tag: don't allow tags to non-existent objects These indicate an inconsistency in the repository which we've created, so don't allow them. Signed-off-by: Carlos Martín Nieto <cmn@elego.de>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
diff --git a/src/tag.c b/src/tag.c
index 994389c..bd9ddda 100644
--- a/src/tag.c
+++ b/src/tag.c
@@ -209,6 +209,9 @@ static int tag_create(
return error;
}
+ if (!git_odb_exists(repo->db, target))
+ return GIT_ENOTFOUND;
+
/* Try to find out what the type is */
if (target_type == GIT_OBJ_ANY) {
size_t _unused;
diff --git a/tests/t08-tag.c b/tests/t08-tag.c
index e701648..62c65a3 100644
--- a/tests/t08-tag.c
+++ b/tests/t08-tag.c
@@ -119,7 +119,7 @@ BEGIN_TEST(write0, "write a tag to the repository and read it again")
END_TEST
-BEGIN_TEST(write1, "write a tag to the repository which points to an unknown oid and read it again")
+BEGIN_TEST(write1, "write a tag to the repository which points to an unknown oid should fail")
git_repository *repo;
git_tag *tag;
git_oid target_id, tag_id;
@@ -135,7 +135,7 @@ BEGIN_TEST(write1, "write a tag to the repository which points to an unknown oid
tagger = git_signature_new(TAGGER_NAME, TAGGER_EMAIL, 123456789, 60);
must_be_true(tagger != NULL);
- must_pass(git_tag_create(
+ must_fail(git_tag_create(
&tag_id, /* out id */
repo,
"the-zombie-tag",
@@ -146,17 +146,6 @@ BEGIN_TEST(write1, "write a tag to the repository which points to an unknown oid
git_signature_free((git_signature *)tagger);
- must_pass(git_tag_lookup(&tag, repo, &tag_id));
-
- /* The non existent target can not be looked up */
- must_fail(git_tag_target(&zombie, tag));
-
- must_pass(git_reference_lookup(&ref_tag, repo, "refs/tags/the-zombie-tag"));
-
- must_pass(git_reference_delete(ref_tag));
- must_pass(remove_loose_object(REPOSITORY_FOLDER, (git_object *)tag));
-
- git_tag_close(tag);
git_repository_free(repo);
END_TEST