]>
git.ipfire.org Git - thirdparty/git.git/blob - t/helper/test-reach.c
3 #include "commit-reach.h"
7 #include "object-name.h"
8 #include "parse-options.h"
9 #include "ref-filter.h"
11 #include "string-list.h"
14 static void print_sorted_commit_ids(struct commit_list
*list
)
17 struct string_list s
= STRING_LIST_INIT_DUP
;
20 string_list_append(&s
, oid_to_hex(&list
->item
->object
.oid
));
26 for (i
= 0; i
< s
.nr
; i
++)
27 printf("%s\n", s
.items
[i
].string
);
29 string_list_clear(&s
, 0);
32 int cmd__reach(int ac
, const char **av
)
34 struct object_id oid_A
, oid_B
;
36 struct commit_list
*X
, *Y
;
37 struct object_array X_obj
= OBJECT_ARRAY_INIT
;
38 struct commit
**X_array
, **Y_array
;
39 int X_nr
, X_alloc
, Y_nr
, Y_alloc
;
40 struct strbuf buf
= STRBUF_INIT
;
41 struct repository
*r
= the_repository
;
43 setup_git_directory();
51 X_alloc
= Y_alloc
= 16;
52 ALLOC_ARRAY(X_array
, X_alloc
);
53 ALLOC_ARRAY(Y_array
, Y_alloc
);
55 while (strbuf_getline(&buf
, stdin
) != EOF
) {
58 struct object
*peeled
;
63 if (repo_get_oid_committish(the_repository
, buf
.buf
+ 2, &oid
))
64 die("failed to resolve %s", buf
.buf
+ 2);
66 orig
= parse_object(r
, &oid
);
67 peeled
= deref_tag_noverify(orig
);
70 die("failed to load commit for input %s resulting in oid %s\n",
71 buf
.buf
, oid_to_hex(&oid
));
73 c
= object_as_type(peeled
, OBJ_COMMIT
, 0);
76 die("failed to load commit for input %s resulting in oid %s\n",
77 buf
.buf
, oid_to_hex(&oid
));
91 commit_list_insert(c
, &X
);
92 ALLOC_GROW(X_array
, X_nr
+ 1, X_alloc
);
94 add_object_array(orig
, NULL
, &X_obj
);
98 commit_list_insert(c
, &Y
);
99 ALLOC_GROW(Y_array
, Y_nr
+ 1, Y_alloc
);
104 die("unexpected start of line: %c", buf
.buf
[0]);
107 strbuf_release(&buf
);
109 if (!strcmp(av
[1], "ref_newer"))
110 printf("%s(A,B):%d\n", av
[1], ref_newer(&oid_A
, &oid_B
));
111 else if (!strcmp(av
[1], "in_merge_bases"))
112 printf("%s(A,B):%d\n", av
[1],
113 repo_in_merge_bases(the_repository
, A
, B
));
114 else if (!strcmp(av
[1], "in_merge_bases_many"))
115 printf("%s(A,X):%d\n", av
[1],
116 repo_in_merge_bases_many(the_repository
, A
, X_nr
, X_array
));
117 else if (!strcmp(av
[1], "is_descendant_of"))
118 printf("%s(A,X):%d\n", av
[1], repo_is_descendant_of(r
, A
, X
));
119 else if (!strcmp(av
[1], "get_merge_bases_many")) {
120 struct commit_list
*list
= repo_get_merge_bases_many(the_repository
,
123 printf("%s(A,X):\n", av
[1]);
124 print_sorted_commit_ids(list
);
125 } else if (!strcmp(av
[1], "reduce_heads")) {
126 struct commit_list
*list
= reduce_heads(X
);
127 printf("%s(X):\n", av
[1]);
128 print_sorted_commit_ids(list
);
129 } else if (!strcmp(av
[1], "can_all_from_reach")) {
130 printf("%s(X,Y):%d\n", av
[1], can_all_from_reach(X
, Y
, 1));
131 } else if (!strcmp(av
[1], "can_all_from_reach_with_flag")) {
132 struct commit_list
*iter
= Y
;
135 iter
->item
->object
.flags
|= 2;
139 printf("%s(X,_,_,0,0):%d\n", av
[1], can_all_from_reach_with_flag(&X_obj
, 2, 4, 0, 0));
140 } else if (!strcmp(av
[1], "commit_contains")) {
141 struct ref_filter filter
= REF_FILTER_INIT
;
142 struct contains_cache cache
;
143 init_contains_cache(&cache
);
145 if (ac
> 2 && !strcmp(av
[2], "--tag"))
146 filter
.with_commit_tag_algo
= 1;
148 filter
.with_commit_tag_algo
= 0;
150 printf("%s(_,A,X,_):%d\n", av
[1], commit_contains(&filter
, A
, X
, &cache
));
151 } else if (!strcmp(av
[1], "get_reachable_subset")) {
152 const int reachable_flag
= 1;
154 struct commit_list
*current
;
155 struct commit_list
*list
= get_reachable_subset(X_array
, X_nr
,
158 printf("get_reachable_subset(X,Y)\n");
159 for (current
= list
; current
; current
= current
->next
) {
160 if (!(list
->item
->object
.flags
& reachable_flag
))
161 die(_("commit %s is not marked reachable"),
162 oid_to_hex(&list
->item
->object
.oid
));
165 for (i
= 0; i
< Y_nr
; i
++) {
166 if (Y_array
[i
]->object
.flags
& reachable_flag
)
171 die(_("too many commits marked reachable"));
173 print_sorted_commit_ids(list
);