contrib/hbisect.py
changeset 1854 638b1bc6c6c9
parent 1748 2428e6d66f06
child 1855 0ba9dee8cfbd
equal deleted inserted replaced
1853:5ac811b720de 1854:638b1bc6c6c9
     2 #
     2 #
     3 # This software may be used and distributed according to the terms
     3 # This software may be used and distributed according to the terms
     4 # of the GNU General Public License, incorporated herein by reference.
     4 # of the GNU General Public License, incorporated herein by reference.
     5 
     5 
     6 from mercurial.demandload import demandload
     6 from mercurial.demandload import demandload
     7 demandload(globals(), "os sys sets")
     7 demandload(globals(), "os sys sets mercurial:hg,util")
     8 from mercurial import hg
       
     9 
     8 
    10 versionstr = "0.0.3"
     9 versionstr = "0.0.3"
    11 
    10 
    12 def lookup_rev(ui, repo, rev=None):
    11 def lookup_rev(ui, repo, rev=None):
    13     """returns rev or the checked-out revision if rev is None"""
    12     """returns rev or the checked-out revision if rev is None"""
    28 
    27 
    29 class bisect(object):
    28 class bisect(object):
    30     """dichotomic search in the DAG of changesets"""
    29     """dichotomic search in the DAG of changesets"""
    31     def __init__(self, ui, repo):
    30     def __init__(self, ui, repo):
    32         self.repo = repo
    31         self.repo = repo
    33         self.path = os.path.join(repo.join(""), "bisect")
    32         self.path = repo.join("bisect")
       
    33         self.opener = util.opener(self.path)
    34         self.ui = ui
    34         self.ui = ui
    35         self.goodrevs = []
    35         self.goodrevs = []
    36         self.badrev = None
    36         self.badrev = None
    37         self.good_dirty = 0
    37         self.good_dirty = 0
    38         self.bad_dirty = 0
    38         self.bad_dirty = 0
    39         self.good_path = os.path.join(self.path, "good")
    39         self.good_path = "good"
    40         self.bad_path = os.path.join(self.path, "bad")
    40         self.bad_path = "bad"
    41 
    41 
    42         s = self.good_path
    42         if os.path.exists(os.path.join(self.path, self.good_path)):
    43         if os.path.exists(s):
    43             self.goodrevs = self.opener(self.good_path).read().splitlines()
    44             self.goodrevs = self.repo.opener(s).read().splitlines()
       
    45             self.goodrevs = [hg.bin(x) for x in self.goodrevs]
    44             self.goodrevs = [hg.bin(x) for x in self.goodrevs]
    46         s = self.bad_path
    45         if os.path.exists(os.path.join(self.path, self.bad_path)):
    47         if os.path.exists(s):
    46             r = self.opener(self.bad_path).read().splitlines()
    48             r = self.repo.opener(s).read().splitlines()
       
    49             if r:
    47             if r:
    50                 self.badrev = hg.bin(r.pop(0))
    48                 self.badrev = hg.bin(r.pop(0))
    51 
    49 
    52     def __del__(self):
    50     def __del__(self):
    53         if not os.path.isdir(self.path):
    51         if not os.path.isdir(self.path):
    54             return
    52             return
    55         f = self.repo.opener(self.good_path, "w")
    53         f = self.opener(self.good_path, "w")
    56         f.write("\n".join([hg.hex(r) for r in  self.goodrevs]))
    54         f.write("\n".join([hg.hex(r) for r in  self.goodrevs]))
    57         if len(self.goodrevs) > 0:
    55         if len(self.goodrevs) > 0:
    58             f.write("\n")
    56             f.write("\n")
    59         f = self.repo.opener(self.bad_path, "w")
    57         f = self.opener(self.bad_path, "w")
    60         if self.badrev:
    58         if self.badrev:
    61             f.write(hg.hex(self.badrev) + "\n")
    59             f.write(hg.hex(self.badrev) + "\n")
    62 
    60 
    63     def init(self):
    61     def init(self):
    64         """start a new bisection"""
    62         """start a new bisection"""
    70         return 0
    68         return 0
    71 
    69 
    72     def reset(self):
    70     def reset(self):
    73         """finish a bisection"""
    71         """finish a bisection"""
    74         if os.path.isdir(self.path):
    72         if os.path.isdir(self.path):
    75             sl = [self.bad_path, self.good_path]
    73             sl = [os.path.join(self.path, p)
       
    74                   for p in [self.bad_path, self.good_path]]
    76             for s in sl:
    75             for s in sl:
    77                 if os.path.exists(s):
    76                 if os.path.exists(s):
    78                     os.unlink(s)
    77                     os.unlink(s)
    79             os.rmdir(self.path)
    78             os.rmdir(self.path)
    80         # Not sure about this
    79         # Not sure about this