Commit 8f90ced5ed79b445509a5be190add4e76d5bae3f

nulltoken 2011-03-03T19:55:48

Fix corner case in reference renaming Renaming a packed reference should not pack another reference which happens to be in both loose and pack state.

diff --git a/src/refs.c b/src/refs.c
index 5bbc777..8e24ba8 100644
--- a/src/refs.c
+++ b/src/refs.c
@@ -695,9 +695,18 @@ static int packed_remove_loose(git_repository *repo, git_vector *packing_list)
 	unsigned int i;
 	char full_path[GIT_PATH_MAX];
 	int error = GIT_SUCCESS;
+	git_reference *reference;
 
 	for (i = 0; i < packing_list->length; ++i) {
 		git_reference *ref = git_vector_get(packing_list, i);
+
+		/* Ensure the packed reference doesn't exist
+		 * in a (more up-to-date?) state as a loose reference
+		 */
+		reference = git_hashtable_lookup(ref->owner->references.loose_cache, ref->name);
+		if (reference != NULL)
+			continue;
+
 		git__joinpath(full_path, repo->path_repository, ref->name);
 
 		if (gitfo_exists(full_path) == GIT_SUCCESS &&