]> git.proxmox.com Git - libgit2.git/blob - tests/libgit2/describe/t6120.c
New upstream version 1.5.0+ds
[libgit2.git] / tests / libgit2 / describe / t6120.c
1 #include "clar_libgit2.h"
2 #include "describe_helpers.h"
3 #include "repository.h"
4
5 /* Ported from https://github.com/git/git/blob/adfc1857bdb090786fd9d22c1acec39371c76048/t/t6120-describe.sh */
6
7 static git_repository *repo;
8
9 void test_describe_t6120__initialize(void)
10 {
11 repo = cl_git_sandbox_init("describe");
12 }
13
14 void test_describe_t6120__cleanup(void)
15 {
16 cl_git_sandbox_cleanup();
17 }
18
19 void test_describe_t6120__default(void)
20 {
21 git_describe_options opts = GIT_DESCRIBE_OPTIONS_INIT;
22 git_describe_format_options fmt_opts = GIT_DESCRIBE_FORMAT_OPTIONS_INIT;
23
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);
30 }
31
32 void test_describe_t6120__tags(void)
33 {
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;
37
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);
44 }
45
46 void test_describe_t6120__all(void)
47 {
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;
51
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);
55 }
56
57 void test_describe_t6120__longformat(void)
58 {
59 git_describe_options opts = GIT_DESCRIBE_OPTIONS_INIT;
60 git_describe_format_options fmt_opts = GIT_DESCRIBE_FORMAT_OPTIONS_INIT;
61
62 fmt_opts.always_use_long_format = 1;
63
64 assert_describe("B-0-*", "HEAD^^2^", repo, &opts, &fmt_opts);
65 assert_describe("A-3-*", "HEAD^^2", repo, &opts, &fmt_opts);
66 }
67
68 void test_describe_t6120__firstparent(void)
69 {
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;
73
74 assert_describe("c-7-*", "HEAD", repo, &opts, &fmt_opts);
75
76 opts.only_follow_first_parent = 1;
77 assert_describe("e-3-*", "HEAD", repo, &opts, &fmt_opts);
78 }
79
80 void test_describe_t6120__workdir(void)
81 {
82 git_describe_options opts = GIT_DESCRIBE_OPTIONS_INIT;
83 git_describe_format_options fmt_opts = GIT_DESCRIBE_FORMAT_OPTIONS_INIT;
84
85 assert_describe_workdir("A-*[0-9a-f]", repo, &opts, &fmt_opts);
86 cl_git_mkfile("describe/file", "something different");
87
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);
92 }
93
94 static void commit_and_tag(
95 git_time_t *time,
96 const char *commit_msg,
97 const char *tag_name)
98 {
99 git_index *index;
100 git_oid commit_id;
101 git_reference *ref;
102
103 cl_git_pass(git_repository_index__weakptr(&index, repo));
104
105 cl_git_append2file("describe/file", "\n");
106
107 cl_git_pass(git_index_add_bypath(index, "file"));
108 cl_git_pass(git_index_write(index));
109
110 *time += 10;
111 cl_repo_commit_from_index(&commit_id, repo, NULL, *time, commit_msg);
112
113 if (tag_name == NULL)
114 return;
115
116 cl_git_pass(git_reference_create(&ref, repo, tag_name, &commit_id, 0, NULL));
117 git_reference_free(ref);
118 }
119
120 void test_describe_t6120__pattern(void)
121 {
122 git_describe_options opts = GIT_DESCRIBE_OPTIONS_INIT;
123 git_describe_format_options fmt_opts = GIT_DESCRIBE_FORMAT_OPTIONS_INIT;
124 git_oid tag_id;
125 git_object *head;
126 git_signature *tagger;
127 git_time_t time;
128
129 /* set-up matching pattern tests */
130 cl_git_pass(git_revparse_single(&head, repo, "HEAD"));
131
132 time = 1380553019;
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);
137
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);
141
142
143 /* Exercize */
144 opts.pattern = "test-*";
145 assert_describe("test-annotated-*", "HEAD", repo, &opts, &fmt_opts);
146
147 opts.describe_strategy = GIT_DESCRIBE_TAGS;
148 opts.pattern = "test1-*";
149 assert_describe("test1-lightweight-*", "HEAD", repo, &opts, &fmt_opts);
150
151 opts.pattern = "test2-*";
152 assert_describe("test2-lightweight-*", "HEAD", repo, &opts, &fmt_opts);
153
154 fmt_opts.always_use_long_format = 1;
155 assert_describe("test2-lightweight-*", "HEAD^", repo, &opts, &fmt_opts);
156 }