mercurial/merge.py
changeset 31166 fad5e299cfc7
parent 31165 81250d377611
child 31168 41a9edc5d00f
equal deleted inserted replaced
31165:81250d377611 31166:fad5e299cfc7
  1442             repo.dirstate.copy(f0, f)
  1442             repo.dirstate.copy(f0, f)
  1443         else:
  1443         else:
  1444             repo.dirstate.normal(f)
  1444             repo.dirstate.normal(f)
  1445 
  1445 
  1446 def update(repo, node, branchmerge, force, ancestor=None,
  1446 def update(repo, node, branchmerge, force, ancestor=None,
  1447            mergeancestor=False, labels=None, matcher=None, mergeforce=False):
  1447            mergeancestor=False, labels=None, matcher=None, mergeforce=False,
       
  1448            updatecheck=None):
  1448     """
  1449     """
  1449     Perform a merge between the working directory and the given node
  1450     Perform a merge between the working directory and the given node
  1450 
  1451 
  1451     node = the node to update to
  1452     node = the node to update to
  1452     branchmerge = whether to merge between branches
  1453     branchmerge = whether to merge between branches
  1466     is dirty, whether a revision is specified, and the relationship of
  1467     is dirty, whether a revision is specified, and the relationship of
  1467     the parent rev to the target rev (linear or not). Match from top first.
  1468     the parent rev to the target rev (linear or not). Match from top first.
  1468 
  1469 
  1469     This logic is tested by test-update-branches.t.
  1470     This logic is tested by test-update-branches.t.
  1470 
  1471 
  1471     -c  -C  dirty  rev  linear  |  result
  1472     -c  -C  -m  dirty  rev  linear  |  result
  1472      y   y    *     *     *     |    (1)
  1473      y   y   *    *     *     *     |    (1)
  1473      *   *    *     n     n     |     x
  1474      y   *   y    *     *     *     |    (1)
  1474      *   *    n     *     *     |    ok
  1475      *   y   y    *     *     *     |    (1)
  1475      n   n    y     *     y     |   merge
  1476      *   *   *    *     n     n     |     x
  1476      n   n    y     y     n     |    (2)
  1477      *   *   *    n     *     *     |    ok
  1477      n   y    y     *     *     |  discard
  1478      n   n   n    y     *     y     |   merge
  1478      y   n    y     *     *     |    (3)
  1479      n   n   n    y     y     n     |    (2)
       
  1480      n   n   y    y     *     *     |   merge
       
  1481      n   y   n    y     *     *     |  discard
       
  1482      y   n   n    y     *     *     |    (3)
  1479 
  1483 
  1480     x = can't happen
  1484     x = can't happen
  1481     * = don't-care
  1485     * = don't-care
  1482     1 = incompatible options (checked in commands.py)
  1486     1 = incompatible options (checked in commands.py)
  1483     2 = abort: uncommitted changes (commit or update --clean to discard changes)
  1487     2 = abort: uncommitted changes (commit or update --clean to discard changes)
  1484     3 = abort: uncommitted changes (checked in commands.py)
  1488     3 = abort: uncommitted changes (checked in commands.py)
  1485 
  1489 
  1486     Return the same tuple as applyupdates().
  1490     Return the same tuple as applyupdates().
  1487     """
  1491     """
  1488 
  1492 
  1489     # This functon used to find the default destination if node was None, but
  1493     # This function used to find the default destination if node was None, but
  1490     # that's now in destutil.py.
  1494     # that's now in destutil.py.
  1491     assert node is not None
  1495     assert node is not None
       
  1496     if not branchmerge and not force:
       
  1497         # TODO: remove the default once all callers that pass branchmerge=False
       
  1498         # and force=False pass a value for updatecheck. We may want to allow
       
  1499         # updatecheck='abort' to better suppport some of these callers.
       
  1500         if updatecheck is None:
       
  1501             updatecheck = 'linear'
       
  1502         assert updatecheck in ('none', 'linear')
  1492     # If we're doing a partial update, we need to skip updating
  1503     # If we're doing a partial update, we need to skip updating
  1493     # the dirstate, so make a note of any partial-ness to the
  1504     # the dirstate, so make a note of any partial-ness to the
  1494     # update here.
  1505     # update here.
  1495     if matcher is None or matcher.always():
  1506     if matcher is None or matcher.always():
  1496         partial = False
  1507         partial = False
  1543                 # call the hooks and exit early
  1554                 # call the hooks and exit early
  1544                 repo.hook('preupdate', throw=True, parent1=xp2, parent2='')
  1555                 repo.hook('preupdate', throw=True, parent1=xp2, parent2='')
  1545                 repo.hook('update', parent1=xp2, parent2='', error=0)
  1556                 repo.hook('update', parent1=xp2, parent2='', error=0)
  1546                 return 0, 0, 0, 0
  1557                 return 0, 0, 0, 0
  1547 
  1558 
  1548             if pas not in ([p1], [p2]):  # nonlinear
  1559             if (updatecheck == 'linear' and
       
  1560                     pas not in ([p1], [p2])):  # nonlinear
  1549                 dirty = wc.dirty(missing=True)
  1561                 dirty = wc.dirty(missing=True)
  1550                 if dirty:
  1562                 if dirty:
  1551                     # Branching is a bit strange to ensure we do the minimal
  1563                     # Branching is a bit strange to ensure we do the minimal
  1552                     # amount of call to obsolete.foreground.
  1564                     # amount of call to obsolete.foreground.
  1553                     foreground = obsolete.foreground(repo, [p1.node()])
  1565                     foreground = obsolete.foreground(repo, [p1.node()])