comparison hgext/convert/git.py @ 10985:7fab6ae3f688 stable

convert/git: rename gitcmd() into gitopen() for readability
author Patrick Mezard <pmezard@gmail.com>
date Sun, 25 Apr 2010 22:32:27 +0200
parents 9f6731b03906
children 610f047326b9
comparison
equal deleted inserted replaced
10980:30ae8174a597 10985:7fab6ae3f688
14 class convert_git(converter_source): 14 class convert_git(converter_source):
15 # Windows does not support GIT_DIR= construct while other systems 15 # Windows does not support GIT_DIR= construct while other systems
16 # cannot remove environment variable. Just assume none have 16 # cannot remove environment variable. Just assume none have
17 # both issues. 17 # both issues.
18 if hasattr(os, 'unsetenv'): 18 if hasattr(os, 'unsetenv'):
19 def gitcmd(self, s): 19 def gitopen(self, s):
20 prevgitdir = os.environ.get('GIT_DIR') 20 prevgitdir = os.environ.get('GIT_DIR')
21 os.environ['GIT_DIR'] = self.path 21 os.environ['GIT_DIR'] = self.path
22 try: 22 try:
23 return util.popen(s, 'rb') 23 return util.popen(s, 'rb')
24 finally: 24 finally:
25 if prevgitdir is None: 25 if prevgitdir is None:
26 del os.environ['GIT_DIR'] 26 del os.environ['GIT_DIR']
27 else: 27 else:
28 os.environ['GIT_DIR'] = prevgitdir 28 os.environ['GIT_DIR'] = prevgitdir
29 else: 29 else:
30 def gitcmd(self, s): 30 def gitopen(self, s):
31 return util.popen('GIT_DIR=%s %s' % (self.path, s), 'rb') 31 return util.popen('GIT_DIR=%s %s' % (self.path, s), 'rb')
32 32
33 def __init__(self, ui, path, rev=None): 33 def __init__(self, ui, path, rev=None):
34 super(convert_git, self).__init__(ui, path, rev=rev) 34 super(convert_git, self).__init__(ui, path, rev=rev)
35 35
42 42
43 self.path = path 43 self.path = path
44 44
45 def getheads(self): 45 def getheads(self):
46 if not self.rev: 46 if not self.rev:
47 fh = self.gitcmd('git rev-parse --branches --remotes') 47 fh = self.gitopen('git rev-parse --branches --remotes')
48 return fh.read().splitlines() 48 return fh.read().splitlines()
49 else: 49 else:
50 fh = self.gitcmd("git rev-parse --verify %s" % self.rev) 50 fh = self.gitopen("git rev-parse --verify %s" % self.rev)
51 return [fh.read()[:-1]] 51 return [fh.read()[:-1]]
52 52
53 def catfile(self, rev, type): 53 def catfile(self, rev, type):
54 if rev == "0" * 40: 54 if rev == "0" * 40:
55 raise IOError() 55 raise IOError()
56 fh = self.gitcmd("git cat-file %s %s" % (type, rev)) 56 fh = self.gitopen("git cat-file %s %s" % (type, rev))
57 return fh.read() 57 return fh.read()
58 58
59 def getfile(self, name, rev): 59 def getfile(self, name, rev):
60 return self.catfile(rev, "blob") 60 return self.catfile(rev, "blob")
61 61
62 def getmode(self, name, rev): 62 def getmode(self, name, rev):
63 return self.modecache[(name, rev)] 63 return self.modecache[(name, rev)]
64 64
65 def getchanges(self, version): 65 def getchanges(self, version):
66 self.modecache = {} 66 self.modecache = {}
67 fh = self.gitcmd("git diff-tree -z --root -m -r %s" % version) 67 fh = self.gitopen("git diff-tree -z --root -m -r %s" % version)
68 changes = [] 68 changes = []
69 seen = set() 69 seen = set()
70 entry = None 70 entry = None
71 for l in fh.read().split('\x00'): 71 for l in fh.read().split('\x00'):
72 if not entry: 72 if not entry:
121 rev=version) 121 rev=version)
122 return c 122 return c
123 123
124 def gettags(self): 124 def gettags(self):
125 tags = {} 125 tags = {}
126 fh = self.gitcmd('git ls-remote --tags "%s"' % self.path) 126 fh = self.gitopen('git ls-remote --tags "%s"' % self.path)
127 prefix = 'refs/tags/' 127 prefix = 'refs/tags/'
128 for line in fh: 128 for line in fh:
129 line = line.strip() 129 line = line.strip()
130 if not line.endswith("^{}"): 130 if not line.endswith("^{}"):
131 continue 131 continue
138 return tags 138 return tags
139 139
140 def getchangedfiles(self, version, i): 140 def getchangedfiles(self, version, i):
141 changes = [] 141 changes = []
142 if i is None: 142 if i is None:
143 fh = self.gitcmd("git diff-tree --root -m -r %s" % version) 143 fh = self.gitopen("git diff-tree --root -m -r %s" % version)
144 for l in fh: 144 for l in fh:
145 if "\t" not in l: 145 if "\t" not in l:
146 continue 146 continue
147 m, f = l[:-1].split("\t") 147 m, f = l[:-1].split("\t")
148 changes.append(f) 148 changes.append(f)
149 fh.close() 149 fh.close()
150 else: 150 else:
151 fh = self.gitcmd('git diff-tree --name-only --root -r %s "%s^%s" --' 151 fh = self.gitopen('git diff-tree --name-only --root -r %s "%s^%s" --'
152 % (version, version, i + 1)) 152 % (version, version, i + 1))
153 changes = [f.rstrip('\n') for f in fh] 153 changes = [f.rstrip('\n') for f in fh]
154 fh.close() 154 fh.close()
155 155
156 return changes 156 return changes