equal
deleted
inserted
replaced
15 |
15 |
16 from . import ( |
16 from . import ( |
17 match as matchmod, |
17 match as matchmod, |
18 node, |
18 node, |
19 pathutil, |
19 pathutil, |
|
20 pycompat, |
20 util, |
21 util, |
21 ) |
22 ) |
22 from .utils import stringutil |
23 from .utils import stringutil |
23 |
24 |
24 |
25 |
142 |
143 |
143 |
144 |
144 def _chain(a, b): |
145 def _chain(a, b): |
145 """chain two sets of copies 'a' and 'b'""" |
146 """chain two sets of copies 'a' and 'b'""" |
146 t = a.copy() |
147 t = a.copy() |
147 for k, v in b.iteritems(): |
148 for k, v in pycompat.iteritems(b): |
148 if v in t: |
149 if v in t: |
149 t[k] = t[v] |
150 t[k] = t[v] |
150 else: |
151 else: |
151 t[k] = v |
152 t[k] = v |
152 return t |
153 return t |
351 # We don't want to pass in "match" here, since that would filter |
352 # We don't want to pass in "match" here, since that would filter |
352 # the destination by it. Since we're reversing the copies, we want |
353 # the destination by it. Since we're reversing the copies, we want |
353 # to filter the source instead. |
354 # to filter the source instead. |
354 f = _forwardcopies(b, a) |
355 f = _forwardcopies(b, a) |
355 r = {} |
356 r = {} |
356 for k, v in sorted(f.iteritems()): |
357 for k, v in sorted(pycompat.iteritems(f)): |
357 if match and not match(v): |
358 if match and not match(v): |
358 continue |
359 continue |
359 # remove copies |
360 # remove copies |
360 if v in a: |
361 if v in a: |
361 continue |
362 continue |
630 invalid = set() |
631 invalid = set() |
631 dirmove = {} |
632 dirmove = {} |
632 |
633 |
633 # examine each file copy for a potential directory move, which is |
634 # examine each file copy for a potential directory move, which is |
634 # when all the files in a directory are moved to a new directory |
635 # when all the files in a directory are moved to a new directory |
635 for dst, src in fullcopy.iteritems(): |
636 for dst, src in pycompat.iteritems(fullcopy): |
636 dsrc, ddst = pathutil.dirname(src), pathutil.dirname(dst) |
637 dsrc, ddst = pathutil.dirname(src), pathutil.dirname(dst) |
637 if dsrc in invalid: |
638 if dsrc in invalid: |
638 # already seen to be uninteresting |
639 # already seen to be uninteresting |
639 continue |
640 continue |
640 elif dsrc in d1 and ddst in d1: |
641 elif dsrc in d1 and ddst in d1: |
656 del d1, d2, invalid |
657 del d1, d2, invalid |
657 |
658 |
658 if not dirmove: |
659 if not dirmove: |
659 return copy, {}, diverge, renamedelete, {} |
660 return copy, {}, diverge, renamedelete, {} |
660 |
661 |
661 dirmove = {k + b"/": v + b"/" for k, v in dirmove.iteritems()} |
662 dirmove = {k + b"/": v + b"/" for k, v in pycompat.iteritems(dirmove)} |
662 |
663 |
663 for d in dirmove: |
664 for d in dirmove: |
664 repo.ui.debug( |
665 repo.ui.debug( |
665 b" discovered dir src: '%s' -> dst: '%s'\n" % (d, dirmove[d]) |
666 b" discovered dir src: '%s' -> dst: '%s'\n" % (d, dirmove[d]) |
666 ) |
667 ) |
734 return _fullcopytracing(repo, c1, c2, base) |
735 return _fullcopytracing(repo, c1, c2, base) |
735 changedfiles.update(ctx.files()) |
736 changedfiles.update(ctx.files()) |
736 ctx = ctx.p1() |
737 ctx = ctx.p1() |
737 |
738 |
738 cp = _forwardcopies(base, c2) |
739 cp = _forwardcopies(base, c2) |
739 for dst, src in cp.iteritems(): |
740 for dst, src in pycompat.iteritems(cp): |
740 if src in m1: |
741 if src in m1: |
741 copies[dst] = src |
742 copies[dst] = src |
742 |
743 |
743 # file is missing if it isn't present in the destination, but is present in |
744 # file is missing if it isn't present in the destination, but is present in |
744 # the base and present in the source. |
745 # the base and present in the source. |
843 # copytrace='off' skips this line, but not the entire function because |
844 # copytrace='off' skips this line, but not the entire function because |
844 # the line below is O(size of the repo) during a rebase, while the rest |
845 # the line below is O(size of the repo) during a rebase, while the rest |
845 # of the function is much faster (and is required for carrying copy |
846 # of the function is much faster (and is required for carrying copy |
846 # metadata across the rebase anyway). |
847 # metadata across the rebase anyway). |
847 exclude = pathcopies(repo[fromrev], repo[skiprev]) |
848 exclude = pathcopies(repo[fromrev], repo[skiprev]) |
848 for dst, src in pathcopies(repo[fromrev], repo[rev]).iteritems(): |
849 for dst, src in pycompat.iteritems(pathcopies(repo[fromrev], repo[rev])): |
849 if dst in exclude: |
850 if dst in exclude: |
850 continue |
851 continue |
851 if dst in wctx: |
852 if dst in wctx: |
852 wctx[dst].markcopied(src) |
853 wctx[dst].markcopied(src) |
853 |
854 |