comparison mercurial/copies.py @ 45672:f877b3628015

copies: return None instead of ChangingFiles when relevant If they are not relevant data, they are no need to fetch them. Differential Revision: https://phab.mercurial-scm.org/D9140
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Thu, 01 Oct 2020 09:42:39 +0200
parents a8fb29b05f92
children 7990e7d957b0
comparison
equal deleted inserted replaced
45671:2d6aea053153 45672:f877b3628015
21 util, 21 util,
22 ) 22 )
23 23
24 24
25 from .utils import stringutil 25 from .utils import stringutil
26
27 from .revlogutils import flagutil
26 28
27 29
28 def _filter(src, dst, t): 30 def _filter(src, dst, t):
29 """filters out invalid copies after chaining""" 31 """filters out invalid copies after chaining"""
30 32
177 * p2: revision number of first parent 179 * p2: revision number of first parent
178 * changes: a ChangingFiles object 180 * changes: a ChangingFiles object
179 """ 181 """
180 cl = repo.changelog 182 cl = repo.changelog
181 parents = cl.parentrevs 183 parents = cl.parentrevs
184 flags = cl.flags
185
186 HASCOPIESINFO = flagutil.REVIDX_HASCOPIESINFO
182 187
183 changelogrevision = cl.changelogrevision 188 changelogrevision = cl.changelogrevision
184 189
185 # A small cache to avoid doing the work twice for merges 190 # A small cache to avoid doing the work twice for merges
186 # 191 #
211 p1, p2 = parents(rev) 216 p1, p2 = parents(rev)
212 value = None 217 value = None
213 e = merge_caches.pop(rev, None) 218 e = merge_caches.pop(rev, None)
214 if e is not None: 219 if e is not None:
215 return e 220 return e
216 value = (p1, p2, changelogrevision(rev).changes) 221 changes = None
222 if flags(rev) & HASCOPIESINFO:
223 changes = changelogrevision(rev).changes
224 value = (p1, p2, changes)
217 if p1 != node.nullrev and p2 != node.nullrev: 225 if p1 != node.nullrev and p2 != node.nullrev:
218 # XXX some case we over cache, IGNORE 226 # XXX some case we over cache, IGNORE
219 merge_caches[rev] = value 227 merge_caches[rev] = value
220 return value 228 return value
221 229
291 if copies is None: 299 if copies is None:
292 # this is a root 300 # this is a root
293 copies = {} 301 copies = {}
294 for i, c in enumerate(children[r]): 302 for i, c in enumerate(children[r]):
295 p1, p2, changes = revinfo(c) 303 p1, p2, changes = revinfo(c)
304 childcopies = {}
296 if r == p1: 305 if r == p1:
297 parent = 1 306 parent = 1
298 childcopies = changes.copied_from_p1 307 if changes is not None:
308 childcopies = changes.copied_from_p1
299 else: 309 else:
300 assert r == p2 310 assert r == p2
301 parent = 2 311 parent = 2
302 childcopies = changes.copied_from_p2 312 if changes is not None:
313 childcopies = changes.copied_from_p2
303 if not alwaysmatch: 314 if not alwaysmatch:
304 childcopies = { 315 childcopies = {
305 dst: src for dst, src in childcopies.items() if match(dst) 316 dst: src for dst, src in childcopies.items() if match(dst)
306 } 317 }
307 newcopies = copies 318 newcopies = copies
311 prev = copies.get(source) 322 prev = copies.get(source)
312 if prev is not None and prev[1] is not None: 323 if prev is not None and prev[1] is not None:
313 source = prev[1] 324 source = prev[1]
314 newcopies[dest] = (c, source) 325 newcopies[dest] = (c, source)
315 assert newcopies is not copies 326 assert newcopies is not copies
316 for f in changes.removed: 327 if changes is not None:
317 if f in newcopies: 328 for f in changes.removed:
318 if newcopies is copies: 329 if f in newcopies:
319 # copy on write to avoid affecting potential other 330 if newcopies is copies:
320 # branches. when there are no other branches, this 331 # copy on write to avoid affecting potential other
321 # could be avoided. 332 # branches. when there are no other branches, this
322 newcopies = copies.copy() 333 # could be avoided.
323 newcopies[f] = (c, None) 334 newcopies = copies.copy()
335 newcopies[f] = (c, None)
324 othercopies = all_copies.get(c) 336 othercopies = all_copies.get(c)
325 if othercopies is None: 337 if othercopies is None:
326 all_copies[c] = newcopies 338 all_copies[c] = newcopies
327 else: 339 else:
328 # we are the second parent to work on c, we need to merge our 340 # we are the second parent to work on c, we need to merge our
371 continue 383 continue
372 # content from "major" wins, unless it is older 384 # content from "major" wins, unless it is older
373 # than the branch point or there is a merge 385 # than the branch point or there is a merge
374 if new_tt == other_tt: 386 if new_tt == other_tt:
375 minor[dest] = value 387 minor[dest] = value
376 elif value[1] is None and dest in changes.salvaged: 388 elif (
389 changes is not None
390 and value[1] is None
391 and dest in changes.salvaged
392 ):
377 pass 393 pass
378 elif other[1] is None and dest in changes.salvaged: 394 elif (
395 changes is not None
396 and other[1] is None
397 and dest in changes.salvaged
398 ):
379 minor[dest] = value 399 minor[dest] = value
380 elif not isancestor(new_tt, other_tt): 400 elif not isancestor(new_tt, other_tt):
381 minor[dest] = value 401 minor[dest] = value
382 elif dest in changes.merged: 402 elif changes is not None and dest in changes.merged:
383 minor[dest] = value 403 minor[dest] = value
384 404
385 405
386 def _revinfo_getter_extra(repo): 406 def _revinfo_getter_extra(repo):
387 """return a function that return multiple data given a <rev>"i 407 """return a function that return multiple data given a <rev>"i