summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Martín Nieto <cmn@elego.de>2011-03-24 14:15:00 +0100
committerVicent Marti <tanoku@gmail.com>2011-03-29 19:58:19 +0300
commit83c95128d924b029b30551f95170df8696583e10 (patch)
treeabb017f5070e8b7f4e5f0b2db6628c699c46cdb1
parent9a53df7e0ac364ccba5bd11e9d6c62091f564397 (diff)
downloadlibgit2-83c95128d924b029b30551f95170df8696583e10.tar.gz
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>
-rw-r--r--src/refs.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/refs.c b/src/refs.c
index 81706952a..9661988cc 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;