diff options
| author | Carlos Martín Nieto <cmn@elego.de> | 2011-03-24 14:15:00 +0100 |
|---|---|---|
| committer | Vicent Marti <tanoku@gmail.com> | 2011-03-29 19:58:19 +0300 |
| commit | 83c95128d924b029b30551f95170df8696583e10 (patch) | |
| tree | abb017f5070e8b7f4e5f0b2db6628c699c46cdb1 | |
| parent | 9a53df7e0ac364ccba5bd11e9d6c62091f564397 (diff) | |
| download | libgit2-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.c | 15 |
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; |
