]> git.proxmox.com Git - libgit2.git/commitdiff
revparse: properly handle refnames containing a @
authornulltoken <emeric.fermas@gmail.com>
Thu, 18 Oct 2012 20:25:27 +0000 (22:25 +0200)
committernulltoken <emeric.fermas@gmail.com>
Thu, 18 Oct 2012 21:05:33 +0000 (23:05 +0200)
Fix #994

src/revparse.c
tests-clar/refs/isvalidname.c
tests-clar/refs/revparse.c

index 191f6374c9e4acbf88f65acf080fae7d83cdc625..83eea7d3fa00b95463f664768d337365ee863730 100644 (file)
@@ -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:
index 99761de3202015e965f69ba92b6fb0570fb9a0f2..8a31f5cbed8cdfcbda102e3e9aace8521dea4b44 100644 (file)
@@ -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"));
 }
index 14bd9fb841314da0f638e34f1c5b8720eea0cd02..a1f0dbf2b79578d9d1539687f7d4f105dbb3d8a9 100644 (file)
@@ -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();
+}