##// END OF EJS Templates
copies: define a type to return from mergecopies()...
Martin von Zweigbergk -
r44681:7f8bdee0 default
parent child Browse files
Show More
@@ -452,44 +452,30 b' def mergecopies(repo, c1, c2, base):'
452
452
453 ```other changed <file> which local deleted```
453 ```other changed <file> which local deleted```
454
454
455 Returns five dicts: "copy", "movewithdir", "diverge", "renamedelete" and
455 Returns a tuple where:
456 "dirmove".
457
456
458 "copy" is a mapping from destination name -> source name,
457 "branch_copies" an instance of branch_copies.
459 where source is in c1 and destination is in c2 or vice-versa.
460
461 "movewithdir" is a mapping from source name -> destination name,
462 where the file at source present in one context but not the other
463 needs to be moved to destination by the merge process, because the
464 other context moved the directory it is in.
465
458
466 "diverge" is a mapping of source name -> list of destination names
459 "diverge" is a mapping of source name -> list of destination names
467 for divergent renames.
460 for divergent renames.
468
461
469 "renamedelete" is a mapping of source name -> list of destination
470 names for files deleted in c1 that were renamed in c2 or vice-versa.
471
472 "dirmove" is a mapping of detected source dir -> destination dir renames.
473 This is needed for handling changes to new files previously grafted into
474 renamed directories.
475
476 This function calls different copytracing algorithms based on config.
462 This function calls different copytracing algorithms based on config.
477 """
463 """
478 # avoid silly behavior for update from empty dir
464 # avoid silly behavior for update from empty dir
479 if not c1 or not c2 or c1 == c2:
465 if not c1 or not c2 or c1 == c2:
480 return {}, {}, {}, {}, {}
466 return branch_copies(), {}
481
467
482 narrowmatch = c1.repo().narrowmatch()
468 narrowmatch = c1.repo().narrowmatch()
483
469
484 # avoid silly behavior for parent -> working dir
470 # avoid silly behavior for parent -> working dir
485 if c2.node() is None and c1.node() == repo.dirstate.p1():
471 if c2.node() is None and c1.node() == repo.dirstate.p1():
486 return _dirstatecopies(repo, narrowmatch), {}, {}, {}, {}
472 return branch_copies(_dirstatecopies(repo, narrowmatch)), {}
487
473
488 copytracing = repo.ui.config(b'experimental', b'copytrace')
474 copytracing = repo.ui.config(b'experimental', b'copytrace')
489 if stringutil.parsebool(copytracing) is False:
475 if stringutil.parsebool(copytracing) is False:
490 # stringutil.parsebool() returns None when it is unable to parse the
476 # stringutil.parsebool() returns None when it is unable to parse the
491 # value, so we should rely on making sure copytracing is on such cases
477 # value, so we should rely on making sure copytracing is on such cases
492 return {}, {}, {}, {}, {}
478 return branch_copies(), {}
493
479
494 if usechangesetcentricalgo(repo):
480 if usechangesetcentricalgo(repo):
495 # The heuristics don't make sense when we need changeset-centric algos
481 # The heuristics don't make sense when we need changeset-centric algos
@@ -548,6 +534,34 b' def _checksinglesidecopies('
548 copy[dst] = src
534 copy[dst] = src
549
535
550
536
537 class branch_copies(object):
538 """Information about copies made on one side of a merge/graft.
539
540 "copy" is a mapping from destination name -> source name,
541 where source is in c1 and destination is in c2 or vice-versa.
542
543 "movewithdir" is a mapping from source name -> destination name,
544 where the file at source present in one context but not the other
545 needs to be moved to destination by the merge process, because the
546 other context moved the directory it is in.
547
548 "renamedelete" is a mapping of source name -> list of destination
549 names for files deleted in c1 that were renamed in c2 or vice-versa.
550
551 "dirmove" is a mapping of detected source dir -> destination dir renames.
552 This is needed for handling changes to new files previously grafted into
553 renamed directories.
554 """
555
556 def __init__(
557 self, copy=None, renamedelete=None, dirmove=None, movewithdir=None
558 ):
559 self.copy = {} if copy is None else copy
560 self.renamedelete = {} if renamedelete is None else renamedelete
561 self.dirmove = {} if dirmove is None else dirmove
562 self.movewithdir = {} if movewithdir is None else movewithdir
563
564
551 def _fullcopytracing(repo, c1, c2, base):
565 def _fullcopytracing(repo, c1, c2, base):
552 """ The full copytracing algorithm which finds all the new files that were
566 """ The full copytracing algorithm which finds all the new files that were
553 added from merge base up to the top commit and for each file it checks if
567 added from merge base up to the top commit and for each file it checks if
@@ -564,7 +578,7 b' def _fullcopytracing(repo, c1, c2, base)'
564 copies2 = pathcopies(base, c2)
578 copies2 = pathcopies(base, c2)
565
579
566 if not (copies1 or copies2):
580 if not (copies1 or copies2):
567 return {}, {}, {}, {}, {}
581 return branch_copies(), {}
568
582
569 inversecopies1 = {}
583 inversecopies1 = {}
570 inversecopies2 = {}
584 inversecopies2 = {}
@@ -672,7 +686,7 b' def _fullcopytracing(repo, c1, c2, base)'
672 movewithdir1.update(movewithdir2)
686 movewithdir1.update(movewithdir2)
673 dirmove1.update(dirmove2)
687 dirmove1.update(dirmove2)
674
688
675 return copy1, movewithdir1, diverge, renamedelete1, dirmove1
689 return branch_copies(copy1, renamedelete1, dirmove1, movewithdir1), diverge
676
690
677
691
678 def _dir_renames(repo, ctx, copy, fullcopy, addedfiles):
692 def _dir_renames(repo, ctx, copy, fullcopy, addedfiles):
@@ -846,7 +860,7 b' def _heuristicscopytracing(repo, c1, c2,'
846 # of upstream copytracing
860 # of upstream copytracing
847 copies[candidate] = f
861 copies[candidate] = f
848
862
849 return copies, {}, {}, {}, {}
863 return branch_copies(copies), {}
850
864
851
865
852 def _related(f1, f2):
866 def _related(f1, f2):
@@ -1264,8 +1264,11 b' def manifestmerge('
1264
1264
1265 copy, movewithdir, diverge, renamedelete, dirmove = {}, {}, {}, {}, {}
1265 copy, movewithdir, diverge, renamedelete, dirmove = {}, {}, {}, {}, {}
1266 if followcopies:
1266 if followcopies:
1267 ret = copies.mergecopies(repo, wctx, p2, pa)
1267 branch_copies, diverge = copies.mergecopies(repo, wctx, p2, pa)
1268 copy, movewithdir, diverge, renamedelete, dirmove = ret
1268 copy = branch_copies.copy
1269 renamedelete = branch_copies.renamedelete
1270 dirmove = branch_copies.dirmove
1271 movewithdir = branch_copies.movewithdir
1269
1272
1270 boolbm = pycompat.bytestr(bool(branchmerge))
1273 boolbm = pycompat.bytestr(bool(branchmerge))
1271 boolf = pycompat.bytestr(bool(force))
1274 boolf = pycompat.bytestr(bool(force))
General Comments 0
You need to be logged in to leave comments. Login now