bisect--helper: reimplement `bisect_visualize()` shell function in C

Reimplement the `bisect_visualize()` shell function
in C and also add `--bisect-visualize` subcommand to
`git bisect--helper` to call it from git-bisect.sh.

Mentored-by: Christian Couder <chriscool@tuxfamily.org>
Mentored-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Tanushree Tumane <tanushreetumane@gmail.com>
Signed-off-by: Miriam Rubio <mirucam@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Pranit Bauva 2021-09-13 19:39:02 +02:00 committed by Junio C Hamano
parent 3f36e6f30c
commit 5e1f28d206
2 changed files with 48 additions and 25 deletions

View File

@ -30,6 +30,7 @@ static const char * const git_bisect_helper_usage[] = {
N_("git bisect--helper --bisect-state (good|old) [<rev>...]"), N_("git bisect--helper --bisect-state (good|old) [<rev>...]"),
N_("git bisect--helper --bisect-replay <filename>"), N_("git bisect--helper --bisect-replay <filename>"),
N_("git bisect--helper --bisect-skip [(<rev>|<range>)...]"), N_("git bisect--helper --bisect-skip [(<rev>|<range>)...]"),
N_("git bisect--helper --bisect-visualize"),
NULL NULL
}; };


@ -1036,6 +1037,44 @@ static enum bisect_error bisect_skip(struct bisect_terms *terms, const char **ar
return res; return res;
} }


static int bisect_visualize(struct bisect_terms *terms, const char **argv, int argc)
{
struct strvec args = STRVEC_INIT;
int flags = RUN_COMMAND_NO_STDIN, res = 0;
struct strbuf sb = STRBUF_INIT;

if (bisect_next_check(terms, NULL) != 0)
return BISECT_FAILED;

if (!argc) {
if ((getenv("DISPLAY") || getenv("SESSIONNAME") || getenv("MSYSTEM") ||
getenv("SECURITYSESSIONID")) && exists_in_PATH("gitk")) {
strvec_push(&args, "gitk");
} else {
strvec_push(&args, "log");
flags |= RUN_GIT_CMD;
}
} else {
if (argv[0][0] == '-') {
strvec_push(&args, "log");
flags |= RUN_GIT_CMD;
} else if (strcmp(argv[0], "tig") && !starts_with(argv[0], "git"))
flags |= RUN_GIT_CMD;

strvec_pushv(&args, argv);
}

strvec_pushl(&args, "--bisect", "--", NULL);

strbuf_read_file(&sb, git_path_bisect_names(), 0);
sq_dequote_to_strvec(sb.buf, &args);
strbuf_release(&sb);

res = run_command_v_opt(args.v, flags);
strvec_clear(&args);
return res;
}

int cmd_bisect__helper(int argc, const char **argv, const char *prefix) int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
{ {
enum { enum {
@ -1048,7 +1087,8 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
BISECT_STATE, BISECT_STATE,
BISECT_LOG, BISECT_LOG,
BISECT_REPLAY, BISECT_REPLAY,
BISECT_SKIP BISECT_SKIP,
BISECT_VISUALIZE,
} cmdmode = 0; } cmdmode = 0;
int res = 0, nolog = 0; int res = 0, nolog = 0;
struct option options[] = { struct option options[] = {
@ -1070,6 +1110,8 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
N_("replay the bisection process from the given file"), BISECT_REPLAY), N_("replay the bisection process from the given file"), BISECT_REPLAY),
OPT_CMDMODE(0, "bisect-skip", &cmdmode, OPT_CMDMODE(0, "bisect-skip", &cmdmode,
N_("skip some commits for checkout"), BISECT_SKIP), N_("skip some commits for checkout"), BISECT_SKIP),
OPT_CMDMODE(0, "bisect-visualize", &cmdmode,
N_("visualize the bisection"), BISECT_VISUALIZE),
OPT_BOOL(0, "no-log", &nolog, OPT_BOOL(0, "no-log", &nolog,
N_("no log for BISECT_WRITE")), N_("no log for BISECT_WRITE")),
OPT_END() OPT_END()
@ -1131,6 +1173,10 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
get_terms(&terms); get_terms(&terms);
res = bisect_skip(&terms, argv, argc); res = bisect_skip(&terms, argv, argc);
break; break;
case BISECT_VISUALIZE:
get_terms(&terms);
res = bisect_visualize(&terms, argv, argc);
break;
default: default:
BUG("unknown subcommand %d", cmdmode); BUG("unknown subcommand %d", cmdmode);
} }

View File

@ -39,29 +39,6 @@ _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
TERM_BAD=bad TERM_BAD=bad
TERM_GOOD=good TERM_GOOD=good


bisect_visualize() {
git bisect--helper --bisect-next-check $TERM_GOOD $TERM_BAD fail || exit

if test $# = 0
then
if test -n "${DISPLAY+set}${SESSIONNAME+set}${MSYSTEM+set}${SECURITYSESSIONID+set}" &&
type gitk >/dev/null 2>&1
then
set gitk
else
set git log
fi
else
case "$1" in
git*|tig) ;;
-*) set git log "$@" ;;
*) set git "$@" ;;
esac
fi

eval '"$@"' --bisect -- $(cat "$GIT_DIR/BISECT_NAMES")
}

bisect_run () { bisect_run () {
git bisect--helper --bisect-next-check $TERM_GOOD $TERM_BAD fail || exit git bisect--helper --bisect-next-check $TERM_GOOD $TERM_BAD fail || exit


@ -152,7 +129,7 @@ case "$#" in
# Not sure we want "next" at the UI level anymore. # Not sure we want "next" at the UI level anymore.
git bisect--helper --bisect-next "$@" || exit ;; git bisect--helper --bisect-next "$@" || exit ;;
visualize|view) visualize|view)
bisect_visualize "$@" ;; git bisect--helper --bisect-visualize "$@" || exit;;
reset) reset)
git bisect--helper --bisect-reset "$@" ;; git bisect--helper --bisect-reset "$@" ;;
replay) replay)