249 repo.ui.debug(" unmatched files in other:\n %s\n" |
249 repo.ui.debug(" unmatched files in other:\n %s\n" |
250 % "\n ".join(u2)) |
250 % "\n ".join(u2)) |
251 return u1, u2 |
251 return u1, u2 |
252 |
252 |
253 def _makegetfctx(ctx): |
253 def _makegetfctx(ctx): |
254 """return a 'getfctx' function suitable for checkcopies usage |
254 """return a 'getfctx' function suitable for _checkcopies usage |
255 |
255 |
256 We have to re-setup the function building 'filectx' for each |
256 We have to re-setup the function building 'filectx' for each |
257 'checkcopies' to ensure the linkrev adjustment is properly setup for |
257 '_checkcopies' to ensure the linkrev adjustment is properly setup for |
258 each. Linkrev adjustment is important to avoid bug in rename |
258 each. Linkrev adjustment is important to avoid bug in rename |
259 detection. Moreover, having a proper '_ancestrycontext' setup ensures |
259 detection. Moreover, having a proper '_ancestrycontext' setup ensures |
260 the performance impact of this adjustment is kept limited. Without it, |
260 the performance impact of this adjustment is kept limited. Without it, |
261 each file could do a full dag traversal making the time complexity of |
261 each file could do a full dag traversal making the time complexity of |
262 the operation explode (see issue4537). |
262 the operation explode (see issue4537). |
329 |
329 |
330 m1 = c1.manifest() |
330 m1 = c1.manifest() |
331 m2 = c2.manifest() |
331 m2 = c2.manifest() |
332 ma = ca.manifest() |
332 ma = ca.manifest() |
333 |
333 |
334 # see checkcopies documentation below for these dicts |
334 # see _checkcopies documentation below for these dicts |
335 copy1, copy2 = {}, {} |
335 copy1, copy2 = {}, {} |
336 movewithdir1, movewithdir2 = {}, {} |
336 movewithdir1, movewithdir2 = {}, {} |
337 fullcopy1, fullcopy2 = {}, {} |
337 fullcopy1, fullcopy2 = {}, {} |
338 diverge = {} |
338 diverge = {} |
339 |
339 |
343 u1r, u2r = _computenonoverlap(repo, c1, c2, addedinm1, addedinm2) |
343 u1r, u2r = _computenonoverlap(repo, c1, c2, addedinm1, addedinm2) |
344 u1u, u2u = u1r, u2r |
344 u1u, u2u = u1r, u2r |
345 bothnew = sorted(addedinm1 & addedinm2) |
345 bothnew = sorted(addedinm1 & addedinm2) |
346 |
346 |
347 for f in u1u: |
347 for f in u1u: |
348 checkcopies(c1, f, m1, m2, ca, limit, diverge, copy1, fullcopy1) |
348 _checkcopies(c1, f, m1, m2, ca, limit, diverge, copy1, fullcopy1) |
349 |
349 |
350 for f in u2u: |
350 for f in u2u: |
351 checkcopies(c2, f, m2, m1, ca, limit, diverge, copy2, fullcopy2) |
351 _checkcopies(c2, f, m2, m1, ca, limit, diverge, copy2, fullcopy2) |
352 |
352 |
353 copy = dict(copy1.items() + copy2.items()) |
353 copy = dict(copy1.items() + copy2.items()) |
354 movewithdir = dict(movewithdir1.items() + movewithdir2.items()) |
354 movewithdir = dict(movewithdir1.items() + movewithdir2.items()) |
355 fullcopy = dict(fullcopy1.items() + fullcopy2.items()) |
355 fullcopy = dict(fullcopy1.items() + fullcopy2.items()) |
356 |
356 |
371 if bothnew: |
371 if bothnew: |
372 repo.ui.debug(" unmatched files new in both:\n %s\n" |
372 repo.ui.debug(" unmatched files new in both:\n %s\n" |
373 % "\n ".join(bothnew)) |
373 % "\n ".join(bothnew)) |
374 bothdiverge, _copy, _fullcopy = {}, {}, {} |
374 bothdiverge, _copy, _fullcopy = {}, {}, {} |
375 for f in bothnew: |
375 for f in bothnew: |
376 checkcopies(c1, f, m1, m2, ca, limit, bothdiverge, _copy, _fullcopy) |
376 _checkcopies(c1, f, m1, m2, ca, limit, bothdiverge, _copy, _fullcopy) |
377 checkcopies(c2, f, m2, m1, ca, limit, bothdiverge, _copy, _fullcopy) |
377 _checkcopies(c2, f, m2, m1, ca, limit, bothdiverge, _copy, _fullcopy) |
378 for of, fl in bothdiverge.items(): |
378 for of, fl in bothdiverge.items(): |
379 if len(fl) == 2 and fl[0] == fl[1]: |
379 if len(fl) == 2 and fl[0] == fl[1]: |
380 copy[fl[0]] = of # not actually divergent, just matching renames |
380 copy[fl[0]] = of # not actually divergent, just matching renames |
381 |
381 |
382 if fullcopy and repo.ui.debugflag: |
382 if fullcopy and repo.ui.debugflag: |
452 "dst: '%s'\n") % (f, df)) |
452 "dst: '%s'\n") % (f, df)) |
453 break |
453 break |
454 |
454 |
455 return copy, movewithdir, diverge, renamedelete |
455 return copy, movewithdir, diverge, renamedelete |
456 |
456 |
457 def checkcopies(ctx, f, m1, m2, ca, limit, diverge, copy, fullcopy): |
457 def _checkcopies(ctx, f, m1, m2, ca, limit, diverge, copy, fullcopy): |
458 """ |
458 """ |
459 check possible copies of f from m1 to m2 |
459 check possible copies of f from m1 to m2 |
460 |
460 |
461 ctx = starting context for f in m1 |
461 ctx = starting context for f in m1 |
462 f = the filename to check |
462 f = the filename to check |