From: Junio C Hamano <gitster@pobox.com>
To: Stephan Beyer <s-beyer@gmx.net>
Cc: git@vger.kernel.org, Christian Couder <christian.couder@gmail.com>
Subject: Re: [PATCH v2 16/21] bisect: make total number of commits global
Date: Fri, 15 Apr 2016 15:11:06 -0700 [thread overview]
Message-ID: <xmqq7ffy8qv9.fsf@gitster.mtv.corp.google.com> (raw)
In-Reply-To: <1460294354-7031-17-git-send-email-s-beyer@gmx.net> (Stephan Beyer's message of "Sun, 10 Apr 2016 15:19:09 +0200")
Stephan Beyer <s-beyer@gmx.net> writes:
> The total number of commits in a bisect process is a property of
> the bisect process. Making this property global helps to make the code
> clearer.
OK.
>
> Signed-off-by: Stephan Beyer <s-beyer@gmx.net>
> ---
> bisect.c | 74 ++++++++++++++++++++++++++++++++++------------------------------
> 1 file changed, 39 insertions(+), 35 deletions(-)
>
> diff --git a/bisect.c b/bisect.c
> index f737ce7..2b415ad 100644
> --- a/bisect.c
> +++ b/bisect.c
> @@ -23,6 +23,8 @@ static const char *argv_show_branch[] = {"show-branch", NULL, NULL};
> static const char *term_bad;
> static const char *term_good;
>
> +static int total;
> +
> static unsigned marker;
>
> struct node_data {
> @@ -38,7 +40,7 @@ static inline struct node_data *node_data(struct commit *elem)
> return (struct node_data *)elem->util;
> }
>
> -static inline int get_distance(struct commit *commit, int total)
> +static inline int get_distance(struct commit *commit)
> {
> int distance = node_data(commit)->weight;
> if (total - distance < distance)
> @@ -54,7 +56,7 @@ static inline int get_distance(struct commit *commit, int total)
> * Return 0 if the distance is halfway.
> * Return 1 if the distance is rising.
> */
> -static inline int distance_direction(struct commit *commit, int total)
> +static inline int distance_direction(struct commit *commit)
> {
> int doubled_diff = 2 * node_data(commit)->weight - total;
> if (doubled_diff < -1)
> @@ -107,25 +109,25 @@ static int count_interesting_parents(struct commit *commit)
> return count;
> }
>
> -static inline int halfway(struct commit *commit, int nr)
> +static inline int halfway(struct commit *commit)
> {
> /*
> * Don't short-cut something we are not going to return!
> */
> if (commit->object.flags & TREESAME)
> return 0;
> - return !distance_direction(commit, nr);
> + return !distance_direction(commit);
> }
>
> #if !DEBUG_BISECT
> -#define show_list(a,b,c,d) do { ; } while (0)
> +#define show_list(a,b,c) do { ; } while (0)
> #else
> -static void show_list(const char *debug, int counted, int nr,
> +static void show_list(const char *debug, int counted,
> struct commit_list *list)
> {
> struct commit_list *p;
>
> - fprintf(stderr, "%s (%d/%d)\n", debug, counted, nr);
> + fprintf(stderr, "%s (%d/%d)\n", debug, counted, total);
>
> for (p = list; p; p = p->next) {
> struct commit_list *pp;
> @@ -157,7 +159,7 @@ static void show_list(const char *debug, int counted, int nr,
> }
> #endif /* DEBUG_BISECT */
>
> -static struct commit_list *best_bisection(struct commit_list *list, int nr)
> +static struct commit_list *best_bisection(struct commit_list *list)
> {
> struct commit_list *p, *best;
> int best_distance = -1;
> @@ -169,7 +171,7 @@ static struct commit_list *best_bisection(struct commit_list *list, int nr)
>
> if (flags & TREESAME)
> continue;
> - distance = get_distance(p->item, nr);
> + distance = get_distance(p->item);
> if (distance > best_distance) {
> best = p;
> best_distance = distance;
> @@ -195,10 +197,10 @@ static int compare_commit_dist(const void *a_, const void *b_)
> return oidcmp(&a->commit->object.oid, &b->commit->object.oid);
> }
>
> -static struct commit_list *best_bisection_sorted(struct commit_list *list, int nr)
> +static struct commit_list *best_bisection_sorted(struct commit_list *list)
> {
> struct commit_list *p;
> - struct commit_dist *array = xcalloc(nr, sizeof(*array));
> + struct commit_dist *array = xcalloc(total, sizeof(*array));
> int cnt, i;
>
> for (p = list, cnt = 0; p; p = p->next) {
> @@ -207,7 +209,7 @@ static struct commit_list *best_bisection_sorted(struct commit_list *list, int n
>
> if (flags & TREESAME)
> continue;
> - distance = get_distance(p->item, nr);
> + distance = get_distance(p->item);
> array[cnt].commit = p->item;
> array[cnt].distance = distance;
> cnt++;
> @@ -243,7 +245,7 @@ static struct commit_list *best_bisection_sorted(struct commit_list *list, int n
> * or positive distance.
> */
> static struct commit_list *do_find_bisection(struct commit_list *list,
> - int nr, struct node_data *weights,
> + struct node_data *weights,
> int find_all)
> {
> int n, counted;
> @@ -262,7 +264,7 @@ static struct commit_list *do_find_bisection(struct commit_list *list,
> node_data(commit)->weight = 1;
> counted++;
> show_list("bisection 2 count one",
> - counted, nr, list);
> + counted, list);
> }
> /*
> * otherwise, it is known not to reach any
> @@ -278,7 +280,7 @@ static struct commit_list *do_find_bisection(struct commit_list *list,
> }
> }
>
> - show_list("bisection 2 initialize", counted, nr, list);
> + show_list("bisection 2 initialize", counted, list);
>
> /*
> * If you have only one parent in the resulting set
> @@ -300,15 +302,15 @@ static struct commit_list *do_find_bisection(struct commit_list *list,
> node_data(p->item)->weight = count_distance(p->item);
>
> /* Does it happen to be at exactly half-way? */
> - if (!find_all && halfway(p->item, nr))
> + if (!find_all && halfway(p->item))
> return p;
> counted++;
> }
> }
>
> - show_list("bisection 2 count_distance", counted, nr, list);
> + show_list("bisection 2 count_distance", counted, list);
>
> - while (counted < nr) {
> + while (counted < total) {
> for (p = list; p; p = p->next) {
> struct commit_list *q;
> unsigned flags = p->item->object.flags;
> @@ -334,40 +336,41 @@ static struct commit_list *do_find_bisection(struct commit_list *list,
> node_data(p->item)->weight++;
> counted++;
> show_list("bisection 2 count one",
> - counted, nr, list);
> + counted, list);
> }
>
> /* Does it happen to be at exactly half-way? */
> - if (!find_all && halfway(p->item, nr))
> + if (!find_all && halfway(p->item))
> return p;
> }
> }
>
> - show_list("bisection 2 counted all", counted, nr, list);
> + show_list("bisection 2 counted all", counted, list);
>
> if (!find_all)
> - return best_bisection(list, nr);
> + return best_bisection(list);
> else
> - return best_bisection_sorted(list, nr);
> + return best_bisection_sorted(list);
> }
>
> struct commit_list *find_bisection(struct commit_list *list,
> int *reaches, int *all,
> int find_all)
> {
> - int nr, on_list;
> + int on_list;
> struct commit_list *p, *best, *next, *last;
> struct node_data *weights;
>
> + total = 0;
> marker = 0;
>
> - show_list("bisection 2 entry", 0, 0, list);
> + show_list("bisection 2 entry", 0, list);
>
> /*
> * Count the number of total and tree-changing items on the
> * list, while reversing the list.
> */
> - for (nr = on_list = 0, last = NULL, p = list;
> + for (on_list = 0, last = NULL, p = list;
> p;
> p = next) {
> unsigned flags = p->item->object.flags;
> @@ -378,23 +381,24 @@ struct commit_list *find_bisection(struct commit_list *list,
> p->next = last;
> last = p;
> if (!(flags & TREESAME))
> - nr++;
> + total++;
> on_list++;
> }
> list = last;
> - show_list("bisection 2 sorted", 0, nr, list);
> + show_list("bisection 2 sorted", 0, list);
>
> - *all = nr;
> + *all = total;
> weights = (struct node_data *)xcalloc(on_list, sizeof(*weights));
>
> /* Do the real work of finding bisection commit. */
> - best = do_find_bisection(list, nr, weights, find_all);
> + best = do_find_bisection(list, weights, find_all);
> if (best) {
> if (!find_all)
> best->next = NULL;
> *reaches = node_data(best->item)->weight;
> }
> free(weights);
> +
> return best;
> }
>
> @@ -931,7 +935,7 @@ int bisect_next_all(const char *prefix, int no_checkout)
> {
> struct rev_info revs;
> struct commit_list *tried;
> - int reaches = 0, all = 0, nr, steps;
> + int reaches = 0, nr, steps;
> const unsigned char *bisect_rev;
>
> read_bisect_terms(&term_bad, &term_good);
> @@ -945,7 +949,7 @@ int bisect_next_all(const char *prefix, int no_checkout)
>
> bisect_common(&revs);
>
> - revs.commits = find_bisection(revs.commits, &reaches, &all,
> + revs.commits = find_bisection(revs.commits, &reaches, &total,
> !!skipped_revs.nr);
> revs.commits = managed_skipped(revs.commits, &tried);
>
> @@ -963,7 +967,7 @@ int bisect_next_all(const char *prefix, int no_checkout)
> exit(1);
> }
>
> - if (!all) {
> + if (!total) {
> fprintf(stderr, "No testable commit found.\n"
> "Maybe you started with bad path parameters?\n");
> exit(4);
> @@ -982,8 +986,8 @@ int bisect_next_all(const char *prefix, int no_checkout)
>
> free_commit_list(revs.commits);
>
> - nr = all - reaches - 1;
> - steps = estimate_bisect_steps(all);
> + nr = total - reaches - 1;
> + steps = estimate_bisect_steps(total);
> printf("Bisecting: %d revision%s left to test after this "
> "(roughly %d step%s)\n", nr, (nr == 1 ? "" : "s"),
> steps, (steps == 1 ? "" : "s"));
next prev parent reply other threads:[~2016-04-15 22:11 UTC|newest]
Thread overview: 56+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-10 13:18 [PATCH v2 00/21] git bisect improvements Stephan Beyer
2016-04-10 13:18 ` [PATCH v2 01/21] bisect: write about `bisect next` in documentation Stephan Beyer
2016-04-10 13:18 ` [PATCH v2 02/21] bisect: allow 'bisect run' if no good commit is known Stephan Beyer
2016-04-10 13:18 ` [PATCH v2 03/21] t/test-lib-functions.sh: generalize test_cmp_rev Stephan Beyer
2016-04-11 0:07 ` Eric Sunshine
2016-04-15 20:00 ` Junio C Hamano
2016-04-24 19:51 ` Stephan Beyer
2016-04-25 18:08 ` Junio C Hamano
2016-04-10 13:18 ` [PATCH v2 04/21] t: use test_cmp_rev() where appropriate Stephan Beyer
2016-04-11 0:07 ` Eric Sunshine
2016-04-15 20:48 ` Junio C Hamano
2016-04-10 13:18 ` [PATCH v2 05/21] t6030: generalize test to not rely on current implementation Stephan Beyer
2016-04-10 13:47 ` Torsten Bögershausen
2016-04-10 19:16 ` Junio C Hamano
2016-04-10 19:37 ` Stephan Beyer
2016-04-11 0:23 ` Eric Sunshine
2016-04-15 21:07 ` Junio C Hamano
2016-04-10 13:18 ` [PATCH v2 06/21] bisect: add test for the bisect algorithm Stephan Beyer
2016-04-15 21:13 ` Junio C Hamano
2016-04-10 13:19 ` [PATCH v2 07/21] bisect: plug the biggest memory leak Stephan Beyer
2016-04-15 21:18 ` Junio C Hamano
2016-04-10 13:19 ` [PATCH v2 08/21] bisect: make bisect compile if DEBUG_BISECT is set Stephan Beyer
2016-04-15 21:22 ` Junio C Hamano
2016-04-10 13:19 ` [PATCH v2 09/21] bisect: make algorithm behavior independent of DEBUG_BISECT Stephan Beyer
2016-04-15 21:25 ` Junio C Hamano
2016-04-10 13:19 ` [PATCH v2 10/21] bisect: get rid of recursion in count_distance() Stephan Beyer
2016-04-15 21:31 ` Junio C Hamano
2016-04-10 13:19 ` [PATCH v2 11/21] bisect: use struct node_data array instead of int array Stephan Beyer
2016-04-12 23:02 ` Christian Couder
2016-04-15 21:47 ` Junio C Hamano
2016-04-10 13:19 ` [PATCH v2 12/21] bisect: replace clear_distance() by unique markers Stephan Beyer
2016-04-12 23:20 ` Christian Couder
2016-04-15 22:07 ` Junio C Hamano
2016-04-10 13:19 ` [PATCH v2 13/21] bisect: use commit instead of commit list as arguments when appropriate Stephan Beyer
2016-04-15 22:08 ` Junio C Hamano
2016-04-10 13:19 ` [PATCH v2 14/21] bisect: extract get_distance() function from code duplication Stephan Beyer
2016-04-15 22:08 ` Junio C Hamano
2016-04-10 13:19 ` [PATCH v2 15/21] bisect: introduce distance_direction() Stephan Beyer
2016-04-15 22:10 ` Junio C Hamano
2016-04-10 13:19 ` [PATCH v2 16/21] bisect: make total number of commits global Stephan Beyer
2016-04-13 13:23 ` Christian Couder
2016-04-15 22:11 ` Junio C Hamano [this message]
2016-04-16 0:44 ` Junio C Hamano
2016-04-10 13:19 ` [PATCH v2 17/21] bisect: rename count_distance() to compute_weight() Stephan Beyer
2016-04-13 13:32 ` Christian Couder
2016-04-15 22:12 ` Junio C Hamano
2016-04-10 13:19 ` [PATCH v2 18/21] bisect: prepare for different algorithms based on find_all Stephan Beyer
2016-04-15 22:36 ` Junio C Hamano
2016-04-10 13:19 ` [PATCH v2 19/21] bisect: use a bottom-up traversal to find relevant weights Stephan Beyer
2016-04-13 14:11 ` Christian Couder
2016-04-15 22:47 ` Junio C Hamano
2016-04-15 22:49 ` Junio C Hamano
2016-04-26 18:27 ` Junio C Hamano
2016-04-10 13:24 ` [PATCH v2 20/21] bisect: compute best bisection in compute_relevant_weights() Stephan Beyer
2016-04-10 13:24 ` [PATCH v2 21/21] bisect: get back halfway shortcut Stephan Beyer
2016-04-15 22:53 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqq7ffy8qv9.fsf@gitster.mtv.corp.google.com \
--to=gitster@pobox.com \
--cc=christian.couder@gmail.com \
--cc=git@vger.kernel.org \
--cc=s-beyer@gmx.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.