mercurial/merge.py
changeset 38345 bec1212eceaa
parent 38045 18e6ea9ba81d
child 38373 ef692614e601
equal deleted inserted replaced
38344:c6f82a18a63d 38345:bec1212eceaa
  1582             fca = repo.filectx(f1, fileid=nullrev)
  1582             fca = repo.filectx(f1, fileid=nullrev)
  1583         ms.add(fcl, fco, fca, f)
  1583         ms.add(fcl, fco, fca, f)
  1584         if f1 != f and move:
  1584         if f1 != f and move:
  1585             moves.append(f1)
  1585             moves.append(f1)
  1586 
  1586 
  1587     _updating = _('updating')
       
  1588     _files = _('files')
       
  1589     progress = repo.ui.progress
       
  1590 
       
  1591     # remove renamed files after safely stored
  1587     # remove renamed files after safely stored
  1592     for f in moves:
  1588     for f in moves:
  1593         if wctx[f].lexists():
  1589         if wctx[f].lexists():
  1594             repo.ui.debug("removing %s\n" % f)
  1590             repo.ui.debug("removing %s\n" % f)
  1595             wctx[f].audit()
  1591             wctx[f].audit()
  1596             wctx[f].remove()
  1592             wctx[f].remove()
  1597 
  1593 
  1598     numupdates = sum(len(l) for m, l in actions.items()
  1594     numupdates = sum(len(l) for m, l in actions.items()
  1599                      if m != ACTION_KEEP)
  1595                      if m != ACTION_KEEP)
  1600     z = 0
  1596     progress = repo.ui.makeprogress(_('updating'), unit=_('files'),
       
  1597                                     total=numupdates)
  1601 
  1598 
  1602     if [a for a in actions[ACTION_REMOVE] if a[0] == '.hgsubstate']:
  1599     if [a for a in actions[ACTION_REMOVE] if a[0] == '.hgsubstate']:
  1603         subrepoutil.submerge(repo, wctx, mctx, wctx, overwrite, labels)
  1600         subrepoutil.submerge(repo, wctx, mctx, wctx, overwrite, labels)
  1604 
  1601 
  1605     # record path conflicts
  1602     # record path conflicts
  1612             s(_("the local file has been renamed to %s\n") % f1)
  1609             s(_("the local file has been renamed to %s\n") % f1)
  1613         else:
  1610         else:
  1614             s(_("the remote file has been renamed to %s\n") % f1)
  1611             s(_("the remote file has been renamed to %s\n") % f1)
  1615         s(_("resolve manually then use 'hg resolve --mark %s'\n") % f)
  1612         s(_("resolve manually then use 'hg resolve --mark %s'\n") % f)
  1616         ms.addpath(f, f1, fo)
  1613         ms.addpath(f, f1, fo)
  1617         z += 1
  1614         progress.increment(item=f)
  1618         progress(_updating, z, item=f, total=numupdates, unit=_files)
       
  1619 
  1615 
  1620     # When merging in-memory, we can't support worker processes, so set the
  1616     # When merging in-memory, we can't support worker processes, so set the
  1621     # per-item cost at 0 in that case.
  1617     # per-item cost at 0 in that case.
  1622     cost = 0 if wctx.isinmemory() else 0.001
  1618     cost = 0 if wctx.isinmemory() else 0.001
  1623 
  1619 
  1624     # remove in parallel (must come before resolving path conflicts and getting)
  1620     # remove in parallel (must come before resolving path conflicts and getting)
  1625     prog = worker.worker(repo.ui, cost, batchremove, (repo, wctx),
  1621     prog = worker.worker(repo.ui, cost, batchremove, (repo, wctx),
  1626                          actions[ACTION_REMOVE])
  1622                          actions[ACTION_REMOVE])
  1627     for i, item in prog:
  1623     for i, item in prog:
  1628         z += i
  1624         progress.increment(step=i, item=item)
  1629         progress(_updating, z, item=item, total=numupdates, unit=_files)
       
  1630     removed = len(actions[ACTION_REMOVE])
  1625     removed = len(actions[ACTION_REMOVE])
  1631 
  1626 
  1632     # resolve path conflicts (must come before getting)
  1627     # resolve path conflicts (must come before getting)
  1633     for f, args, msg in actions[ACTION_PATH_CONFLICT_RESOLVE]:
  1628     for f, args, msg in actions[ACTION_PATH_CONFLICT_RESOLVE]:
  1634         repo.ui.debug(" %s: %s -> pr\n" % (f, msg))
  1629         repo.ui.debug(" %s: %s -> pr\n" % (f, msg))
  1636         if wctx[f0].lexists():
  1631         if wctx[f0].lexists():
  1637             repo.ui.note(_("moving %s to %s\n") % (f0, f))
  1632             repo.ui.note(_("moving %s to %s\n") % (f0, f))
  1638             wctx[f].audit()
  1633             wctx[f].audit()
  1639             wctx[f].write(wctx.filectx(f0).data(), wctx.filectx(f0).flags())
  1634             wctx[f].write(wctx.filectx(f0).data(), wctx.filectx(f0).flags())
  1640             wctx[f0].remove()
  1635             wctx[f0].remove()
  1641         z += 1
  1636         progress.increment(item=f)
  1642         progress(_updating, z, item=f, total=numupdates, unit=_files)
       
  1643 
  1637 
  1644     # get in parallel
  1638     # get in parallel
  1645     prog = worker.worker(repo.ui, cost, batchget, (repo, mctx, wctx),
  1639     prog = worker.worker(repo.ui, cost, batchget, (repo, mctx, wctx),
  1646                          actions[ACTION_GET])
  1640                          actions[ACTION_GET])
  1647     for i, item in prog:
  1641     for i, item in prog:
  1648         z += i
  1642         progress.increment(step=i, item=item)
  1649         progress(_updating, z, item=item, total=numupdates, unit=_files)
       
  1650     updated = len(actions[ACTION_GET])
  1643     updated = len(actions[ACTION_GET])
  1651 
  1644 
  1652     if [a for a in actions[ACTION_GET] if a[0] == '.hgsubstate']:
  1645     if [a for a in actions[ACTION_GET] if a[0] == '.hgsubstate']:
  1653         subrepoutil.submerge(repo, wctx, mctx, wctx, overwrite, labels)
  1646         subrepoutil.submerge(repo, wctx, mctx, wctx, overwrite, labels)
  1654 
  1647 
  1655     # forget (manifest only, just log it) (must come first)
  1648     # forget (manifest only, just log it) (must come first)
  1656     for f, args, msg in actions[ACTION_FORGET]:
  1649     for f, args, msg in actions[ACTION_FORGET]:
  1657         repo.ui.debug(" %s: %s -> f\n" % (f, msg))
  1650         repo.ui.debug(" %s: %s -> f\n" % (f, msg))
  1658         z += 1
  1651         progress.increment(item=f)
  1659         progress(_updating, z, item=f, total=numupdates, unit=_files)
       
  1660 
  1652 
  1661     # re-add (manifest only, just log it)
  1653     # re-add (manifest only, just log it)
  1662     for f, args, msg in actions[ACTION_ADD]:
  1654     for f, args, msg in actions[ACTION_ADD]:
  1663         repo.ui.debug(" %s: %s -> a\n" % (f, msg))
  1655         repo.ui.debug(" %s: %s -> a\n" % (f, msg))
  1664         z += 1
  1656         progress.increment(item=f)
  1665         progress(_updating, z, item=f, total=numupdates, unit=_files)
       
  1666 
  1657 
  1667     # re-add/mark as modified (manifest only, just log it)
  1658     # re-add/mark as modified (manifest only, just log it)
  1668     for f, args, msg in actions[ACTION_ADD_MODIFIED]:
  1659     for f, args, msg in actions[ACTION_ADD_MODIFIED]:
  1669         repo.ui.debug(" %s: %s -> am\n" % (f, msg))
  1660         repo.ui.debug(" %s: %s -> am\n" % (f, msg))
  1670         z += 1
  1661         progress.increment(item=f)
  1671         progress(_updating, z, item=f, total=numupdates, unit=_files)
       
  1672 
  1662 
  1673     # keep (noop, just log it)
  1663     # keep (noop, just log it)
  1674     for f, args, msg in actions[ACTION_KEEP]:
  1664     for f, args, msg in actions[ACTION_KEEP]:
  1675         repo.ui.debug(" %s: %s -> k\n" % (f, msg))
  1665         repo.ui.debug(" %s: %s -> k\n" % (f, msg))
  1676         # no progress
  1666         # no progress
  1677 
  1667 
  1678     # directory rename, move local
  1668     # directory rename, move local
  1679     for f, args, msg in actions[ACTION_DIR_RENAME_MOVE_LOCAL]:
  1669     for f, args, msg in actions[ACTION_DIR_RENAME_MOVE_LOCAL]:
  1680         repo.ui.debug(" %s: %s -> dm\n" % (f, msg))
  1670         repo.ui.debug(" %s: %s -> dm\n" % (f, msg))
  1681         z += 1
  1671         progress.increment(item=f)
  1682         progress(_updating, z, item=f, total=numupdates, unit=_files)
       
  1683         f0, flags = args
  1672         f0, flags = args
  1684         repo.ui.note(_("moving %s to %s\n") % (f0, f))
  1673         repo.ui.note(_("moving %s to %s\n") % (f0, f))
  1685         wctx[f].audit()
  1674         wctx[f].audit()
  1686         wctx[f].write(wctx.filectx(f0).data(), flags)
  1675         wctx[f].write(wctx.filectx(f0).data(), flags)
  1687         wctx[f0].remove()
  1676         wctx[f0].remove()
  1688         updated += 1
  1677         updated += 1
  1689 
  1678 
  1690     # local directory rename, get
  1679     # local directory rename, get
  1691     for f, args, msg in actions[ACTION_LOCAL_DIR_RENAME_GET]:
  1680     for f, args, msg in actions[ACTION_LOCAL_DIR_RENAME_GET]:
  1692         repo.ui.debug(" %s: %s -> dg\n" % (f, msg))
  1681         repo.ui.debug(" %s: %s -> dg\n" % (f, msg))
  1693         z += 1
  1682         progress.increment(item=f)
  1694         progress(_updating, z, item=f, total=numupdates, unit=_files)
       
  1695         f0, flags = args
  1683         f0, flags = args
  1696         repo.ui.note(_("getting %s to %s\n") % (f0, f))
  1684         repo.ui.note(_("getting %s to %s\n") % (f0, f))
  1697         wctx[f].write(mctx.filectx(f0).data(), flags)
  1685         wctx[f].write(mctx.filectx(f0).data(), flags)
  1698         updated += 1
  1686         updated += 1
  1699 
  1687 
  1700     # exec
  1688     # exec
  1701     for f, args, msg in actions[ACTION_EXEC]:
  1689     for f, args, msg in actions[ACTION_EXEC]:
  1702         repo.ui.debug(" %s: %s -> e\n" % (f, msg))
  1690         repo.ui.debug(" %s: %s -> e\n" % (f, msg))
  1703         z += 1
  1691         progress.increment(item=f)
  1704         progress(_updating, z, item=f, total=numupdates, unit=_files)
       
  1705         flags, = args
  1692         flags, = args
  1706         wctx[f].audit()
  1693         wctx[f].audit()
  1707         wctx[f].setflags('l' in flags, 'x' in flags)
  1694         wctx[f].setflags('l' in flags, 'x' in flags)
  1708         updated += 1
  1695         updated += 1
  1709 
  1696 
  1734     try:
  1721     try:
  1735         # premerge
  1722         # premerge
  1736         tocomplete = []
  1723         tocomplete = []
  1737         for f, args, msg in mergeactions:
  1724         for f, args, msg in mergeactions:
  1738             repo.ui.debug(" %s: %s -> m (premerge)\n" % (f, msg))
  1725             repo.ui.debug(" %s: %s -> m (premerge)\n" % (f, msg))
  1739             z += 1
  1726             progress.increment(item=f)
  1740             progress(_updating, z, item=f, total=numupdates, unit=_files)
       
  1741             if f == '.hgsubstate': # subrepo states need updating
  1727             if f == '.hgsubstate': # subrepo states need updating
  1742                 subrepoutil.submerge(repo, wctx, mctx, wctx.ancestor(mctx),
  1728                 subrepoutil.submerge(repo, wctx, mctx, wctx.ancestor(mctx),
  1743                                      overwrite, labels)
  1729                                      overwrite, labels)
  1744                 continue
  1730                 continue
  1745             wctx[f].audit()
  1731             wctx[f].audit()
  1749                 tocomplete.append((f, args, msg))
  1735                 tocomplete.append((f, args, msg))
  1750 
  1736 
  1751         # merge
  1737         # merge
  1752         for f, args, msg in tocomplete:
  1738         for f, args, msg in tocomplete:
  1753             repo.ui.debug(" %s: %s -> m (merge)\n" % (f, msg))
  1739             repo.ui.debug(" %s: %s -> m (merge)\n" % (f, msg))
  1754             z += 1
  1740             progress.increment(item=f, total=numupdates)
  1755             progress(_updating, z, item=f, total=numupdates, unit=_files)
       
  1756             ms.resolve(f, wctx)
  1741             ms.resolve(f, wctx)
  1757 
  1742 
  1758     finally:
  1743     finally:
  1759         ms.commit()
  1744         ms.commit()
  1760 
  1745 
  1798             mfiles.difference_update(a[0] for a in acts)
  1783             mfiles.difference_update(a[0] for a in acts)
  1799 
  1784 
  1800         actions[ACTION_MERGE] = [a for a in actions[ACTION_MERGE]
  1785         actions[ACTION_MERGE] = [a for a in actions[ACTION_MERGE]
  1801                                  if a[0] in mfiles]
  1786                                  if a[0] in mfiles]
  1802 
  1787 
  1803     progress(_updating, None, total=numupdates, unit=_files)
  1788     progress.update(None)
  1804     return updateresult(updated, merged, removed, unresolved)
  1789     return updateresult(updated, merged, removed, unresolved)
  1805 
  1790 
  1806 def recordupdates(repo, actions, branchmerge):
  1791 def recordupdates(repo, actions, branchmerge):
  1807     "record merge actions to the dirstate"
  1792     "record merge actions to the dirstate"
  1808     # remove (must come first)
  1793     # remove (must come first)