hgext/convert/git.py
changeset 4760 2d0a823cbba5
parent 4753 07efcce17d28
child 4761 f52bfe566583
equal deleted inserted replaced
4759:95cbb6b74790 4760:2d0a823cbba5
     3 import os
     3 import os
     4 
     4 
     5 from common import NoRepo, commit, converter_source
     5 from common import NoRepo, commit, converter_source
     6 
     6 
     7 class convert_git(converter_source):
     7 class convert_git(converter_source):
       
     8     def gitcmd(self, s):
       
     9         return os.popen('GIT_DIR=%s %s' % (self.path, s))
       
    10 
     8     def __init__(self, ui, path, rev=None):
    11     def __init__(self, ui, path, rev=None):
     9         if os.path.isdir(path + "/.git"):
    12         if os.path.isdir(path + "/.git"):
    10             path += "/.git"
    13             path += "/.git"
    11         if not os.path.exists(path + "/objects"):
    14         if not os.path.exists(path + "/objects"):
    12             raise NoRepo("couldn't open GIT repo %s" % path)
    15             raise NoRepo("couldn't open GIT repo %s" % path)
    16         self.rev = rev
    19         self.rev = rev
    17         self.encoding = 'utf-8'
    20         self.encoding = 'utf-8'
    18 
    21 
    19     def getheads(self):
    22     def getheads(self):
    20         rev = self.rev or 'HEAD'
    23         rev = self.rev or 'HEAD'
    21         fh = os.popen("GIT_DIR=%s git-rev-parse --verify %s" % (self.path, rev))
    24         fh = self.gitcmd("git-rev-parse --verify %s" % rev)
    22         return [fh.read()[:-1]]
    25         return [fh.read()[:-1]]
    23 
    26 
    24     def catfile(self, rev, type):
    27     def catfile(self, rev, type):
    25         if rev == "0" * 40: raise IOError()
    28         if rev == "0" * 40: raise IOError()
    26         fh = os.popen("GIT_DIR=%s git-cat-file %s %s 2>/dev/null"
    29         fh = self.gitcmd("git-cat-file %s %s 2>/dev/null" % (type, rev))
    27                       % (self.path, type, rev))
       
    28         return fh.read()
    30         return fh.read()
    29 
    31 
    30     def getfile(self, name, rev):
    32     def getfile(self, name, rev):
    31         return self.catfile(rev, "blob")
    33         return self.catfile(rev, "blob")
    32 
    34 
    33     def getmode(self, name, rev):
    35     def getmode(self, name, rev):
    34         return self.modecache[(name, rev)]
    36         return self.modecache[(name, rev)]
    35 
    37 
    36     def getchanges(self, version):
    38     def getchanges(self, version):
    37         self.modecache = {}
    39         self.modecache = {}
    38         fh = os.popen("GIT_DIR=%s git-diff-tree --root -m -r %s"
    40         fh = self.gitcmd("git-diff-tree --root -m -r %s" % version)
    39                       % (self.path, version))
       
    40         changes = []
    41         changes = []
    41         for l in fh:
    42         for l in fh:
    42             if "\t" not in l: continue
    43             if "\t" not in l: continue
    43             m, f = l[:-1].split("\t")
    44             m, f = l[:-1].split("\t")
    44             m = m.split()
    45             m = m.split()
    82         c = commit(parents=parents, date=date, author=author, desc=message)
    83         c = commit(parents=parents, date=date, author=author, desc=message)
    83         return c
    84         return c
    84 
    85 
    85     def gettags(self):
    86     def gettags(self):
    86         tags = {}
    87         tags = {}
    87         fh = os.popen('git-ls-remote --tags "%s" 2>/dev/null' % self.path)
    88         fh = self.gitcmd('git-ls-remote --tags "%s" 2>/dev/null' % self.path)
    88         prefix = 'refs/tags/'
    89         prefix = 'refs/tags/'
    89         for line in fh:
    90         for line in fh:
    90             line = line.strip()
    91             line = line.strip()
    91             if not line.endswith("^{}"):
    92             if not line.endswith("^{}"):
    92                 continue
    93                 continue