Skip to content

Commit

Permalink
bisect: check ancestors without forking a "git rev-list" process
Browse files Browse the repository at this point in the history
We must save the pending commits that will be used during revision
walking and unparse them after, because we want to leave a clean
state for the next revision walking that will try to find the best
bisection point.

As we don"t fork a process anymore to call "git rev-list", we need
to remove the use of GIT_TRACE to check how "git rev-list" is
called from the t6030 test that uses it.

Signed-off-by: Christian Couder <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
chriscool authored and gitster committed May 18, 2009
1 parent 836a3fd commit 2d938fc
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 44 deletions.
54 changes: 22 additions & 32 deletions bisect.c
Original file line number Diff line number Diff line change
Expand Up @@ -750,42 +750,31 @@ static void check_merge_bases(void)
free_commit_list(result);
}

/*
* This function runs the command "git rev-list $_good ^$_bad"
* and returns 1 if it produces some output, 0 otherwise.
*/
static int check_ancestors(void)
static int check_ancestors(const char *prefix)
{
struct argv_array rev_argv = { NULL, 0, 0 };
struct strbuf str = STRBUF_INIT;
int i, result = 0;
struct child_process rls;
FILE *rls_fout;
struct rev_info revs;
struct object_array pending_copy;
int i, res;

argv_array_push(&rev_argv, xstrdup("rev-list"));
argv_array_push_sha1(&rev_argv, current_bad_sha1, "^%s");
for (i = 0; i < good_revs.sha1_nr; i++)
argv_array_push_sha1(&rev_argv, good_revs.sha1[i], "%s");
argv_array_push(&rev_argv, NULL);
bisect_rev_setup(&revs, prefix, "^%s", "%s", 0);

memset(&rls, 0, sizeof(rls));
rls.argv = rev_argv.argv;
rls.out = -1;
rls.git_cmd = 1;
if (start_command(&rls))
die("Could not launch 'git rev-list' command.");
rls_fout = fdopen(rls.out, "r");
while (strbuf_getline(&str, rls_fout, '\n') != EOF) {
strbuf_trim(&str);
if (*str.buf) {
result = 1;
break;
}
/* Save pending objects, so they can be cleaned up later. */
memset(&pending_copy, 0, sizeof(pending_copy));
for (i = 0; i < revs.pending.nr; i++)
add_object_array(revs.pending.objects[i].item,
revs.pending.objects[i].name,
&pending_copy);

bisect_common(&revs);
res = (revs.commits != NULL);

/* Clean up objects used, as they will be reused. */
for (i = 0; i < pending_copy.nr; i++) {
struct object *o = pending_copy.objects[i].item;
unparse_commit((struct commit *)o);
}
fclose(rls_fout);
finish_command(&rls);

return result;
return res;
}

/*
Expand Down Expand Up @@ -813,7 +802,8 @@ static void check_good_are_ancestors_of_bad(const char *prefix)
if (good_revs.sha1_nr == 0)
return;

if (check_ancestors())
/* Check if all good revs are ancestor of the bad rev. */
if (check_ancestors(prefix))
check_merge_bases();

/* Create file BISECT_ANCESTORS_OK. */
Expand Down
13 changes: 1 addition & 12 deletions t/t6030-bisect-porcelain.sh
Original file line number Diff line number Diff line change
Expand Up @@ -482,28 +482,17 @@ test_expect_success 'good merge bases when good and bad are siblings' '
git bisect reset
'

check_trace() {
grep "$1" "$GIT_TRACE" | grep "\^$2" | grep "$3" >/dev/null
}

test_expect_success 'optimized merge base checks' '
GIT_TRACE="$(pwd)/trace.log" &&
export GIT_TRACE &&
git bisect start "$HASH7" "$SIDE_HASH7" > my_bisect_log.txt &&
grep "merge base must be tested" my_bisect_log.txt &&
grep "$HASH4" my_bisect_log.txt &&
check_trace "rev-list" "$HASH7" "$SIDE_HASH7" &&
git bisect good > my_bisect_log2.txt &&
test -f ".git/BISECT_ANCESTORS_OK" &&
test "$HASH6" = $(git rev-parse --verify HEAD) &&
: > "$GIT_TRACE" &&
git bisect bad > my_bisect_log3.txt &&
test_must_fail check_trace "rev-list" "$HASH6" "$SIDE_HASH7" &&
git bisect good "$A_HASH" > my_bisect_log4.txt &&
grep "merge base must be tested" my_bisect_log4.txt &&
test_must_fail test -f ".git/BISECT_ANCESTORS_OK" &&
check_trace "rev-list" "$HASH6" "$A_HASH" &&
unset GIT_TRACE
test_must_fail test -f ".git/BISECT_ANCESTORS_OK"
'

# This creates another side branch called "parallel" with some files
Expand Down

0 comments on commit 2d938fc

Please sign in to comment.