Mercurial > hg
comparison mercurial/copies.py @ 42593:11ceb1b8fd74
copies: inline _chainandfilter() to prepare for next patch
Differential Revision: https://phab.mercurial-scm.org/D6602
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Tue, 25 Jun 2019 13:46:55 -0700 |
parents | a48f6f18dc6d |
children | d013099c551b |
comparison
equal
deleted
inserted
replaced
42592:a48f6f18dc6d | 42593:11ceb1b8fd74 |
---|---|
105 # yet the filelog has the copy information in rev 1 and we will not look | 105 # yet the filelog has the copy information in rev 1 and we will not look |
106 # back far enough unless we also look at the a and b as candidates. | 106 # back far enough unless we also look at the a and b as candidates. |
107 # This only occurs when a is a descendent of b or visa-versa. | 107 # This only occurs when a is a descendent of b or visa-versa. |
108 return min(limit, a, b) | 108 return min(limit, a, b) |
109 | 109 |
110 def _chainandfilter(src, dst, a, b): | 110 def _filter(src, dst, t): |
111 """chain two sets of copies 'a' and 'b' and filter result""" | 111 """filters out invalid copies after chaining""" |
112 | 112 |
113 # When chaining copies in 'a' (from 'src' via some other commit 'mid') with | 113 # When _chain()'ing copies in 'a' (from 'src' via some other commit 'mid') |
114 # copies in 'b' (from 'mid' to 'dst'), we can get the different cases in the | 114 # with copies in 'b' (from 'mid' to 'dst'), we can get the different cases |
115 # following table (not including trivial cases). For example, case 2 is | 115 # in the following table (not including trivial cases). For example, case 2 |
116 # where a file existed in 'src' and remained under that name in 'mid' and | 116 # is where a file existed in 'src' and remained under that name in 'mid' and |
117 # then was renamed between 'mid' and 'dst'. | 117 # then was renamed between 'mid' and 'dst'. |
118 # | 118 # |
119 # case src mid dst result | 119 # case src mid dst result |
120 # 1 x y - - | 120 # 1 x y - - |
121 # 2 x y y x->y | 121 # 2 x y y x->y |
127 # _chain() takes care of chaining the copies in 'a' and 'b', but it | 127 # _chain() takes care of chaining the copies in 'a' and 'b', but it |
128 # cannot tell the difference between cases 1 and 2, between 3 and 4, or | 128 # cannot tell the difference between cases 1 and 2, between 3 and 4, or |
129 # between 5 and 6, so it includes all cases in its result. | 129 # between 5 and 6, so it includes all cases in its result. |
130 # Cases 1, 3, and 5 are then removed by _filter(). | 130 # Cases 1, 3, and 5 are then removed by _filter(). |
131 | 131 |
132 t = _chain(a, b) | |
133 _filter(src, dst, t) | |
134 return t | |
135 | |
136 def _filter(src, dst, t): | |
137 """filters out invalid copies after chaining""" | |
138 for k, v in list(t.items()): | 132 for k, v in list(t.items()): |
139 # remove copies from files that didn't exist | 133 # remove copies from files that didn't exist |
140 if v not in src: | 134 if v not in src: |
141 del t[k] | 135 del t[k] |
142 # remove criss-crossed copies | 136 # remove criss-crossed copies |
324 match = a.repo().narrowmatch(match) | 318 match = a.repo().narrowmatch(match) |
325 # check for working copy | 319 # check for working copy |
326 if b.rev() is None: | 320 if b.rev() is None: |
327 cm = _committedforwardcopies(a, b.p1(), match) | 321 cm = _committedforwardcopies(a, b.p1(), match) |
328 # combine copies from dirstate if necessary | 322 # combine copies from dirstate if necessary |
329 copies = _chainandfilter(a, b, cm, _dirstatecopies(b._repo, match)) | 323 copies = _chain(cm, _dirstatecopies(b._repo, match)) |
324 _filter(a, b, copies) | |
330 else: | 325 else: |
331 copies = _committedforwardcopies(a, b, match) | 326 copies = _committedforwardcopies(a, b, match) |
332 return copies | 327 return copies |
333 | 328 |
334 def _backwardrenames(a, b, match): | 329 def _backwardrenames(a, b, match): |
374 repo.ui.debug('debug.copies: search mode: backward\n') | 369 repo.ui.debug('debug.copies: search mode: backward\n') |
375 copies = _backwardrenames(x, y, match=match) | 370 copies = _backwardrenames(x, y, match=match) |
376 else: | 371 else: |
377 if debug: | 372 if debug: |
378 repo.ui.debug('debug.copies: search mode: combined\n') | 373 repo.ui.debug('debug.copies: search mode: combined\n') |
379 copies = _chainandfilter(x, y, _backwardrenames(x, a, match=match), | 374 copies = _chain(_backwardrenames(x, a, match=match), |
380 _forwardcopies(a, y, match=match)) | 375 _forwardcopies(a, y, match=match)) |
376 _filter(x, y, copies) | |
381 return copies | 377 return copies |
382 | 378 |
383 def mergecopies(repo, c1, c2, base): | 379 def mergecopies(repo, c1, c2, base): |
384 """ | 380 """ |
385 Finds moves and copies between context c1 and c2 that are relevant for | 381 Finds moves and copies between context c1 and c2 that are relevant for |