hgext/transplant.py
changeset 12313 2912881c2a98
parent 12266 00658492e2aa
child 12331 40935b59518b
equal deleted inserted replaced
12312:83a310f2f14a 12313:2912881c2a98
    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')