comparison git_handler.py @ 37:7046d792dfcd

fix bug where it was not writing the git object names properly properly gathers list of needed shas to create packfile, updates server on send-pack next: create and send packfile
author Scott Chacon <schacon@gmail.com>
date Tue, 28 Apr 2009 12:46:51 -0700 (2009-04-28)
parents 562fc51b991e
children f0daee676e10
comparison
equal deleted inserted replaced
36:c13c5f8e03fd 37:7046d792dfcd
152 parents = self.repo.parents(rev) 152 parents = self.repo.parents(rev)
153 for parent in parents: 153 for parent in parents:
154 p_rev = parent.rev() 154 p_rev = parent.rev()
155 hgsha = hex(parent.node()) 155 hgsha = hex(parent.node())
156 git_sha = self.map_git_get(hgsha) 156 git_sha = self.map_git_get(hgsha)
157 if not git_sha: 157 if not p_rev == -1:
158 self.export_hg_commit(self, p_rev) 158 if not git_sha:
159 self.export_hg_commit(p_rev)
159 160
160 ctx = self.repo.changectx(rev) 161 ctx = self.repo.changectx(rev)
161 tree_sha = self.write_git_tree(ctx) 162 tree_sha = self.write_git_tree(ctx)
162 163
163 # TODO : something with tags? 164 # TODO : something with tags?
174 175
175 commit['parents'] = [] 176 commit['parents'] = []
176 for parent in parents: 177 for parent in parents:
177 hgsha = hex(parent.node()) 178 hgsha = hex(parent.node())
178 git_sha = self.map_git_get(hgsha) 179 git_sha = self.map_git_get(hgsha)
179 commit['parents'].append(git_sha) 180 if git_sha:
181 commit['parents'].append(git_sha)
180 182
181 commit_sha = self.git.write_commit_hash(commit) # writing new blobs to git 183 commit_sha = self.git.write_commit_hash(commit) # writing new blobs to git
182 self.map_set(commit_sha, phgsha) 184 self.map_set(commit_sha, phgsha)
183 return commit_sha 185 return commit_sha
184 186
251 return None 253 return None
252 254
253 def upload_pack(self, remote_name): 255 def upload_pack(self, remote_name):
254 git_url = self.remote_name_to_url(remote_name) 256 git_url = self.remote_name_to_url(remote_name)
255 client, path = self.get_transport_and_path(git_url) 257 client, path = self.get_transport_and_path(git_url)
258 changed = self.get_changed_refs
256 genpack = self.generate_pack_contents 259 genpack = self.generate_pack_contents
257 try: 260 try:
258 client.send_pack(path, genpack) 261 client.send_pack(path, changed, genpack)
259 # TODO : self.git.set_remote_refs(refs, remote_name) 262 # TODO : self.git.set_remote_refs(refs, remote_name)
260 except: 263 except:
261 raise 264 raise
262 265
263 def generate_pack_contents(self, want, have, none): 266 # TODO : for now, we'll just push all heads
264 print "WANT: " + str(want) 267 # * we should have specified push, tracking branches and --all
265 print "HAVE: " + str(have) 268 # takes a dict of refs:shas from the server and returns what should be
266 print "NONE: " + str(none) 269 # pushed up
270 def get_changed_refs(self, refs):
271 keys = refs.keys()
272 if not keys:
273 return None
274 changed = []
275 for ref_name in keys:
276 parts = ref_name.split('/')
277 if parts[0] == 'refs': # strip off 'refs/heads'
278 if parts[1] == 'heads':
279 head = "/".join([v for v in parts[2:]])
280 print ref_name
281 print head
282 local_ref = self.git.ref(ref_name)
283 if local_ref:
284 if not local_ref == refs[ref_name]:
285 changed.append((refs[ref_name], local_ref, ref_name))
286 return changed
287
288 # takes a list of shas the server wants and shas the server has
289 # and generates a list of commit shas we need to push up
290 def generate_pack_contents(self, want, have):
291 graph_walker = SimpleFetchGraphWalker(want, self.git.get_parents)
292 next = graph_walker.next()
293 shas = []
294 while next:
295 if next in have:
296 graph_walker.ack(next)
297 else:
298 shas.append(next)
299 next = graph_walker.next()
300 return shas
267 301
268 def fetch_pack(self, remote_name): 302 def fetch_pack(self, remote_name):
269 git_url = self.remote_name_to_url(remote_name) 303 git_url = self.remote_name_to_url(remote_name)
270 client, path = self.get_transport_and_path(git_url) 304 client, path = self.get_transport_and_path(git_url)
271 graphwalker = SimpleFetchGraphWalker(self.git.heads().values(), self.git.get_parents) 305 graphwalker = SimpleFetchGraphWalker(self.git.heads().values(), self.git.get_parents)