29 self.transplantfile = transplantfile |
29 self.transplantfile = transplantfile |
30 self.opener = opener |
30 self.opener = opener |
31 |
31 |
32 if not opener: |
32 if not opener: |
33 self.opener = util.opener(self.path) |
33 self.opener = util.opener(self.path) |
34 self.transplants = [] |
34 self.transplants = {} |
35 self.dirty = False |
35 self.dirty = False |
36 self.read() |
36 self.read() |
37 |
37 |
38 def read(self): |
38 def read(self): |
39 abspath = os.path.join(self.path, self.transplantfile) |
39 abspath = os.path.join(self.path, self.transplantfile) |
40 if self.transplantfile and os.path.exists(abspath): |
40 if self.transplantfile and os.path.exists(abspath): |
41 for line in self.opener(self.transplantfile).read().splitlines(): |
41 for line in self.opener(self.transplantfile).read().splitlines(): |
42 lnode, rnode = map(revlog.bin, line.split(':')) |
42 lnode, rnode = map(revlog.bin, line.split(':')) |
43 self.transplants.append(transplantentry(lnode, rnode)) |
43 list = self.transplants.setdefault(rnode, []) |
|
44 list.append(transplantentry(lnode, rnode)) |
44 |
45 |
45 def write(self): |
46 def write(self): |
46 if self.dirty and self.transplantfile: |
47 if self.dirty and self.transplantfile: |
47 if not os.path.isdir(self.path): |
48 if not os.path.isdir(self.path): |
48 os.mkdir(self.path) |
49 os.mkdir(self.path) |
49 fp = self.opener(self.transplantfile, 'w') |
50 fp = self.opener(self.transplantfile, 'w') |
50 for c in self.transplants: |
51 for l in self.transplants.itervalues(): |
51 l, r = map(revlog.hex, (c.lnode, c.rnode)) |
52 for c in l: |
52 fp.write(l + ':' + r + '\n') |
53 l, r = map(revlog.hex, (c.lnode, c.rnode)) |
|
54 fp.write(l + ':' + r + '\n') |
53 fp.close() |
55 fp.close() |
54 self.dirty = False |
56 self.dirty = False |
55 |
57 |
56 def get(self, rnode): |
58 def get(self, rnode): |
57 return [t for t in self.transplants if t.rnode == rnode] |
59 return self.transplants.get(rnode) or [] |
58 |
60 |
59 def set(self, lnode, rnode): |
61 def set(self, lnode, rnode): |
60 self.transplants.append(transplantentry(lnode, rnode)) |
62 list = self.transplants.setdefault(rnode, []) |
|
63 list.append(transplantentry(lnode, rnode)) |
61 self.dirty = True |
64 self.dirty = True |
62 |
65 |
63 def remove(self, transplant): |
66 def remove(self, transplant): |
64 del self.transplants[self.transplants.index(transplant)] |
67 list = self.transplants.get(transplant.rnode) |
65 self.dirty = True |
68 if list: |
|
69 del list[list.index(transplant)] |
|
70 self.dirty = True |
66 |
71 |
67 class transplanter(object): |
72 class transplanter(object): |
68 def __init__(self, ui, repo): |
73 def __init__(self, ui, repo): |
69 self.ui = ui |
74 self.ui = ui |
70 self.path = repo.join('transplant') |
75 self.path = repo.join('transplant') |