Commit 83c95128d924b029b30551f95170df8696583e10

Carlos Martín Nieto 2011-03-24T14:15:00

normalize_name: allow more references under refs/ Allow any well-formed reference name to live under refs/ removing the condition that they be under refs/{heads,tags,remotes}/ as was the design of git. An exception is made for HEAD which is allowed to contain an OID reference in detached HEAD state. Signed-off-by: Carlos Martín Nieto <cmn@elego.de>

diff --git a/src/refs.c b/src/refs.c
index 8170695..9661988 100644
--- a/src/refs.c
+++ b/src/refs.c
@@ -1680,8 +1680,9 @@ static int normalize_name(char *buffer_out, const char *name, int is_oid_ref)
 		*buffer_out++ = *current++;
 	}
 
-	/* Object id refname have to contain at least one slash */
-	if (is_oid_ref && !contains_a_slash)
+	/* Object id refname have to contain at least one slash, except
+	 * for HEAD in a detached state */
+	if (is_oid_ref && !contains_a_slash && strcmp(name, GIT_HEAD_FILE))
 				return GIT_EINVALIDREFNAME;
 
 	/* A refname can not end with ".lock" */
@@ -1690,9 +1691,13 @@ static int normalize_name(char *buffer_out, const char *name, int is_oid_ref)
 
 	*buffer_out = '\0';
 
-	/* For object id references, name has to start with refs/(heads|tags|remotes) */
-	if (is_oid_ref && !(!git__prefixcmp(buffer_out_start, GIT_REFS_HEADS_DIR) ||
-			!git__prefixcmp(buffer_out_start, GIT_REFS_TAGS_DIR) || !git__prefixcmp(buffer_out_start, GIT_REFS_REMOTES_DIR)))
+	/*
+	 * For object id references, name has to start with refs/. Again,
+	 * we need to allow HEAD to be in a detached state.
+	 */
+	if (is_oid_ref &&
+		!(git__prefixcmp(buffer_out_start, GIT_REFS_DIR) ||
+		  strcmp(buffer_out_start, GIT_HEAD_FILE)))
 		return GIT_EINVALIDREFNAME;
 
 	return error;