1 #include "clar_libgit2.h"
2 #include "describe_helpers.h"
3 #include "repository.h"
5 /* Ported from https://github.com/git/git/blob/adfc1857bdb090786fd9d22c1acec39371c76048/t/t6120-describe.sh */
7 static git_repository
*repo
;
9 void test_describe_t6120__initialize(void)
11 repo
= cl_git_sandbox_init("describe");
14 void test_describe_t6120__cleanup(void)
16 cl_git_sandbox_cleanup();
19 void test_describe_t6120__default(void)
21 git_describe_options opts
= GIT_DESCRIBE_OPTIONS_INIT
;
22 git_describe_format_options fmt_opts
= GIT_DESCRIBE_FORMAT_OPTIONS_INIT
;
24 assert_describe("A-*", "HEAD", repo
, &opts
, &fmt_opts
);
25 assert_describe("A-*", "HEAD^", repo
, &opts
, &fmt_opts
);
26 assert_describe("R-*", "HEAD^^", repo
, &opts
, &fmt_opts
);
27 assert_describe("A-*", "HEAD^^2", repo
, &opts
, &fmt_opts
);
28 assert_describe("B", "HEAD^^2^", repo
, &opts
, &fmt_opts
);
29 assert_describe("R-*", "HEAD^^^", repo
, &opts
, &fmt_opts
);
32 void test_describe_t6120__tags(void)
34 git_describe_options opts
= GIT_DESCRIBE_OPTIONS_INIT
;
35 git_describe_format_options fmt_opts
= GIT_DESCRIBE_FORMAT_OPTIONS_INIT
;
36 opts
.describe_strategy
= GIT_DESCRIBE_TAGS
;
38 assert_describe("c-*", "HEAD", repo
, &opts
, &fmt_opts
);
39 assert_describe("c-*", "HEAD^", repo
, &opts
, &fmt_opts
);
40 assert_describe("e-*", "HEAD^^", repo
, &opts
, &fmt_opts
);
41 assert_describe("c-*", "HEAD^^2", repo
, &opts
, &fmt_opts
);
42 assert_describe("B", "HEAD^^2^", repo
, &opts
, &fmt_opts
);
43 assert_describe("e", "HEAD^^^", repo
, &opts
, &fmt_opts
);
46 void test_describe_t6120__all(void)
48 git_describe_options opts
= GIT_DESCRIBE_OPTIONS_INIT
;
49 git_describe_format_options fmt_opts
= GIT_DESCRIBE_FORMAT_OPTIONS_INIT
;
50 opts
.describe_strategy
= GIT_DESCRIBE_ALL
;
52 assert_describe("heads/master", "HEAD", repo
, &opts
, &fmt_opts
);
53 assert_describe("tags/c-*", "HEAD^", repo
, &opts
, &fmt_opts
);
54 assert_describe("tags/e", "HEAD^^^", repo
, &opts
, &fmt_opts
);
57 void test_describe_t6120__longformat(void)
59 git_describe_options opts
= GIT_DESCRIBE_OPTIONS_INIT
;
60 git_describe_format_options fmt_opts
= GIT_DESCRIBE_FORMAT_OPTIONS_INIT
;
62 fmt_opts
.always_use_long_format
= 1;
64 assert_describe("B-0-*", "HEAD^^2^", repo
, &opts
, &fmt_opts
);
65 assert_describe("A-3-*", "HEAD^^2", repo
, &opts
, &fmt_opts
);
68 void test_describe_t6120__firstparent(void)
70 git_describe_options opts
= GIT_DESCRIBE_OPTIONS_INIT
;
71 git_describe_format_options fmt_opts
= GIT_DESCRIBE_FORMAT_OPTIONS_INIT
;
72 opts
.describe_strategy
= GIT_DESCRIBE_TAGS
;
74 assert_describe("c-7-*", "HEAD", repo
, &opts
, &fmt_opts
);
76 opts
.only_follow_first_parent
= 1;
77 assert_describe("e-3-*", "HEAD", repo
, &opts
, &fmt_opts
);
80 void test_describe_t6120__workdir(void)
82 git_describe_options opts
= GIT_DESCRIBE_OPTIONS_INIT
;
83 git_describe_format_options fmt_opts
= GIT_DESCRIBE_FORMAT_OPTIONS_INIT
;
85 assert_describe_workdir("A-*[0-9a-f]", repo
, &opts
, &fmt_opts
);
86 cl_git_mkfile("describe/file", "something different");
88 fmt_opts
.dirty_suffix
= "-dirty";
89 assert_describe_workdir("A-*[0-9a-f]-dirty", repo
, &opts
, &fmt_opts
);
90 fmt_opts
.dirty_suffix
= ".mod";
91 assert_describe_workdir("A-*[0-9a-f].mod", repo
, &opts
, &fmt_opts
);
94 static void commit_and_tag(
96 const char *commit_msg
,
103 cl_git_pass(git_repository_index__weakptr(&index
, repo
));
105 cl_git_append2file("describe/file", "\n");
107 cl_git_pass(git_index_add_bypath(index
, "file"));
108 cl_git_pass(git_index_write(index
));
111 cl_repo_commit_from_index(&commit_id
, repo
, NULL
, *time
, commit_msg
);
113 if (tag_name
== NULL
)
116 cl_git_pass(git_reference_create(&ref
, repo
, tag_name
, &commit_id
, 0, NULL
));
117 git_reference_free(ref
);
120 void test_describe_t6120__pattern(void)
122 git_describe_options opts
= GIT_DESCRIBE_OPTIONS_INIT
;
123 git_describe_format_options fmt_opts
= GIT_DESCRIBE_FORMAT_OPTIONS_INIT
;
126 git_signature
*tagger
;
129 /* set-up matching pattern tests */
130 cl_git_pass(git_revparse_single(&head
, repo
, "HEAD"));
133 cl_git_pass(git_signature_new(&tagger
, "tagger", "tagger@libgit2.org", time
, 0));
134 cl_git_pass(git_tag_create(&tag_id
, repo
, "test-annotated", head
, tagger
, "test-annotated", 0));
135 git_signature_free(tagger
);
136 git_object_free(head
);
138 commit_and_tag(&time
, "one more", "refs/tags/test1-lightweight");
139 commit_and_tag(&time
, "yet another", "refs/tags/test2-lightweight");
140 commit_and_tag(&time
, "even more", NULL
);
144 opts
.pattern
= "test-*";
145 assert_describe("test-annotated-*", "HEAD", repo
, &opts
, &fmt_opts
);
147 opts
.describe_strategy
= GIT_DESCRIBE_TAGS
;
148 opts
.pattern
= "test1-*";
149 assert_describe("test1-lightweight-*", "HEAD", repo
, &opts
, &fmt_opts
);
151 opts
.pattern
= "test2-*";
152 assert_describe("test2-lightweight-*", "HEAD", repo
, &opts
, &fmt_opts
);
154 fmt_opts
.always_use_long_format
= 1;
155 assert_describe("test2-lightweight-*", "HEAD^", repo
, &opts
, &fmt_opts
);