Skip to content

Commit

Permalink
test-reach: test can_all_from_reach_with_flags
Browse files Browse the repository at this point in the history
The can_all_from_reach_with_flags method is used by ok_to_give_up in
upload-pack.c to see if we have done enough negotiation during a fetch.
This method is intentionally created to preserve state between calls to
assist with stateful negotiation, such as over SSH.

To make this method testable, add a new can_all_from_reach method that
does the initial setup and final tear-down. Call the method from
'test-tool reach'.

Since this is a many-to-many reachability query, add a new type of input
to the 'test-tool reach' input format. Lines "Y:<committish>" create a
list of commits to be the reachability targets from the commits in the
'X' list. In the context of fetch negotiation, the 'X' commits are the
'want' commits and the 'Y' commits are the 'have' commits.

Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
  • Loading branch information
derrickstolee committed Jul 13, 2018
1 parent 3b0379c commit 95b11ce
Show file tree
Hide file tree
Showing 4 changed files with 102 additions and 2 deletions.
47 changes: 47 additions & 0 deletions commit-reach.c
Original file line number Diff line number Diff line change
Expand Up @@ -593,3 +593,50 @@ int can_all_from_reach_with_flag(struct object_array *from,
}
return 1;
}

int can_all_from_reach(struct commit_list *from, struct commit_list *to,
int cutoff_by_min_date)
{
struct object_array from_objs = OBJECT_ARRAY_INIT;
time_t min_commit_date = cutoff_by_min_date ? from->item->date : 0;
struct commit_list *from_iter = from, *to_iter = to;
int result;

while (from_iter) {
add_object_array(&from_iter->item->object, NULL, &from_objs);

if (!parse_commit(from_iter->item)) {
if (from_iter->item->date < min_commit_date)
min_commit_date = from_iter->item->date;
}

from_iter = from_iter->next;
}

while (to_iter) {
if (!parse_commit(to_iter->item)) {
if (to_iter->item->date < min_commit_date)
min_commit_date = to_iter->item->date;
}

to_iter->item->object.flags |= PARENT2;

to_iter = to_iter->next;
}

result = can_all_from_reach_with_flag(&from_objs, PARENT2, PARENT1,
min_commit_date);

while (from) {
clear_commit_marks(from->item, PARENT1);
from = from->next;
}

while (to) {
clear_commit_marks(to->item, PARENT2);
to = to->next;
}

object_array_clear(&from_objs);
return result;
}
2 changes: 2 additions & 0 deletions commit-reach.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,5 +68,7 @@ int reachable(struct commit *from, int with_flag, int assign_flag,
int can_all_from_reach_with_flag(struct object_array *from,
int with_flag, int assign_flag,
time_t min_commit_date);
int can_all_from_reach(struct commit_list *from, struct commit_list *to,
int commit_date_cutoff);

#endif
10 changes: 8 additions & 2 deletions t/helper/test-reach.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ int cmd__reach(int ac, const char **av)
{
struct object_id oid_A, oid_B;
struct commit *A, *B;
struct commit_list *X;
struct commit_list *X, *Y;
struct commit **X_array;
int X_nr, X_alloc;
struct strbuf buf = STRBUF_INIT;
Expand All @@ -21,7 +21,7 @@ int cmd__reach(int ac, const char **av)
exit(1);

A = B = NULL;
X = NULL;
X = Y = NULL;
X_nr = 0;
X_alloc = 16;
ALLOC_ARRAY(X_array, X_alloc);
Expand Down Expand Up @@ -66,6 +66,10 @@ int cmd__reach(int ac, const char **av)
X_array[X_nr++] = c;
break;

case 'Y':
commit_list_insert(c, &Y);
break;

default:
die("unexpected start of line: %c", buf.buf[0]);
}
Expand All @@ -92,6 +96,8 @@ int cmd__reach(int ac, const char **av)
printf("%s\n", oid_to_hex(&list->item->object.oid));
list = list->next;
}
} else if (!strcmp(av[1], "can_all_from_reach")) {
printf("%s(X,Y):%d\n", av[1], can_all_from_reach(X, Y, 1));
}

exit(0);
Expand Down
45 changes: 45 additions & 0 deletions t/t6600-test-reach.sh
Original file line number Diff line number Diff line change
Expand Up @@ -160,4 +160,49 @@ test_expect_success 'reduce_heads' '
test_three_modes reduce_heads
'

test_expect_success 'can_all_from_reach:hit' '
cat >input <<-\EOF &&
X:commit-2-10
X:commit-3-9
X:commit-4-8
X:commit-5-7
X:commit-6-6
X:commit-7-5
X:commit-8-4
X:commit-9-3
Y:commit-1-9
Y:commit-2-8
Y:commit-3-7
Y:commit-4-6
Y:commit-5-5
Y:commit-6-4
Y:commit-7-3
Y:commit-8-1
EOF
printf "can_all_from_reach(X,Y):1\n" >expect &&
test_three_modes can_all_from_reach
'

test_expect_success 'can_all_from_reach:miss' '
cat >input <<-\EOF &&
X:commit-2-10
X:commit-3-9
X:commit-4-8
X:commit-5-7
X:commit-6-6
X:commit-7-5
X:commit-8-4
X:commit-9-3
Y:commit-1-9
Y:commit-2-8
Y:commit-3-7
Y:commit-4-6
Y:commit-5-5
Y:commit-6-4
Y:commit-8-5
EOF
printf "can_all_from_reach(X,Y):0\n" >expect &&
test_three_modes can_all_from_reach
'

test_done

0 comments on commit 95b11ce

Please sign in to comment.