hgext/hbisect.py
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
Wed, 26 Sep 2007 01:58:45 -0300
changeset 5338 f87685355c9c
parent 5316 121816063b9a
permissions -rw-r--r--
revlog: fix revlogio.packentry corner case We want to store version information about the revlog in the first entry of its index. The code in packentry was using some heuristics to detect whether this was the first entry, but these heuristics could fail in some cases (e.g. rev 0 was empty; rev 1 descends directly from the nullid and is stored as a delta). We now give the revision number to packentry to avoid heuristics.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1855
0ba9dee8cfbd Fixed spacing/indentation, removed #! script header, added short description.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1854
diff changeset
     1
# bisect extension for mercurial
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
     2
#
1861
65949d1c9bf7 Added copyright information to hbisect.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1856
diff changeset
     3
# Copyright 2005, 2006 Benoit Boissinot <benoit.boissinot@ens-lyon.org>
65949d1c9bf7 Added copyright information to hbisect.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1856
diff changeset
     4
# Inspired by git bisect, extension skeleton taken from mq.py.
65949d1c9bf7 Added copyright information to hbisect.py
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1856
diff changeset
     5
#
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
     6
# This software may be used and distributed according to the terms
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
     7
# of the GNU General Public License, incorporated herein by reference.
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
     8
3893
6b4127c7d52a Simplify i18n imports
Matt Mackall <mpm@selenic.com>
parents: 3886
diff changeset
     9
from mercurial.i18n import _
3886
abaee83ce0a6 Replace demandload with new demandimport
Matt Mackall <mpm@selenic.com>
parents: 3646
diff changeset
    10
from mercurial import hg, util, commands, cmdutil
abaee83ce0a6 Replace demandload with new demandimport
Matt Mackall <mpm@selenic.com>
parents: 3646
diff changeset
    11
import os, sys, sets
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    12
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    13
versionstr = "0.0.3"
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    14
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    15
def lookup_rev(ui, repo, rev=None):
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    16
    """returns rev or the checked-out revision if rev is None"""
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    17
    if not rev is None:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    18
        return repo.lookup(rev)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    19
    parents = [p for p in repo.dirstate.parents() if p != hg.nullid]
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    20
    if len(parents) != 1:
2348
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
    21
        raise util.Abort(_("unexpected number of parents, "
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
    22
                           "please commit or revert"))
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    23
    return parents.pop()
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    24
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    25
def check_clean(ui, repo):
2874
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2822
diff changeset
    26
    modified, added, removed, deleted, unknown = repo.status()[:5]
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2822
diff changeset
    27
    if modified or added or removed:
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2822
diff changeset
    28
        ui.warn("Repository is not clean, please commit or revert\n")
3d6efcbbd1c9 remove localrepository.changes.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2822
diff changeset
    29
        sys.exit(1)
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    30
1559
59b3639df0a9 Convert all classes to new-style classes by deriving them from object.
Eric Hopper <hopper@omnifarious.org>
parents: 1367
diff changeset
    31
class bisect(object):
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    32
    """dichotomic search in the DAG of changesets"""
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    33
    def __init__(self, ui, repo):
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    34
        self.repo = repo
1854
638b1bc6c6c9 Fixed contrib/hbisect.py to work with the new opener behaviour.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1748
diff changeset
    35
        self.path = repo.join("bisect")
638b1bc6c6c9 Fixed contrib/hbisect.py to work with the new opener behaviour.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1748
diff changeset
    36
        self.opener = util.opener(self.path)
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    37
        self.ui = ui
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    38
        self.goodrevs = []
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    39
        self.badrev = None
1854
638b1bc6c6c9 Fixed contrib/hbisect.py to work with the new opener behaviour.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1748
diff changeset
    40
        self.good_path = "good"
638b1bc6c6c9 Fixed contrib/hbisect.py to work with the new opener behaviour.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1748
diff changeset
    41
        self.bad_path = "bad"
5311
5b6e403601d1 bisect: do silent init if necessary
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 5160
diff changeset
    42
        self.is_reset = False
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    43
1854
638b1bc6c6c9 Fixed contrib/hbisect.py to work with the new opener behaviour.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1748
diff changeset
    44
        if os.path.exists(os.path.join(self.path, self.good_path)):
638b1bc6c6c9 Fixed contrib/hbisect.py to work with the new opener behaviour.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1748
diff changeset
    45
            self.goodrevs = self.opener(self.good_path).read().splitlines()
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    46
            self.goodrevs = [hg.bin(x) for x in self.goodrevs]
1854
638b1bc6c6c9 Fixed contrib/hbisect.py to work with the new opener behaviour.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1748
diff changeset
    47
        if os.path.exists(os.path.join(self.path, self.bad_path)):
638b1bc6c6c9 Fixed contrib/hbisect.py to work with the new opener behaviour.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1748
diff changeset
    48
            r = self.opener(self.bad_path).read().splitlines()
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    49
            if r:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    50
                self.badrev = hg.bin(r.pop(0))
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    51
2734
07026da25ed8 hbisect.py: don't rely on __del__ to write the current state.
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 2348
diff changeset
    52
    def write(self):
5311
5b6e403601d1 bisect: do silent init if necessary
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 5160
diff changeset
    53
        if self.is_reset:
5b6e403601d1 bisect: do silent init if necessary
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 5160
diff changeset
    54
            return
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    55
        if not os.path.isdir(self.path):
5311
5b6e403601d1 bisect: do silent init if necessary
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 5160
diff changeset
    56
            os.mkdir(self.path)
1854
638b1bc6c6c9 Fixed contrib/hbisect.py to work with the new opener behaviour.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1748
diff changeset
    57
        f = self.opener(self.good_path, "w")
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    58
        f.write("\n".join([hg.hex(r) for r in  self.goodrevs]))
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    59
        if len(self.goodrevs) > 0:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    60
            f.write("\n")
1854
638b1bc6c6c9 Fixed contrib/hbisect.py to work with the new opener behaviour.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1748
diff changeset
    61
        f = self.opener(self.bad_path, "w")
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    62
        if self.badrev:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    63
            f.write(hg.hex(self.badrev) + "\n")
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    64
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    65
    def init(self):
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    66
        """start a new bisection"""
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    67
        if os.path.isdir(self.path):
2348
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
    68
            raise util.Abort(_("bisect directory already exists\n"))
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    69
        os.mkdir(self.path)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    70
        check_clean(self.ui, self.repo)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    71
        return 0
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    72
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    73
    def reset(self):
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    74
        """finish a bisection"""
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    75
        if os.path.isdir(self.path):
1854
638b1bc6c6c9 Fixed contrib/hbisect.py to work with the new opener behaviour.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1748
diff changeset
    76
            sl = [os.path.join(self.path, p)
638b1bc6c6c9 Fixed contrib/hbisect.py to work with the new opener behaviour.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1748
diff changeset
    77
                  for p in [self.bad_path, self.good_path]]
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    78
            for s in sl:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    79
                if os.path.exists(s):
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    80
                    os.unlink(s)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    81
            os.rmdir(self.path)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    82
        # Not sure about this
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    83
        #self.ui.write("Going back to tip\n")
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    84
        #self.repo.update(self.repo.changelog.tip())
5311
5b6e403601d1 bisect: do silent init if necessary
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 5160
diff changeset
    85
        self.is_reset = True
5160
c13610d5642c Return 0 as 'hg bisect reset' is successful
Guillaume Chazarain <guichaz@yahoo.fr>
parents: 4497
diff changeset
    86
        return 0
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    87
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    88
    def num_ancestors(self, head=None, stop=None):
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    89
        """
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    90
        returns a dict with the mapping:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    91
        node -> number of ancestors (self included)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    92
        for all nodes who are ancestor of head and
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    93
        not in stop.
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    94
        """
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    95
        if head is None:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    96
            head = self.badrev
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    97
        return self.__ancestors_and_nb_ancestors(head, stop)[1]
1855
0ba9dee8cfbd Fixed spacing/indentation, removed #! script header, added short description.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1854
diff changeset
    98
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
    99
    def ancestors(self, head=None, stop=None):
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   100
        """
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   101
        returns the set of the ancestors of head (self included)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   102
        who are not in stop.
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   103
        """
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   104
        if head is None:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   105
            head = self.badrev
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   106
        return self.__ancestors_and_nb_ancestors(head, stop)[0]
1855
0ba9dee8cfbd Fixed spacing/indentation, removed #! script header, added short description.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1854
diff changeset
   107
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   108
    def __ancestors_and_nb_ancestors(self, head, stop=None):
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   109
        """
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   110
        if stop is None then ancestors of goodrevs are used as
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   111
        lower limit.
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   112
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   113
        returns (anc, n_child) where anc is the set of the ancestors of head
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   114
        and n_child is a dictionary with the following mapping:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   115
        node -> number of ancestors (self included)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   116
        """
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   117
        cl = self.repo.changelog
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   118
        if not stop:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   119
            stop = sets.Set([])
1856
b8bd84ad9b67 Make bisect extension work with python2.3
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1855
diff changeset
   120
            for i in xrange(len(self.goodrevs)-1, -1, -1):
b8bd84ad9b67 Make bisect extension work with python2.3
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1855
diff changeset
   121
                g = self.goodrevs[i]
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   122
                if g in stop:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   123
                    continue
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   124
                stop.update(cl.reachable(g))
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   125
        def num_children(a):
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   126
            """
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   127
            returns a dictionnary with the following mapping
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   128
            node -> [number of children, empty set]
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   129
            """
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   130
            d = {a: [0, sets.Set([])]}
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   131
            for i in xrange(cl.rev(a)+1):
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   132
                n = cl.node(i)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   133
                if not d.has_key(n):
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   134
                    d[n] = [0, sets.Set([])]
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   135
                parents = [p for p in cl.parents(n) if p != hg.nullid]
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   136
                for p in parents:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   137
                    d[p][0] += 1
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   138
            return d
1855
0ba9dee8cfbd Fixed spacing/indentation, removed #! script header, added short description.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1854
diff changeset
   139
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   140
        if head in stop:
4493
50a46ae14efb hbisect: fix a typo in error message
TK Soh <teekaysoh@yahoo.com>
parents: 3646
diff changeset
   141
            raise util.Abort(_("Inconsistent state, %s:%s is good and bad")
2348
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   142
                             % (cl.rev(head), hg.short(head)))
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   143
        n_child = num_children(head)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   144
        for i in xrange(cl.rev(head)+1):
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   145
            n = cl.node(i)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   146
            parents = [p for p in cl.parents(n) if p != hg.nullid]
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   147
            for p in parents:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   148
                n_child[p][0] -= 1
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   149
                if not n in stop:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   150
                    n_child[n][1].union_update(n_child[p][1])
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   151
                if n_child[p][0] == 0:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   152
                    n_child[p] = len(n_child[p][1])
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   153
            if not n in stop:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   154
                n_child[n][1].add(n)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   155
            if n_child[n][0] == 0:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   156
                if n == head:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   157
                    anc = n_child[n][1]
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   158
                n_child[n] = len(n_child[n][1])
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   159
        return anc, n_child
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   160
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   161
    def next(self):
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   162
        if not self.badrev:
2348
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   163
            raise util.Abort(_("You should give at least one bad revision"))
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   164
        if not self.goodrevs:
2348
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   165
            self.ui.warn(_("No good revision given\n"))
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   166
            self.ui.warn(_("Marking the first revision as good\n"))
1855
0ba9dee8cfbd Fixed spacing/indentation, removed #! script header, added short description.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1854
diff changeset
   167
        ancestors, num_ancestors = self.__ancestors_and_nb_ancestors(
0ba9dee8cfbd Fixed spacing/indentation, removed #! script header, added short description.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1854
diff changeset
   168
                                    self.badrev)
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   169
        tot = len(ancestors)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   170
        if tot == 1:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   171
            if ancestors.pop() != self.badrev:
2348
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   172
                raise util.Abort(_("Could not find the first bad revision"))
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   173
            self.ui.write(_("The first bad revision is:\n"))
3646
b4ad640a3bcf templates: move changeset templating bits to cmdutils
Matt Mackall <mpm@selenic.com>
parents: 2874
diff changeset
   174
            displayer = cmdutil.show_changeset(self.ui, self.repo, {})
2348
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   175
            displayer.show(changenode=self.badrev)
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   176
            return None
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   177
        best_rev = None
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   178
        best_len = -1
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   179
        for n in ancestors:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   180
            l = num_ancestors[n]
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   181
            l = min(l, tot - l)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   182
            if l > best_len:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   183
                best_len = l
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   184
                best_rev = n
2348
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   185
        assert best_rev is not None
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   186
        nb_tests = 0
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   187
        q, r = divmod(tot, 2)
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   188
        while q:
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   189
            nb_tests += 1
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   190
            q, r = divmod(q, 2)
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   191
        msg = _("Testing changeset %s:%s (%s changesets remaining, "
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   192
                "~%s tests)\n") % (self.repo.changelog.rev(best_rev),
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   193
                                   hg.short(best_rev), tot, nb_tests)
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   194
        self.ui.write(msg)
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   195
        return best_rev
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   196
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   197
    def autonext(self):
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   198
        """find and update to the next revision to test"""
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   199
        check_clean(self.ui, self.repo)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   200
        rev = self.next()
2348
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   201
        if rev is not None:
2822
30f59f4a327e Introduce update helper functions: update, merge, clean, and revert
Matt Mackall <mpm@selenic.com>
parents: 2819
diff changeset
   202
            return hg.clean(self.repo, rev)
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   203
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   204
    def good(self, rev):
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   205
        self.goodrevs.append(rev)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   206
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   207
    def autogood(self, rev=None):
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   208
        """mark revision as good and update to the next revision to test"""
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   209
        check_clean(self.ui, self.repo)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   210
        rev = lookup_rev(self.ui, self.repo, rev)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   211
        self.good(rev)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   212
        if self.badrev:
2348
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   213
            return self.autonext()
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   214
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   215
    def bad(self, rev):
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   216
        self.badrev = rev
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   217
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   218
    def autobad(self, rev=None):
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   219
        """mark revision as bad and update to the next revision to test"""
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   220
        check_clean(self.ui, self.repo)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   221
        rev = lookup_rev(self.ui, self.repo, rev)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   222
        self.bad(rev)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   223
        if self.goodrevs:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   224
            self.autonext()
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   225
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   226
# should we put it in the class ?
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   227
def test(ui, repo, rev):
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   228
    """test the bisection code"""
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   229
    b = bisect(ui, repo)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   230
    rev = repo.lookup(rev)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   231
    ui.write("testing with rev %s\n" % hg.hex(rev))
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   232
    anc = b.ancestors()
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   233
    while len(anc) > 1:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   234
        if not rev in anc:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   235
            ui.warn("failure while bisecting\n")
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   236
            sys.exit(1)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   237
        ui.write("it worked :)\n")
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   238
        new_rev = b.next()
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   239
        ui.write("choosing if good or bad\n")
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   240
        if rev in b.ancestors(head=new_rev):
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   241
            b.bad(new_rev)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   242
            ui.write("it is bad\n")
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   243
        else:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   244
            b.good(new_rev)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   245
            ui.write("it is good\n")
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   246
        anc = b.ancestors()
2348
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   247
        #repo.update(new_rev, force=True)
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   248
    for v in anc:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   249
        if v != rev:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   250
            ui.warn("fail to found cset! :(\n")
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   251
            return 1
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   252
    ui.write("Found bad cset: %s\n" % hg.hex(b.badrev))
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   253
    ui.write("Everything is ok :)\n")
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   254
    return 0
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   255
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   256
def bisect_run(ui, repo, cmd=None, *args):
4390
052062b98f26 Flesh out bisect help text
Brendan Cully <brendan@kublai.com>
parents: 3893
diff changeset
   257
    """Dichotomic search in the DAG of changesets
052062b98f26 Flesh out bisect help text
Brendan Cully <brendan@kublai.com>
parents: 3893
diff changeset
   258
052062b98f26 Flesh out bisect help text
Brendan Cully <brendan@kublai.com>
parents: 3893
diff changeset
   259
This extension helps to find changesets which cause problems.
052062b98f26 Flesh out bisect help text
Brendan Cully <brendan@kublai.com>
parents: 3893
diff changeset
   260
To use, mark the earliest changeset you know introduces the problem
052062b98f26 Flesh out bisect help text
Brendan Cully <brendan@kublai.com>
parents: 3893
diff changeset
   261
as bad, then mark the latest changeset which is free from the problem
052062b98f26 Flesh out bisect help text
Brendan Cully <brendan@kublai.com>
parents: 3893
diff changeset
   262
as good. Bisect will update your working directory to a revision for
052062b98f26 Flesh out bisect help text
Brendan Cully <brendan@kublai.com>
parents: 3893
diff changeset
   263
testing. Once you have performed tests, mark the working directory
052062b98f26 Flesh out bisect help text
Brendan Cully <brendan@kublai.com>
parents: 3893
diff changeset
   264
as bad or good and bisect will either update to another candidate
052062b98f26 Flesh out bisect help text
Brendan Cully <brendan@kublai.com>
parents: 3893
diff changeset
   265
changeset or announce that it has found the bad revision.
052062b98f26 Flesh out bisect help text
Brendan Cully <brendan@kublai.com>
parents: 3893
diff changeset
   266
052062b98f26 Flesh out bisect help text
Brendan Cully <brendan@kublai.com>
parents: 3893
diff changeset
   267
Note: bisect expects bad revisions to be descendants of good revisions.
052062b98f26 Flesh out bisect help text
Brendan Cully <brendan@kublai.com>
parents: 3893
diff changeset
   268
If you are looking for the point at which a problem was fixed, then make
052062b98f26 Flesh out bisect help text
Brendan Cully <brendan@kublai.com>
parents: 3893
diff changeset
   269
the problem-free state "bad" and the problematic state "good."
052062b98f26 Flesh out bisect help text
Brendan Cully <brendan@kublai.com>
parents: 3893
diff changeset
   270
052062b98f26 Flesh out bisect help text
Brendan Cully <brendan@kublai.com>
parents: 3893
diff changeset
   271
For subcommands see "hg bisect help\"
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   272
    """
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   273
    def help_(cmd=None, *args):
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   274
        """show help for a given bisect subcommand or all subcommands"""
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   275
        cmdtable = bisectcmdtable
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   276
        if cmd:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   277
            doc = cmdtable[cmd][0].__doc__
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   278
            synopsis = cmdtable[cmd][2]
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   279
            ui.write(synopsis + "\n")
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   280
            ui.write("\n" + doc + "\n")
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   281
            return
2348
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   282
        ui.write(_("list of subcommands for the bisect extension\n\n"))
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   283
        cmds = cmdtable.keys()
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   284
        cmds.sort()
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   285
        m = max([len(c) for c in cmds])
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   286
        for cmd in cmds:
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   287
            doc = cmdtable[cmd][0].__doc__.splitlines(0)[0].rstrip()
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   288
            ui.write(" %-*s   %s\n" % (m, cmd, doc))
1855
0ba9dee8cfbd Fixed spacing/indentation, removed #! script header, added short description.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1854
diff changeset
   289
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   290
    b = bisect(ui, repo)
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   291
    bisectcmdtable = {
2348
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   292
        "init": (b.init, 0, _("hg bisect init")),
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   293
        "bad": (b.autobad, 1, _("hg bisect bad [<rev>]")),
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   294
        "good": (b.autogood, 1, _("hg bisect good [<rev>]")),
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   295
        "next": (b.autonext, 0, _("hg bisect next")),
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   296
        "reset": (b.reset, 0, _("hg bisect reset")),
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   297
        "help": (help_, 1, _("hg bisect help [<subcommand>]")),
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   298
    }
1855
0ba9dee8cfbd Fixed spacing/indentation, removed #! script header, added short description.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1854
diff changeset
   299
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   300
    if not bisectcmdtable.has_key(cmd):
2348
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   301
        ui.warn(_("bisect: Unknown sub-command\n"))
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   302
        return help_()
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   303
    if len(args) > bisectcmdtable[cmd][1]:
2348
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   304
        ui.warn(_("bisect: Too many arguments\n"))
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   305
        return help_()
5316
121816063b9a bisect: remove useless try/except
Patrick Mezard <pmezard@gmail.com>
parents: 5312
diff changeset
   306
    ret = bisectcmdtable[cmd][0](*args)
121816063b9a bisect: remove useless try/except
Patrick Mezard <pmezard@gmail.com>
parents: 5312
diff changeset
   307
    b.write()
121816063b9a bisect: remove useless try/except
Patrick Mezard <pmezard@gmail.com>
parents: 5312
diff changeset
   308
    return ret
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   309
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   310
cmdtable = {
2348
1772852d7d14 better ui for the bisect extension
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2305
diff changeset
   311
    "bisect": (bisect_run, [], _("hg bisect [help|init|reset|next|good|bad]")),
1367
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   312
    #"bisect-test": (test, [], "hg bisect-test rev"),
a7678cbd7c28 bisect extension for mercurial
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
diff changeset
   313
}