comparison hgext/convert/git.py @ 13756:6b7077df4aa5

convert: add bookmarks reading support to git backend
author Edouard Gomez <ed.gomez@free.fr>
date Fri, 25 Mar 2011 01:38:43 +0100
parents be9c4131a8f4
children fc004d16633f
comparison
equal deleted inserted replaced
13755:e45780ac8292 13756:6b7077df4aa5
15 class convert_git(converter_source): 15 class convert_git(converter_source):
16 # Windows does not support GIT_DIR= construct while other systems 16 # Windows does not support GIT_DIR= construct while other systems
17 # cannot remove environment variable. Just assume none have 17 # cannot remove environment variable. Just assume none have
18 # both issues. 18 # both issues.
19 if hasattr(os, 'unsetenv'): 19 if hasattr(os, 'unsetenv'):
20 def gitopen(self, s): 20 def gitopen(self, s, noerr=False):
21 prevgitdir = os.environ.get('GIT_DIR') 21 prevgitdir = os.environ.get('GIT_DIR')
22 os.environ['GIT_DIR'] = self.path 22 os.environ['GIT_DIR'] = self.path
23 try: 23 try:
24 return util.popen(s, 'rb') 24 if noerr:
25 (stdin, stdout, stderr) = util.popen3(s)
26 return stdout
27 else:
28 return util.popen(s, 'rb')
25 finally: 29 finally:
26 if prevgitdir is None: 30 if prevgitdir is None:
27 del os.environ['GIT_DIR'] 31 del os.environ['GIT_DIR']
28 else: 32 else:
29 os.environ['GIT_DIR'] = prevgitdir 33 os.environ['GIT_DIR'] = prevgitdir
30 else: 34 else:
31 def gitopen(self, s): 35 def gitopen(self, s, noerr=False):
32 return util.popen('GIT_DIR=%s %s' % (self.path, s), 'rb') 36 if noerr:
37 (sin, so, se) = util.popen3('GIT_DIR=%s %s' % (self.path, s))
38 return stdout
39 else:
40 util.popen('GIT_DIR=%s %s' % (self.path, s), 'rb')
33 41
34 def gitread(self, s): 42 def gitread(self, s):
35 fh = self.gitopen(s) 43 fh = self.gitopen(s)
36 data = fh.read() 44 data = fh.read()
37 return data, fh.close() 45 return data, fh.close()
166 changes = [f.rstrip('\n') for f in fh] 174 changes = [f.rstrip('\n') for f in fh]
167 if fh.close(): 175 if fh.close():
168 raise util.Abort(_('cannot read changes in %s') % version) 176 raise util.Abort(_('cannot read changes in %s') % version)
169 177
170 return changes 178 return changes
179
180 def getbookmarks(self):
181 bookmarks = {}
182
183 # Interesting references in git are prefixed
184 prefix = 'refs/heads/'
185 prefixlen = len(prefix)
186
187 # factor two commands
188 gitcmd = { 'remote/': 'git ls-remote --heads origin',
189 '': 'git show-ref'}
190
191 # Origin heads
192 for reftype in gitcmd:
193 try:
194 fh = self.gitopen(gitcmd[reftype], noerr=True)
195 for line in fh:
196 line = line.strip()
197 rev, name = line.split(None, 1)
198 if not name.startswith(prefix):
199 continue
200 name = '%s%s' % (reftype, name[prefixlen:])
201 bookmarks[name] = rev
202 except:
203 pass
204
205 return bookmarks