Merge pull request #7218 from KoviRobi/main

revparse: Allow `HEAD` abbreviation `@`
This commit is contained in:
Edward Thomson
2026-03-24 21:13:54 +00:00
committed by GitHub
2 changed files with 20 additions and 4 deletions

View File

@@ -894,6 +894,9 @@ static bool is_valid_normalized_name(const char *name, size_t len)
if (i == 0 && c == '^')
continue; /* The first character is allowed to be "^" for negative refspecs */
if (len == 1 && c == '@')
return true; /* Abbreviation for HEAD */
if ((c < 'A' || c > 'Z') && c != '_')
return false;
}
@@ -965,11 +968,16 @@ int git_reference__normalize_name(
process_flags &= ~GIT_REFERENCE_FORMAT_REFSPEC_PATTERN;
if (normalize) {
size_t cur_len = git_str_len(buf);
/* `<empty>@` (i.e. just `@`) is an alias for `HEAD` */
if (segments_count == 0 && segment_len == 1 && current[0] == '@') {
git_str_sets(buf, GIT_HEAD_FILE);
} else {
size_t cur_len = git_str_len(buf);
git_str_joinpath(buf, git_str_cstr(buf), current);
git_str_truncate(buf,
cur_len + segment_len + (segments_count ? 1 : 0));
git_str_joinpath(buf, git_str_cstr(buf), current);
git_str_truncate(buf,
cur_len + segment_len + (segments_count ? 1 : 0));
}
if (git_str_oom(buf)) {
error = -1;

View File

@@ -173,6 +173,14 @@ void test_refs_revparse__head(void)
test_object("master", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750");
}
void test_refs_revparse__head_abbrev(void)
{
test_object("@", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750");
test_object("@^0", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750");
test_object("@~0", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750");
test_object("master", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750");
}
void test_refs_revparse__full_refs(void)
{
test_object("refs/heads/master", "a65fedf39aefe402d3bb6e24df4d4f5fe4547750");