Mercurial > hg
comparison mercurial/mergestate.py @ 48428:c25a67cfc291
mergestate: make `_resolve()` do both preresolve and resolve
This patch removes the `preresolve` argument from `_resolve()` and
makes it do both the "preresolve" and "resolve" steps without the
caller having to call it twice.
Differential Revision: https://phab.mercurial-scm.org/D11856
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Fri, 03 Dec 2021 13:53:02 -0800 |
parents | 38941a28406a |
children | f9bc36863923 |
comparison
equal
deleted
inserted
replaced
48427:38941a28406a | 48428:c25a67cfc291 |
---|---|
311 | 311 |
312 def extras(self, filename): | 312 def extras(self, filename): |
313 """return extras stored with the mergestate for the given filename""" | 313 """return extras stored with the mergestate for the given filename""" |
314 return self._stateextras[filename] | 314 return self._stateextras[filename] |
315 | 315 |
316 def _resolve(self, preresolve, dfile, wctx): | 316 def _resolve(self, dfile, wctx): |
317 """rerun merge process for file path `dfile`. | 317 """rerun merge process for file path `dfile`. |
318 Returns whether the merge was completed and the return value of merge | 318 Returns the return value of merge obtained from filemerge._filemerge(). |
319 obtained from filemerge._filemerge(). | |
320 """ | 319 """ |
321 if self[dfile] in ( | 320 if self[dfile] in ( |
322 MERGE_RECORD_RESOLVED, | 321 MERGE_RECORD_RESOLVED, |
323 LEGACY_RECORD_DRIVER_RESOLVED, | 322 LEGACY_RECORD_DRIVER_RESOLVED, |
324 ): | 323 ): |
325 return True, 0 | 324 return 0 |
326 stateentry = self._state[dfile] | 325 stateentry = self._state[dfile] |
327 state, localkey, lfile, afile, anode, ofile, onode, flags = stateentry | 326 state, localkey, lfile, afile, anode, ofile, onode, flags = stateentry |
328 octx = self._repo[self._other] | 327 octx = self._repo[self._other] |
329 extras = self.extras(dfile) | 328 extras = self.extras(dfile) |
330 anccommitnode = extras.get(b'ancestorlinknode') | 329 anccommitnode = extras.get(b'ancestorlinknode') |
339 # "premerge" x flags | 338 # "premerge" x flags |
340 flo = fco.flags() | 339 flo = fco.flags() |
341 fla = fca.flags() | 340 fla = fca.flags() |
342 if b'x' in flags + flo + fla and b'l' not in flags + flo + fla: | 341 if b'x' in flags + flo + fla and b'l' not in flags + flo + fla: |
343 if fca.rev() == nullrev and flags != flo: | 342 if fca.rev() == nullrev and flags != flo: |
344 if preresolve: | 343 self._repo.ui.warn( |
345 self._repo.ui.warn( | 344 _( |
346 _( | 345 b'warning: cannot merge flags for %s ' |
347 b'warning: cannot merge flags for %s ' | 346 b'without common ancestor - keeping local flags\n' |
348 b'without common ancestor - keeping local flags\n' | |
349 ) | |
350 % afile | |
351 ) | 347 ) |
348 % afile | |
349 ) | |
352 elif flags == fla: | 350 elif flags == fla: |
353 flags = flo | 351 flags = flo |
354 if preresolve: | 352 # restore local |
355 # restore local | 353 if localkey != self._repo.nodeconstants.nullhex: |
356 if localkey != self._repo.nodeconstants.nullhex: | 354 self._restore_backup(wctx[dfile], localkey, flags) |
357 self._restore_backup(wctx[dfile], localkey, flags) | 355 else: |
358 else: | 356 wctx[dfile].remove(ignoremissing=True) |
359 wctx[dfile].remove(ignoremissing=True) | 357 complete, merge_ret, deleted = filemerge.premerge( |
360 complete, merge_ret, deleted = filemerge.premerge( | 358 self._repo, |
361 self._repo, | 359 wctx, |
362 wctx, | 360 self._local, |
363 self._local, | 361 lfile, |
364 lfile, | 362 fcd, |
365 fcd, | 363 fco, |
366 fco, | 364 fca, |
367 fca, | 365 labels=self._labels, |
368 labels=self._labels, | 366 ) |
369 ) | 367 if not complete: |
370 else: | |
371 complete, merge_ret, deleted = filemerge.filemerge( | 368 complete, merge_ret, deleted = filemerge.filemerge( |
372 self._repo, | 369 self._repo, |
373 wctx, | 370 wctx, |
374 self._local, | 371 self._local, |
375 lfile, | 372 lfile, |
404 else: | 401 else: |
405 action = ACTION_ADD | 402 action = ACTION_ADD |
406 # else: regular merges (no action necessary) | 403 # else: regular merges (no action necessary) |
407 self._results[dfile] = merge_ret, action | 404 self._results[dfile] = merge_ret, action |
408 | 405 |
409 return complete, merge_ret | 406 return merge_ret |
410 | 407 |
411 def resolve(self, dfile, wctx): | 408 def resolve(self, dfile, wctx): |
412 """run merge process for dfile | 409 """run merge process for dfile |
413 | 410 |
414 Returns the exit code of the merge.""" | 411 Returns the exit code of the merge.""" |
415 complete, r = self._resolve(True, dfile, wctx) | 412 return self._resolve(dfile, wctx) |
416 if not complete: | |
417 r = self._resolve(False, dfile, wctx)[1] | |
418 return r | |
419 | 413 |
420 def counts(self): | 414 def counts(self): |
421 """return counts for updated, merged and removed files in this | 415 """return counts for updated, merged and removed files in this |
422 session""" | 416 session""" |
423 updated, merged, removed = 0, 0, 0 | 417 updated, merged, removed = 0, 0, 0 |