From 24cb87e2a68f550be9b9df8569796f8d491fed55 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Sun, 31 Mar 2013 13:27:43 +0200 Subject: [PATCH] tag: Fix parsing when no tagger nor message --- include/git2/tag.h | 4 +-- src/tag.c | 2 +- tests-clar/network/fetchlocal.c | 4 +-- tests-clar/network/remote/local.c | 4 +-- tests-clar/object/tag/read.c | 23 ++++++++++++++++++ tests-clar/odb/foreach.c | 6 ++--- tests-clar/refs/foreachglob.c | 4 +-- .../4a/23e2e65ad4e31c4c9db7dc746650bfad082679 | Bin 0 -> 83 bytes .../testrepo.git/refs/tags/taggerless | 1 + 9 files changed, 36 insertions(+), 12 deletions(-) create mode 100644 tests-clar/resources/testrepo.git/objects/4a/23e2e65ad4e31c4c9db7dc746650bfad082679 create mode 100644 tests-clar/resources/testrepo.git/refs/tags/taggerless diff --git a/include/git2/tag.h b/include/git2/tag.h index 1ffeb0b4a..84c954c27 100644 --- a/include/git2/tag.h +++ b/include/git2/tag.h @@ -121,7 +121,7 @@ GIT_EXTERN(const char *) git_tag_name(const git_tag *tag); * Get the tagger (author) of a tag * * @param tag a previously loaded tag. - * @return reference to the tag's author + * @return reference to the tag's author or NULL when unspecified */ GIT_EXTERN(const git_signature *) git_tag_tagger(const git_tag *tag); @@ -129,7 +129,7 @@ GIT_EXTERN(const git_signature *) git_tag_tagger(const git_tag *tag); * Get the message of a tag * * @param tag a previously loaded tag. - * @return message of the tag + * @return message of the tag or NULL when unspecified */ GIT_EXTERN(const char *) git_tag_message(const git_tag *tag); diff --git a/src/tag.c b/src/tag.c index e52467f66..735ba7e1d 100644 --- a/src/tag.c +++ b/src/tag.c @@ -131,7 +131,7 @@ int git_tag__parse_buffer(git_tag *tag, const char *buffer, size_t length) buffer = search + 1; tag->tagger = NULL; - if (*buffer != '\n') { + if (buffer < buffer_end && *buffer != '\n') { tag->tagger = git__malloc(sizeof(git_signature)); GITERR_CHECK_ALLOC(tag->tagger); diff --git a/tests-clar/network/fetchlocal.c b/tests-clar/network/fetchlocal.c index e2ba675e1..bcf298cde 100644 --- a/tests-clar/network/fetchlocal.c +++ b/tests-clar/network/fetchlocal.c @@ -35,7 +35,7 @@ void test_network_fetchlocal__complete(void) cl_git_pass(git_remote_update_tips(origin)); cl_git_pass(git_reference_list(&refnames, repo, GIT_REF_LISTALL)); - cl_assert_equal_i(18, (int)refnames.count); + cl_assert_equal_i(19, (int)refnames.count); cl_assert(callcount > 0); git_strarray_free(&refnames); @@ -70,7 +70,7 @@ void test_network_fetchlocal__partial(void) git_strarray_free(&refnames); cl_git_pass(git_reference_list(&refnames, repo, GIT_REF_LISTALL)); - cl_assert_equal_i(19, (int)refnames.count); /* 18 remote + 1 local */ + cl_assert_equal_i(20, (int)refnames.count); /* 18 remote + 1 local */ cl_assert(callcount > 0); git_strarray_free(&refnames); diff --git a/tests-clar/network/remote/local.c b/tests-clar/network/remote/local.c index db7d8afdd..7e847e654 100644 --- a/tests-clar/network/remote/local.c +++ b/tests-clar/network/remote/local.c @@ -72,7 +72,7 @@ void test_network_remote_local__retrieve_advertised_references(void) cl_git_pass(git_remote_ls(remote, &count_ref__cb, &how_many_refs)); - cl_assert_equal_i(how_many_refs, 26); + cl_assert_equal_i(how_many_refs, 28); } void test_network_remote_local__retrieve_advertised_references_from_spaced_repository(void) @@ -86,7 +86,7 @@ void test_network_remote_local__retrieve_advertised_references_from_spaced_repos cl_git_pass(git_remote_ls(remote, &count_ref__cb, &how_many_refs)); - cl_assert_equal_i(how_many_refs, 26); + cl_assert_equal_i(how_many_refs, 28); git_remote_free(remote); /* Disconnect from the "spaced repo" before the cleanup */ remote = NULL; diff --git a/tests-clar/object/tag/read.c b/tests-clar/object/tag/read.c index 743668bf3..c9787a413 100644 --- a/tests-clar/object/tag/read.c +++ b/tests-clar/object/tag/read.c @@ -9,6 +9,7 @@ static const char *bad_tag_id = "eda9f45a2a98d4c17a09d681d88569fa4ea91755"; static const char *badly_tagged_commit = "e90810b8df3e80c413d903f631643c716887138d"; static const char *short_tag_id = "5da7760512a953e3c7c4e47e4392c7a4338fb729"; static const char *short_tagged_commit = "4a5ed60bafcf4638b7c8356bd4ce1916bfede93c"; +static const char *taggerless = "4a23e2e65ad4e31c4c9db7dc746650bfad082679"; static git_repository *g_repo; @@ -117,3 +118,25 @@ void test_object_tag_read__parse_without_message(void) git_commit_free(commit); git_repository_free(short_tag_repo); } + +void test_object_tag_read__without_tagger_nor_message(void) +{ + git_tag *tag; + git_oid id; + git_repository *repo; + + cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git"))); + + cl_git_pass(git_oid_fromstr(&id, taggerless)); + + cl_git_pass(git_tag_lookup(&tag, repo, &id)); + + cl_assert_equal_s(git_tag_name(tag), "taggerless"); + cl_assert(git_tag_target_type(tag) == GIT_OBJ_COMMIT); + + cl_assert(tag->message == NULL); + cl_assert(tag->tagger == NULL); + + git_tag_free(tag); + git_repository_free(repo); +} diff --git a/tests-clar/odb/foreach.c b/tests-clar/odb/foreach.c index 37158d458..f643d9621 100644 --- a/tests-clar/odb/foreach.c +++ b/tests-clar/odb/foreach.c @@ -28,8 +28,8 @@ static int foreach_cb(const git_oid *oid, void *data) /* * $ git --git-dir tests-clar/resources/testrepo.git count-objects --verbose - * count: 43 - * size: 3 + * count: 47 + * size: 4 * in-pack: 1640 * packs: 3 * size-pack: 425 @@ -42,7 +42,7 @@ void test_odb_foreach__foreach(void) git_repository_odb(&_odb, _repo); cl_git_pass(git_odb_foreach(_odb, foreach_cb, NULL)); - cl_assert_equal_i(46 + 1640, nobj); /* count + in-pack */ + cl_assert_equal_i(47 + 1640, nobj); /* count + in-pack */ } void test_odb_foreach__one_pack(void) diff --git a/tests-clar/refs/foreachglob.c b/tests-clar/refs/foreachglob.c index 88516ddce..4da1a15dd 100644 --- a/tests-clar/refs/foreachglob.c +++ b/tests-clar/refs/foreachglob.c @@ -48,8 +48,8 @@ static void assert_retrieval(const char *glob, unsigned int flags, int expected_ void test_refs_foreachglob__retrieve_all_refs(void) { - /* 8 heads (including one packed head) + 1 note + 2 remotes + 6 tags */ - assert_retrieval("*", GIT_REF_LISTALL, 21); + /* 12 heads (including one packed head) + 1 note + 2 remotes + 7 tags */ + assert_retrieval("*", GIT_REF_LISTALL, 22); } void test_refs_foreachglob__retrieve_remote_branches(void) diff --git a/tests-clar/resources/testrepo.git/objects/4a/23e2e65ad4e31c4c9db7dc746650bfad082679 b/tests-clar/resources/testrepo.git/objects/4a/23e2e65ad4e31c4c9db7dc746650bfad082679 new file mode 100644 index 0000000000000000000000000000000000000000..18e3964b39638cdf75b706ef0afd463d8a62af64 GIT binary patch literal 83 zcmV-Z0IdIb0S(MC4uBvG06=G6!4ujPp*%;R5RC*QUHrWax1Ju&hJ739lB`xDFhb%| pNf@$2DiNr9LhmRC^vnT?i_z~9n@8`b8ePTG