comparison mercurial/merge.py @ 45337:5ce63ee1fe3d

merge: replace use of actions dict with mergeresult object There are still some places which can be improved by having a dedicated API, this patch for now make all users of actions dict go through the mergeresult object API. Differential Revision: https://phab.mercurial-scm.org/D8879
author Pulkit Goyal <7895pulkit@gmail.com>
date Mon, 03 Aug 2020 17:32:30 +0530
parents 27c6518b7287
children 72b8c082676b
comparison
equal deleted inserted replaced
45336:27c6518b7287 45337:5ce63ee1fe3d
1350 (updated, merged, removed, unresolved) that describes how many 1350 (updated, merged, removed, unresolved) that describes how many
1351 files were affected by the update, and filedata is as described in 1351 files were affected by the update, and filedata is as described in
1352 batchget. 1352 batchget.
1353 """ 1353 """
1354 1354
1355 actions = mresult.actionsdict
1356 _prefetchfiles(repo, mctx, mresult) 1355 _prefetchfiles(repo, mctx, mresult)
1357 1356
1358 updated, merged, removed = 0, 0, 0 1357 updated, merged, removed = 0, 0, 0
1359 ms = mergestatemod.mergestate.clean( 1358 ms = mergestatemod.mergestate.clean(
1360 repo, wctx.p1().node(), mctx.node(), labels 1359 repo, wctx.p1().node(), mctx.node(), labels
1368 # mergestate so that it can be reused on commit 1367 # mergestate so that it can be reused on commit
1369 if op == b'other': 1368 if op == b'other':
1370 ms.addmergedother(f) 1369 ms.addmergedother(f)
1371 1370
1372 moves = [] 1371 moves = []
1373 for m, l in actions.items():
1374 l.sort()
1375 1372
1376 # 'cd' and 'dc' actions are treated like other merge conflicts 1373 # 'cd' and 'dc' actions are treated like other merge conflicts
1377 mergeactions = sorted(actions[mergestatemod.ACTION_CHANGED_DELETED]) 1374 mergeactions = mresult.getactions(
1378 mergeactions.extend(sorted(actions[mergestatemod.ACTION_DELETED_CHANGED])) 1375 [
1379 mergeactions.extend(actions[mergestatemod.ACTION_MERGE]) 1376 mergestatemod.ACTION_CHANGED_DELETED,
1377 mergestatemod.ACTION_DELETED_CHANGED,
1378 mergestatemod.ACTION_MERGE,
1379 ],
1380 sort=True,
1381 )
1380 for f, args, msg in mergeactions: 1382 for f, args, msg in mergeactions:
1381 f1, f2, fa, move, anc = args 1383 f1, f2, fa, move, anc = args
1382 if f == b'.hgsubstate': # merged internally 1384 if f == b'.hgsubstate': # merged internally
1383 continue 1385 continue
1384 if f1 is None: 1386 if f1 is None:
1405 if wctx[f].lexists(): 1407 if wctx[f].lexists():
1406 repo.ui.debug(b"removing %s\n" % f) 1408 repo.ui.debug(b"removing %s\n" % f)
1407 wctx[f].audit() 1409 wctx[f].audit()
1408 wctx[f].remove() 1410 wctx[f].remove()
1409 1411
1410 numupdates = sum( 1412 numupdates = len(mresult.actions) - len(
1411 len(l) for m, l in actions.items() if m != mergestatemod.ACTION_KEEP 1413 mresult._actionmapping[mergestatemod.ACTION_KEEP]
1412 ) 1414 )
1413 progress = repo.ui.makeprogress( 1415 progress = repo.ui.makeprogress(
1414 _(b'updating'), unit=_(b'files'), total=numupdates 1416 _(b'updating'), unit=_(b'files'), total=numupdates
1415 ) 1417 )
1416 1418
1417 if [ 1419 if b'.hgsubstate' in mresult._actionmapping[mergestatemod.ACTION_REMOVE]:
1418 a
1419 for a in actions[mergestatemod.ACTION_REMOVE]
1420 if a[0] == b'.hgsubstate'
1421 ]:
1422 subrepoutil.submerge(repo, wctx, mctx, wctx, overwrite, labels) 1420 subrepoutil.submerge(repo, wctx, mctx, wctx, overwrite, labels)
1423 1421
1424 # record path conflicts 1422 # record path conflicts
1425 for f, args, msg in actions[mergestatemod.ACTION_PATH_CONFLICT]: 1423 for f, args, msg in mresult.getactions(
1424 [mergestatemod.ACTION_PATH_CONFLICT], sort=True
1425 ):
1426 f1, fo = args 1426 f1, fo = args
1427 s = repo.ui.status 1427 s = repo.ui.status
1428 s( 1428 s(
1429 _( 1429 _(
1430 b"%s: path conflict - a file or link has the same name as a " 1430 b"%s: path conflict - a file or link has the same name as a "
1448 prog = worker.worker( 1448 prog = worker.worker(
1449 repo.ui, 1449 repo.ui,
1450 cost, 1450 cost,
1451 batchremove, 1451 batchremove,
1452 (repo, wctx), 1452 (repo, wctx),
1453 actions[mergestatemod.ACTION_REMOVE], 1453 mresult.getactions([mergestatemod.ACTION_REMOVE], sort=True),
1454 ) 1454 )
1455 for i, item in prog: 1455 for i, item in prog:
1456 progress.increment(step=i, item=item) 1456 progress.increment(step=i, item=item)
1457 removed = len(actions[mergestatemod.ACTION_REMOVE]) 1457 removed = len(mresult._actionmapping[mergestatemod.ACTION_REMOVE])
1458 1458
1459 # resolve path conflicts (must come before getting) 1459 # resolve path conflicts (must come before getting)
1460 for f, args, msg in actions[mergestatemod.ACTION_PATH_CONFLICT_RESOLVE]: 1460 for f, args, msg in mresult.getactions(
1461 [mergestatemod.ACTION_PATH_CONFLICT_RESOLVE], sort=True
1462 ):
1461 repo.ui.debug(b" %s: %s -> pr\n" % (f, msg)) 1463 repo.ui.debug(b" %s: %s -> pr\n" % (f, msg))
1462 (f0, origf0) = args 1464 (f0, origf0) = args
1463 if wctx[f0].lexists(): 1465 if wctx[f0].lexists():
1464 repo.ui.note(_(b"moving %s to %s\n") % (f0, f)) 1466 repo.ui.note(_(b"moving %s to %s\n") % (f0, f))
1465 wctx[f].audit() 1467 wctx[f].audit()
1474 prog = worker.worker( 1476 prog = worker.worker(
1475 repo.ui, 1477 repo.ui,
1476 cost, 1478 cost,
1477 batchget, 1479 batchget,
1478 (repo, mctx, wctx, wantfiledata), 1480 (repo, mctx, wctx, wantfiledata),
1479 actions[mergestatemod.ACTION_GET], 1481 mresult.getactions([mergestatemod.ACTION_GET], sort=True),
1480 threadsafe=threadsafe, 1482 threadsafe=threadsafe,
1481 hasretval=True, 1483 hasretval=True,
1482 ) 1484 )
1483 getfiledata = {} 1485 getfiledata = {}
1484 for final, res in prog: 1486 for final, res in prog:
1485 if final: 1487 if final:
1486 getfiledata = res 1488 getfiledata = res
1487 else: 1489 else:
1488 i, item = res 1490 i, item = res
1489 progress.increment(step=i, item=item) 1491 progress.increment(step=i, item=item)
1490 updated = len(actions[mergestatemod.ACTION_GET]) 1492 updated = len(mresult._actionmapping[mergestatemod.ACTION_GET])
1491 1493
1492 if [a for a in actions[mergestatemod.ACTION_GET] if a[0] == b'.hgsubstate']: 1494 if b'.hgsubstate' in mresult._actionmapping[mergestatemod.ACTION_GET]:
1493 subrepoutil.submerge(repo, wctx, mctx, wctx, overwrite, labels) 1495 subrepoutil.submerge(repo, wctx, mctx, wctx, overwrite, labels)
1494 1496
1495 # forget (manifest only, just log it) (must come first) 1497 # forget (manifest only, just log it) (must come first)
1496 for f, args, msg in actions[mergestatemod.ACTION_FORGET]: 1498 for f, args, msg in mresult.getactions(
1499 (mergestatemod.ACTION_FORGET,), sort=True
1500 ):
1497 repo.ui.debug(b" %s: %s -> f\n" % (f, msg)) 1501 repo.ui.debug(b" %s: %s -> f\n" % (f, msg))
1498 progress.increment(item=f) 1502 progress.increment(item=f)
1499 1503
1500 # re-add (manifest only, just log it) 1504 # re-add (manifest only, just log it)
1501 for f, args, msg in actions[mergestatemod.ACTION_ADD]: 1505 for f, args, msg in mresult.getactions(
1506 (mergestatemod.ACTION_ADD,), sort=True
1507 ):
1502 repo.ui.debug(b" %s: %s -> a\n" % (f, msg)) 1508 repo.ui.debug(b" %s: %s -> a\n" % (f, msg))
1503 progress.increment(item=f) 1509 progress.increment(item=f)
1504 1510
1505 # re-add/mark as modified (manifest only, just log it) 1511 # re-add/mark as modified (manifest only, just log it)
1506 for f, args, msg in actions[mergestatemod.ACTION_ADD_MODIFIED]: 1512 for f, args, msg in mresult.getactions(
1513 (mergestatemod.ACTION_ADD_MODIFIED,), sort=True
1514 ):
1507 repo.ui.debug(b" %s: %s -> am\n" % (f, msg)) 1515 repo.ui.debug(b" %s: %s -> am\n" % (f, msg))
1508 progress.increment(item=f) 1516 progress.increment(item=f)
1509 1517
1510 # keep (noop, just log it) 1518 # keep (noop, just log it)
1511 for f, args, msg in actions[mergestatemod.ACTION_KEEP]: 1519 for f, args, msg in mresult.getactions(
1520 (mergestatemod.ACTION_KEEP,), sort=True
1521 ):
1512 repo.ui.debug(b" %s: %s -> k\n" % (f, msg)) 1522 repo.ui.debug(b" %s: %s -> k\n" % (f, msg))
1513 # no progress 1523 # no progress
1514 1524
1515 # directory rename, move local 1525 # directory rename, move local
1516 for f, args, msg in actions[mergestatemod.ACTION_DIR_RENAME_MOVE_LOCAL]: 1526 for f, args, msg in mresult.getactions(
1527 (mergestatemod.ACTION_DIR_RENAME_MOVE_LOCAL,), sort=True
1528 ):
1517 repo.ui.debug(b" %s: %s -> dm\n" % (f, msg)) 1529 repo.ui.debug(b" %s: %s -> dm\n" % (f, msg))
1518 progress.increment(item=f) 1530 progress.increment(item=f)
1519 f0, flags = args 1531 f0, flags = args
1520 repo.ui.note(_(b"moving %s to %s\n") % (f0, f)) 1532 repo.ui.note(_(b"moving %s to %s\n") % (f0, f))
1521 wctx[f].audit() 1533 wctx[f].audit()
1522 wctx[f].write(wctx.filectx(f0).data(), flags) 1534 wctx[f].write(wctx.filectx(f0).data(), flags)
1523 wctx[f0].remove() 1535 wctx[f0].remove()
1524 updated += 1 1536 updated += 1
1525 1537
1526 # local directory rename, get 1538 # local directory rename, get
1527 for f, args, msg in actions[mergestatemod.ACTION_LOCAL_DIR_RENAME_GET]: 1539 for f, args, msg in mresult.getactions(
1540 (mergestatemod.ACTION_LOCAL_DIR_RENAME_GET,), sort=True
1541 ):
1528 repo.ui.debug(b" %s: %s -> dg\n" % (f, msg)) 1542 repo.ui.debug(b" %s: %s -> dg\n" % (f, msg))
1529 progress.increment(item=f) 1543 progress.increment(item=f)
1530 f0, flags = args 1544 f0, flags = args
1531 repo.ui.note(_(b"getting %s to %s\n") % (f0, f)) 1545 repo.ui.note(_(b"getting %s to %s\n") % (f0, f))
1532 wctx[f].write(mctx.filectx(f0).data(), flags) 1546 wctx[f].write(mctx.filectx(f0).data(), flags)
1533 updated += 1 1547 updated += 1
1534 1548
1535 # exec 1549 # exec
1536 for f, args, msg in actions[mergestatemod.ACTION_EXEC]: 1550 for f, args, msg in mresult.getactions(
1551 (mergestatemod.ACTION_EXEC,), sort=True
1552 ):
1537 repo.ui.debug(b" %s: %s -> e\n" % (f, msg)) 1553 repo.ui.debug(b" %s: %s -> e\n" % (f, msg))
1538 progress.increment(item=f) 1554 progress.increment(item=f)
1539 (flags,) = args 1555 (flags,) = args
1540 wctx[f].audit() 1556 wctx[f].audit()
1541 wctx[f].setflags(b'l' in flags, b'x' in flags) 1557 wctx[f].setflags(b'l' in flags, b'x' in flags)
1612 merged += msmerged 1628 merged += msmerged
1613 removed += msremoved 1629 removed += msremoved
1614 1630
1615 extraactions = ms.actions() 1631 extraactions = ms.actions()
1616 if extraactions: 1632 if extraactions:
1617 mfiles = {a[0] for a in actions[mergestatemod.ACTION_MERGE]} 1633 mfiles = {
1634 a[0] for a in mresult.getactions((mergestatemod.ACTION_MERGE,))
1635 }
1618 for k, acts in pycompat.iteritems(extraactions): 1636 for k, acts in pycompat.iteritems(extraactions):
1619 actions[k].extend(acts)
1620 for a in acts: 1637 for a in acts:
1621 mresult.addfile(a[0], k, *a[1:]) 1638 mresult.addfile(a[0], k, *a[1:])
1622 if k == mergestatemod.ACTION_GET and wantfiledata: 1639 if k == mergestatemod.ACTION_GET and wantfiledata:
1623 # no filedata until mergestate is updated to provide it 1640 # no filedata until mergestate is updated to provide it
1624 for a in acts: 1641 for a in acts:
1639 # 1656 #
1640 # We don't need to do the same operation for 'dc' and 'cd' because 1657 # We don't need to do the same operation for 'dc' and 'cd' because
1641 # those lists aren't consulted again. 1658 # those lists aren't consulted again.
1642 mfiles.difference_update(a[0] for a in acts) 1659 mfiles.difference_update(a[0] for a in acts)
1643 1660
1644 actions[mergestatemod.ACTION_MERGE] = [
1645 a for a in actions[mergestatemod.ACTION_MERGE] if a[0] in mfiles
1646 ]
1647 for a in mresult.getactions([mergestatemod.ACTION_MERGE]): 1661 for a in mresult.getactions([mergestatemod.ACTION_MERGE]):
1648 if a[0] not in mfiles: 1662 if a[0] not in mfiles:
1649 mresult.removefile(a[0]) 1663 mresult.removefile(a[0])
1650 1664
1651 progress.complete() 1665 progress.complete()
1652 assert len(getfiledata) == ( 1666 assert len(getfiledata) == (
1653 len(actions[mergestatemod.ACTION_GET]) if wantfiledata else 0 1667 len(mresult._actionmapping[mergestatemod.ACTION_GET])
1668 if wantfiledata
1669 else 0
1654 ) 1670 )
1655 return updateresult(updated, merged, removed, unresolved), getfiledata 1671 return updateresult(updated, merged, removed, unresolved), getfiledata
1656 1672
1657 1673
1658 def _advertisefsmonitor(repo, num_gets, p1node): 1674 def _advertisefsmonitor(repo, num_gets, p1node):