Mercurial > hg > hg-git
diff hggit/git_handler.py @ 640: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 +++ b/hggit/git_handler.py @@ -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