comparison mercurial/sparse.py @ 45334:b9b055f15035

merge: pass mergeresult obj instead of actions in applyupdates() (API) This is similar to past 20 patches or so where we are replacing use of a bare actions dict with a dedicated mergeresult object. The goal is to have a dedicated powerful object instead of a dict while making the code more easier to understand. In past few patches, we have already simplified the code at some places using the newly introduced object. This patch does not updates applyupdates() to use the mergeresult object directly. That will be done in next patch to make things easier to review. Differential Revision: https://phab.mercurial-scm.org/D8876
author Pulkit Goyal <7895pulkit@gmail.com>
date Mon, 03 Aug 2020 14:12:13 +0530
parents 6a8eafaeff3b
children 9320f66854f6
comparison
equal deleted inserted replaced
45333:f569ca3eb430 45334:b9b055f15035
267 # Still have pending changes. Don't bother trying to prune. 267 # Still have pending changes. Don't bother trying to prune.
268 return 268 return
269 269
270 sparsematch = matcher(repo, includetemp=False) 270 sparsematch = matcher(repo, includetemp=False)
271 dirstate = repo.dirstate 271 dirstate = repo.dirstate
272 actions = [] 272 mresult = mergemod.mergeresult()
273 dropped = [] 273 dropped = []
274 tempincludes = readtemporaryincludes(repo) 274 tempincludes = readtemporaryincludes(repo)
275 for file in tempincludes: 275 for file in tempincludes:
276 if file in dirstate and not sparsematch(file): 276 if file in dirstate and not sparsematch(file):
277 message = _(b'dropping temporarily included sparse files') 277 message = _(b'dropping temporarily included sparse files')
278 actions.append((file, None, message)) 278 mresult.addfile(file, b'r', None, message)
279 dropped.append(file) 279 dropped.append(file)
280 280
281 typeactions = mergemod.emptyactions()
282 typeactions[b'r'] = actions
283 mergemod.applyupdates( 281 mergemod.applyupdates(
284 repo, typeactions, repo[None], repo[b'.'], False, wantfiledata=False 282 repo, mresult, repo[None], repo[b'.'], False, wantfiledata=False
285 ) 283 )
286 284
287 # Fix dirstate 285 # Fix dirstate
288 for file in dropped: 286 for file in dropped:
289 dirstate.drop(file) 287 dirstate.drop(file)
427 % len(temporaryfiles) 425 % len(temporaryfiles)
428 ) 426 )
429 addtemporaryincludes(repo, temporaryfiles) 427 addtemporaryincludes(repo, temporaryfiles)
430 428
431 # Add the new files to the working copy so they can be merged, etc 429 # Add the new files to the working copy so they can be merged, etc
432 actions = [] 430 tmresult = mergemod.mergeresult()
433 message = b'temporarily adding to sparse checkout' 431 message = b'temporarily adding to sparse checkout'
434 wctxmanifest = repo[None].manifest() 432 wctxmanifest = repo[None].manifest()
435 for file in temporaryfiles: 433 for file in temporaryfiles:
436 if file in wctxmanifest: 434 if file in wctxmanifest:
437 fctx = repo[None][file] 435 fctx = repo[None][file]
438 actions.append((file, (fctx.flags(), False), message)) 436 tmresult.addfile(
439 437 file,
440 typeactions = mergemod.emptyactions() 438 mergestatemod.ACTION_GET,
441 typeactions[mergestatemod.ACTION_GET] = actions 439 (fctx.flags(), False),
440 message,
441 )
442
442 mergemod.applyupdates( 443 mergemod.applyupdates(
443 repo, typeactions, repo[None], repo[b'.'], False, wantfiledata=False 444 repo, tmresult, repo[None], repo[b'.'], False, wantfiledata=False
444 ) 445 )
445 446
446 dirstate = repo.dirstate 447 dirstate = repo.dirstate
447 for file, flags, msg in actions: 448 for file, flags, msg in tmresult.getactions([mergestatemod.ACTION_GET]):
448 dirstate.normal(file) 449 dirstate.normal(file)
449 450
450 profiles = activeconfig(repo)[2] 451 profiles = activeconfig(repo)[2]
451 changedprofiles = profiles & files 452 changedprofiles = profiles & files
452 # If an active profile changed during the update, refresh the checkout. 453 # If an active profile changed during the update, refresh the checkout.
495 if abort: 496 if abort:
496 raise error.Abort( 497 raise error.Abort(
497 _(b'could not update sparseness due to pending changes') 498 _(b'could not update sparseness due to pending changes')
498 ) 499 )
499 500
500 # Calculate actions 501 # Calculate merge result
501 dirstate = repo.dirstate 502 dirstate = repo.dirstate
502 ctx = repo[b'.'] 503 ctx = repo[b'.']
503 added = [] 504 added = []
504 lookup = [] 505 lookup = []
505 dropped = [] 506 dropped = []
506 mf = ctx.manifest() 507 mf = ctx.manifest()
507 files = set(mf) 508 files = set(mf)
508 509 mresult = mergemod.mergeresult()
509 actions = {}
510 510
511 for file in files: 511 for file in files:
512 old = origsparsematch(file) 512 old = origsparsematch(file)
513 new = sparsematch(file) 513 new = sparsematch(file)
514 # Add files that are newly included, or that don't exist in 514 # Add files that are newly included, or that don't exist in
515 # the dirstate yet. 515 # the dirstate yet.
516 if (new and not old) or (old and new and not file in dirstate): 516 if (new and not old) or (old and new and not file in dirstate):
517 fl = mf.flags(file) 517 fl = mf.flags(file)
518 if repo.wvfs.exists(file): 518 if repo.wvfs.exists(file):
519 actions[file] = (b'e', (fl,), b'') 519 mresult.addfile(file, b'e', (fl,), b'')
520 lookup.append(file) 520 lookup.append(file)
521 else: 521 else:
522 actions[file] = (b'g', (fl, False), b'') 522 mresult.addfile(file, b'g', (fl, False), b'')
523 added.append(file) 523 added.append(file)
524 # Drop files that are newly excluded, or that still exist in 524 # Drop files that are newly excluded, or that still exist in
525 # the dirstate. 525 # the dirstate.
526 elif (old and not new) or (not old and not new and file in dirstate): 526 elif (old and not new) or (not old and not new and file in dirstate):
527 dropped.append(file) 527 dropped.append(file)
528 if file not in pending: 528 if file not in pending:
529 actions[file] = (b'r', [], b'') 529 mresult.addfile(file, b'r', [], b'')
530 530
531 # Verify there are no pending changes in newly included files 531 # Verify there are no pending changes in newly included files
532 abort = False 532 abort = False
533 for file in lookup: 533 for file in lookup:
534 repo.ui.warn(_(b"pending changes to '%s'\n") % file) 534 repo.ui.warn(_(b"pending changes to '%s'\n") % file)
548 old = origsparsematch(file) 548 old = origsparsematch(file)
549 new = sparsematch(file) 549 new = sparsematch(file)
550 if old and not new: 550 if old and not new:
551 dropped.append(file) 551 dropped.append(file)
552 552
553 # Apply changes to disk
554 typeactions = mergemod.emptyactions()
555 for f, (m, args, msg) in pycompat.iteritems(actions):
556 typeactions[m].append((f, args, msg))
557
558 mergemod.applyupdates( 553 mergemod.applyupdates(
559 repo, typeactions, repo[None], repo[b'.'], False, wantfiledata=False 554 repo, mresult, repo[None], repo[b'.'], False, wantfiledata=False
560 ) 555 )
561 556
562 # Fix dirstate 557 # Fix dirstate
563 for file in added: 558 for file in added:
564 dirstate.normal(file) 559 dirstate.normal(file)