git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / 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, sunshine@sunshineco.com
Subject: [PATCH v3 0/6] convert various shell functions in git-bisect to C
Date: Sun, 26 Jun 2016 17:53:50 +0530	[thread overview]
Message-ID: <20160626122356.28999-1-pranit.bauva@gmail.com> (raw)
In-Reply-To: <20160607205454.22576-1-pranit.bauva@gmail.com>

The major change introduced in this version is that I have used `struct
bisect_terms` to store term_good and term_bad and then I am passing around
the memory address of it to functions. Also I have made various changes
in accordance with the previous review.

Here is the link for v2.
http://thread.gmane.org/gmane.comp.version-control.git/297372

Thanks for suggestions Eric Sunshine, Christian Couder and Junio C Hammano.

Here's the interdiff:
diff --git a/builtin/am.c b/builtin/am.c
index 84f21d0..6ee158f 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -1307,7 +1307,7 @@ static int parse_mail(struct am_state *state, const char *mail)
 		goto finish;
 	}
 
-	if (is_empty_file(am_path(state, "patch"))) {
+	if (is_empty_or_missing_file(am_path(state, "patch"))) {
 		printf_ln(_("Patch is empty. Was it split wrong?"));
 		die_user_resolve(state);
 	}
@@ -1895,7 +1895,7 @@ next:
 		resume = 0;
 	}
 
-	if (!is_empty_file(am_path(state, "rewritten"))) {
+	if (!is_empty_or_missing_file(am_path(state, "rewritten"))) {
 		assert(state->rebasing);
 		copy_notes_for_rebase(state);
 		run_post_rewrite_hook(state);
diff --git a/builtin/bisect--helper.c b/builtin/bisect--helper.c
index eebfcf0..e946ba9 100644
--- a/builtin/bisect--helper.c
+++ b/builtin/bisect--helper.c
@@ -26,6 +26,25 @@ static const char * const git_bisect_helper_usage[] = {
 	NULL
 };
 
+struct bisect_terms {
+	struct strbuf term_good;
+	struct strbuf term_bad;
+};
+
+static int bisect_terms_init(struct bisect_terms *term)
+{
+	strbuf_init(&term->term_good, 0);
+	strbuf_init(&term->term_bad, 0);
+	return 0;
+}
+
+static int bisect_terms_release(struct bisect_terms *term)
+{
+	strbuf_release(&term->term_good);
+	strbuf_release(&term->term_good);
+	return 0;
+}
+
 /*
  * Check whether the string `term` belongs to the set of strings
  * included in the variable arguments.
@@ -110,6 +129,7 @@ static int bisect_clean_state(void)
 	for_each_ref_in("refs/bisect/", mark_for_removal, (void *) &refs_for_removal);
 	string_list_append(&refs_for_removal, xstrdup("BISECT_HEAD"));
 	result = delete_refs(&refs_for_removal);
+	refs_for_removal.strdup_strings = 1;
 	string_list_clear(&refs_for_removal, 0);
 	remove_path(git_path_bisect_expected_rev());
 	remove_path(git_path_bisect_ancestors_ok());
@@ -138,12 +158,11 @@ static int bisect_reset(const char *commit)
 			return 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);
+		strbuf_addstr(&branch, commit);
 	}
 
 	if (!file_exists(git_path_bisect_head())) {
@@ -151,7 +170,7 @@ static int bisect_reset(const char *commit)
 		argv_array_pushl(&argv, "checkout", branch.buf, "--", NULL);
 		if (run_command_v_opt(argv.argv, RUN_GIT_CMD)) {
 			error(_("Could not check out original HEAD '%s'. Try"
-					"'git bisect reset <commit>'."), branch.buf);
+				"'git bisect reset <commit>'."), branch.buf);
 			strbuf_release(&branch);
 			argv_array_clear(&argv);
 			return -1;
@@ -166,15 +185,11 @@ static int bisect_reset(const char *commit)
 static int is_expected_rev(const char *expected_hex)
 {
 	struct strbuf actual_hex = STRBUF_INIT;
-	int res;
-
-	if (strbuf_read_file(&actual_hex, git_path_bisect_expected_rev(), 0) < 0) {
-		strbuf_release(&actual_hex);
-		return 0;
+	int res = 0;
+	if (strbuf_read_file(&actual_hex, git_path_bisect_expected_rev(), 0) >= 0) {
+		strbuf_trim(&actual_hex);
+		res = !strcmp(actual_hex.buf, expected_hex);
 	}
-
-	strbuf_trim(&actual_hex);
-	res = !strcmp(actual_hex.buf, expected_hex);
 	strbuf_release(&actual_hex);
 	return res;
 }
@@ -194,8 +209,7 @@ static int check_expected_revs(const char **revs, int rev_nr)
 }
 
 static int bisect_write(const char *state, const char *rev,
-			const char *term_good, const char *term_bad,
-			int nolog)
+			const struct bisect_terms *term, int nolog)
 {
 	struct strbuf tag = STRBUF_INIT;
 	struct strbuf commit_name = STRBUF_INIT;
@@ -204,9 +218,9 @@ static int bisect_write(const char *state, const char *rev,
 	struct pretty_print_context pp = {0};
 	FILE *fp;
 
-	if (!strcmp(state, term_bad))
+	if (!strcmp(state, term->term_bad.buf))
 		strbuf_addf(&tag, "refs/bisect/%s", state);
-	else if(one_of(state, term_good, "skip", NULL))
+	else if(one_of(state, term->term_good.buf, "skip", NULL))
 		strbuf_addf(&tag, "refs/bisect/%s-%s", state, rev);
 	else
 		return error(_("Bad bisect_write argument: %s"), state);
@@ -221,23 +235,21 @@ static int bisect_write(const char *state, const char *rev,
 		strbuf_release(&tag);
 		return -1;
 	}
+	strbuf_release(&tag);
 
 	fp = fopen(git_path_bisect_log(), "a");
-	if (!fp) {
-		strbuf_release(&tag);
+	if (!fp)
 		return error_errno(_("couldn't open the file '%s'"), git_path_bisect_log());
-	}
 
 	commit = lookup_commit_reference(oid.hash);
 	format_commit_message(commit, "%s", &commit_name, &pp);
 	fprintf(fp, "# %s: [%s] %s\n", state, sha1_to_hex(oid.hash),
 		commit_name.buf);
+	strbuf_release(&commit_name);
 
 	if (!nolog)
 		fprintf(fp, "git bisect %s %s\n", state, rev);
 
-	strbuf_release(&commit_name);
-	strbuf_release(&tag);
 	fclose(fp);
 	return 0;
 }
@@ -252,7 +264,7 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
 		CHECK_EXPECTED_REVS,
 		BISECT_WRITE
 	} cmdmode = 0;
-	int no_checkout = 0;
+	int no_checkout = 0, res = 0;
 	struct option options[] = {
 		OPT_CMDMODE(0, "next-all", &cmdmode,
 			 N_("perform 'git bisect next'"), NEXT_ALL),
@@ -270,6 +282,8 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
 			 N_("update BISECT_HEAD instead of checking out the current commit")),
 		OPT_END()
 	};
+	struct bisect_terms state;
+	bisect_terms_init(&state);
 
 	argc = parse_options(argc, argv, prefix, options,
 			     git_bisect_helper_usage, 0);
@@ -284,24 +298,32 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
 	case WRITE_TERMS:
 		if (argc != 2)
 			die(_("--write-terms requires two arguments"));
-		return write_terms(argv[0], argv[1]);
+		res = write_terms(argv[0], argv[1]);
+		break;
 	case BISECT_CLEAN_STATE:
 		if (argc != 0)
 			die(_("--bisect-clean-state requires no arguments"));
-		return bisect_clean_state();
+		res = bisect_clean_state();
+		break;
 	case BISECT_RESET:
 		if (argc > 1)
 			die(_("--bisect-reset requires either zero or one arguments"));
-		return bisect_reset(argc ? argv[0] : NULL);
+		res = bisect_reset(argc ? argv[0] : NULL);
+		break;
 	case CHECK_EXPECTED_REVS:
-		return check_expected_revs(argv, argc);
+		res = check_expected_revs(argv, argc);
+		break;
 	case BISECT_WRITE:
 		if (argc != 4 && argc != 5)
 			die(_("--bisect-write requires either 4 or 5 arguments"));
 		nolog = (argc == 5) && !strcmp(argv[4], "nolog");
-		return bisect_write(argv[0], argv[1], argv[2], argv[3], nolog);
+		strbuf_addstr(&state.term_good, argv[2]);
+		strbuf_addstr(&state.term_bad, argv[3]);
+		res = bisect_write(argv[0], argv[1], &state, nolog);
+		break;
 	default:
 		die("BUG: unknown subcommand '%d'", cmdmode);
 	}
-	return 0;
+	bisect_terms_release(&state);
+	return res;
 }
diff --git a/cache.h b/cache.h
index 8eaad70..91e2f81 100644
--- a/cache.h
+++ b/cache.h
@@ -1871,6 +1871,6 @@ void sleep_millisec(int millisec);
 void safe_create_dir(const char *dir, int share);
 
 /* Return 1 if the file is empty or does not exists, 0 otherwise. */
-extern int is_empty_file(const char *filename);
+extern int is_empty_or_missing_file(const char *filename);
 
 #endif /* CACHE_H */
diff --git a/wrapper.c b/wrapper.c
index 36a3eeb..e70e4d1 100644
--- a/wrapper.c
+++ b/wrapper.c
@@ -697,14 +697,14 @@ void sleep_millisec(int millisec)
 	poll(NULL, 0, millisec);
 }
 
-int is_empty_file(const char *filename)
+int is_empty_or_missing_file(const char *filename)
 {
 	struct stat st;
 
 	if (stat(filename, &st) < 0) {
 		if (errno == ENOENT)
 			return 1;
-		error_errno(_("could not stat %s"), filename);
+		die_errno(_("could not stat %s"), filename);
 	}
 
 	return !st.st_size;



Pranit Bauva (6):
  bisect--helper: `bisect_clean_state` shell function in C
  t6030: explicitly test for bisection cleanup
  wrapper: move is_empty_file() and rename it as
    is_empty_or_missing_file()
  bisect--helper: `bisect_reset` shell function in C
  bisect--helper: `is_expected_rev` & `check_expected_revs` shell
    function in C
  bisect--helper: `bisect_write` shell function in C

 builtin/am.c                |  20 +---
 builtin/bisect--helper.c    | 222 +++++++++++++++++++++++++++++++++++++++++++-
 cache.h                     |   3 +
 git-bisect.sh               |  97 ++-----------------
 t/t6030-bisect-porcelain.sh |  17 ++++
 wrapper.c                   |  13 +++
 6 files changed, 263 insertions(+), 109 deletions(-)

-- 
2.9.0


  parent reply	other threads:[~2016-06-26 12:25 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 ` [PATCH 4/4] bisect--helper: `bisect_reset` shell function in C Pranit Bauva
2016-06-08  7:59   ` 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 ` Pranit Bauva [this message]
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

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160626122356.28999-1-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 \
    --cc=sunshine@sunshineco.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.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).