hgext/convert/hg.py
changeset 4534 cc9b79216a76
parent 4532 c3a78a49d7f0
child 4589 451e91ed535e
equal deleted inserted replaced
4533:36abb07c79d4 4534:cc9b79216a76
       
     1 # hg backend for convert extension
       
     2 
       
     3 import os, time
       
     4 from mercurial import hg
       
     5 
       
     6 from common import NoRepo, converter_sink
       
     7 
       
     8 class convert_mercurial(converter_sink):
       
     9     def __init__(self, ui, path):
       
    10         self.path = path
       
    11         self.ui = ui
       
    12         try:
       
    13             self.repo = hg.repository(self.ui, path)
       
    14         except:
       
    15             raise NoRepo("could open hg repo %s" % path)
       
    16 
       
    17     def mapfile(self):
       
    18         return os.path.join(self.path, ".hg", "shamap")
       
    19 
       
    20     def getheads(self):
       
    21         h = self.repo.changelog.heads()
       
    22         return [ hg.hex(x) for x in h ]
       
    23 
       
    24     def putfile(self, f, e, data):
       
    25         self.repo.wwrite(f, data, e)
       
    26         if self.repo.dirstate.state(f) == '?':
       
    27             self.repo.dirstate.update([f], "a")
       
    28 
       
    29     def delfile(self, f):
       
    30         try:
       
    31             os.unlink(self.repo.wjoin(f))
       
    32             #self.repo.remove([f])
       
    33         except:
       
    34             pass
       
    35 
       
    36     def putcommit(self, files, parents, commit):
       
    37         seen = {}
       
    38         pl = []
       
    39         for p in parents:
       
    40             if p not in seen:
       
    41                 pl.append(p)
       
    42                 seen[p] = 1
       
    43         parents = pl
       
    44 
       
    45         if len(parents) < 2: parents.append("0" * 40)
       
    46         if len(parents) < 2: parents.append("0" * 40)
       
    47         p2 = parents.pop(0)
       
    48 
       
    49         text = commit.desc
       
    50         extra = {}
       
    51         try:
       
    52             extra["branch"] = commit.branch
       
    53         except AttributeError:
       
    54             pass
       
    55 
       
    56         while parents:
       
    57             p1 = p2
       
    58             p2 = parents.pop(0)
       
    59             a = self.repo.rawcommit(files, text, commit.author, commit.date,
       
    60                                     hg.bin(p1), hg.bin(p2), extra=extra)
       
    61             text = "(octopus merge fixup)\n"
       
    62             p2 = hg.hex(self.repo.changelog.tip())
       
    63 
       
    64         return p2
       
    65 
       
    66     def puttags(self, tags):
       
    67         try:
       
    68             old = self.repo.wfile(".hgtags").read()
       
    69             oldlines = old.splitlines(1)
       
    70             oldlines.sort()
       
    71         except:
       
    72             oldlines = []
       
    73 
       
    74         k = tags.keys()
       
    75         k.sort()
       
    76         newlines = []
       
    77         for tag in k:
       
    78             newlines.append("%s %s\n" % (tags[tag], tag))
       
    79 
       
    80         newlines.sort()
       
    81 
       
    82         if newlines != oldlines:
       
    83             self.ui.status("updating tags\n")
       
    84             f = self.repo.wfile(".hgtags", "w")
       
    85             f.write("".join(newlines))
       
    86             f.close()
       
    87             if not oldlines: self.repo.add([".hgtags"])
       
    88             date = "%s 0" % int(time.mktime(time.gmtime()))
       
    89             self.repo.rawcommit([".hgtags"], "update tags", "convert-repo",
       
    90                                 date, self.repo.changelog.tip(), hg.nullid)
       
    91             return hg.hex(self.repo.changelog.tip())