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""" |