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")