560 |
560 |
561 - see all changesets whose states are already known in the current |
561 - see all changesets whose states are already known in the current |
562 bisection:: |
562 bisection:: |
563 |
563 |
564 hg log -r "bisect(pruned)" |
564 hg log -r "bisect(pruned)" |
|
565 |
|
566 - see the changeset currently being bisected (especially useful |
|
567 if running with -U/--noupdate):: |
|
568 |
|
569 hg log -r "bisect(current)" |
565 |
570 |
566 - see all changesets that took part in the current bisection:: |
571 - see all changesets that took part in the current bisection:: |
567 |
572 |
568 hg log -r "bisect(range)" |
573 hg log -r "bisect(range)" |
569 |
574 |
645 state = hbisect.load_state(repo) |
650 state = hbisect.load_state(repo) |
646 |
651 |
647 if command: |
652 if command: |
648 changesets = 1 |
653 changesets = 1 |
649 try: |
654 try: |
|
655 node = state['current'][0] |
|
656 except LookupError: |
|
657 if noupdate: |
|
658 raise util.Abort(_('current bisect revision is unknown - ' |
|
659 'start a new bisect to fix')) |
|
660 node, p2 = repo.dirstate.parents() |
|
661 if p2 != nullid: |
|
662 raise util.Abort(_('current bisect revision is a merge')) |
|
663 try: |
650 while changesets: |
664 while changesets: |
651 # update state |
665 # update state |
|
666 state['current'] = [node] |
652 hbisect.save_state(repo, state) |
667 hbisect.save_state(repo, state) |
653 status = util.system(command, out=ui.fout) |
668 status = util.system(command, out=ui.fout) |
654 if status == 125: |
669 if status == 125: |
655 transition = "skip" |
670 transition = "skip" |
656 elif status == 0: |
671 elif status == 0: |
660 raise util.Abort(_("failed to execute %s") % command) |
675 raise util.Abort(_("failed to execute %s") % command) |
661 elif status < 0: |
676 elif status < 0: |
662 raise util.Abort(_("%s killed") % command) |
677 raise util.Abort(_("%s killed") % command) |
663 else: |
678 else: |
664 transition = "bad" |
679 transition = "bad" |
665 ctx = scmutil.revsingle(repo, rev) |
680 ctx = scmutil.revsingle(repo, rev, node) |
666 rev = None # clear for future iterations |
681 rev = None # clear for future iterations |
667 state[transition].append(ctx.node()) |
682 state[transition].append(ctx.node()) |
668 ui.status(_('Changeset %d:%s: %s\n') % (ctx, ctx, transition)) |
683 ui.status(_('Changeset %d:%s: %s\n') % (ctx, ctx, transition)) |
669 check_state(state, interactive=False) |
684 check_state(state, interactive=False) |
670 # bisect |
685 # bisect |
671 nodes, changesets, good = hbisect.bisect(repo.changelog, state) |
686 nodes, changesets, good = hbisect.bisect(repo.changelog, state) |
672 # update to next check |
687 # update to next check |
673 cmdutil.bailifchanged(repo) |
688 node = nodes[0] |
674 hg.clean(repo, nodes[0], show_stats=False) |
689 if not noupdate: |
|
690 cmdutil.bailifchanged(repo) |
|
691 hg.clean(repo, node, show_stats=False) |
675 finally: |
692 finally: |
|
693 state['current'] = [node] |
676 hbisect.save_state(repo, state) |
694 hbisect.save_state(repo, state) |
677 print_result(nodes, good) |
695 print_result(nodes, good) |
678 return |
696 return |
679 |
697 |
680 # update state |
698 # update state |
702 if not changesets: |
720 if not changesets: |
703 extendnode = extendbisectrange(nodes, good) |
721 extendnode = extendbisectrange(nodes, good) |
704 if extendnode is not None: |
722 if extendnode is not None: |
705 ui.write(_("Extending search to changeset %d:%s\n" |
723 ui.write(_("Extending search to changeset %d:%s\n" |
706 % (extendnode.rev(), extendnode))) |
724 % (extendnode.rev(), extendnode))) |
|
725 state['current'] = [extendnode.node()] |
|
726 hbisect.save_state(repo, state) |
707 if noupdate: |
727 if noupdate: |
708 return |
728 return |
709 cmdutil.bailifchanged(repo) |
729 cmdutil.bailifchanged(repo) |
710 return hg.clean(repo, extendnode.node()) |
730 return hg.clean(repo, extendnode.node()) |
711 raise util.Abort(_("nothing to extend")) |
731 raise util.Abort(_("nothing to extend")) |
721 tests, size = tests + 1, size * 2 |
741 tests, size = tests + 1, size * 2 |
722 rev = repo.changelog.rev(node) |
742 rev = repo.changelog.rev(node) |
723 ui.write(_("Testing changeset %d:%s " |
743 ui.write(_("Testing changeset %d:%s " |
724 "(%d changesets remaining, ~%d tests)\n") |
744 "(%d changesets remaining, ~%d tests)\n") |
725 % (rev, short(node), changesets, tests)) |
745 % (rev, short(node), changesets, tests)) |
|
746 state['current'] = [node] |
|
747 hbisect.save_state(repo, state) |
726 if not noupdate: |
748 if not noupdate: |
727 cmdutil.bailifchanged(repo) |
749 cmdutil.bailifchanged(repo) |
728 return hg.clean(repo, node) |
750 return hg.clean(repo, node) |
729 |
751 |
730 @command('bookmarks', |
752 @command('bookmarks', |