From: "Pranit Bauva via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Junio C Hamano <gitster@pobox.com>,
Pranit Bauva <pranit.bauva@gmail.com>
Subject: [PATCH 20/26] bisect--helper: `bisect_replay` shell function in C
Date: Sun, 24 Feb 2019 02:11:30 -0800 (PST) [thread overview]
Message-ID: <1e9034bb9de0e44be8ecfcc27ebc97d0dd4b44fd.1551003074.git.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.117.git.gitgitgadget@gmail.com>
From: Pranit Bauva <pranit.bauva@gmail.com>
Reimplement the `bisect_replay` shell function in C and also add
`--bisect-replay` subcommand to `git bisect--helper` to call it from
git-bisect.sh
Using `--bisect-replay` subcommand is a temporary measure to port shell
function to C so as to use the existing test suite. As more functions
are ported, this subcommand will be retired and will be called by some
other method.
Mentored-by: Lars Schneider <larsxschneider@gmail.com>
Mentored-by: Christian Couder <chriscool@tuxfamily.org>
Mentored-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Pranit Bauva <pranit.bauva@gmail.com>
Signed-off-by: Tanushree Tumane <tanushreetumane@gmail.com>
---
builtin/bisect--helper.c | 123 ++++++++++++++++++++++++++++++++++++++-
git-bisect.sh | 32 +---------
2 files changed, 123 insertions(+), 32 deletions(-)
diff --git a/builtin/bisect--helper.c b/builtin/bisect--helper.c
index 0a482d67cf..6a1920d3e7 100644
--- a/builtin/bisect--helper.c
+++ b/builtin/bisect--helper.c
@@ -32,6 +32,7 @@ static const char * const git_bisect_helper_usage[] = {
N_("git bisect--helper --bisect-autostart"),
N_("git bisect--helper --bisect-state (bad|new) [<rev>]"),
N_("git bisect--helper --bisect-state (good|old) [<rev>...]"),
+ N_("git bisect--helper --bisect-replay <filename>"),
NULL
};
@@ -899,6 +900,117 @@ static int bisect_log(void)
return status ? -1 : 0;
}
+static int get_next_word(const char *line, int pos, struct strbuf *word)
+{
+ int i, len = strlen(line), begin = 0;
+ strbuf_reset(word);
+ for (i = pos; i < len; i++) {
+ if (line[i] == ' ' && begin)
+ return i + 1;
+
+ if (!begin)
+ begin = 1;
+ strbuf_addch(word, line[i]);
+ }
+
+ return i;
+}
+
+static int bisect_replay(struct bisect_terms *terms, const char *filename)
+{
+ struct strbuf line = STRBUF_INIT;
+ struct strbuf word = STRBUF_INIT;
+ FILE *fp = NULL;
+ int res = 0;
+
+ if (is_empty_or_missing_file(filename)) {
+ error(_("cannot read file '%s' for replaying"), filename);
+ res = -1;
+ goto finish;
+ }
+
+ if (bisect_reset(NULL)) {
+ res = -1;
+ goto finish;
+ }
+
+ fp = fopen(filename, "r");
+ if (!fp) {
+ res = -1;
+ goto finish;
+ }
+
+ while (strbuf_getline(&line, fp) != EOF) {
+ int pos = 0;
+ while (pos < line.len) {
+ pos = get_next_word(line.buf, pos, &word);
+
+ if (!strcmp(word.buf, "git")) {
+ continue;
+ } else if (!strcmp(word.buf, "git-bisect")) {
+ continue;
+ } else if (!strcmp(word.buf, "bisect")) {
+ continue;
+ } else if (starts_with(word.buf, "#")) {
+ break;
+ }
+
+ get_terms(terms);
+ if (check_and_set_terms(terms, word.buf)) {
+ res = -1;
+ goto finish;
+ }
+
+ if (!strcmp(word.buf, "start")) {
+ struct argv_array argv = ARGV_ARRAY_INIT;
+ sq_dequote_to_argv_array(line.buf+pos, &argv);
+ if (bisect_start(terms, 0, argv.argv, argv.argc)) {
+ argv_array_clear(&argv);
+ res = -1;
+ goto finish;
+ }
+ argv_array_clear(&argv);
+ break;
+ }
+
+ if (one_of(word.buf, terms->term_good,
+ terms->term_bad, "skip", NULL)) {
+ if (bisect_write(word.buf, line.buf+pos, terms, 0)) {
+ res = -1;
+ goto finish;
+ }
+ break;
+ }
+
+ if (!strcmp(word.buf, "terms")) {
+ struct argv_array argv = ARGV_ARRAY_INIT;
+ sq_dequote_to_argv_array(line.buf+pos, &argv);
+ if (bisect_terms(terms, argv.argc == 1 ? argv.argv[0] : NULL)) {
+ argv_array_clear(&argv);
+ res = -1;
+ goto finish;
+ }
+ argv_array_clear(&argv);
+ break;
+ }
+
+ error(_("Replay file contains rubbish (\"%s\")"),
+ word.buf);
+ res = -1;
+ goto finish;
+ }
+ }
+finish:
+ if (fp)
+ fclose(fp);
+ strbuf_release(&line);
+ strbuf_release(&word);
+ if (res)
+ return -1;
+
+ return bisect_auto_next(terms, NULL);
+}
+
int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
{
enum {
@@ -912,7 +1024,8 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
BISECT_AUTO_NEXT,
BISECT_AUTOSTART,
BISECT_STATE,
- BISECT_LOG
+ BISECT_LOG,
+ BISECT_REPLAY
} cmdmode = 0;
int no_checkout = 0, res = 0, nolog = 0;
struct option options[] = {
@@ -938,6 +1051,8 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
N_("mark the state of ref (or refs)"), BISECT_STATE),
OPT_CMDMODE(0, "bisect-log", &cmdmode,
N_("output the contents of BISECT_LOG"), BISECT_LOG),
+ OPT_CMDMODE(0, "bisect-replay", &cmdmode,
+ N_("replay the bisection process from the given file"), BISECT_REPLAY),
OPT_BOOL(0, "no-checkout", &no_checkout,
N_("update BISECT_HEAD instead of checking out the current commit")),
OPT_BOOL(0, "no-log", &nolog,
@@ -1015,6 +1130,12 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
return error(_("--bisect-log requires 0 arguments"));
res = bisect_log();
break;
+ case BISECT_REPLAY:
+ if (argc != 1)
+ return error(_("no logfile given"));
+ set_terms(&terms, "bad", "good");
+ res = bisect_replay(&terms, argv[0]);
+ break;
default:
return error("BUG: unknown subcommand '%d'", cmdmode);
}
diff --git a/git-bisect.sh b/git-bisect.sh
index 151358aeda..0555191c41 100755
--- a/git-bisect.sh
+++ b/git-bisect.sh
@@ -77,36 +77,6 @@ bisect_visualize() {
eval '"$@"' --bisect -- $(cat "$GIT_DIR/BISECT_NAMES")
}
-bisect_replay () {
- file="$1"
- test "$#" -eq 1 || die "$(gettext "No logfile given")"
- test -r "$file" || die "$(eval_gettext "cannot read \$file for replaying")"
- git bisect--helper --bisect-reset || exit
- while read git bisect command rev
- do
- test "$git $bisect" = "git bisect" || test "$git" = "git-bisect" || continue
- if test "$git" = "git-bisect"
- then
- rev="$command"
- command="$bisect"
- fi
- get_terms
- git bisect--helper --check-and-set-terms "$command" "$TERM_GOOD" "$TERM_BAD" || exit
- get_terms
- case "$command" in
- start)
- eval "git bisect--helper --bisect-start $rev" ;;
- "$TERM_GOOD"|"$TERM_BAD"|skip)
- git bisect--helper --bisect-write "$command" "$rev" "$TERM_GOOD" "$TERM_BAD" || exit;;
- terms)
- git bisect--helper --bisect-terms $rev || exit;;
- *)
- die "$(gettext "?? what are you talking about?")" ;;
- esac
- done <"$file"
- git bisect--helper --bisect-auto-next
-}
-
bisect_run () {
git bisect--helper --bisect-next-check $TERM_GOOD $TERM_BAD fail || exit
@@ -202,7 +172,7 @@ case "$#" in
reset)
git bisect--helper --bisect-reset "$@" ;;
replay)
- bisect_replay "$@" ;;
+ git bisect--helper --bisect-replay "$@" ;;
log)
git bisect--helper --bisect-log ;;
run)
--
gitgitgadget
next prev parent reply other threads:[~2019-02-24 10:11 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-02-24 10:11 [PATCH 00/26] Git bisect part3 Tanushree Tumane via GitGitGadget
2019-02-24 10:11 ` [PATCH 01/26] bisect--helper: refer branch.buf before strbuf_release(...) Tanushree Tumane via GitGitGadget
2019-02-24 10:11 ` [PATCH 02/26] bisect--helper: change `retval` to `res` Tanushree Tumane via GitGitGadget
2019-02-24 10:11 ` [PATCH 03/26] bisect--helper: `decide_next()` helper function Tanushree Tumane via GitGitGadget
2019-02-24 10:11 ` [PATCH 04/26] bisect.c: libify `exit_if_skipped_commits` to `error_if_skipped...` Pranit Bauva via GitGitGadget
2019-02-24 10:11 ` [PATCH 05/26] bisect.c: libify `bisect_checkout` and its dependants Pranit Bauva via GitGitGadget
2019-02-24 10:11 ` [PATCH 07/26] bisect.c: libify `check_good_are_ancestors_of_bad` and its dependents Pranit Bauva via GitGitGadget
2019-02-24 10:11 ` [PATCH 06/26] bisect.c: libify `check_merge_bases` " Pranit Bauva via GitGitGadget
2019-02-24 10:11 ` [PATCH 08/26] bisect.c: libify `handle_bad_merge_base` and its dependants Pranit Bauva via GitGitGadget
2019-02-24 10:11 ` [PATCH 09/26] bisect.c: libify `bisect_next_all` " Pranit Bauva via GitGitGadget
2019-02-24 10:11 ` [PATCH 11/26] bisect--helper: Finish `bisect_start()` conversion Pranit Bauva via GitGitGadget
2019-02-24 10:11 ` [PATCH 10/26] bisect--helper: `bisect_next` and `bisect_auto_next` shell function in C Pranit Bauva via GitGitGadget
2019-02-24 10:11 ` [PATCH 12/26] bisect--helper: dequote arguments in `bisect-start` Pranit Bauva via GitGitGadget
2019-02-24 10:11 ` [PATCH 13/26] bisect--helper: retire `--bisect-clean-state` subcommand Pranit Bauva via GitGitGadget
2019-02-24 10:11 ` [PATCH 14/26] bisect--helper: retire `--next-all` subcommand Pranit Bauva via GitGitGadget
2019-02-24 10:11 ` [PATCH 15/26] bisect--helper: `bisect_autostart` shell function in C Pranit Bauva via GitGitGadget
2019-02-24 10:11 ` [PATCH 16/26] bisect--helper: `bisect_state` & `bisect_head` " Pranit Bauva via GitGitGadget
2019-02-24 10:11 ` [PATCH 17/26] bisect--helper: retire `--check-expected-revs` subcommand Pranit Bauva via GitGitGadget
2019-02-24 10:11 ` [PATCH 18/26] bisect--helper: retire `--write-terms` subcommand Pranit Bauva via GitGitGadget
2019-02-24 10:11 ` Pranit Bauva via GitGitGadget [this message]
2019-02-24 10:11 ` [PATCH 19/26] bisect--helper: `bisect_log` shell function in C Pranit Bauva via GitGitGadget
2019-02-24 10:11 ` [PATCH 21/26] bisect--helper: retire `--bisect-write` subcommand Pranit Bauva via GitGitGadget
2019-02-24 10:11 ` [PATCH 22/26] bisect--helper: retire `--bisect-autostart` subcommand Pranit Bauva via GitGitGadget
2019-02-24 10:11 ` [PATCH 24/26] bisect--helper: remove the dequote in bisect_start() Pranit Bauva via GitGitGadget
2019-02-24 10:11 ` [PATCH 23/26] bisect--helper: retire `--bisect-auto-next` subcommand Pranit Bauva via GitGitGadget
2019-02-24 10:11 ` [PATCH 25/26] bisect--helper: `bisect_skip` shell function in C Pranit Bauva via GitGitGadget
2019-02-24 10:11 ` [PATCH 26/26] bisect--helper: retire `--check-and-set-terms` subcommand Pranit Bauva via GitGitGadget
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=1e9034bb9de0e44be8ecfcc27ebc97d0dd4b44fd.1551003074.git.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--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.