equal
deleted
inserted
replaced
2588 ) |
2588 ) |
2589 return stats |
2589 return stats |
2590 |
2590 |
2591 |
2591 |
2592 def graft( |
2592 def graft( |
2593 repo, ctx, base, labels=None, keepparent=False, keepconflictparent=False |
2593 repo, |
|
2594 ctx, |
|
2595 base, |
|
2596 labels=None, |
|
2597 keepparent=False, |
|
2598 keepconflictparent=False, |
|
2599 wctx=None, |
2594 ): |
2600 ): |
2595 """Do a graft-like merge. |
2601 """Do a graft-like merge. |
2596 |
2602 |
2597 This is a merge where the merge ancestor is chosen such that one |
2603 This is a merge where the merge ancestor is chosen such that one |
2598 or more changesets are grafted onto the current changeset. In |
2604 or more changesets are grafted onto the current changeset. In |
2611 # mergeancestor=True to update. This does two things: 1) allows the merge if |
2617 # mergeancestor=True to update. This does two things: 1) allows the merge if |
2612 # the destination is the same as the parent of the ctx (so we can use graft |
2618 # the destination is the same as the parent of the ctx (so we can use graft |
2613 # to copy commits), and 2) informs update that the incoming changes are |
2619 # to copy commits), and 2) informs update that the incoming changes are |
2614 # newer than the destination so it doesn't prompt about "remote changed foo |
2620 # newer than the destination so it doesn't prompt about "remote changed foo |
2615 # which local deleted". |
2621 # which local deleted". |
2616 wctx = repo[None] |
2622 wctx = wctx or repo[None] |
2617 pctx = wctx.p1() |
2623 pctx = wctx.p1() |
2618 mergeancestor = repo.changelog.isancestor(pctx.node(), ctx.node()) |
2624 mergeancestor = repo.changelog.isancestor(pctx.node(), ctx.node()) |
2619 |
2625 |
2620 stats = update( |
2626 stats = update( |
2621 repo, |
2627 repo, |
2623 True, |
2629 True, |
2624 True, |
2630 True, |
2625 base.node(), |
2631 base.node(), |
2626 mergeancestor=mergeancestor, |
2632 mergeancestor=mergeancestor, |
2627 labels=labels, |
2633 labels=labels, |
|
2634 wc=wctx, |
2628 ) |
2635 ) |
2629 |
2636 |
2630 if keepconflictparent and stats.unresolvedcount: |
2637 if keepconflictparent and stats.unresolvedcount: |
2631 pother = ctx.node() |
2638 pother = ctx.node() |
2632 else: |
2639 else: |
2637 pother = parents[0].node() |
2644 pother = parents[0].node() |
2638 # Never set both parents equal to each other |
2645 # Never set both parents equal to each other |
2639 if pother == pctx.node(): |
2646 if pother == pctx.node(): |
2640 pother = nullid |
2647 pother = nullid |
2641 |
2648 |
2642 with repo.dirstate.parentchange(): |
2649 if wctx.isinmemory(): |
2643 repo.setparents(pctx.node(), pother) |
2650 wctx.setparents(pctx.node(), pother) |
2644 repo.dirstate.write(repo.currenttransaction()) |
|
2645 # fix up dirstate for copies and renames |
2651 # fix up dirstate for copies and renames |
2646 copies.graftcopies(wctx, ctx, base) |
2652 copies.graftcopies(wctx, ctx, base) |
|
2653 else: |
|
2654 with repo.dirstate.parentchange(): |
|
2655 repo.setparents(pctx.node(), pother) |
|
2656 repo.dirstate.write(repo.currenttransaction()) |
|
2657 # fix up dirstate for copies and renames |
|
2658 copies.graftcopies(wctx, ctx, base) |
2647 return stats |
2659 return stats |
2648 |
2660 |
2649 |
2661 |
2650 def purge( |
2662 def purge( |
2651 repo, |
2663 repo, |