All of lore.kernel.org
 help / color / mirror / Atom feed
From: Pranit Bauva <pranit.bauva@gmail.com>
To: git@vger.kernel.org
Cc: Pranit Bauva <pranit.bauva@gmail.com>,
	christian.couder@gmail.com, chriscool@tuxfamily.org,
	larsxschneider@gmail.com
Subject: [PATCH 4/4] bisect--helper: `bisect_reset` shell function in C
Date: Wed,  8 Jun 2016 02:24:54 +0530	[thread overview]
Message-ID: <20160607205454.22576-4-pranit.bauva@gmail.com> (raw)
In-Reply-To: <20160607205454.22576-1-pranit.bauva@gmail.com>

Reimplement `bisect_reset` shell function in C and add a `--bisect-reset`
subcommand to `git bisect--helper` to call it from git-bisect.sh .

Using `bisect_reset` subcommand is a temporary measure to port shell
functions to C so as to use the existing test suite. As more functions
are ported, this subcommand would be retired and will be called by some
other method.

Note: --bisect-clean-state subcommand has not been retired as there are
still a function namely `bisect_start()` which still uses this
subcommand.

Mentored-by: Lars Schneider <larsxschneider@gmail.com>
Mentored-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Pranit Bauva <pranit.bauva@gmail.com>
---
 builtin/bisect--helper.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++-
 git-bisect.sh            | 28 ++------------------------
 2 files changed, 52 insertions(+), 27 deletions(-)

diff --git a/builtin/bisect--helper.c b/builtin/bisect--helper.c
index ad39181..4153e8a 100644
--- a/builtin/bisect--helper.c
+++ b/builtin/bisect--helper.c
@@ -4,6 +4,8 @@
 #include "bisect.h"
 #include "refs.h"
 #include "dir.h"
+#include "argv-array.h"
+#include "run-command.h"
 
 static GIT_PATH_FUNC(git_path_bisect_write_terms, "BISECT_TERMS")
 static GIT_PATH_FUNC(git_path_bisect_expected_rev, "BISECT_EXPECTED_REV")
@@ -13,11 +15,13 @@ static GIT_PATH_FUNC(git_path_bisect_names, "BISECT_NAMES")
 static GIT_PATH_FUNC(git_path_bisect_run, "BISECT_RUN")
 static GIT_PATH_FUNC(git_path_head_name, "head-name")
 static GIT_PATH_FUNC(git_path_bisect_start, "BISECT_START")
+static GIT_PATH_FUNC(git_path_bisect_head, "BISECT_HEAD")
 
 static const char * const git_bisect_helper_usage[] = {
 	N_("git bisect--helper --next-all [--no-checkout]"),
 	N_("git bisect--helper --write-terms <bad_term> <good_term>"),
 	N_("git bisect--helper --bisect-clean-state"),
+	N_("git bisect--helper --bisect-reset [<commit>]"),
 	NULL
 };
 
@@ -118,12 +122,51 @@ int bisect_clean_state(void)
 	return result;
 }
 
+int bisect_reset(const char *commit)
+{
+	struct strbuf branch = STRBUF_INIT;
+	int status = 0;
+
+	if (file_size(git_path_bisect_start()) < 1) {
+		printf("We are not bisecting.\n");
+		return 0;
+	}
+
+	if (!commit) {
+		strbuf_read_file(&branch, git_path_bisect_start(), 0);
+		strbuf_rtrim(&branch);
+	} else {
+		struct object_id oid;
+		if (get_oid(commit, &oid))
+			return error(_("'%s' is not a valid commit"), commit);
+		strbuf_addf(&branch, "%s", commit);
+	}
+
+	if (!file_exists(git_path_bisect_head())) {
+		struct argv_array argv = ARGV_ARRAY_INIT;
+		argv_array_pushl(&argv, "checkout", branch.buf, "--", NULL);
+		status = run_command_v_opt(argv.argv, RUN_GIT_CMD);
+		argv_array_clear(&argv);
+	}
+
+	if (status) {
+		error(_("Could not check out original HEAD '%s'. "
+				"Try 'git bisect reset <commit>'."), branch.buf);
+		strbuf_release(&branch);
+		return -1;
+	}
+
+	strbuf_release(&branch);
+	return bisect_clean_state();
+}
+
 int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
 {
 	enum {
 		NEXT_ALL = 1,
 		WRITE_TERMS,
-		BISECT_CLEAN_STATE
+		BISECT_CLEAN_STATE,
+		BISECT_RESET
 	} cmdmode = 0;
 	int no_checkout = 0;
 	struct option options[] = {
@@ -133,6 +176,8 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
 			 N_("write the terms to .git/BISECT_TERMS"), WRITE_TERMS),
 		OPT_CMDMODE(0, "bisect-clean-state", &cmdmode,
 			 N_("cleanup the bisection state"), BISECT_CLEAN_STATE),
+		OPT_CMDMODE(0, "bisect-reset", &cmdmode,
+			 N_("reset the bisection state"), BISECT_RESET),
 		OPT_BOOL(0, "no-checkout", &no_checkout,
 			 N_("update BISECT_HEAD instead of checking out the current commit")),
 		OPT_END()
@@ -155,6 +200,10 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
 		if (argc != 0)
 			die(_("--bisect-clean-state requires no arguments"));
 		return bisect_clean_state();
+	case BISECT_RESET:
+		if (argc > 1)
+			die(_("--bisect-reset requires either zero or one arguments"));
+		return bisect_reset(argc ? argv[0] : NULL);
 	default:
 		die("BUG: unknown subcommand '%d'", cmdmode);
 	}
diff --git a/git-bisect.sh b/git-bisect.sh
index bbc57d2..18580b7 100755
--- a/git-bisect.sh
+++ b/git-bisect.sh
@@ -409,35 +409,11 @@ bisect_visualize() {
 	eval '"$@"' --bisect -- $(cat "$GIT_DIR/BISECT_NAMES")
 }
 
-bisect_reset() {
-	test -s "$GIT_DIR/BISECT_START" || {
-		gettextln "We are not bisecting."
-		return
-	}
-	case "$#" in
-	0) branch=$(cat "$GIT_DIR/BISECT_START") ;;
-	1) git rev-parse --quiet --verify "$1^{commit}" >/dev/null || {
-			invalid="$1"
-			die "$(eval_gettext "'\$invalid' is not a valid commit")"
-		}
-		branch="$1" ;;
-	*)
-		usage ;;
-	esac
-
-	if ! test -f "$GIT_DIR/BISECT_HEAD" && ! git checkout "$branch" --
-	then
-		die "$(eval_gettext "Could not check out original HEAD '\$branch'.
-Try 'git bisect reset <commit>'.")"
-	fi
-	git bisect--helper --bisect-clean-state || exit
-}
-
 bisect_replay () {
 	file="$1"
 	test "$#" -eq 1 || die "$(gettext "No logfile given")"
 	test -r "$file" || die "$(eval_gettext "cannot read \$file for replaying")"
-	bisect_reset
+	git bisect--helper --bisect-reset || exit
 	while read git bisect command rev
 	do
 		test "$git $bisect" = "git bisect" || test "$git" = "git-bisect" || continue
@@ -627,7 +603,7 @@ case "$#" in
 	visualize|view)
 		bisect_visualize "$@" ;;
 	reset)
-		bisect_reset "$@" ;;
+		git bisect--helper --bisect-reset "$@" ;;
 	replay)
 		bisect_replay "$@" ;;
 	log)
-- 
2.8.3

  parent reply	other threads:[~2016-06-07 20:56 UTC|newest]

Thread overview: 75+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-07 20:54 [PATCH 1/4] bisect--helper: `bisect_clean_state` shell function in C Pranit Bauva
2016-06-07 20:54 ` [PATCH 2/4] t6030: explicitly test for bisection cleanup Pranit Bauva
2016-06-07 23:21   ` Eric Sunshine
2016-06-08  8:07     ` Pranit Bauva
2016-06-08  8:17       ` Eric Sunshine
2016-06-08 10:20         ` Pranit Bauva
2016-06-07 20:54 ` [PATCH 3/4] dir: introduce file_size() to check the size of file Pranit Bauva
2016-06-08  7:37   ` Eric Sunshine
2016-06-08  7:57     ` Pranit Bauva
2016-06-08  8:13       ` Eric Sunshine
2016-06-08 10:03         ` Christian Couder
2016-06-08  8:17       ` Torsten Bögershausen
2016-06-08 13:08         ` Pranit Bauva
2016-06-12 10:44           ` Torsten Bögershausen
2016-06-13  6:21             ` Pranit Bauva
2016-06-07 20:54 ` Pranit Bauva [this message]
2016-06-08  7:59   ` [PATCH 4/4] bisect--helper: `bisect_reset` shell function in C Eric Sunshine
2016-06-08  9:51     ` Christian Couder
2016-06-08  9:53       ` Christian Couder
2016-06-08 17:50       ` Eric Sunshine
2016-06-08 13:20     ` Pranit Bauva
2016-06-08 17:53       ` Eric Sunshine
2016-06-08 18:04         ` Pranit Bauva
2016-06-07 22:31 ` [PATCH 1/4] bisect--helper: `bisect_clean_state` " Eric Sunshine
2016-06-08  1:51   ` Eric Sunshine
2016-06-08  7:46   ` Pranit Bauva
2016-06-08  8:02     ` Eric Sunshine
2016-06-08  8:09       ` Pranit Bauva
2016-06-08  9:41       ` Christian Couder
2016-06-08 17:59         ` Eric Sunshine
2016-06-08 18:04           ` Pranit Bauva
2016-06-15 14:00 ` [PATCH v2 0/6] convert various shell functions in git-bisect to C Pranit Bauva
2016-06-15 14:00   ` [PATCH v2 1/6] bisect--helper: `bisect_clean_state` shell function in C Pranit Bauva
2016-06-15 18:04     ` Eric Sunshine
2016-06-15 18:47       ` Pranit Bauva
2016-06-15 20:22         ` Eric Sunshine
2016-06-15 14:00   ` [PATCH v2 2/6] t6030: explicitly test for bisection cleanup Pranit Bauva
2016-06-15 14:00   ` [PATCH v2 3/6] wrapper: move is_empty_file() from builtin/am.c Pranit Bauva
2016-06-15 18:12     ` Junio C Hamano
2016-06-15 18:15       ` Pranit Bauva
2016-06-15 18:22     ` Eric Sunshine
2016-06-15 18:40       ` Pranit Bauva
2016-06-15 14:00   ` [PATCH v2 4/6] bisect--helper: `bisect_reset` shell function in C Pranit Bauva
2016-06-15 21:05     ` Eric Sunshine
2016-06-16 19:06       ` Pranit Bauva
2016-06-15 14:00   ` [PATCH v2 5/6] bisect--helper: `is_expected_rev` & `check_expected_revs` " Pranit Bauva
2016-06-15 21:14     ` Eric Sunshine
2016-06-16 19:05       ` Pranit Bauva
2016-06-16 19:16         ` Eric Sunshine
2016-06-16 19:25           ` Pranit Bauva
2016-06-16 20:47             ` Christian Couder
2016-06-17 12:49               ` Pranit Bauva
2016-06-15 14:00   ` [PATCH v2 6/6] bisect--helper: `bisect_write` " Pranit Bauva
2016-06-16 18:55     ` Eric Sunshine
2016-06-16 19:01       ` Pranit Bauva
2016-06-16 20:38         ` Christian Couder
2016-06-17 13:10           ` Pranit Bauva
2016-06-15 17:53   ` [PATCH v2 0/6] convert various shell functions in git-bisect to C Eric Sunshine
2016-06-15 18:09     ` Pranit Bauva
2016-06-26 12:23 ` [PATCH v3 " Pranit Bauva
2016-07-06 20:25   ` [PATCH v4 " Pranit Bauva
2016-07-06 20:25     ` [PATCH v4 1/6] bisect--helper: `bisect_clean_state` shell function in C Pranit Bauva
2016-07-06 20:25     ` [PATCH v4 2/6] t6030: explicitly test for bisection cleanup Pranit Bauva
2016-07-11 19:16       ` Junio C Hamano
2016-07-06 20:25     ` [PATCH v4 3/6] wrapper: move is_empty_file() and rename it as is_empty_or_missing_file() Pranit Bauva
2016-07-06 20:25     ` [PATCH v4 4/6] bisect--helper: `bisect_reset` shell function in C Pranit Bauva
2016-07-06 20:25     ` [PATCH v4 5/6] bisect--helper: `is_expected_rev` & `check_expected_revs` " Pranit Bauva
2016-07-06 20:25     ` [PATCH v4 6/6] bisect--helper: `bisect_write` " Pranit Bauva
2016-07-11 19:19     ` [PATCH v4 0/6] convert various shell functions in git-bisect to C Junio C Hamano
2016-06-26 12:23 ` [PATCH v3 1/6] bisect--helper: `bisect_clean_state` shell function in C Pranit Bauva
2016-06-26 12:23 ` [PATCH v3 2/6] t6030: explicitly test for bisection cleanup Pranit Bauva
2016-06-26 12:23 ` [PATCH v3 3/6] wrapper: move is_empty_file() and rename it as is_empty_or_missing_file() Pranit Bauva
2016-06-26 12:23 ` [PATCH v3 4/6] bisect--helper: `bisect_reset` shell function in C Pranit Bauva
2016-06-26 12:23 ` [PATCH v3 5/6] bisect--helper: `is_expected_rev` & `check_expected_revs` " Pranit Bauva
2016-06-26 12:23 ` [PATCH v3 6/6] bisect--helper: `bisect_write` " Pranit Bauva

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=20160607205454.22576-4-pranit.bauva@gmail.com \
    --to=pranit.bauva@gmail.com \
    --cc=chriscool@tuxfamily.org \
    --cc=christian.couder@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=larsxschneider@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.