]> git.ipfire.org Git - thirdparty/git.git/commitdiff
bisect--helper: reimplement `bisect_visualize()` shell function in C
authorPranit Bauva <pranit.bauva@gmail.com>
Mon, 13 Sep 2021 17:39:02 +0000 (19:39 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 13 Sep 2021 20:37:37 +0000 (13:37 -0700)
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>
builtin/bisect--helper.c
git-bisect.sh

index f184eaeac6d0fd60ae8d255c458f6b873f2bd3cf..14653107345ce55ad1108ed76ac11102c9308aff 100644 (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-replay <filename>"),
        N_("git bisect--helper --bisect-skip [(<rev>|<range>)...]"),
+       N_("git bisect--helper --bisect-visualize"),
        NULL
 };
 
@@ -1036,6 +1037,44 @@ static enum bisect_error bisect_skip(struct bisect_terms *terms, const char **ar
        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)
 {
        enum {
@@ -1048,7 +1087,8 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
                BISECT_STATE,
                BISECT_LOG,
                BISECT_REPLAY,
-               BISECT_SKIP
+               BISECT_SKIP,
+               BISECT_VISUALIZE,
        } cmdmode = 0;
        int res = 0, nolog = 0;
        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),
                OPT_CMDMODE(0, "bisect-skip", &cmdmode,
                         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,
                         N_("no log for BISECT_WRITE")),
                OPT_END()
@@ -1131,6 +1173,10 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
                get_terms(&terms);
                res = bisect_skip(&terms, argv, argc);
                break;
+       case BISECT_VISUALIZE:
+               get_terms(&terms);
+               res = bisect_visualize(&terms, argv, argc);
+               break;
        default:
                BUG("unknown subcommand %d", cmdmode);
        }
index 6a7afaea8da09fa3fb3670d1a688421fbf152747..95f7f3fb8c08626226013f860f31d2e6764807fe 100755 (executable)
@@ -39,29 +39,6 @@ _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
 TERM_BAD=bad
 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 () {
        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.
                git bisect--helper --bisect-next "$@" || exit ;;
        visualize|view)
-               bisect_visualize "$@" ;;
+               git bisect--helper --bisect-visualize "$@" || exit;;
        reset)
                git bisect--helper --bisect-reset "$@" ;;
        replay)