diff hggit/git_handler.py @ 639:42ca3ace9a0f

git_handler: return gitlinks in get_files_changed Currently, to figure out which gitlinks are in a repository we walk through the entire tree. This patch lets us use get_files_changed to detect which gitlinks have changed.
author Siddharth Agarwal <sid0@fb.com>
date Fri, 14 Feb 2014 11:31:54 -0800
parents f933e3930f78
children cacd98c7382e
line wrap: on
line diff
--- a/hggit/git_handler.py	Wed Feb 12 18:05:12 2014 -0800
+++ b/hggit/git_handler.py	Fri Feb 14 11:31:54 2014 -0800
@@ -675,8 +675,8 @@
         (strip_message, hg_renames,
          hg_branch, extra) = self.extract_hg_metadata(commit.message)
 
-        # get a list of the changed, added, removed files
-        files = self.get_files_changed(commit)
+        # get a list of the changed, added, removed files and gitlinks
+        files, gitlinks = self.get_files_changed(commit)
 
         # Handle gitlinks: collect
         gitlinks = self.collect_gitlinks(commit.tree)
@@ -1239,32 +1239,38 @@
 
         changes = self.git.object_store.tree_changes(btree, tree)
         files = {}
+        gitlinks = {}
         for (oldfile, newfile), (oldmode, newmode), (oldsha, newsha) in changes:
-            # don't create new submodules
+            # actions are described by the following table ('no' means 'does not
+            # exist'):
+            #    old        new     |    action
+            #     no        file    |  record file
+            #     no      gitlink   |  record gitlink
+            #    file        no     |  delete file
+            #    file       file    |  record file
+            #    file     gitlink   |  delete file and record gitlink
+            #  gitlink       no     |  delete gitlink
+            #  gitlink      file    |  delete gitlink and record file
+            #  gitlink    gitlink   |  record gitlink
             if newmode == 0160000:
-                if oldfile:
-                    # become a regular delete
-                    newfile, newmode = None, None
-                else:
-                    continue
-            # so old submodules shoudn't exist
-            if oldmode == 0160000:
-                if newfile:
-                    # become a regular add
-                    oldfile, oldmode = None, None
-                else:
-                    continue
+                # new = gitlink
+                gitlinks[newfile] = newsha
+                if oldmode is not None and oldmode != 0160000:
+                    # file -> gitlink
+                    files[oldfile] = True, None, None
+                continue
+            if oldmode == 0160000 and newmode != 0160000:
+                # gitlink -> no/file (gitlink -> gitlink is covered above)
+                gitlinks[oldfile] = None
+                continue
+            if newfile is not None:
+                # new = file
+                files[newfile] = False, newmode, newsha
+            else:
+                # old = file
+                files[oldfile] = True, None, None
 
-            if newfile is None:
-                file = oldfile
-                delete = True
-            else:
-                file = newfile
-                delete = False
-
-            files[file] = (delete, newmode, newsha)
-
-        return files
+        return files, gitlinks
 
     def collect_gitlinks(self, tree_id):
         """Walk the tree and collect all gitlink entries