1 #define USE_THE_REPOSITORY_VARIABLE
2 #define DISABLE_SIGN_COMPARE_WARNINGS
4 #include "git-compat-util.h"
8 #include "environment.h"
13 #include "list-objects.h"
15 #include "run-command.h"
18 #include "oid-array.h"
20 #include "commit-slab.h"
21 #include "commit-reach.h"
22 #include "object-name.h"
23 #include "object-store-ll.h"
27 static struct oid_array good_revs
;
28 static struct oid_array skipped_revs
;
30 static struct object_id
*current_bad_oid
;
32 static char *term_bad
;
33 static char *term_good
;
35 /* Remember to update object flag allocation in object.h */
36 #define COUNTED (1u<<16)
39 * This is a truly stupid algorithm, but it's only
40 * used for bisection, and we just don't care enough.
42 * We care just barely enough to avoid recursing for
45 static int count_distance(struct commit_list
*entry
)
50 struct commit
*commit
= entry
->item
;
51 struct commit_list
*p
;
53 if (commit
->object
.flags
& (UNINTERESTING
| COUNTED
))
55 if (!(commit
->object
.flags
& TREESAME
))
57 commit
->object
.flags
|= COUNTED
;
63 nr
+= count_distance(p
);
72 static void clear_distance(struct commit_list
*list
)
75 struct commit
*commit
= list
->item
;
76 commit
->object
.flags
&= ~COUNTED
;
81 define_commit_slab(commit_weight
, int *);
82 static struct commit_weight commit_weight
;
84 #define DEBUG_BISECT 0
86 static inline int weight(struct commit_list
*elem
)
88 return **commit_weight_at(&commit_weight
, elem
->item
);
91 static inline void weight_set(struct commit_list
*elem
, int weight
)
93 **commit_weight_at(&commit_weight
, elem
->item
) = weight
;
96 static int count_interesting_parents(struct commit
*commit
, unsigned bisect_flags
)
98 struct commit_list
*p
;
101 for (count
= 0, p
= commit
->parents
; p
; p
= p
->next
) {
102 if (!(p
->item
->object
.flags
& UNINTERESTING
))
104 if (bisect_flags
& FIND_BISECTION_FIRST_PARENT_ONLY
)
110 static inline int approx_halfway(struct commit_list
*p
, int nr
)
115 * Don't short-cut something we are not going to return!
117 if (p
->item
->object
.flags
& TREESAME
)
122 * For small number of commits 2 and 3 are halfway of 5, and
123 * 3 is halfway of 6 but 2 and 4 are not.
125 diff
= 2 * weight(p
) - nr
;
127 case -1: case 0: case 1:
131 * For large number of commits we are not so strict, it's
132 * good enough if it's within ~0.1% of the halfway point,
133 * e.g. 5000 is exactly halfway of 10000, but we consider
134 * the values [4996, 5004] as halfway as well.
136 if (abs(diff
) < nr
/ 1024)
142 static void show_list(const char *debug
, int counted
, int nr
,
143 struct commit_list
*list
)
145 struct commit_list
*p
;
150 fprintf(stderr
, "%s (%d/%d)\n", debug
, counted
, nr
);
152 for (p
= list
; p
; p
= p
->next
) {
153 struct commit_list
*pp
;
154 struct commit
*commit
= p
->item
;
155 unsigned commit_flags
= commit
->object
.flags
;
156 enum object_type type
;
158 char *buf
= repo_read_object_file(the_repository
,
159 &commit
->object
.oid
, &type
,
161 const char *subject_start
;
165 die(_("unable to read %s"), oid_to_hex(&commit
->object
.oid
));
167 fprintf(stderr
, "%c%c%c ",
168 (commit_flags
& TREESAME
) ? ' ' : 'T',
169 (commit_flags
& UNINTERESTING
) ? 'U' : ' ',
170 (commit_flags
& COUNTED
) ? 'C' : ' ');
171 if (*commit_weight_at(&commit_weight
, p
->item
))
172 fprintf(stderr
, "%3d", weight(p
));
174 fprintf(stderr
, "---");
175 fprintf(stderr
, " %.*s", 8, oid_to_hex(&commit
->object
.oid
));
176 for (pp
= commit
->parents
; pp
; pp
= pp
->next
)
177 fprintf(stderr
, " %.*s", 8,
178 oid_to_hex(&pp
->item
->object
.oid
));
180 subject_len
= find_commit_subject(buf
, &subject_start
);
182 fprintf(stderr
, " %.*s", subject_len
, subject_start
);
183 fprintf(stderr
, "\n");
187 static struct commit_list
*best_bisection(struct commit_list
*list
, int nr
)
189 struct commit_list
*p
, *best
;
190 int best_distance
= -1;
193 for (p
= list
; p
; p
= p
->next
) {
195 unsigned commit_flags
= p
->item
->object
.flags
;
197 if (commit_flags
& TREESAME
)
199 distance
= weight(p
);
200 if (nr
- distance
< distance
)
201 distance
= nr
- distance
;
202 if (distance
> best_distance
) {
204 best_distance
= distance
;
212 struct commit
*commit
;
216 static int compare_commit_dist(const void *a_
, const void *b_
)
218 struct commit_dist
*a
, *b
;
220 a
= (struct commit_dist
*)a_
;
221 b
= (struct commit_dist
*)b_
;
222 if (a
->distance
!= b
->distance
)
223 return b
->distance
- a
->distance
; /* desc sort */
224 return oidcmp(&a
->commit
->object
.oid
, &b
->commit
->object
.oid
);
227 static struct commit_list
*best_bisection_sorted(struct commit_list
*list
, int nr
)
229 struct commit_list
*p
;
230 struct commit_dist
*array
= xcalloc(nr
, sizeof(*array
));
231 struct strbuf buf
= STRBUF_INIT
;
234 for (p
= list
, cnt
= 0; p
; p
= p
->next
) {
236 unsigned commit_flags
= p
->item
->object
.flags
;
238 if (commit_flags
& TREESAME
)
240 distance
= weight(p
);
241 if (nr
- distance
< distance
)
242 distance
= nr
- distance
;
243 array
[cnt
].commit
= p
->item
;
244 array
[cnt
].distance
= distance
;
247 QSORT(array
, cnt
, compare_commit_dist
);
248 for (p
= list
, i
= 0; i
< cnt
; i
++) {
249 struct object
*obj
= &(array
[i
].commit
->object
);
252 strbuf_addf(&buf
, "dist=%d", array
[i
].distance
);
253 add_name_decoration(DECORATION_NONE
, buf
.buf
, obj
);
255 p
->item
= array
[i
].commit
;
260 free_commit_list(p
->next
);
263 strbuf_release(&buf
);
269 * zero or positive weight is the number of interesting commits it can
270 * reach, including itself. Especially, weight = 0 means it does not
271 * reach any tree-changing commits (e.g. just above uninteresting one
272 * but traversal is with pathspec).
274 * weight = -1 means it has one parent and its distance is yet to
277 * weight = -2 means it has more than one parent and its distance is
278 * unknown. After running count_distance() first, they will get zero
279 * or positive distance.
281 static struct commit_list
*do_find_bisection(struct commit_list
*list
,
282 int nr
, int *weights
,
283 unsigned bisect_flags
)
286 struct commit_list
*p
;
290 for (n
= 0, p
= list
; p
; p
= p
->next
) {
291 struct commit
*commit
= p
->item
;
292 unsigned commit_flags
= commit
->object
.flags
;
294 *commit_weight_at(&commit_weight
, p
->item
) = &weights
[n
++];
295 switch (count_interesting_parents(commit
, bisect_flags
)) {
297 if (!(commit_flags
& TREESAME
)) {
300 show_list("bisection 2 count one",
304 * otherwise, it is known not to reach any
305 * tree-changing commit and gets weight 0.
317 show_list("bisection 2 initialize", counted
, nr
, list
);
320 * If you have only one parent in the resulting set
321 * then you can reach one commit more than that parent
322 * can reach. So we do not have to run the expensive
323 * count_distance() for single strand of pearls.
325 * However, if you have more than one parents, you cannot
326 * just add their distance and one for yourself, since
327 * they usually reach the same ancestor and you would
328 * end up counting them twice that way.
330 * So we will first count distance of merges the usual
331 * way, and then fill the blanks using cheaper algorithm.
333 for (p
= list
; p
; p
= p
->next
) {
334 if (p
->item
->object
.flags
& UNINTERESTING
)
338 if (bisect_flags
& FIND_BISECTION_FIRST_PARENT_ONLY
)
339 BUG("shouldn't be calling count-distance in fp mode");
340 weight_set(p
, count_distance(p
));
341 clear_distance(list
);
343 /* Does it happen to be at half-way? */
344 if (!(bisect_flags
& FIND_BISECTION_ALL
) &&
345 approx_halfway(p
, nr
))
350 show_list("bisection 2 count_distance", counted
, nr
, list
);
352 while (counted
< nr
) {
353 for (p
= list
; p
; p
= p
->next
) {
354 struct commit_list
*q
;
355 unsigned commit_flags
= p
->item
->object
.flags
;
360 for (q
= p
->item
->parents
;
362 q
= bisect_flags
& FIND_BISECTION_FIRST_PARENT_ONLY
? NULL
: q
->next
) {
363 if (q
->item
->object
.flags
& UNINTERESTING
)
372 * weight for p is unknown but q is known.
373 * add one for p itself if p is to be counted,
374 * otherwise inherit it from q directly.
376 if (!(commit_flags
& TREESAME
)) {
377 weight_set(p
, weight(q
)+1);
379 show_list("bisection 2 count one",
383 weight_set(p
, weight(q
));
385 /* Does it happen to be at half-way? */
386 if (!(bisect_flags
& FIND_BISECTION_ALL
) &&
387 approx_halfway(p
, nr
))
392 show_list("bisection 2 counted all", counted
, nr
, list
);
394 if (!(bisect_flags
& FIND_BISECTION_ALL
))
395 return best_bisection(list
, nr
);
397 return best_bisection_sorted(list
, nr
);
400 void find_bisection(struct commit_list
**commit_list
, int *reaches
,
401 int *all
, unsigned bisect_flags
)
404 struct commit_list
*list
, *p
, *best
, *next
, *last
;
407 show_list("bisection 2 entry", 0, 0, *commit_list
);
408 init_commit_weight(&commit_weight
);
411 * Count the number of total and tree-changing items on the
412 * list, while reversing the list.
414 for (nr
= on_list
= 0, last
= NULL
, p
= *commit_list
;
417 unsigned commit_flags
= p
->item
->object
.flags
;
420 if (commit_flags
& UNINTERESTING
) {
426 if (!(commit_flags
& TREESAME
))
431 show_list("bisection 2 sorted", 0, nr
, list
);
434 CALLOC_ARRAY(weights
, on_list
);
436 /* Do the real work of finding bisection commit. */
437 best
= do_find_bisection(list
, nr
, weights
, bisect_flags
);
439 if (!(bisect_flags
& FIND_BISECTION_ALL
)) {
440 list
->item
= best
->item
;
441 free_commit_list(list
->next
);
445 *reaches
= weight(best
);
450 clear_commit_weight(&commit_weight
);
453 static int register_ref(const char *refname
, const char *referent UNUSED
, const struct object_id
*oid
,
454 int flags UNUSED
, void *cb_data UNUSED
)
456 struct strbuf good_prefix
= STRBUF_INIT
;
457 strbuf_addstr(&good_prefix
, term_good
);
458 strbuf_addstr(&good_prefix
, "-");
460 if (!strcmp(refname
, term_bad
)) {
461 free(current_bad_oid
);
462 current_bad_oid
= xmalloc(sizeof(*current_bad_oid
));
463 oidcpy(current_bad_oid
, oid
);
464 } else if (starts_with(refname
, good_prefix
.buf
)) {
465 oid_array_append(&good_revs
, oid
);
466 } else if (starts_with(refname
, "skip-")) {
467 oid_array_append(&skipped_revs
, oid
);
470 strbuf_release(&good_prefix
);
475 static int read_bisect_refs(void)
477 return refs_for_each_ref_in(get_main_ref_store(the_repository
),
478 "refs/bisect/", register_ref
, NULL
);
481 static GIT_PATH_FUNC(git_path_bisect_names
, "BISECT_NAMES")
482 static GIT_PATH_FUNC(git_path_bisect_ancestors_ok
, "BISECT_ANCESTORS_OK")
483 static GIT_PATH_FUNC(git_path_bisect_run
, "BISECT_RUN")
484 static GIT_PATH_FUNC(git_path_bisect_start
, "BISECT_START")
485 static GIT_PATH_FUNC(git_path_bisect_log
, "BISECT_LOG")
486 static GIT_PATH_FUNC(git_path_bisect_terms
, "BISECT_TERMS")
487 static GIT_PATH_FUNC(git_path_bisect_first_parent
, "BISECT_FIRST_PARENT")
489 static void read_bisect_paths(struct strvec
*array
)
491 struct strbuf str
= STRBUF_INIT
;
492 const char *filename
= git_path_bisect_names();
493 FILE *fp
= xfopen(filename
, "r");
495 while (strbuf_getline_lf(&str
, fp
) != EOF
) {
497 if (sq_dequote_to_strvec(str
.buf
, array
))
498 die(_("Badly quoted content in file '%s': %s"),
502 strbuf_release(&str
);
506 static char *join_oid_array_hex(struct oid_array
*array
, char delim
)
508 struct strbuf joined_hexs
= STRBUF_INIT
;
511 for (i
= 0; i
< array
->nr
; i
++) {
512 strbuf_addstr(&joined_hexs
, oid_to_hex(array
->oid
+ i
));
513 if (i
+ 1 < array
->nr
)
514 strbuf_addch(&joined_hexs
, delim
);
517 return strbuf_detach(&joined_hexs
, NULL
);
521 * In this function, passing a not NULL skipped_first is very special.
522 * It means that we want to know if the first commit in the list is
523 * skipped because we will want to test a commit away from it if it is
525 * So if the first commit is skipped, we cannot take the shortcut to
526 * just "return list" when we find the first non skipped commit, we
527 * have to return a fully filtered list.
529 * We use (*skipped_first == -1) to mean "it has been found that the
530 * first commit is not skipped". In this case *skipped_first is set back
531 * to 0 just before the function returns.
533 struct commit_list
*filter_skipped(struct commit_list
*list
,
534 struct commit_list
**tried
,
539 struct commit_list
*filtered
= NULL
, **f
= &filtered
;
548 if (!skipped_revs
.nr
)
552 struct commit_list
*next
= list
->next
;
554 if (0 <= oid_array_lookup(&skipped_revs
, &list
->item
->object
.oid
)) {
555 if (skipped_first
&& !*skipped_first
)
557 /* Move current to tried list */
562 if (!skipped_first
|| !*skipped_first
) {
563 free_commit_list(next
);
564 free_commit_list(filtered
);
567 } else if (skipped_first
&& !*skipped_first
) {
568 /* This means we know it's not skipped */
571 /* Move current to filtered list */
580 if (skipped_first
&& *skipped_first
== -1)
586 #define PRN_MODULO 32768
589 * This is a pseudo random number generator based on "man 3 rand".
590 * It is not used properly because the seed is the argument and it
591 * is increased by one between each call, but that should not matter
592 * for this application.
594 static unsigned get_prn(unsigned count
)
596 count
= count
* 1103515245 + 12345;
597 return (count
/65536) % PRN_MODULO
;
601 * Custom integer square root from
602 * https://en.wikipedia.org/wiki/Integer_square_root
604 static int sqrti(int val
)
612 float y
= (x
+ (float)val
/ x
) / 2;
613 d
= (y
> x
) ? y
- x
: x
- y
;
620 static struct commit_list
*skip_away(struct commit_list
*list
, int count
)
622 struct commit_list
*cur
, *previous
, *result
= list
;
625 prn
= get_prn(count
);
626 index
= (count
* prn
/ PRN_MODULO
) * sqrti(prn
) / sqrti(PRN_MODULO
);
631 for (i
= 0; cur
; cur
= cur
->next
, i
++) {
633 if (!oideq(&cur
->item
->object
.oid
, current_bad_oid
))
644 for (cur
= list
; cur
!= result
; ) {
645 struct commit_list
*next
= cur
->next
;
653 static struct commit_list
*managed_skipped(struct commit_list
*list
,
654 struct commit_list
**tried
)
656 int count
, skipped_first
;
660 if (!skipped_revs
.nr
)
663 list
= filter_skipped(list
, tried
, 0, &count
, &skipped_first
);
668 return skip_away(list
, count
);
671 static void bisect_rev_setup(struct repository
*r
, struct rev_info
*revs
,
672 struct strvec
*rev_argv
,
674 const char *bad_format
, const char *good_format
,
677 struct setup_revision_opt opt
= {
678 .free_removed_argv_elements
= 1,
682 repo_init_revisions(r
, revs
, prefix
);
684 revs
->commit_format
= CMIT_FMT_UNSPECIFIED
;
686 /* rev_argv.argv[0] will be ignored by setup_revisions */
687 strvec_push(rev_argv
, "bisect_rev_setup");
688 strvec_pushf(rev_argv
, bad_format
, oid_to_hex(current_bad_oid
));
689 for (i
= 0; i
< good_revs
.nr
; i
++)
690 strvec_pushf(rev_argv
, good_format
,
691 oid_to_hex(good_revs
.oid
+ i
));
692 strvec_push(rev_argv
, "--");
694 read_bisect_paths(rev_argv
);
696 setup_revisions(rev_argv
->nr
, rev_argv
->v
, revs
, &opt
);
699 static void bisect_common(struct rev_info
*revs
)
701 if (prepare_revision_walk(revs
))
702 die("revision walk setup failed");
703 if (revs
->tree_objects
)
704 mark_edges_uninteresting(revs
, NULL
, 0);
707 static enum bisect_error
error_if_skipped_commits(struct commit_list
*tried
,
708 const struct object_id
*bad
)
713 printf("There are only 'skip'ped commits left to test.\n"
714 "The first %s commit could be any of:\n", term_bad
);
716 for ( ; tried
; tried
= tried
->next
)
717 printf("%s\n", oid_to_hex(&tried
->item
->object
.oid
));
720 printf("%s\n", oid_to_hex(bad
));
721 printf(_("We cannot bisect more!\n"));
723 return BISECT_ONLY_SKIPPED_LEFT
;
726 static int is_expected_rev(const struct object_id
*oid
)
728 struct object_id expected_oid
;
729 if (refs_read_ref(get_main_ref_store(the_repository
), "BISECT_EXPECTED_REV", &expected_oid
))
731 return oideq(oid
, &expected_oid
);
734 enum bisect_error
bisect_checkout(const struct object_id
*bisect_rev
,
737 struct commit
*commit
;
738 struct pretty_print_context pp
= {0};
739 struct strbuf commit_msg
= STRBUF_INIT
;
741 refs_update_ref(get_main_ref_store(the_repository
), NULL
,
742 "BISECT_EXPECTED_REV", bisect_rev
, NULL
, 0,
743 UPDATE_REFS_DIE_ON_ERR
);
746 refs_update_ref(get_main_ref_store(the_repository
), NULL
,
747 "BISECT_HEAD", bisect_rev
, NULL
, 0,
748 UPDATE_REFS_DIE_ON_ERR
);
750 struct child_process cmd
= CHILD_PROCESS_INIT
;
753 strvec_pushl(&cmd
.args
, "checkout", "-q",
754 oid_to_hex(bisect_rev
), "--", NULL
);
755 if (run_command(&cmd
))
757 * Errors in `run_command()` itself, signaled by res < 0,
758 * and errors in the child process, signaled by res > 0
759 * can both be treated as regular BISECT_FAILED (-1).
761 return BISECT_FAILED
;
764 commit
= lookup_commit_reference(the_repository
, bisect_rev
);
765 repo_format_commit_message(the_repository
, commit
, "[%H] %s%n",
767 fputs(commit_msg
.buf
, stdout
);
768 strbuf_release(&commit_msg
);
773 static struct commit
*get_commit_reference(struct repository
*r
,
774 const struct object_id
*oid
)
776 struct commit
*c
= lookup_commit_reference(r
, oid
);
778 die(_("Not a valid commit name %s"), oid_to_hex(oid
));
782 static struct commit
**get_bad_and_good_commits(struct repository
*r
,
788 ALLOC_ARRAY(rev
, 1 + good_revs
.nr
);
789 rev
[n
++] = get_commit_reference(r
, current_bad_oid
);
790 for (i
= 0; i
< good_revs
.nr
; i
++)
791 rev
[n
++] = get_commit_reference(r
, good_revs
.oid
+ i
);
797 static enum bisect_error
handle_bad_merge_base(void)
799 if (is_expected_rev(current_bad_oid
)) {
800 char *bad_hex
= oid_to_hex(current_bad_oid
);
801 char *good_hex
= join_oid_array_hex(&good_revs
, ' ');
802 if (!strcmp(term_bad
, "bad") && !strcmp(term_good
, "good")) {
803 fprintf(stderr
, _("The merge base %s is bad.\n"
804 "This means the bug has been fixed "
805 "between %s and [%s].\n"),
806 bad_hex
, bad_hex
, good_hex
);
807 } else if (!strcmp(term_bad
, "new") && !strcmp(term_good
, "old")) {
808 fprintf(stderr
, _("The merge base %s is new.\n"
809 "The property has changed "
810 "between %s and [%s].\n"),
811 bad_hex
, bad_hex
, good_hex
);
813 fprintf(stderr
, _("The merge base %s is %s.\n"
814 "This means the first '%s' commit is "
815 "between %s and [%s].\n"),
816 bad_hex
, term_bad
, term_good
, bad_hex
, good_hex
);
820 return BISECT_MERGE_BASE_CHECK
;
823 fprintf(stderr
, _("Some %s revs are not ancestors of the %s rev.\n"
824 "git bisect cannot work properly in this case.\n"
825 "Maybe you mistook %s and %s revs?\n"),
826 term_good
, term_bad
, term_good
, term_bad
);
827 return BISECT_FAILED
;
830 static void handle_skipped_merge_base(const struct object_id
*mb
)
832 char *mb_hex
= oid_to_hex(mb
);
833 char *bad_hex
= oid_to_hex(current_bad_oid
);
834 char *good_hex
= join_oid_array_hex(&good_revs
, ' ');
836 warning(_("the merge base between %s and [%s] "
838 "So we cannot be sure the first %s commit is "
839 "between %s and %s.\n"
840 "We continue anyway."),
841 bad_hex
, good_hex
, term_bad
, mb_hex
, bad_hex
);
846 * "check_merge_bases" checks that merge bases are not "bad" (or "new").
848 * - If one is "bad" (or "new"), it means the user assumed something wrong
849 * and we must return error with a non 0 error code.
850 * - If one is "good" (or "old"), that's good, we have nothing to do.
851 * - If one is "skipped", we can't know but we should warn.
852 * - If we don't know, we should check it out and ask the user to test.
853 * - If a merge base must be tested, on success return
854 * BISECT_INTERNAL_SUCCESS_MERGE_BASE (-11) a special condition
855 * for early success, this will be converted back to 0 in
856 * check_good_are_ancestors_of_bad().
858 static enum bisect_error
check_merge_bases(size_t rev_nr
, struct commit
**rev
, int no_checkout
)
860 enum bisect_error res
= BISECT_OK
;
861 struct commit_list
*result
= NULL
;
863 if (repo_get_merge_bases_many(the_repository
, rev
[0], rev_nr
- 1,
864 rev
+ 1, &result
) < 0)
867 for (struct commit_list
*l
= result
; l
; l
= l
->next
) {
868 const struct object_id
*mb
= &l
->item
->object
.oid
;
869 if (oideq(mb
, current_bad_oid
)) {
870 res
= handle_bad_merge_base();
872 } else if (0 <= oid_array_lookup(&good_revs
, mb
)) {
874 } else if (0 <= oid_array_lookup(&skipped_revs
, mb
)) {
875 handle_skipped_merge_base(mb
);
877 printf(_("Bisecting: a merge base must be tested\n"));
878 res
= bisect_checkout(mb
, no_checkout
);
880 /* indicate early success */
881 res
= BISECT_INTERNAL_SUCCESS_MERGE_BASE
;
886 free_commit_list(result
);
890 static int check_ancestors(struct repository
*r
, size_t rev_nr
,
891 struct commit
**rev
, const char *prefix
)
893 struct strvec rev_argv
= STRVEC_INIT
;
894 struct rev_info revs
;
897 bisect_rev_setup(r
, &revs
, &rev_argv
, prefix
, "^%s", "%s", 0);
899 bisect_common(&revs
);
900 res
= (revs
.commits
!= NULL
);
902 /* Clean up objects used, as they will be reused. */
903 clear_commit_marks_many(rev_nr
, rev
, ALL_REV_FLAGS
);
905 release_revisions(&revs
);
906 strvec_clear(&rev_argv
);
911 * "check_good_are_ancestors_of_bad" checks that all "good" revs are
912 * ancestor of the "bad" rev.
914 * If that's not the case, we need to check the merge bases.
915 * If a merge base must be tested by the user, its source code will be
916 * checked out to be tested by the user and we will return.
919 static enum bisect_error
check_good_are_ancestors_of_bad(struct repository
*r
,
927 enum bisect_error res
= BISECT_OK
;
930 if (!current_bad_oid
)
931 return error(_("a %s revision is needed"), term_bad
);
933 filename
= git_pathdup("BISECT_ANCESTORS_OK");
935 /* Check if file BISECT_ANCESTORS_OK exists. */
936 if (!stat(filename
, &st
) && S_ISREG(st
.st_mode
))
939 /* Bisecting with no good rev is ok. */
943 /* Check if all good revs are ancestor of the bad rev. */
945 rev
= get_bad_and_good_commits(r
, &rev_nr
);
946 if (check_ancestors(r
, rev_nr
, rev
, prefix
))
947 res
= check_merge_bases(rev_nr
, rev
, no_checkout
);
951 /* Create file BISECT_ANCESTORS_OK. */
952 fd
= open(filename
, O_CREAT
| O_TRUNC
| O_WRONLY
, 0600);
955 * BISECT_ANCESTORS_OK file is not absolutely necessary,
956 * the bisection process will continue at the next
958 * So, just signal with a warning that something
961 warning_errno(_("could not create file '%s'"),
972 * Display a commit summary to the user.
974 static void show_commit(struct commit
*commit
)
976 struct child_process show
= CHILD_PROCESS_INIT
;
979 * Call git show with --no-pager, as it would otherwise
980 * paginate the "git show" output only, not the output
981 * from bisect_next_all(); this can be fixed by moving
982 * it into a --format parameter, but that would override
983 * the user's default options for "git show", which we
984 * are trying to honour.
986 strvec_pushl(&show
.args
,
991 "--no-abbrev-commit",
992 "--diff-merges=first-parent",
993 oid_to_hex(&commit
->object
.oid
), NULL
);
995 if (run_command(&show
))
996 die(_("unable to start 'show' for object '%s'"),
997 oid_to_hex(&commit
->object
.oid
));
1001 * The terms used for this bisect session are stored in BISECT_TERMS.
1002 * We read them and store them to adapt the messages accordingly.
1003 * Default is bad/good.
1005 void read_bisect_terms(char **read_bad
, char **read_good
)
1007 struct strbuf str
= STRBUF_INIT
;
1008 const char *filename
= git_path_bisect_terms();
1009 FILE *fp
= fopen(filename
, "r");
1012 if (errno
== ENOENT
) {
1014 *read_bad
= xstrdup("bad");
1016 *read_good
= xstrdup("good");
1019 die_errno(_("could not read file '%s'"), filename
);
1022 strbuf_getline_lf(&str
, fp
);
1024 *read_bad
= strbuf_detach(&str
, NULL
);
1025 strbuf_getline_lf(&str
, fp
);
1027 *read_good
= strbuf_detach(&str
, NULL
);
1029 strbuf_release(&str
);
1034 * We use the convention that return BISECT_INTERNAL_SUCCESS_1ST_BAD_FOUND (-10) means
1035 * the bisection process finished successfully.
1036 * In this case the calling function or command should not turn a
1037 * BISECT_INTERNAL_SUCCESS_1ST_BAD_FOUND return code into an error or a non zero exit code.
1039 * Checking BISECT_INTERNAL_SUCCESS_1ST_BAD_FOUND
1040 * in bisect_helper::bisect_next() and only transforming it to 0 at
1041 * the end of bisect_helper::cmd_bisect__helper() helps bypassing
1042 * all the code related to finding a commit to test.
1044 enum bisect_error
bisect_next_all(struct repository
*r
, const char *prefix
)
1046 struct strvec rev_argv
= STRVEC_INIT
;
1047 struct rev_info revs
= REV_INFO_INIT
;
1048 struct commit_list
*tried
= NULL
;
1049 int reaches
= 0, all
= 0, nr
, steps
;
1050 enum bisect_error res
= BISECT_OK
;
1051 struct object_id
*bisect_rev
;
1054 * If no_checkout is non-zero, the bisection process does not
1055 * checkout the trial commit but instead simply updates BISECT_HEAD.
1057 int no_checkout
= refs_ref_exists(get_main_ref_store(the_repository
),
1059 unsigned bisect_flags
= 0;
1061 read_bisect_terms(&term_bad
, &term_good
);
1062 if (read_bisect_refs())
1063 die(_("reading bisect refs failed"));
1065 if (file_exists(git_path_bisect_first_parent()))
1066 bisect_flags
|= FIND_BISECTION_FIRST_PARENT_ONLY
;
1068 if (skipped_revs
.nr
)
1069 bisect_flags
|= FIND_BISECTION_ALL
;
1071 res
= check_good_are_ancestors_of_bad(r
, prefix
, no_checkout
);
1075 bisect_rev_setup(r
, &revs
, &rev_argv
, prefix
, "%s", "^%s", 1);
1077 revs
.first_parent_only
= !!(bisect_flags
& FIND_BISECTION_FIRST_PARENT_ONLY
);
1080 bisect_common(&revs
);
1082 find_bisection(&revs
.commits
, &reaches
, &all
, bisect_flags
);
1083 revs
.commits
= managed_skipped(revs
.commits
, &tried
);
1085 if (!revs
.commits
) {
1087 * We should return error here only if the "bad"
1088 * commit is also a "skip" commit.
1090 res
= error_if_skipped_commits(tried
, NULL
);
1093 printf(_("%s was both %s and %s\n"),
1094 oid_to_hex(current_bad_oid
),
1098 res
= BISECT_FAILED
;
1103 fprintf(stderr
, _("No testable commit found.\n"
1104 "Maybe you started with bad path arguments?\n"));
1106 res
= BISECT_NO_TESTABLE_COMMIT
;
1110 bisect_rev
= &revs
.commits
->item
->object
.oid
;
1112 if (oideq(bisect_rev
, current_bad_oid
)) {
1113 res
= error_if_skipped_commits(tried
, current_bad_oid
);
1116 printf("%s is the first %s commit\n", oid_to_hex(bisect_rev
),
1119 show_commit(revs
.commits
->item
);
1121 * This means the bisection process succeeded.
1122 * Using BISECT_INTERNAL_SUCCESS_1ST_BAD_FOUND (-10)
1123 * so that the call chain can simply check
1124 * for negative return values for early returns up
1125 * until the cmd_bisect__helper() caller.
1127 res
= BISECT_INTERNAL_SUCCESS_1ST_BAD_FOUND
;
1131 nr
= all
- reaches
- 1;
1132 steps
= estimate_bisect_steps(all
);
1134 steps_msg
= xstrfmt(Q_("(roughly %d step)", "(roughly %d steps)",
1137 * TRANSLATORS: the last %s will be replaced with "(roughly %d
1138 * steps)" translation.
1140 printf(Q_("Bisecting: %d revision left to test after this %s\n",
1141 "Bisecting: %d revisions left to test after this %s\n",
1142 nr
), nr
, steps_msg
);
1144 /* Clean up objects used, as they will be reused. */
1145 repo_clear_commit_marks(r
, ALL_REV_FLAGS
);
1147 res
= bisect_checkout(bisect_rev
, no_checkout
);
1149 free_commit_list(tried
);
1150 release_revisions(&revs
);
1151 strvec_clear(&rev_argv
);
1155 static inline int exp2i(int n
)
1161 * Estimate the number of bisect steps left (after the current step)
1163 * For any x between 0 included and 2^n excluded, the probability for
1164 * n - 1 steps left looks like:
1166 * P(2^n + x) == (2^n - x) / (2^n + x)
1168 * and P(2^n + x) < 0.5 means 2^n < 3x
1170 int estimate_bisect_steps(int all
)
1181 return (e
< 3 * x
) ? n
: n
- 1;
1184 static int mark_for_removal(const char *refname
,
1185 const char *referent UNUSED
,
1186 const struct object_id
*oid UNUSED
,
1187 int flag UNUSED
, void *cb_data
)
1189 struct string_list
*refs
= cb_data
;
1190 char *ref
= xstrfmt("refs/bisect%s", refname
);
1191 string_list_append(refs
, ref
);
1195 int bisect_clean_state(void)
1199 /* There may be some refs packed during bisection */
1200 struct string_list refs_for_removal
= STRING_LIST_INIT_NODUP
;
1201 refs_for_each_ref_in(get_main_ref_store(the_repository
),
1202 "refs/bisect", mark_for_removal
,
1203 (void *) &refs_for_removal
);
1204 string_list_append(&refs_for_removal
, xstrdup("BISECT_HEAD"));
1205 string_list_append(&refs_for_removal
, xstrdup("BISECT_EXPECTED_REV"));
1206 result
= refs_delete_refs(get_main_ref_store(the_repository
),
1207 "bisect: remove", &refs_for_removal
,
1209 refs_for_removal
.strdup_strings
= 1;
1210 string_list_clear(&refs_for_removal
, 0);
1211 unlink_or_warn(git_path_bisect_ancestors_ok());
1212 unlink_or_warn(git_path_bisect_log());
1213 unlink_or_warn(git_path_bisect_names());
1214 unlink_or_warn(git_path_bisect_run());
1215 unlink_or_warn(git_path_bisect_terms());
1216 unlink_or_warn(git_path_bisect_first_parent());
1218 * Cleanup BISECT_START last to support the --no-checkout option
1219 * introduced in the commit 4796e823a.
1221 unlink_or_warn(git_path_bisect_start());