Mercurial > hg > hg-git
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) |