From 5912d74c69fb1cbfcb5f57261543d8b7afcedef1 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Thu, 18 Oct 2012 22:25:27 +0200 Subject: [PATCH] revparse: properly handle refnames containing a @ Fix #994 --- src/revparse.c | 24 ++++++++++++++---------- tests-clar/refs/isvalidname.c | 1 + tests-clar/refs/revparse.c | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 10 deletions(-) diff --git a/src/revparse.c b/src/revparse.c index 191f6374c..83eea7d3f 100644 --- a/src/revparse.c +++ b/src/revparse.c @@ -795,20 +795,24 @@ int git_revparse_single(git_object **out, git_repository *repo, const char *spec case '@': { - git_object *temp_object = NULL; + if (spec[pos+1] == '{') { + git_object *temp_object = NULL; - if ((error = extract_curly_braces_content(&buf, spec, &pos)) < 0) - goto cleanup; + if ((error = extract_curly_braces_content(&buf, spec, &pos)) < 0) + goto cleanup; - if ((error = ensure_base_rev_is_not_known_yet(base_rev, spec)) < 0) - goto cleanup; + if ((error = ensure_base_rev_is_not_known_yet(base_rev, spec)) < 0) + goto cleanup; - if ((error = handle_at_syntax(&temp_object, &reference, spec, identifier_len, repo, git_buf_cstr(&buf))) < 0) - goto cleanup; + if ((error = handle_at_syntax(&temp_object, &reference, spec, identifier_len, repo, git_buf_cstr(&buf))) < 0) + goto cleanup; - if (temp_object != NULL) - base_rev = temp_object; - break; + if (temp_object != NULL) + base_rev = temp_object; + break; + } else { + /* Fall through */ + } } default: diff --git a/tests-clar/refs/isvalidname.c b/tests-clar/refs/isvalidname.c index 99761de32..8a31f5cbe 100644 --- a/tests-clar/refs/isvalidname.c +++ b/tests-clar/refs/isvalidname.c @@ -20,4 +20,5 @@ void test_refs_isvalidname__wont_hopefully_choke_on_valid_formats(void) cl_assert_equal_i(true, git_reference_is_valid_name("HEAD")); cl_assert_equal_i(true, git_reference_is_valid_name("ONE_LEVEL")); cl_assert_equal_i(true, git_reference_is_valid_name("refs/stash")); + cl_assert_equal_i(true, git_reference_is_valid_name("refs/remotes/origin/bim_with_3d@11296")); } diff --git a/tests-clar/refs/revparse.c b/tests-clar/refs/revparse.c index 14bd9fb84..a1f0dbf2b 100644 --- a/tests-clar/refs/revparse.c +++ b/tests-clar/refs/revparse.c @@ -451,3 +451,37 @@ void test_refs_revparse__a_too_short_objectid_returns_EAMBIGUOUS(void) cl_assert_equal_i(GIT_EAMBIGUOUS, result); } + +void test_refs_revparse__issue_994(void) +{ + git_repository *repo; + git_reference *head, *with_at; + git_object *target; + + repo = cl_git_sandbox_init("testrepo.git"); + + cl_assert_equal_i(GIT_ENOTFOUND, + git_revparse_single(&target, repo, "origin/bim_with_3d@11296")); + + cl_assert_equal_i(GIT_ENOTFOUND, + git_revparse_single(&target, repo, "refs/remotes/origin/bim_with_3d@11296")); + + + cl_git_pass(git_repository_head(&head, repo)); + cl_git_pass(git_reference_create_oid( + &with_at, + repo, + "refs/remotes/origin/bim_with_3d@11296", + git_reference_oid(head), + 0)); + + cl_git_pass(git_revparse_single(&target, repo, "origin/bim_with_3d@11296")); + git_object_free(target); + + cl_git_pass(git_revparse_single(&target, repo, "refs/remotes/origin/bim_with_3d@11296")); + git_object_free(target); + + git_reference_free(with_at); + git_reference_free(head); + cl_git_sandbox_cleanup(); +}