On Wed, May 4, 2016 at 1:07 AM, Pranit Bauva <pranit.bauva@xxxxxxxxx> wrote: > This reimplements the `check_term_format` shell function in C and adds s/This reimplements/Reimplement/ s/adds/add/ > a `--check-term-format` subcommand to `git bisect--helper` to call it > from git-bisect.sh s/$/./ Okay, I'll bite: Why is this a good idea? What does it buy you? It's not as if the rewrite is especially faster or more easily expressed in C; quite the contrary, the shell code is more concise and probably about equally as fast (not that execution speed matters in this case). I could understand this functionality being ported to C in the form of a static function as a minor part of porting "git bisect terms" in its entirety to C, but I'm not imaginative enough to see why this functionality is useful as a standalone git-bisect--helper subcommand, and the commit message doesn't enlighten. Consequently, it seems like unnecessary complexity. > Signed-off-by: Pranit Bauva <pranit.bauva@xxxxxxxxx> > --- > diff --git a/builtin/bisect--helper.c b/builtin/bisect--helper.c > @@ -2,16 +2,66 @@ > static const char * const git_bisect_helper_usage[] = { > N_("git bisect--helper --next-all [--no-checkout]"), > + N_("git bisect--helper --check-term-format <term> <orig_term>"), Could this be shortened to --check-term or would that be undesirable? > NULL > }; > > enum sub_commands { > - NEXT_ALL = 1 > + NEXT_ALL = 1, > + CHECK_TERM_FMT > }; > > +/* > + * To check whether the string `term` belongs to the set of strings > + * included in the variable arguments so as to make the code look > + * clean and avoid having long lines in the `if` statement. > + */ Is this a (long) sentence fragment? Code cleanliness is an obviously desirable trait, thus talking about it in the comment adds no value; it's just noise. > +static int one_of(const char *term, ...) > +{ > + va_list matches; > + const char *match; > + > + va_start(matches, term); > + while ((match = va_arg(matches, const char *)) != NULL) > + if (!strcmp(term, match)) > + return 1; Is it wise to return here without invoking va_end()? > + va_end(matches); > + > + return 0; > +} > + > +static int check_term_format(const char *term, const char *orig_term, > + int flag) What is 'flag' for? The single caller only ever passes 0, so why is this needed? > +{ > + struct strbuf new_term = STRBUF_INIT; 'new_term' is being leaked at every 'return' statement in this function. > + strbuf_addf(&new_term, "refs/bisect/%s", term); > + > + if (check_refname_format(new_term.buf, flag)) > + die(_("'%s' is not a valid term\n"), term); Why does this die() while the other "invalid" cases merely return error()? What makes this special? Also, drop "\n" from the error string. > + else if (one_of(term, "help", "start", "skip", "next", "reset", s/else // > + "visualize", "replay", "log", "run", NULL)) > + return error("can't use the builtin command '%s' as a term\n", term); This should be wrapped in _(...). Also, drop the "\n". > + /* > + * In theory, nothing prevents swapping > + * completely good and bad, but this situation > + * could be confusing and hasn't been tested > + * enough. Forbid it for now. > + */ This would be a bit easier to read if re-wrapped to fit within 80 columns rather than 53 or so. > + else if ((one_of(term, "bad", "new", NULL) && strcmp(orig_term, "bad")) || s/else // > + (one_of(term, "good", "old", NULL) && strcmp(orig_term, "good"))) This can be more efficient by doing the strcmp() before the expensive one_of(): if ((strcmp(...) && one_of(...)) || strcmp(...) && one_of(...))) > + return error("can't change the meaning of the term '%s'\n", term); This should be wrapped in _(...). Also, drop the "\n". > + return 0; > +} > + > int cmd_bisect__helper(int argc, const char **argv, const char *prefix) > { > int sub_command = 0; > @@ -19,6 +69,8 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix) > struct option options[] = { > OPT_CMDMODE(0, "next-all", &sub_command, > N_("perform 'git bisect next'"), NEXT_ALL), > + OPT_CMDMODE(0, "check-term-format", &sub_command, > + N_("check format of the ref"), CHECK_TERM_FMT), What "ref"? > OPT_BOOL(0, "no-checkout", &no_checkout, > N_("update BISECT_HEAD instead of checking out the current commit")), > OPT_END() > @@ -33,6 +85,10 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix) > switch (sub_command) { > case NEXT_ALL: > return bisect_next_all(prefix, no_checkout); > + case CHECK_TERM_FMT: > + if (argc != 2) > + die(_("--check-term-format should be followed by exactly 2 arguments.")); Drop the period. Possible reword: --check-term-format requires two arguments > + return check_term_format(argv[0], argv[1], 0); > default: > die(_("bug: unknown subcommand '%d'"), sub_command); > } -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html