All of lore.kernel.org
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Pranit Bauva <pranit.bauva@gmail.com>
Cc: git@vger.kernel.org
Subject: Re: [PATCH v14 14/27] bisect--helper: `bisect_next` and `bisect_auto_next` shell function in C
Date: Thu, 25 Aug 2016 13:30:14 -0700	[thread overview]
Message-ID: <xmqq37lsmw15.fsf@gitster.mtv.corp.google.com> (raw)
In-Reply-To: <01020156b73fe6ce-3b204354-849b-40fd-93ff-2ebcf77df91c-000000@eu-west-1.amazonses.com> (Pranit Bauva's message of "Tue, 23 Aug 2016 11:53:53 +0000")

Pranit Bauva <pranit.bauva@gmail.com> writes:

> A lot of parts of bisect.c uses exit() and these signals are then
> trapped in the `bisect_start` function. Since the shell script ceases
> its existence it would be necessary to convert those exit() calls to
> return statements so that errors can be reported efficiently in C code.

Is efficiency really an issue?  I think the real reason is that it
would make it impossible for the callers to handle errors, if you do
not convert and let the error codepaths exit().

> @@ -729,7 +735,7 @@ static struct commit **get_bad_and_good_commits(int *rev_nr)
>  	return rev;
>  }
>  
> -static void handle_bad_merge_base(void)
> +static int handle_bad_merge_base(void)
>  {
>  	if (is_expected_rev(current_bad_oid)) {
>  		char *bad_hex = oid_to_hex(current_bad_oid);
> @@ -750,17 +756,18 @@ static void handle_bad_merge_base(void)
>  				"between %s and [%s].\n"),
>  				bad_hex, term_bad, term_good, bad_hex, good_hex);
>  		}
> -		exit(3);
> +		return 3;
>  	}
>  
>  	fprintf(stderr, _("Some %s revs are not ancestor of the %s rev.\n"
>  		"git bisect cannot work properly in this case.\n"
>  		"Maybe you mistook %s and %s revs?\n"),
>  		term_good, term_bad, term_good, term_bad);
> -	exit(1);
> +	bisect_clean_state();
> +	return 1;

What is the logic behind this function sometimes clean the state,
and some other times do not, when it makes an error-return?  We see
above that "return 3" codepath leaves the state behind.

Either you forgot a necessary clean_state in "return 3" codepath,
or you forgot to document why the distinction exists in the in-code
comment for the function.  I cannot tell which, but I am leaning
towards guessing that it is the former.

> -static void check_good_are_ancestors_of_bad(const char *prefix, int no_checkout)
> +static int check_good_are_ancestors_of_bad(const char *prefix, int no_checkout)
>  {
>  	char *filename = git_pathdup("BISECT_ANCESTORS_OK");
>  	struct stat st;
> -	int fd;
> +	int fd, res = 0;
>  
>  	if (!current_bad_oid)
>  		die(_("a %s revision is needed"), term_bad);

Can you let it die yere?

> @@ -873,8 +890,11 @@ static void check_good_are_ancestors_of_bad(const char *prefix, int no_checkout)
>  			      filename);
>  	else
>  		close(fd);
> +
> +	return 0;
>   done:
>  	free(filename);
> +	return 0;
>  }

Who owns "filename"?  The first "return 0" leaves it unfreed, and
when "goto done" is done, it is freed.

The above two may indicate that "perhaps 'retval + goto finish'
pattern?" is a really relevant suggestion for the earlier steps in
this series.

>  	if (!all) {
>  		fprintf(stderr, _("No testable commit found.\n"
>  			"Maybe you started with bad path parameters?\n"));
> -		exit(4);
> +		return 4;
>  	}
>  
>  	bisect_rev = revs.commits->item->object.oid.hash;
>  
>  	if (!hashcmp(bisect_rev, current_bad_oid->hash)) {
> -		exit_if_skipped_commits(tried, current_bad_oid);
> +		res = exit_if_skipped_commits(tried, current_bad_oid);
> +		if (res)
> +			return res;
> +
>  		printf("%s is the first %s commit\n", sha1_to_hex(bisect_rev),
>  			term_bad);
>  		show_diff_tree(prefix, revs.commits->item);
>  		/* This means the bisection process succeeded. */
> -		exit(10);
> +		return 10;
>  	}
>  
>  	nr = all - reaches - 1;
> @@ -1005,7 +1033,11 @@ int bisect_next_all(const char *prefix, int no_checkout)
>  		  "Bisecting: %d revisions left to test after this %s\n",
>  		  nr), nr, steps_msg);
>  
> -	return bisect_checkout(bisect_rev, no_checkout);
> +	res = bisect_checkout(bisect_rev, no_checkout);
> +	if (res)
> +		bisect_clean_state();
> +
> +	return res;
>  }

There were tons of "exit_if" that was converted to "if (res) return
res" above, instead of jumping here to cause clean_state to be
called.  I cannot tell if this new call to clean_state() is wrong,
or all the earlier "return res" should come here.  I am guessing the
latter.

> diff --git a/builtin/bisect--helper.c b/builtin/bisect--helper.c
> index c64996a..ef7b3a1 100644
> --- a/builtin/bisect--helper.c
> +++ b/builtin/bisect--helper.c
> @@ -8,6 +8,7 @@
>  #include "run-command.h"
>  #include "prompt.h"
>  #include "quote.h"
> +#include "revision.h"
>  
>  static GIT_PATH_FUNC(git_path_bisect_terms, "BISECT_TERMS")
>  static GIT_PATH_FUNC(git_path_bisect_expected_rev, "BISECT_EXPECTED_REV")
> @@ -29,6 +30,8 @@ static const char * const git_bisect_helper_usage[] = {
>  	N_("git bisect--helper --bisect-terms [--term-good | --term-old | --term-bad | --term-new]"),
>  	N_("git bisect--helper --bisect start [--term-{old,good}=<term> --term-{new,bad}=<term>]"
>  					      "[--no-checkout] [<bad> [<good>...]] [--] [<paths>...]"),
> +	N_("git bisect--helper --bisect-next"),
> +	N_("git bisect--helper --bisect-auto-next"),
>  	NULL
>  };
>  
> @@ -396,6 +399,129 @@ static int bisect_terms(struct bisect_terms *terms, const char **argv, int argc)
>  	return 0;
>  }
>  
> +static int register_good_ref(const char *refname,
> +			     const struct object_id *oid, int flags,
> +			     void *cb_data)
> +{
> +	struct string_list *good_refs = cb_data;
> +	string_list_append(good_refs, oid_to_hex(oid));
> +	return 0;
> +}
> +
> +static int bisect_next(struct bisect_terms *terms, const char *prefix)
> +{
> +	int res, no_checkout;
> +
> +	/* In case of mistaken revs or checkout error, or signals received,

That's an unbalanced comment.  You end the block with "*/" on its
own line, so you should start the block with "/*" on its own line.
There seems to be at least one more such comment in this patch but I
won't repeat.

> +	 * "bisect_auto_next" below may exit or misbehave.
> +	 * We have to trap this to be able to clean up using
> +	 * "bisect_clean_state".
> +	 */

"exit" meaning "call exit() to terminate the process", or something
else?  If the latter, don't say "exit", but say "return error".

> +	if (bisect_next_check(terms, terms->term_good.buf))
> +		return -1;

Mental note.  The "autostart" in the original is gone.  Perhaps it
is done by next_check in this code, but we haven't seen that yet.

> +	no_checkout = !is_empty_or_missing_file(git_path_bisect_head());
> +
> +	/* Perform all bisection computation, display and checkout */
> +	res = bisect_next_all(prefix , no_checkout);
> +
> +	if (res == 10) {
> +		FILE *fp;
> +		unsigned char sha1[20];
> +		struct commit *commit;
> +		struct pretty_print_context pp = {0};
> +		struct strbuf commit_name = STRBUF_INIT;
> +		char *bad_ref = xstrfmt("refs/bisect/%s",
> +					      terms->term_bad.buf);
> +		read_ref(bad_ref, sha1);
> +		commit = lookup_commit_reference(sha1);
> +		format_commit_message(commit, "%s", &commit_name, &pp);
> +		fp = fopen(git_path_bisect_log(), "a");
> +		if (!fp) {
> +			free(bad_ref);
> +			strbuf_release(&commit_name);
> +			return -1;
> +		}
> +		if (fprintf(fp, "# first %s commit: [%s] %s\n",
> +			    terms->term_bad.buf, sha1_to_hex(sha1),
> +			    commit_name.buf) < 1){
> +			free(bad_ref);
> +			strbuf_release(&commit_name);
> +			fclose(fp);
> +			return -1;
> +		}
> +		free(bad_ref);
> +		strbuf_release(&commit_name);
> +		fclose(fp);
> +		return 0;

Doesn't it bother you that you have to write free(bad_ref)...fclose(fp)
repeatedly?

> +	}
> +	else if (res == 2) {
> +		FILE *fp;
> +		struct rev_info revs;
> +		struct argv_array rev_argv = ARGV_ARRAY_INIT;
> +		struct string_list good_revs = STRING_LIST_INIT_DUP;
> +		struct pretty_print_context pp = {0};
> +		struct commit *commit;
> +		char *term_good = xstrfmt("%s-*", terms->term_good.buf);
> +		int i;
> +
> +		fp = fopen(git_path_bisect_log(), "a");
> +		if (!fp) {
> +			free(term_good);
> +			return -1;
> +		}
> +		if (fprintf(fp, "# only skipped commits left to test\n") < 1) {
> +			free(term_good);
> +			fclose(fp);
> +			return -1;
> +		}
> +		for_each_glob_ref_in(register_good_ref, term_good,
> +				     "refs/bisect/", (void *) &good_revs);
> +
> +		free(term_good);

Doesn't it bother you that you have to write free(term_good) repeatedly?

> +		argv_array_pushl(&rev_argv, "skipped_commits", "refs/bisect/bad", "--not", NULL);
> +		for (i = 0; i < good_revs.nr; i++)
> +			argv_array_push(&rev_argv, good_revs.items[i].string);
> +
> +		/* It is important to reset the flags used by revision walks
> +		 * as the previous call to bisect_next_all() in turn
> +		 * setups a revision walk.
> +		 */
> +		reset_revision_walk();
> +		init_revisions(&revs, NULL);
> +		rev_argv.argc = setup_revisions(rev_argv.argc, rev_argv.argv, &revs, NULL);
> +		argv_array_clear(&rev_argv);
> +		string_list_clear(&good_revs, 0);

Are you sure that the revision walking machinery is prepared to see
the argv[] and elements in it you have given to setup_revisions()
gets cleared before it starts doing the real work in
prepare_revision_walk()?  I am reasonably sure that the machinery
borrows strings like pathspec elements from the caller and expects
them to stay during revision traversal.

You seem to have acquired a habit of freeing and clearing things
early, which is bad.  Instead, make it a habit of free/clear at the
end, and make sure all error paths go through that central freeing
site.  That tends to future-proof your code better from leaking even
when later other people change it.

> +		if (prepare_revision_walk(&revs)) {
> +			die(_("revision walk setup failed\n"));
> +		}

This one is still allowed to die, without clean_state?

> +		while ((commit = get_revision(&revs)) != NULL) {
> +			struct strbuf commit_name = STRBUF_INIT;
> +			format_commit_message(commit, "%s",
> +					      &commit_name, &pp);
> +			fprintf(fp, "# possible first %s commit: "
> +				    "[%s] %s\n", terms->term_bad.buf,
> +				    oid_to_hex(&commit->object.oid),
> +				    commit_name.buf);
> +			strbuf_release(&commit_name);
> +		}
> +
> +		fclose(fp);
> +		return res;
> +	}
> +
> +	return res;
> +}

> @@ -415,47 +541,67 @@ static int bisect_start(struct bisect_terms *terms, int no_checkout,
>  		no_checkout = 1;
>  
>  	for (i = 0; i < argc; i++) {
> -		if (!strcmp(argv[i], "--")) {
> +		const char *arg;
> +		if (starts_with(argv[i], "'"))
> +			arg = sq_dequote(xstrdup(argv[i]));
> +		else
> +			arg = argv[i];
> +		if (!strcmp(arg, "--")) {
>  			has_double_dash = 1;
>  			break;
>  		}
>  	}

This is really bad; you are blindly assuming that anything that
begins with "'" begins with "'" because "git-bisect.sh" sq-quoted
and it never directly came from the command line that _wanted_ to
give you something that begins with a "'".

I suspect that you should be able to dequote on the calling script
side.  Then all these ugliness would disappear.

>  	for (i = 0; i < argc; i++) {
> -		const char *commit_id = xstrfmt("%s^{commit}", argv[i]);
> +		const char *arg, *commit_id;
> +		if (starts_with(argv[i], "'"))
> +			arg = sq_dequote(xstrdup(argv[i]));
> +		else
> +			arg = argv[i];

Likewise.

> +		commit_id = xstrfmt("%s^{commit}", arg);

In any case, I think a separate "const char *arg" that is an alias
to argv[i] in the loop is a very good idea to do from the very
beginning (i.e. should be done in a much much earlier patch in this
series).

  reply	other threads:[~2016-08-25 20:30 UTC|newest]

Thread overview: 320+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-07-12 22:35 [PATCH 0/9] Resend of gitster/pb/bisect Pranit Bauva
2016-07-12 22:35 ` [PATCH 1/9] bisect--helper: use OPT_CMDMODE instead of OPT_BOOL Pranit Bauva
2016-07-12 22:35 ` [PATCH 2/9] bisect: rewrite `check_term_format` shell function in C Pranit Bauva
2016-07-12 22:35 ` [PATCH 3/9] bisect--helper: `write_terms` " Pranit Bauva
2016-07-12 22:35 ` [PATCH 4/9] bisect--helper: `bisect_clean_state` " Pranit Bauva
2016-07-12 22:35 ` [PATCH 5/9] t6030: explicitly test for bisection cleanup Pranit Bauva
2016-07-12 22:35 ` [PATCH 6/9] wrapper: move is_empty_file() and rename it as is_empty_or_missing_file() Pranit Bauva
2016-07-12 22:35 ` [PATCH 7/9] bisect--helper: `bisect_reset` shell function in C Pranit Bauva
2016-07-12 22:35 ` [PATCH 8/9] bisect--helper: `is_expected_rev` & `check_expected_revs` " Pranit Bauva
2016-07-12 22:35 ` [PATCH 9/9] bisect--helper: `bisect_write` " Pranit Bauva
2016-07-13  7:47 ` [PATCH 0/9] Resend of gitster/pb/bisect Christian Couder
2016-07-20 16:00 ` Pranit Bauva
2016-07-20 21:47 ` [PATCH v10 01/12] bisect--helper: use OPT_CMDMODE instead of OPT_BOOL Pranit Bauva
2016-07-20 21:47   ` [PATCH v10 04/12] bisect--helper: `bisect_clean_state` shell function in C Pranit Bauva
2016-07-20 21:47   ` [PATCH v10 03/12] bisect--helper: `write_terms` " Pranit Bauva
2016-07-20 21:47   ` [PATCH v10 05/12] t6030: explicitly test for bisection cleanup Pranit Bauva
2016-07-20 21:47   ` [PATCH v10 02/12] bisect: rewrite `check_term_format` shell function in C Pranit Bauva
2016-07-20 21:47   ` [PATCH v10 07/12] bisect--helper: `bisect_reset` " Pranit Bauva
2016-07-20 21:47   ` [PATCH v10 08/12] bisect--helper: `is_expected_rev` & `check_expected_revs` " Pranit Bauva
2016-07-20 21:47   ` [PATCH v10 11/12] bisect--helper: `bisect_next_check` " Pranit Bauva
2016-07-20 21:47   ` [PATCH v10 09/12] bisect--helper: `bisect_write` " Pranit Bauva
2016-07-20 21:47   ` [PATCH v10 12/12] bisect--helper: `get_terms` & `bisect_terms` " Pranit Bauva
2016-07-22  2:29     ` Torsten Bögershausen
2016-07-22 14:07       ` Pranit Bauva
2016-07-25 16:53         ` Junio C Hamano
2016-07-25 21:28           ` Christian Couder
2016-07-26  1:42           ` Torsten Bögershausen
2016-07-26 17:32             ` Junio C Hamano
2016-07-27  4:20               ` Pranit Bauva
2016-07-27 16:13                 ` Junio C Hamano
2016-07-20 21:47   ` [PATCH v10 10/12] bisect--helper: `check_and_set_terms` " Pranit Bauva
2016-07-20 21:47   ` [PATCH v10 06/12] wrapper: move is_empty_file() and rename it as is_empty_or_missing_file() Pranit Bauva
2016-07-31  9:21   ` [RFC/PATCH v11 01/13] bisect--helper: use OPT_CMDMODE instead of OPT_BOOL Pranit Bauva
2016-07-31  9:21     ` [RFC/PATCH v11 13/13] bisect--helper: `bisect_start` shell function partially in C Pranit Bauva
2016-08-02 20:19       ` Junio C Hamano
2016-08-03 20:49         ` Pranit Bauva
2016-07-31  9:21     ` [RFC/PATCH v11 02/13] bisect: rewrite `check_term_format` shell function " Pranit Bauva
2016-08-02 17:31       ` Junio C Hamano
2016-08-03 20:20         ` Pranit Bauva
2016-07-31  9:21     ` [RFC/PATCH v11 09/13] bisect--helper: `bisect_write` " Pranit Bauva
2016-08-02 20:25       ` Junio C Hamano
2016-08-02 22:17         ` Junio C Hamano
2016-08-03 20:52           ` Pranit Bauva
2016-08-03 20:51         ` Pranit Bauva
2016-07-31  9:21     ` [RFC/PATCH v11 05/13] t6030: explicitly test for bisection cleanup Pranit Bauva
2016-07-31  9:21     ` [RFC/PATCH v11 11/13] bisect--helper: `bisect_next_check` shell function in C Pranit Bauva
2016-08-02 19:17       ` Junio C Hamano
2016-08-03 20:33         ` Pranit Bauva
2016-07-31  9:21     ` [RFC/PATCH v11 04/13] bisect--helper: `bisect_clean_state` " Pranit Bauva
2016-08-02 17:46       ` Junio C Hamano
2016-08-03 20:27         ` Pranit Bauva
2016-08-04 15:45           ` Junio C Hamano
2016-08-04 16:07             ` Pranit Bauva
2016-08-04 16:50               ` Junio C Hamano
2016-08-04 16:57                 ` Pranit Bauva
2016-07-31  9:21     ` [RFC/PATCH v11 06/13] wrapper: move is_empty_file() and rename it as is_empty_or_missing_file() Pranit Bauva
2016-07-31  9:21     ` [RFC/PATCH v11 03/13] bisect--helper: `write_terms` shell function in C Pranit Bauva
2016-08-02 17:38       ` Junio C Hamano
2016-08-03 20:21         ` Pranit Bauva
2016-08-04 15:39           ` Junio C Hamano
2016-07-31  9:21     ` [RFC/PATCH v11 07/13] bisect--helper: `bisect_reset` " Pranit Bauva
2016-08-02 18:44       ` Junio C Hamano
2016-07-31  9:21     ` [RFC/PATCH v11 10/13] bisect--helper: `check_and_set_terms` " Pranit Bauva
2016-08-02 18:53       ` Junio C Hamano
2016-08-03 20:29         ` Pranit Bauva
2016-07-31  9:21     ` [RFC/PATCH v11 08/13] bisect--helper: `is_expected_rev` & `check_expected_revs` " Pranit Bauva
2016-08-02 18:46       ` Junio C Hamano
2016-07-31  9:21     ` [RFC/PATCH v11 12/13] bisect--helper: `get_terms` & `bisect_terms` " Pranit Bauva
2016-08-02 19:22       ` Junio C Hamano
2016-08-03 20:33         ` Pranit Bauva
2016-08-02 17:25     ` [RFC/PATCH v11 01/13] bisect--helper: use OPT_CMDMODE instead of OPT_BOOL Junio C Hamano
2016-08-10 21:57     ` [PATCH v12 " Pranit Bauva
2016-08-10 21:57       ` [PATCH v12 09/13] bisect--helper: `bisect_write` shell function in C Pranit Bauva
2016-08-10 21:57       ` [PATCH v12 08/13] bisect--helper: `is_expected_rev` & `check_expected_revs` " Pranit Bauva
2016-08-10 21:57       ` [PATCH v12 10/13] bisect--helper: `check_and_set_terms` " Pranit Bauva
2016-08-10 21:57       ` [PATCH v12 13/13] bisect--helper: `bisect_start` shell function partially " Pranit Bauva
2016-08-12 19:25         ` Junio C Hamano
2016-08-13  6:33           ` Pranit Bauva
2016-08-13  7:34         ` Christian Couder
2016-08-13 13:50           ` Pranit Bauva
2016-08-10 21:57       ` [PATCH v12 02/13] bisect: rewrite `check_term_format` shell function " Pranit Bauva
2016-08-10 21:57       ` [PATCH v12 11/13] bisect--helper: `bisect_next_check` & bisect_voc " Pranit Bauva
2016-08-12 18:11         ` Junio C Hamano
2016-08-12 18:49           ` Junio C Hamano
2016-08-13  6:32             ` Pranit Bauva
2016-08-10 21:57       ` [PATCH v12 07/13] bisect--helper: `bisect_reset` " Pranit Bauva
2016-08-10 21:57       ` [PATCH v12 03/13] bisect--helper: `write_terms` " Pranit Bauva
2016-08-10 21:57       ` [PATCH v12 12/13] bisect--helper: `get_terms` & `bisect_terms` " Pranit Bauva
2016-08-10 21:57       ` [PATCH v12 05/13] t6030: explicitly test for bisection cleanup Pranit Bauva
2016-08-10 21:57       ` [PATCH v12 06/13] wrapper: move is_empty_file() and rename it as is_empty_or_missing_file() Pranit Bauva
2016-08-10 21:57       ` [PATCH v12 04/13] bisect--helper: `bisect_clean_state` shell function in C Pranit Bauva
2016-08-12 19:24         ` Junio C Hamano
2016-08-10 22:19       ` [PATCH v12 01/13] bisect--helper: use OPT_CMDMODE instead of OPT_BOOL Pranit Bauva
2016-08-19 20:32       ` [PATCH v13 " Pranit Bauva
2016-08-19 20:32         ` [PATCH v13 03/13] bisect--helper: `write_terms` shell function in C Pranit Bauva
2016-08-19 20:32         ` [PATCH v13 13/13] bisect--helper: `bisect_start` shell function partially " Pranit Bauva
2016-08-19 20:32         ` [PATCH v13 02/13] bisect: rewrite `check_term_format` shell function " Pranit Bauva
2016-08-19 20:32         ` [PATCH v13 08/13] bisect--helper: `is_expected_rev` & `check_expected_revs` " Pranit Bauva
2016-08-19 20:32         ` [PATCH v13 05/13] t6030: explicitly test for bisection cleanup Pranit Bauva
2016-08-19 20:32         ` [PATCH v13 12/13] bisect--helper: `get_terms` & `bisect_terms` shell function in C Pranit Bauva
2016-08-19 20:32         ` [PATCH v13 06/13] wrapper: move is_empty_file() and rename it as is_empty_or_missing_file() Pranit Bauva
2016-08-19 20:32         ` [PATCH v13 11/13] bisect--helper: `bisect_next_check` & bisect_voc shell function in C Pranit Bauva
2016-08-19 20:32         ` [PATCH v13 09/13] bisect--helper: `bisect_write` " Pranit Bauva
2016-08-19 20:32         ` [PATCH v13 10/13] bisect--helper: `check_and_set_terms` " Pranit Bauva
2016-08-19 20:32         ` [PATCH v13 04/13] bisect--helper: `bisect_clean_state` " Pranit Bauva
2016-08-21 11:18           ` Pranit Bauva
2016-08-19 20:32         ` [PATCH v13 07/13] bisect--helper: `bisect_reset` " Pranit Bauva
2016-08-21 11:14         ` [PATCH v13 01/13] bisect--helper: use OPT_CMDMODE instead of OPT_BOOL Pranit Bauva
2016-08-23 11:53         ` [PATCH v14 01/27] " Pranit Bauva
2016-08-23 11:53           ` [PATCH v14 08/27] bisect--helper: `is_expected_rev` & `check_expected_revs` shell function in C Pranit Bauva
2016-08-24 22:13             ` Junio C Hamano
2016-08-27  9:14               ` Pranit Bauva
2016-08-29 17:17                 ` Junio C Hamano
2016-08-23 11:53           ` [PATCH v14 09/27] bisect--helper: `bisect_write` " Pranit Bauva
2016-08-24 22:30             ` Junio C Hamano
2016-08-27  9:33               ` Pranit Bauva
2016-08-27 21:22                 ` Junio C Hamano
2016-08-30  6:42                   ` Pranit Bauva
2016-08-23 11:53           ` [PATCH v14 13/27] bisect--helper: `bisect_start` shell function partially " Pranit Bauva
2016-08-25 19:02             ` Junio C Hamano
2016-08-25 19:43               ` Junio C Hamano
2016-08-27 19:47               ` Pranit Bauva
2016-08-27 20:53                 ` Junio C Hamano
2016-08-23 11:53           ` [PATCH v14 11/27] bisect--helper: `bisect_next_check` & bisect_voc shell function " Pranit Bauva
2016-08-24 22:40             ` Junio C Hamano
2016-08-27  9:35               ` Pranit Bauva
2016-08-23 11:53           ` [PATCH v14 26/27] bisect--helper: retire `--bisect-auto-next` subcommand Pranit Bauva
2016-08-23 11:53           ` [PATCH v14 05/27] t6030: explicitly test for bisection cleanup Pranit Bauva
2016-08-23 11:53           ` [PATCH v14 06/27] wrapper: move is_empty_file() and rename it as is_empty_or_missing_file() Pranit Bauva
2016-08-23 11:53           ` [PATCH v14 20/27] bisect--helper: retire `--write-terms` subcommand Pranit Bauva
2016-08-23 11:53           ` [PATCH v14 16/27] bisect--helper: retire `--next-all` subcommand Pranit Bauva
2016-08-23 11:53           ` [PATCH v14 19/27] bisect--helper: retire `--check-expected-revs` subcommand Pranit Bauva
2016-08-23 11:53           ` [PATCH v14 17/27] bisect--helper: `bisect_autostart` shell function in C Pranit Bauva
2016-08-26 21:09             ` Junio C Hamano
2016-08-23 11:53           ` [PATCH v14 25/27] bisect--helper: retire `--bisect-autostart` subcommand Pranit Bauva
2016-08-23 11:53           ` [PATCH v14 24/27] bisect--helper: retire `--check-and-set-terms` subcommand Pranit Bauva
2016-08-23 11:53           ` [PATCH v14 27/27] bisect--helper: remove the dequote in bisect_start() Pranit Bauva
2016-08-23 11:53           ` [PATCH v14 23/27] bisect--helper: retire `--bisect-write` subcommand Pranit Bauva
2016-08-23 11:53           ` [PATCH v14 02/27] bisect: rewrite `check_term_format` shell function in C Pranit Bauva
2016-08-23 11:53           ` [PATCH v14 12/27] bisect--helper: `get_terms` & `bisect_terms` " Pranit Bauva
2016-08-25 18:05             ` Junio C Hamano
2016-08-27  9:48               ` Pranit Bauva
2016-08-29 17:15                 ` Junio C Hamano
2016-08-23 11:53           ` [PATCH v14 03/27] bisect--helper: `write_terms` " Pranit Bauva
2016-08-23 11:53           ` [PATCH v14 14/27] bisect--helper: `bisect_next` and `bisect_auto_next` " Pranit Bauva
2016-08-25 20:30             ` Junio C Hamano [this message]
2016-08-30 18:25               ` Pranit Bauva
2016-08-30 18:44                 ` Pranit Bauva
2016-08-30 19:33                 ` Junio C Hamano
2016-08-30 20:17                   ` Pranit Bauva
2016-08-23 11:53           ` [PATCH v14 10/27] bisect--helper: `check_and_set_terms` " Pranit Bauva
2016-08-23 11:53           ` [PATCH v14 18/27] bisect--helper: `bisect_state` & `bisect_head` " Pranit Bauva
2016-08-23 11:53           ` [PATCH v14 04/27] bisect--helper: `bisect_clean_state` " Pranit Bauva
2016-08-24 20:58             ` Junio C Hamano
2016-08-23 11:53           ` [PATCH v14 15/27] bisect--helper: retire `--bisect-clean-state` subcommand Pranit Bauva
2016-08-26 20:56             ` Junio C Hamano
2016-08-23 11:53           ` [PATCH v14 22/27] bisect--helper: `bisect_replay` shell function in C Pranit Bauva
2016-08-26 23:24             ` Junio C Hamano
2016-08-23 11:53           ` [PATCH v14 07/27] bisect--helper: `bisect_reset` " Pranit Bauva
2016-08-24 21:12             ` Junio C Hamano
2016-08-26 13:46               ` Pranit Bauva
2016-08-26 16:29                 ` Junio C Hamano
2016-08-27 10:52                   ` Pranit Bauva
2016-08-29 17:06                     ` Junio C Hamano
2016-08-23 11:53           ` [PATCH v14 21/27] bisect--helper: `bisect_log` " Pranit Bauva
2016-08-26 23:07             ` Junio C Hamano
2016-08-27 20:16               ` Pranit Bauva
2016-08-23 20:28           ` [PATCH v14 01/27] bisect--helper: use OPT_CMDMODE instead of OPT_BOOL Junio C Hamano
2016-08-23 21:07             ` Pranit Bauva
2016-08-23 21:24           ` Pranit Bauva
2016-10-14 14:14           ` [PATCH v15 " Pranit Bauva
2016-10-14 14:14             ` [PATCH v15 05/27] t6030: explicitly test for bisection cleanup Pranit Bauva
2016-10-14 14:14             ` [PATCH v15 02/27] bisect: rewrite `check_term_format` shell function in C Pranit Bauva
2016-11-14 22:20               ` Stephan Beyer
2016-11-15  5:16                 ` Pranit Bauva
2016-10-14 14:14             ` [PATCH v15 03/27] bisect--helper: `write_terms` " Pranit Bauva
2016-10-14 14:14             ` [PATCH v15 27/27] bisect--helper: remove the dequote in bisect_start() Pranit Bauva
2016-10-14 14:14             ` [PATCH v15 25/27] bisect--helper: retire `--bisect-autostart` subcommand Pranit Bauva
2016-10-14 14:14             ` [PATCH v15 09/27] bisect--helper: `bisect_write` shell function in C Pranit Bauva
2016-11-17  9:40               ` Stephan Beyer
2016-12-06 21:32                 ` Pranit Bauva
2016-10-14 14:14             ` [PATCH v15 06/27] wrapper: move is_empty_file() and rename it as is_empty_or_missing_file() Pranit Bauva
2016-10-14 14:14             ` [PATCH v15 07/27] bisect--helper: `bisect_reset` shell function in C Pranit Bauva
2016-11-16 23:23               ` Stephan Beyer
2016-11-17  3:56                 ` Pranit Bauva
2016-10-14 14:14             ` [PATCH v15 22/27] bisect--helper: `bisect_log` " Pranit Bauva
2016-11-17 21:47               ` Stephan Beyer
2016-12-06 22:42                 ` Pranit Bauva
2016-10-14 14:14             ` [PATCH v15 26/27] bisect--helper: retire `--bisect-auto-next` subcommand Pranit Bauva
2016-10-14 14:14             ` [PATCH v15 19/27] bisect--helper: `bisect_state` & `bisect_head` shell function in C Pranit Bauva
2016-11-22  0:12               ` Stephan Beyer
2016-12-06 22:40                 ` Pranit Bauva
2016-12-06 23:54                   ` Stephan Beyer
2016-12-08  6:43                     ` Pranit Bauva
2016-10-14 14:14             ` [PATCH v15 13/27] bisect--helper: `bisect_start` shell function partially " Pranit Bauva
2016-11-15 23:19               ` Stephan Beyer
2016-11-16 17:09                 ` Pranit Bauva
2016-11-20 20:01               ` Stephan Beyer
2016-11-20 20:19                 ` Stephan Beyer
2016-10-14 14:14             ` [PATCH v15 10/27] bisect--helper: `check_and_set_terms` shell function " Pranit Bauva
2016-11-17 20:25               ` Stephan Beyer
2016-12-06 22:43                 ` Pranit Bauva
2016-10-14 14:14             ` [PATCH v15 12/27] bisect--helper: `get_terms` & `bisect_terms` " Pranit Bauva
2016-11-17 21:32               ` Stephan Beyer
2016-12-06 21:14                 ` Pranit Bauva
2016-12-06 23:05                   ` Stephan Beyer
2016-12-07 12:06                     ` Pranit Bauva
2016-10-14 14:14             ` [PATCH v15 23/27] bisect--helper: `bisect_replay` " Pranit Bauva
2016-11-22  0:49               ` Stephan Beyer
2016-12-06 23:02                 ` Pranit Bauva
2016-12-06 23:20                   ` Stephan Beyer
2016-12-06 23:40                   ` Stephan Beyer
2016-12-07 13:15                     ` Christian Couder
2016-10-14 14:14             ` [PATCH v15 08/27] bisect--helper: `is_expected_rev` & `check_expected_revs` " Pranit Bauva
2016-11-16 23:47               ` Stephan Beyer
2016-12-06 19:33                 ` Pranit Bauva
2016-12-16 19:00                   ` Pranit Bauva
2016-12-17 19:42                     ` Stephan Beyer
2016-12-16 19:35                 ` Pranit Bauva
2016-12-17 19:55                   ` Stephan Beyer
2016-10-14 14:14             ` [PATCH v15 17/27] bisect--helper: retire `--next-all` subcommand Pranit Bauva
2016-10-14 14:14             ` [PATCH v15 18/27] bisect--helper: `bisect_autostart` shell function in C Pranit Bauva
2016-11-20 20:15               ` Stephan Beyer
2016-12-06 19:47                 ` Pranit Bauva
2016-10-14 14:14             ` [PATCH v15 24/27] bisect--helper: retire `--bisect-write` subcommand Pranit Bauva
2016-10-14 14:14             ` [PATCH v15 14/27] t6030: no cleanup with bad merge base Pranit Bauva
2016-10-14 21:43               ` Junio C Hamano
2016-10-15  8:46                 ` Pranit Bauva
2016-10-14 14:14             ` [PATCH v15 11/27] bisect--helper: `bisect_next_check` & bisect_voc shell function in C Pranit Bauva
2016-11-17 20:59               ` Stephan Beyer
2016-12-06 18:39                 ` Pranit Bauva
2016-10-14 14:14             ` [PATCH v15 04/27] bisect--helper: `bisect_clean_state` " Pranit Bauva
2016-11-15 21:09               ` Stephan Beyer
2016-11-15 21:40                 ` Junio C Hamano
2016-11-15 21:53                   ` Stephan Beyer
2016-11-16 16:49                   ` Pranit Bauva
2016-10-14 14:14             ` [PATCH v15 21/27] bisect--helper: retire `--write-terms` subcommand Pranit Bauva
2016-10-14 14:14             ` [PATCH v15 20/27] bisect--helper: retire `--check-expected-revs` subcommand Pranit Bauva
2016-10-14 14:14             ` [PATCH v15 16/27] bisect--helper: retire `--bisect-clean-state` subcommand Pranit Bauva
2016-10-14 14:14             ` [PATCH v15 15/27] bisect--helper: `bisect_next` and `bisect_auto_next` shell function in C Pranit Bauva
2016-11-20 20:01               ` Stephan Beyer
2016-12-31 10:23                 ` Pranit Bauva
2016-11-21 21:35               ` Stephan Beyer
2016-12-31 10:43                 ` Pranit Bauva
2017-01-01 16:27                   ` Stephan Beyer
2017-01-01 17:41                     ` Pranit Bauva
2016-10-14 15:12             ` [PATCH v15 01/27] bisect--helper: use OPT_CMDMODE instead of OPT_BOOL Pranit Bauva
2017-09-29  6:49               ` [PATCH v16 1/6] " Pranit Bauva
2017-09-29  6:49                 ` [PATCH v16 5/6] t6030: explicitly test for bisection cleanup Pranit Bauva
2017-09-29  6:49                 ` [PATCH v16 3/6] bisect--helper: `write_terms` shell function in C Pranit Bauva
2017-09-29  6:49                 ` [PATCH v16 2/6] bisect--helper: rewrite `check_term_format` " Pranit Bauva
2017-09-29  6:49                 ` [PATCH v16 4/6] bisect--helper: `bisect_clean_state` " Pranit Bauva
2017-09-29  6:49                 ` [PATCH v16 6/6] bisect--helper: `is_expected_rev` & `check_expected_revs` " Pranit Bauva
2017-11-19 20:34                   ` Christian Couder
2017-11-20  3:05                     ` Junio C Hamano
2017-11-20  7:03                       ` Christian Couder
2017-09-29 18:54                 ` [PATCH v16 1/6] bisect--helper: use OPT_CMDMODE instead of OPT_BOOL Stephan Beyer
2017-09-29 21:10                   ` Pranit Bauva
2017-09-30 12:59                 ` Ramsay Jones
2017-10-02 13:44                   ` Pranit Bauva
2017-10-03  0:48                     ` Ramsay Jones
2017-10-03  3:51                       ` Junio C Hamano
2017-10-03  4:35                         ` Pranit Bauva
2017-10-04  2:22                         ` Ramsay Jones
2017-10-04  4:07                           ` Junio C Hamano
2017-10-27 15:06                 ` [PATCH v16 Part II 1/8] bisect--helper: `bisect_reset` shell function in C Pranit Bauva
2017-10-27 15:06                   ` [PATCH v16 Part II 7/8] bisect--helper: `bisect_start` shell function partially " Pranit Bauva
2017-10-30 16:51                     ` Stephan Beyer
2017-10-30 17:28                       ` Pranit Bauva
2018-02-16  1:22                     ` SZEDER Gábor
2017-10-27 15:06                   ` [PATCH v16 Part II 6/8] bisect--helper: `get_terms` & `bisect_terms` shell function " Pranit Bauva
2017-10-27 20:04                     ` Martin Ågren
2017-10-30 17:45                       ` Pranit Bauva
2017-10-30 16:34                     ` Stephan Beyer
2017-10-30 17:31                       ` Pranit Bauva
2017-11-08  0:59                     ` Ramsay Jones
2017-10-27 15:06                   ` [PATCH v16 Part II 3/8] wrapper: move is_empty_file() and rename it as is_empty_or_missing_file() Pranit Bauva
2017-10-27 15:06                   ` [PATCH v16 Part II 2/8] bisect--helper: `bisect_write` shell function in C Pranit Bauva
2017-10-27 17:28                     ` Martin Ågren
2017-10-30 17:35                       ` Pranit Bauva
2018-11-23 10:13                         ` Johannes Schindelin
2018-11-23 12:22                           ` Martin Ågren
2018-11-26 18:18                             ` Johannes Schindelin
2017-10-27 18:19                     ` Junio C Hamano
2017-10-30 17:38                       ` Pranit Bauva
2017-10-30 13:38                     ` Stephan Beyer
2017-10-30 16:24                       ` Stephan Beyer
2017-11-08  0:26                     ` Ramsay Jones
2017-10-27 15:06                   ` [PATCH v16 Part II 5/8] bisect--helper: `bisect_next_check` " Pranit Bauva
2017-10-27 17:35                     ` Martin Ågren
2017-10-30 17:40                       ` Pranit Bauva
2017-11-08  0:48                     ` Ramsay Jones
2017-11-12 19:19                     ` Stephan Beyer
2017-11-12 19:27                     ` Stephan Beyer
2017-11-12 20:03                     ` Stephan Beyer
2017-11-13  3:56                       ` Junio C Hamano
2017-10-27 15:06                   ` [PATCH v16 Part II 8/8] t6030: make various test to pass GETTEXT_POISON tests Pranit Bauva
2017-10-27 15:06                   ` [PATCH v16 Part II 4/8] bisect--helper: `check_and_set_terms` shell function in C Pranit Bauva
2017-11-08  0:37                     ` Ramsay Jones
2017-10-27 15:32                   ` [PATCH v16 Part II 1/8] bisect--helper: `bisect_reset` " Pranit Bauva
2017-10-27 17:40                   ` Junio C Hamano
2017-10-30 17:26                     ` Pranit Bauva
2017-10-30 13:22                   ` Stephan Beyer
2017-10-30 17:27                     ` Pranit Bauva
2017-11-08  0:07                   ` Ramsay Jones
2019-01-02 15:38                   ` [PATCH v17 0/7] git bisect: convert from shell to C Tanushree Tumane via GitGitGadget
2019-01-02 15:38                     ` [PATCH v17 1/7] bisect--helper: `bisect_reset` shell function in C Pranit Bauva via GitGitGadget
2019-01-02 15:38                     ` [PATCH v17 2/7] bisect--helper: `bisect_write` " Pranit Bauva via GitGitGadget
2019-01-02 15:38                     ` [PATCH v17 3/7] wrapper: move is_empty_file() and rename it as is_empty_or_missing_file() Pranit Bauva via GitGitGadget
2019-01-02 15:38                     ` [PATCH v17 4/7] bisect--helper: `check_and_set_terms` shell function in C Pranit Bauva via GitGitGadget
2019-01-02 15:38                     ` [PATCH v17 5/7] bisect--helper: `bisect_next_check` " Pranit Bauva via GitGitGadget
2019-01-02 15:38                     ` [PATCH v17 6/7] bisect--helper: `get_terms` & `bisect_terms` " Pranit Bauva via GitGitGadget
2019-01-02 15:38                     ` [PATCH v17 7/7] bisect--helper: `bisect_start` shell function partially " Pranit Bauva via GitGitGadget
2019-01-03  1:19                     ` [PATCH v17 0/7] git bisect: convert from shell to C Ramsay Jones
2019-01-07  9:15                       ` TANUSHREE TUMANE
2016-10-27 16:59             ` [PATCH v15 01/27] bisect--helper: use OPT_CMDMODE instead of OPT_BOOL Junio C Hamano
2016-10-27 20:14               ` Christian Couder
2016-10-28  6:02               ` Matthieu Moy
2016-11-15 21:40               ` Stephan Beyer
2016-11-16  0:18                 ` 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=xmqq37lsmw15.fsf@gitster.mtv.corp.google.com \
    --to=gitster@pobox.com \
    --cc=git@vger.kernel.org \
    --cc=pranit.bauva@gmail.com \
    /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.