test-reach: test get_reachable_subset
The get_reachable_subset() method returns the list of commits in the 'to' array that are reachable from at least one commit in the 'from' array. Add tests that check this method works in a few cases: 1. All commits in the 'to' list are reachable. This exercises the early-termination condition. 2. Some commits in the 'to' list are reachable. This exercises the loop-termination condition. 3. No commits in the 'to' list are reachable. This exercises the NULL return condition. Signed-off-by: Derrick Stolee <dstolee@microsoft.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
fcb2c0769d
commit
4c7bb45269
|
@ -32,8 +32,8 @@ int cmd__reach(int ac, const char **av)
|
||||||
struct commit *A, *B;
|
struct commit *A, *B;
|
||||||
struct commit_list *X, *Y;
|
struct commit_list *X, *Y;
|
||||||
struct object_array X_obj = OBJECT_ARRAY_INIT;
|
struct object_array X_obj = OBJECT_ARRAY_INIT;
|
||||||
struct commit **X_array;
|
struct commit **X_array, **Y_array;
|
||||||
int X_nr, X_alloc;
|
int X_nr, X_alloc, Y_nr, Y_alloc;
|
||||||
struct strbuf buf = STRBUF_INIT;
|
struct strbuf buf = STRBUF_INIT;
|
||||||
struct repository *r = the_repository;
|
struct repository *r = the_repository;
|
||||||
|
|
||||||
|
@ -44,9 +44,10 @@ int cmd__reach(int ac, const char **av)
|
||||||
|
|
||||||
A = B = NULL;
|
A = B = NULL;
|
||||||
X = Y = NULL;
|
X = Y = NULL;
|
||||||
X_nr = 0;
|
X_nr = Y_nr = 0;
|
||||||
X_alloc = 16;
|
X_alloc = Y_alloc = 16;
|
||||||
ALLOC_ARRAY(X_array, X_alloc);
|
ALLOC_ARRAY(X_array, X_alloc);
|
||||||
|
ALLOC_ARRAY(Y_array, Y_alloc);
|
||||||
|
|
||||||
while (strbuf_getline(&buf, stdin) != EOF) {
|
while (strbuf_getline(&buf, stdin) != EOF) {
|
||||||
struct object_id oid;
|
struct object_id oid;
|
||||||
|
@ -92,6 +93,8 @@ int cmd__reach(int ac, const char **av)
|
||||||
|
|
||||||
case 'Y':
|
case 'Y':
|
||||||
commit_list_insert(c, &Y);
|
commit_list_insert(c, &Y);
|
||||||
|
ALLOC_GROW(Y_array, Y_nr + 1, Y_alloc);
|
||||||
|
Y_array[Y_nr++] = c;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -136,6 +139,29 @@ int cmd__reach(int ac, const char **av)
|
||||||
filter.with_commit_tag_algo = 0;
|
filter.with_commit_tag_algo = 0;
|
||||||
|
|
||||||
printf("%s(_,A,X,_):%d\n", av[1], commit_contains(&filter, A, X, &cache));
|
printf("%s(_,A,X,_):%d\n", av[1], commit_contains(&filter, A, X, &cache));
|
||||||
|
} else if (!strcmp(av[1], "get_reachable_subset")) {
|
||||||
|
const int reachable_flag = 1;
|
||||||
|
int i, count = 0;
|
||||||
|
struct commit_list *current;
|
||||||
|
struct commit_list *list = get_reachable_subset(X_array, X_nr,
|
||||||
|
Y_array, Y_nr,
|
||||||
|
reachable_flag);
|
||||||
|
printf("get_reachable_subset(X,Y)\n");
|
||||||
|
for (current = list; current; current = current->next) {
|
||||||
|
if (!(list->item->object.flags & reachable_flag))
|
||||||
|
die(_("commit %s is not marked reachable"),
|
||||||
|
oid_to_hex(&list->item->object.oid));
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
for (i = 0; i < Y_nr; i++) {
|
||||||
|
if (Y_array[i]->object.flags & reachable_flag)
|
||||||
|
count--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (count < 0)
|
||||||
|
die(_("too many commits marked reachable"));
|
||||||
|
|
||||||
|
print_sorted_commit_ids(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
exit(0);
|
exit(0);
|
||||||
|
|
|
@ -265,4 +265,56 @@ test_expect_success 'commit_contains:miss' '
|
||||||
test_three_modes commit_contains --tag
|
test_three_modes commit_contains --tag
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'get_reachable_subset:all' '
|
||||||
|
cat >input <<-\EOF &&
|
||||||
|
X:commit-9-1
|
||||||
|
X:commit-8-3
|
||||||
|
X:commit-7-5
|
||||||
|
X:commit-6-6
|
||||||
|
X:commit-1-7
|
||||||
|
Y:commit-3-3
|
||||||
|
Y:commit-1-7
|
||||||
|
Y:commit-5-6
|
||||||
|
EOF
|
||||||
|
(
|
||||||
|
echo "get_reachable_subset(X,Y)" &&
|
||||||
|
git rev-parse commit-3-3 \
|
||||||
|
commit-1-7 \
|
||||||
|
commit-5-6 | sort
|
||||||
|
) >expect &&
|
||||||
|
test_three_modes get_reachable_subset
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'get_reachable_subset:some' '
|
||||||
|
cat >input <<-\EOF &&
|
||||||
|
X:commit-9-1
|
||||||
|
X:commit-8-3
|
||||||
|
X:commit-7-5
|
||||||
|
X:commit-1-7
|
||||||
|
Y:commit-3-3
|
||||||
|
Y:commit-1-7
|
||||||
|
Y:commit-5-6
|
||||||
|
EOF
|
||||||
|
(
|
||||||
|
echo "get_reachable_subset(X,Y)" &&
|
||||||
|
git rev-parse commit-3-3 \
|
||||||
|
commit-1-7 | sort
|
||||||
|
) >expect &&
|
||||||
|
test_three_modes get_reachable_subset
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'get_reachable_subset:none' '
|
||||||
|
cat >input <<-\EOF &&
|
||||||
|
X:commit-9-1
|
||||||
|
X:commit-8-3
|
||||||
|
X:commit-7-5
|
||||||
|
X:commit-1-7
|
||||||
|
Y:commit-9-3
|
||||||
|
Y:commit-7-6
|
||||||
|
Y:commit-2-8
|
||||||
|
EOF
|
||||||
|
echo "get_reachable_subset(X,Y)" >expect &&
|
||||||
|
test_three_modes get_reachable_subset
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
|
Loading…
Reference in New Issue