# HG changeset patch # User Siddharth Agarwal # Date 1392406314 28800 # Node ID 42ca3ace9a0f0837ddf59c9aa88e7324481ccb5e # Parent f828d82c35dca8bc71a32825ce27783e94ce6474 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. diff --git a/hggit/git_handler.py b/hggit/git_handler.py --- 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