Mercurial > hg-git
changeset 184:7bf98d3085f4
Fix remote branch hadling to use the hgrc [paths] section
author | Abderrahim Kitouni <a.kitouni@gmail.com> |
---|---|
date | Tue, 16 Jun 2009 14:44:19 +0100 |
parents | 469e80d3142a |
children | 1224d118ac92 |
files | git_handler.py |
diffstat | 1 files changed, 44 insertions(+), 23 deletions(-) [+] |
line wrap: on
line diff
--- a/git_handler.py Tue Jun 16 13:39:11 2009 +0100 +++ b/git_handler.py Tue Jun 16 14:44:19 2009 +0100 @@ -31,7 +31,8 @@ self.importbranch = ui.config('git', 'importbranch') self.exportbranch = ui.config('git', 'exportbranch', 'refs/heads/master') - self.bookbranch = ui.config('git', 'bookbranch', '') + + self.paths = ui.configitems('paths') self.init_if_missing() self.load_git() @@ -81,13 +82,22 @@ self.import_git_objects(remote_name) self.save_map() - def fetch(self, remote_name): - self.ui.status(_("fetching from : %s\n") % remote_name) + def fetch(self, remote): + self.ui.status(_("fetching from : %s\n") % remote) self.export_git_objects() - refs = self.fetch_pack(remote_name) + refs = self.fetch_pack(remote) + remote_name = self.remote_name(remote) + if refs: self.import_git_objects(remote_name, refs) self.import_local_tags(refs) + self.update_hg_bookmarks(refs) + if remote_name: + self.update_remote_branches(remote_name, refs) + elif not self.paths: + # intial cloning + self.update_remote_branches('default', refs) + self.save_map() def export_commits(self, export_objects=True): @@ -420,8 +430,6 @@ if not self.map_hg_get(csha): # it's already here self.import_git_commit(commit) - self.update_hg_bookmarks(remote_name) - def import_git_commit(self, commit): self.ui.debug(_("importing: %s\n") % commit.id) # TODO : Do something less coarse-grained than try/except on the @@ -519,20 +527,21 @@ ## PACK UPLOADING AND FETCHING - def upload_pack(self, remote_name): - client, path = self.get_transport_and_path(remote_name) + def upload_pack(self, remote): + client, path = self.get_transport_and_path(remote) changed = self.get_changed_refs genpack = self.generate_pack_contents try: self.ui.status(_("creating and sending data\n")) changed_refs = client.send_pack(path, changed, genpack) - if changed_refs: + remote_name = self.remote_name(remote) + if remote_name and changed_refs: new_refs = {} for ref, sha in changed_refs.iteritems(): self.ui.status(" "+ remote_name + "::" + ref + " => GIT:" + sha[0:8] + "\n") new_refs[ref] = sha self.git.set_remote_refs(new_refs, remote_name) - self.update_hg_bookmarks(remote_name) + self.update_remote_branches(remote_name, new_refs) except: # TODO : remove try/except or do something useful here raise @@ -703,24 +712,22 @@ if sha: self.repo.tag(ref_name, hex_to_sha(sha), '', True, None, None) - def update_hg_bookmarks(self, remote_name): + def update_hg_bookmarks(self, refs): try: bms = bookmarks.parse(self.repo) - if remote_name: - heads = self.git.remote_refs(remote_name) - else: - branches = self.bookbranch.split(',') - heads = dict((i, self.git.ref(i.strip())) for i in branches) - - base_name = (remote_name + '/') if remote_name else '' + heads = dict([(ref[11:],refs[ref]) for ref in refs + if ref.startswith('refs/heads/')]) for head, sha in heads.iteritems(): - if not sha: - self.ui.warn(_("Could not resolve head %s.\n") % head) - continue hgsha = hex_to_sha(self.map_hg_get(sha)) - if not head == 'HEAD': - bms[base_name + head] = hgsha + if not head in bms: + # new branch + bms[head] = hgsha + else: + bm = self.repo[bms[head]] + if bm.ancestor(self.repo[hgsha]) == bm: + # fast forward + bms[head] = hgsha if heads: bookmarks.write(self.repo, bms) @@ -728,6 +735,15 @@ self.ui.warn(_('creating bookmarks failed, do you have' ' bookmarks enabled?\n')) + def update_remote_branches(self, remote_name, refs): + heads = dict([(ref[11:],refs[ref]) for ref in refs + if ref.startswith('refs/heads/')]) + + for head, sha in heads.iteritems(): + hgsha = hex_to_sha(self.map_hg_get(sha)) + tag = '%s/%s' % (remote_name, head) + self.repo.tag(tag, hgsha, '', True, None, None) + ## UTILITY FUNCTIONS def convert_git_int_mode(self, mode): @@ -769,6 +785,11 @@ extra[before] = urllib.unquote(after) return (message, renames, branch, files, extra) + def remote_name(self, remote): + names = [name for name, path in self.paths if path == remote] + if names: + return names[0] + def check_bookmarks(self): if self.ui.config('extensions', 'hgext.bookmarks') is not None: self.ui.warn("YOU NEED TO SETUP BOOKMARKS\n")