summaryrefslogtreecommitdiff
path: root/tests/describe
diff options
context:
space:
mode:
authornulltoken <emeric.fermas@gmail.com>2012-11-13 16:35:24 +0100
committerCarlos Martín Nieto <cmn@dwim.me>2014-04-30 09:46:25 +0200
commit3a728fb508ea3eea8033a9e338c61a6421ad21b2 (patch)
tree6f32280311850282e684840cbcc6c52b5a7c77bd /tests/describe
parent4cc71bb7fb7d10347bfa8ba57cb4cf74dcc79d4b (diff)
downloadlibgit2-3a728fb508ea3eea8033a9e338c61a6421ad21b2.tar.gz
object: introduce git_describe_object()
Diffstat (limited to 'tests/describe')
-rw-r--r--tests/describe/describe.c47
-rw-r--r--tests/describe/describe_helpers.c24
-rw-r--r--tests/describe/describe_helpers.h9
-rw-r--r--tests/describe/t6120.c135
4 files changed, 215 insertions, 0 deletions
diff --git a/tests/describe/describe.c b/tests/describe/describe.c
new file mode 100644
index 000000000..fcd4486bc
--- /dev/null
+++ b/tests/describe/describe.c
@@ -0,0 +1,47 @@
+#include "clar_libgit2.h"
+#include "describe_helpers.h"
+
+void test_describe_describe__can_describe_against_a_bare_repo(void)
+{
+ git_repository *repo;
+ git_describe_opts opts = GIT_DESCRIBE_OPTIONS_INIT;
+
+ cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git")));
+
+ assert_describe("hard_tag", "HEAD", repo, &opts, false);
+
+ opts.show_commit_oid_as_fallback = 1;
+
+ assert_describe("be3563a", "HEAD^", repo, &opts, true);
+
+ git_repository_free(repo);
+}
+
+static int delete_cb(git_reference *ref, void *payload)
+{
+ GIT_UNUSED(payload);
+
+ cl_git_pass(git_reference_delete(ref));
+ git_reference_free(ref);
+
+ return 0;
+}
+
+void test_describe_describe__cannot_describe_against_a_repo_with_no_ref(void)
+{
+ git_repository *repo;
+ git_describe_opts opts = GIT_DESCRIBE_OPTIONS_INIT;
+ git_buf buf = GIT_BUF_INIT;
+ git_object *object;
+
+ repo = cl_git_sandbox_init("testrepo.git");
+ cl_git_pass(git_revparse_single(&object, repo, "HEAD"));
+
+ cl_git_pass(git_reference_foreach(repo, delete_cb, NULL));
+
+ cl_git_fail(git_describe_object(&buf, object, &opts));
+
+ git_object_free(object);
+ git_buf_free(&buf);
+ cl_git_sandbox_cleanup();
+}
diff --git a/tests/describe/describe_helpers.c b/tests/describe/describe_helpers.c
new file mode 100644
index 000000000..aa2a54f9e
--- /dev/null
+++ b/tests/describe/describe_helpers.c
@@ -0,0 +1,24 @@
+#include "describe_helpers.h"
+
+void assert_describe(
+ const char *expected_output,
+ const char *revparse_spec,
+ git_repository *repo,
+ git_describe_opts *opts,
+ bool is_prefix_match)
+{
+ git_object *object;
+ git_buf label;
+
+ cl_git_pass(git_revparse_single(&object, repo, revparse_spec));
+
+ cl_git_pass(git_describe_object(&label, object, opts));
+
+ if (is_prefix_match)
+ cl_assert_equal_i(0, git__prefixcmp(git_buf_cstr(&label), expected_output));
+ else
+ cl_assert_equal_s(expected_output, label);
+
+ git_object_free(object);
+ git_buf_free(&label);
+}
diff --git a/tests/describe/describe_helpers.h b/tests/describe/describe_helpers.h
new file mode 100644
index 000000000..0f107f5a7
--- /dev/null
+++ b/tests/describe/describe_helpers.h
@@ -0,0 +1,9 @@
+#include "clar_libgit2.h"
+#include "buffer.h"
+
+extern void assert_describe(
+ const char *expected_output,
+ const char *revparse_spec,
+ git_repository *repo,
+ git_describe_opts *opts,
+ bool is_prefix_match);
diff --git a/tests/describe/t6120.c b/tests/describe/t6120.c
new file mode 100644
index 000000000..d589e82a6
--- /dev/null
+++ b/tests/describe/t6120.c
@@ -0,0 +1,135 @@
+#include "clar_libgit2.h"
+#include "describe_helpers.h"
+#include "repository.h"
+
+// Ported from https://github.com/git/git/blob/adfc1857bdb090786fd9d22c1acec39371c76048/t/t6120-describe.sh
+
+static git_repository *repo;
+
+void test_describe_t6120__initialize(void)
+{
+ repo = cl_git_sandbox_init("describe");
+}
+
+void test_describe_t6120__cleanup(void)
+{
+ cl_git_sandbox_cleanup();
+}
+
+void test_describe_t6120__default(void)
+{
+ git_describe_opts opts = GIT_DESCRIBE_OPTIONS_INIT;
+
+ assert_describe("A-", "HEAD", repo, &opts, true);
+ assert_describe("A-", "HEAD^", repo, &opts, true);
+ assert_describe("R-", "HEAD^^", repo, &opts, true);
+ assert_describe("A-", "HEAD^^2", repo, &opts, true);
+ assert_describe("B", "HEAD^^2^", repo, &opts, false);
+ assert_describe("R-", "HEAD^^^", repo, &opts, true);
+}
+
+void test_describe_t6120__tags(void)
+{
+ git_describe_opts opts = GIT_DESCRIBE_OPTIONS_INIT;
+ opts.describe_strategy = GIT_DESCRIBE_TAGS;
+
+ assert_describe("c-", "HEAD", repo, &opts, true);
+ assert_describe("c-", "HEAD^", repo, &opts, true);
+ assert_describe("e-", "HEAD^^", repo, &opts, true);
+ assert_describe("c-", "HEAD^^2", repo, &opts, true);
+ assert_describe("B", "HEAD^^2^", repo, &opts, false);
+ assert_describe("e", "HEAD^^^", repo, &opts, false);
+}
+
+void test_describe_t6120__all(void)
+{
+ git_describe_opts opts = GIT_DESCRIBE_OPTIONS_INIT;
+ opts.describe_strategy = GIT_DESCRIBE_ALL;
+
+ assert_describe("heads/master", "HEAD", repo, &opts, false);
+ assert_describe("tags/c-", "HEAD^", repo, &opts, true);
+ assert_describe("tags/e", "HEAD^^^", repo, &opts, false);
+}
+
+void test_describe_t6120__longformat(void)
+{
+ git_describe_opts opts = GIT_DESCRIBE_OPTIONS_INIT;
+ opts.always_use_long_format = 1;
+
+ assert_describe("B-0-", "HEAD^^2^", repo, &opts, true);
+ assert_describe("A-3-", "HEAD^^2", repo, &opts, true);
+}
+
+void test_describe_t6120__firstparent(void)
+{
+ git_describe_opts opts = GIT_DESCRIBE_OPTIONS_INIT;
+ opts.describe_strategy = GIT_DESCRIBE_TAGS;
+
+ assert_describe("c-7-", "HEAD", repo, &opts, true);
+
+ opts.only_follow_first_parent = 1;
+ assert_describe("e-3-", "HEAD", repo, &opts, true);
+}
+
+static void commit_and_tag(
+ git_time_t *time,
+ const char *commit_msg,
+ const char *tag_name)
+{
+ git_index *index;
+ git_oid commit_id;
+ git_reference *ref;
+
+ cl_git_pass(git_repository_index__weakptr(&index, repo));
+
+ cl_git_append2file("describe/file", "\n");
+
+ git_index_add_bypath(index, "describe/file");
+ git_index_write(index);
+
+ *time += 10;
+ cl_repo_commit_from_index(&commit_id, repo, NULL, *time, commit_msg);
+
+ if (tag_name == NULL)
+ return;
+
+ cl_git_pass(git_reference_create(&ref, repo, tag_name, &commit_id, 0, NULL, NULL));
+ git_reference_free(ref);
+}
+
+void test_describe_t6120__pattern(void)
+{
+ git_describe_opts opts = GIT_DESCRIBE_OPTIONS_INIT;
+ git_oid tag_id;
+ git_object *head;
+ git_signature *tagger;
+ git_time_t time;
+
+ /* set-up matching pattern tests */
+ cl_git_pass(git_revparse_single(&head, repo, "HEAD"));
+
+ time = 1380553019;
+ cl_git_pass(git_signature_new(&tagger, "tagger", "tagger@libgit2.org", time, 0));
+ cl_git_pass(git_tag_create(&tag_id, repo, "test-annotated", head, tagger, "test-annotated", 0));
+ git_signature_free(tagger);
+ git_object_free(head);
+
+ commit_and_tag(&time, "one more", "refs/tags/test1-lightweight");
+ commit_and_tag(&time, "yet another", "refs/tags/test2-lightweight");
+ commit_and_tag(&time, "even more", NULL);
+
+
+ /* Exercize */
+ opts.pattern = "test-*";
+ assert_describe("test-annotated-", "HEAD", repo, &opts, true);
+
+ opts.describe_strategy = GIT_DESCRIBE_TAGS;
+ opts.pattern = "test1-*";
+ assert_describe("test1-lightweight-", "HEAD", repo, &opts, true);
+
+ opts.pattern = "test2-*";
+ assert_describe("test2-lightweight-", "HEAD", repo, &opts, true);
+
+ opts.always_use_long_format = 1;
+ assert_describe("test2-lightweight-", "HEAD^", repo, &opts, true);
+}