hgext/convert/git.py
changeset 5228 39e6deaa8b81
parent 4721 96614af3c679
child 5229 149742a628fd
equal deleted inserted replaced
5219:74723744d8e0 5228:39e6deaa8b81
    12             return s.decode("latin-1").encode("utf-8")
    12             return s.decode("latin-1").encode("utf-8")
    13         except:
    13         except:
    14             return s.decode("utf-8", "replace").encode("utf-8")
    14             return s.decode("utf-8", "replace").encode("utf-8")
    15 
    15 
    16 class convert_git(converter_source):
    16 class convert_git(converter_source):
       
    17     def gitcmd(self, s):
       
    18         return os.popen('GIT_DIR=%s %s' % (self.path, s))
       
    19     
    17     def __init__(self, ui, path):
    20     def __init__(self, ui, path):
    18         if os.path.isdir(path + "/.git"):
    21         if os.path.isdir(path + "/.git"):
    19             path += "/.git"
    22             path += "/.git"
    20         self.path = path
    23         self.path = path
    21         self.ui = ui
    24         self.ui = ui
    22         if not os.path.exists(path + "/objects"):
    25         if not os.path.exists(path + "/objects"):
    23             raise NoRepo("couldn't open GIT repo %s" % path)
    26             raise NoRepo("couldn't open GIT repo %s" % path)
    24 
    27 
    25     def getheads(self):
    28     def getheads(self):
    26         fh = os.popen("GIT_DIR=%s git-rev-parse --verify HEAD" % self.path)
    29         fh = self.gitcmd("git-rev-parse --verify HEAD")
    27         return [fh.read()[:-1]]
    30         return [fh.read()[:-1]]
    28 
    31 
    29     def catfile(self, rev, type):
    32     def catfile(self, rev, type):
    30         if rev == "0" * 40: raise IOError()
    33         if rev == "0" * 40: raise IOError()
    31         fh = os.popen("GIT_DIR=%s git-cat-file %s %s 2>/dev/null"
    34         fh = self.gitcmd("git-cat-file %s %s 2>/dev/null" % (type, rev))
    32                       % (self.path, type, rev))
       
    33         return fh.read()
    35         return fh.read()
    34 
    36 
    35     def getfile(self, name, rev):
    37     def getfile(self, name, rev):
    36         return self.catfile(rev, "blob")
    38         return self.catfile(rev, "blob")
    37 
    39 
    38     def getmode(self, name, rev):
    40     def getmode(self, name, rev):
    39         return self.modecache[(name, rev)]
    41         return self.modecache[(name, rev)]
    40 
    42 
    41     def getchanges(self, version):
    43     def getchanges(self, version):
    42         self.modecache = {}
    44         self.modecache = {}
    43         fh = os.popen("GIT_DIR=%s git-diff-tree --root -m -r %s"
    45         fh = self.gitcmd("git-diff-tree --root -m -r %s" % version)
    44                       % (self.path, version))
       
    45         changes = []
    46         changes = []
    46         for l in fh:
    47         for l in fh:
    47             if "\t" not in l: continue
    48             if "\t" not in l: continue
    48             m, f = l[:-1].split("\t")
    49             m, f = l[:-1].split("\t")
    49             m = m.split()
    50             m = m.split()
    87         c = commit(parents=parents, date=date, author=author, desc=message)
    88         c = commit(parents=parents, date=date, author=author, desc=message)
    88         return c
    89         return c
    89 
    90 
    90     def gettags(self):
    91     def gettags(self):
    91         tags = {}
    92         tags = {}
    92         fh = os.popen('git-ls-remote --tags "%s" 2>/dev/null' % self.path)
    93         fh = self.gitcmd('git-ls-remote --tags "%s" 2>/dev/null' % self.path)
    93         prefix = 'refs/tags/'
    94         prefix = 'refs/tags/'
    94         for line in fh:
    95         for line in fh:
    95             line = line.strip()
    96             line = line.strip()
    96             if not line.endswith("^{}"):
    97             if not line.endswith("^{}"):
    97                 continue
    98                 continue