Re: [PATCH v16 Part II 6/8] bisect--helper: `get_terms` & `bisect_terms` shell function in C
From: Ramsay Jones <hidden>
Date: 2017-11-08 00:59:06
On 27/10/17 16:06, Pranit Bauva wrote:
quoted hunk ↗ jump to hunk
Reimplement the `get_terms` and `bisect_terms` shell function in C and add `bisect-terms` subcommand to `git bisect--helper` to call it from git-bisect.sh . Using `--bisect-terms` subcommand is a temporary measure to port shell function in C so as to use the existing test suite. As more functions are ported, this subcommand will be retired but its implementation will be called by some other methods. Also use error() to report "no terms defined" and accordingly change the test in t6030. Mentored-by: Lars Schneider [off-list ref] Mentored-by: Christian Couder [off-list ref] Signed-off-by: Pranit Bauva <redacted> --- builtin/bisect--helper.c | 69 +++++++++++++++++++++++++++++++++++++++++++-- git-bisect.sh | 35 ++--------------------- t/t6030-bisect-porcelain.sh | 2 +- 3 files changed, 70 insertions(+), 36 deletions(-)diff --git a/builtin/bisect--helper.c b/builtin/bisect--helper.c index 0f9c3e63821b8..ab0580ce0089a 100644 --- a/builtin/bisect--helper.c +++ b/builtin/bisect--helper.c@@ -23,6 +23,7 @@ static const char * const git_bisect_helper_usage[] = { N_("git bisect--helper --bisect-write <state> <revision> <good_term> <bad_term> [<nolog>]"), N_("git bisect--helper --bisect-check-and-set-terms <command> <good_term> <bad_term>"), N_("git bisect--helper --bisect-next-check [<term>] <good_term> <bad_term>"), + N_("git bisect--helper --bisect-terms [--term-good | --term-old | --term-bad | --term-new]"), NULL };@@ -344,6 +345,62 @@ static int bisect_next_check(const struct bisect_terms *terms, return retval; } +static int get_terms(struct bisect_terms *terms) +{ + struct strbuf str = STRBUF_INIT; + FILE *fp = NULL; + int res = 0; + + fp = fopen(git_path_bisect_terms(), "r"); + if (!fp) + goto fail; + + free_terms(terms); + strbuf_getline_lf(&str, fp); + terms->term_bad = strbuf_detach(&str, NULL); + strbuf_getline_lf(&str, fp); + terms->term_good = strbuf_detach(&str, NULL); + goto finish; + +fail: + res = -1; +finish: + if (fp) + fclose(fp); + strbuf_release(&str); + return res; +} + +static int bisect_terms(struct bisect_terms *terms, const char **argv, int argc) +{ + int i; + + if (get_terms(terms)) + return error(_("no terms defined")); + + if (argc > 1) + return error(_("--bisect-term requires exactly one argument")); + + if (argc == 0) + return !printf(_("Your current terms are %s for the old state\n" + "and %s for the new state.\n"), + terms->term_good, terms->term_bad);
Again, I don't think you want to do this. :-D
+
+ for (i = 0; i < argc; i++) {
+ if (!strcmp(argv[i], "--term-good"))> + printf(_("%s\n"), terms->term_good);
+ else if (!strcmp(argv[i], "--term-bad"))
+ printf(_("%s\n"), terms->term_bad);
+ else
Here, you want to check for the pairs "--term-{good,old}" and
"--term-{bad,new}", so maybe this instead:
+ if (one_of(argv[i], "--term-good", "--term-old", NULL))
+ printf("%s\n", terms->term_good);
+ else if (one_of(argv[i], "--term-bad", "--term-new", NULL))
+ printf("%s\n", terms->term_bad);
+ else
+ error(_("BUG: invalid argument %s for 'git bisect terms'.\n"
+ "Supported options are: "
+ "--term-good|--term-old and "
+ "--term-bad|--term-new."), argv[i]);
+ }
+
+ return 0;
+}
+ATB, Ramsay Jones