504 force = whether to force branch merging or file overwriting |
504 force = whether to force branch merging or file overwriting |
505 partial = a function to filter file lists (dirstate not updated) |
505 partial = a function to filter file lists (dirstate not updated) |
506 wlock = working dir lock, if already held |
506 wlock = working dir lock, if already held |
507 """ |
507 """ |
508 |
508 |
509 if not wlock: |
509 try: |
510 wlock = repo.wlock() |
510 if not wlock: |
511 |
511 wlock = repo.wlock() |
512 wc = repo.workingctx() |
512 |
513 if node is None: |
513 wc = repo.workingctx() |
514 # tip of current branch |
514 if node is None: |
515 try: |
515 # tip of current branch |
516 node = repo.branchtags()[wc.branch()] |
516 try: |
517 except KeyError: |
517 node = repo.branchtags()[wc.branch()] |
518 raise util.Abort(_("branch %s not found") % wc.branch()) |
518 except KeyError: |
519 overwrite = force and not branchmerge |
519 raise util.Abort(_("branch %s not found") % wc.branch()) |
520 forcemerge = force and branchmerge |
520 overwrite = force and not branchmerge |
521 pl = wc.parents() |
521 forcemerge = force and branchmerge |
522 p1, p2 = pl[0], repo.changectx(node) |
522 pl = wc.parents() |
523 pa = p1.ancestor(p2) |
523 p1, p2 = pl[0], repo.changectx(node) |
524 fp1, fp2, xp1, xp2 = p1.node(), p2.node(), str(p1), str(p2) |
524 pa = p1.ancestor(p2) |
525 fastforward = False |
525 fp1, fp2, xp1, xp2 = p1.node(), p2.node(), str(p1), str(p2) |
526 |
526 fastforward = False |
527 ### check phase |
527 |
528 if not overwrite and len(pl) > 1: |
528 ### check phase |
529 raise util.Abort(_("outstanding uncommitted merges")) |
529 if not overwrite and len(pl) > 1: |
530 if pa == p1 or pa == p2: # is there a linear path from p1 to p2? |
530 raise util.Abort(_("outstanding uncommitted merges")) |
531 if branchmerge: |
531 if pa == p1 or pa == p2: # is there a linear path from p1 to p2? |
532 if p1.branch() != p2.branch() and pa != p2: |
532 if branchmerge: |
533 fastforward = True |
533 if p1.branch() != p2.branch() and pa != p2: |
534 else: |
534 fastforward = True |
535 raise util.Abort(_("there is nothing to merge, just use " |
535 else: |
536 "'hg update' or look at 'hg heads'")) |
536 raise util.Abort(_("there is nothing to merge, just use " |
537 elif not (overwrite or branchmerge): |
537 "'hg update' or look at 'hg heads'")) |
538 raise util.Abort(_("update spans branches, use 'hg merge' " |
538 elif not (overwrite or branchmerge): |
539 "or 'hg update -C' to lose changes")) |
539 raise util.Abort(_("update spans branches, use 'hg merge' " |
540 if branchmerge and not forcemerge: |
540 "or 'hg update -C' to lose changes")) |
541 if wc.files(): |
541 if branchmerge and not forcemerge: |
542 raise util.Abort(_("outstanding uncommitted changes")) |
542 if wc.files(): |
543 |
543 raise util.Abort(_("outstanding uncommitted changes")) |
544 ### calculate phase |
544 |
545 action = [] |
545 ### calculate phase |
546 if not force: |
546 action = [] |
547 checkunknown(wc, p2) |
547 if not force: |
548 if not util.checkfolding(repo.path): |
548 checkunknown(wc, p2) |
549 checkcollision(p2) |
549 if not util.checkfolding(repo.path): |
550 if not branchmerge: |
550 checkcollision(p2) |
551 action += forgetremoved(wc, p2) |
551 if not branchmerge: |
552 action += manifestmerge(repo, wc, p2, pa, overwrite, partial) |
552 action += forgetremoved(wc, p2) |
553 |
553 action += manifestmerge(repo, wc, p2, pa, overwrite, partial) |
554 ### apply phase |
554 |
555 if not branchmerge: # just jump to the new rev |
555 ### apply phase |
556 fp1, fp2, xp1, xp2 = fp2, nullid, xp2, '' |
556 if not branchmerge: # just jump to the new rev |
557 if not partial: |
557 fp1, fp2, xp1, xp2 = fp2, nullid, xp2, '' |
558 repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2) |
558 if not partial: |
559 |
559 repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2) |
560 stats = applyupdates(repo, action, wc, p2) |
560 |
561 |
561 stats = applyupdates(repo, action, wc, p2) |
562 if not partial: |
562 |
563 recordupdates(repo, action, branchmerge) |
563 if not partial: |
564 repo.dirstate.setparents(fp1, fp2) |
564 recordupdates(repo, action, branchmerge) |
565 if not branchmerge and not fastforward: |
565 repo.dirstate.setparents(fp1, fp2) |
566 repo.dirstate.setbranch(p2.branch()) |
566 if not branchmerge and not fastforward: |
567 repo.hook('update', parent1=xp1, parent2=xp2, error=stats[3]) |
567 repo.dirstate.setbranch(p2.branch()) |
568 |
568 repo.hook('update', parent1=xp1, parent2=xp2, error=stats[3]) |
569 return stats |
569 |
570 |
570 return stats |
|
571 finally: |
|
572 del wlock |