git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v2 01/11] bisect--helper: fix `cmd_*()` function switch default return

From
Junio C Hamano <gitster@pobox.com>
Date
Apr 3, 2020, 04:58 UTC
Message-ID
<xmqqk12x17za.fsf@gitster.c.googlers.com>
In-Reply-To
<20200321161020.22817-2-mirucam@gmail.com>
Miriam Rubio <mirucam@gmail.com> writes:
Show 23 quoted lines
> In a `cmd_*()` function, return `error()` cannot be used
> because that translates to `-1` and `cmd_*()` functions need
> to return exit codes.
>
> Let's fix switch default return.
>
> Mentored-by: Christian Couder <chriscool@tuxfamily.org>
> Mentored-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
> Signed-off-by: Miriam Rubio <mirucam@gmail.com>
> ---
>  builtin/bisect--helper.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/builtin/bisect--helper.c b/builtin/bisect--helper.c
> index c1c40b516d..1f81cff1d8 100644
> --- a/builtin/bisect--helper.c
> +++ b/builtin/bisect--helper.c
> @@ -711,7 +711,7 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
>  		res = bisect_start(&terms, no_checkout, argv, argc);
>  		break;
>  	default:
> -		return error("BUG: unknown subcommand '%d'", cmdmode);
> +		res = error(_("BUG: unknown subcommand."));

The return value from error() is *NOT* taken from "enum bisect_error"; its value (-1) happens to be the same as BISECT_FAILED, but that is by accident, and not by design.

So the above code is accident waiting to happen, while
	default:
		error(_("BUG: ..."));
		res = BISECT_FAILED;
would be a lot more correct (by design).
>  	}
>  	free_terms(&terms);
After this part, there is this code:
       if (res == BISECT_INTERNAL_SUCCESS_MERGE_BASE)
                       res = BISECT_OK;
        return abs(res);

This is not a problem with this patch, but the use of abs() is very misleading, as res is always non-positive, as it is (after fixing the patch I am responding to) taken from "enum bisect_error" vocabulary. "return -res;" would make the intent of the code clearer, I think.

By the way, under what condition can the "BUG:" be reached? Would it only be reachable by a programming error? If so, it would be correct to use BUG("...") and force it die there. If it can be reached in some other way (e.g. an incorrect input by the user, corruption in state files "git bisect" uses on the filesystem), then it is *not* a "BUG".

I think "bisect--helper" is *not* called by end-user, so an unknown command would be a BUG in the calling program, which is still part of git, so it probably is more prudent to do something like the following instead.

Thanks.
 builtin/bisect--helper.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/builtin/bisect--helper.c b/builtin/bisect--helper.c
index c1c40b516d..0fbd924aac 100644
--- a/builtin/bisect--helper.c
+++ b/builtin/bisect--helper.c
@@ -711,7 +711,7 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
 		res = bisect_start(&terms, no_checkout, argv, argc);
 		break;
 	default:
-		return error("BUG: unknown subcommand '%d'", cmdmode);
+		BUG("unknown subcommand %d", (int)cmdmode);
 	}
 	free_terms(&terms);
 
@@ -722,5 +722,5 @@ int cmd_bisect__helper(int argc, const char **argv, const char *prefix)
 	if (res == BISECT_INTERNAL_SUCCESS_MERGE_BASE)
 		res = BISECT_OK;
 
-	return abs(res);
+	return -res;
 }
Previous: Miriam RubioNext: Christian Couder
Message 3 of 18 in “Finish converting git bisect to C part 2”
  1. 00/11 Finish converting git bisect to C part 2Miriam Rubio, Mar 21, 2020
  2. 01/11 bisect--helper: fix `cmd_*()` function switch default returnMiriam Rubio, Mar 21, 2020
  3. Junio C HamanoApr 3, 2020
  4. Christian CouderApr 3, 2020
  5. Junio C HamanoApr 3, 2020
  6. 02/11 bisect--helper: introduce new `write_in_file()` functionMiriam Rubio, Mar 21, 2020
  7. Junio C HamanoApr 3, 2020
  8. 03/11 bisect--helper: reimplement `bisect_next` and `bisect_auto_next` shell functions in CMiriam Rubio, Mar 21, 2020
  9. Junio C HamanoApr 3, 2020
  10. Miriam R.Apr 23, 2020
  11. 05/11 bisect--helper: retire `--bisect-clean-state` subcommandMiriam Rubio, Mar 21, 2020
  12. 04/11 bisect--helper: finish porting `bisect_start()` to CMiriam Rubio, Mar 21, 2020
  13. 06/11 bisect--helper: retire `--next-all` subcommandMiriam Rubio, Mar 21, 2020
  14. 10/11 bisect--helper: retire `--write-terms` subcommandMiriam Rubio, Mar 21, 2020
  15. 09/11 bisect--helper: retire `--check-expected-revs` subcommandMiriam Rubio, Mar 21, 2020
  16. 07/11 bisect--helper: reimplement `bisect_autostart` shell function in CMiriam Rubio, Mar 21, 2020
  17. 08/11 bisect--helper: reimplement `bisect_state` & `bisect_head` shell functions in CMiriam Rubio, Mar 21, 2020
  18. 11/11 bisect--helper: retire `--bisect-autostart` subcommandMiriam Rubio, Mar 21, 2020

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.