hg pull very slow on a repository with a lot of tags and branches
Pulling from a repository that contains a lot of tags and branches (over 2000) is very slow even when there is nothing to do. E.g. the following output shows up quickly: ``` > hg pull pulling from git+https://redacted no changes found ``` Then I have to wait over 2 minutes for the command to complete and the shell prompt to return. I was able to trace the issue to [git_handler.py:1933](../../1.0.1/hggit/git_handler.py#L1933) and [git_handler.py:1937](../../1.0.1/hggit/git_handler.py#L1937) which get called for each ref and trigger a call to `fsync` inside dulwich. I was able to fix the issue by checking if we're really trying to set a new hash or if we're just rewriting the same one: ```patch @@ -1930,11 +1928,13 @@ remote_refs[remote_head] = bin(hgsha) # TODO(durin42): what is this doing? new_ref = REMOTE_BRANCH_PREFIX + remote_head - self.git.refs[new_ref] = sha + if self.git.refs.follow (new_ref)[1] != sha: + self.git.refs[new_ref] = sha elif ref_name.startswith( LOCAL_TAG_PREFIX ) and not ref_name.endswith(ANNOTATED_TAG_SUFFIX): - self.git.refs[ref_name] = sha + if self.git.refs.follow (ref_name)[1] != sha: + self.git.refs[ref_name] = sha if hgsha: all_remote_nodeids.append(bin(hgsha)) ```
issue