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

Re: [PATCH] sequencer: rectify empty hint in call of require_clean_work_tree()

From
Junio C Hamano <gitster@pobox.com>
Date
Apr 27, 2023, 21:13 UTC
Message-ID
<xmqqmt2thvuu.fsf@gitster.g>
In-Reply-To
<ZEorMhPZRL/w4yKM@ugly>
Oswald Buddenhagen <oswald.buddenhagen@gmx.de> writes:
Show 5 quoted lines
> ping!
>
> On Thu, Mar 23, 2023 at 05:22:34PM +0100, Oswald Buddenhagen wrote:
>>The canonical way to represent "no error hint" is making it null, which
>>shortcuts the error() call altogether.

I won't repeat what Peff already said on another ping! we saw recently on the list.

The call to require_clean_work_tree() with "" hint existed ever since this part of the "rebase" machinery was rewritten in C by b97e1873 (rebase -i: rewrite complete_action() in C, 2018-08-28). I added the author of that change to the Cc: list.

The original implementation of require_clean_work_tree looked like this:

require_clean_work_tree () {
	git rev-parse --verify HEAD >/dev/null || exit 1
	git update-index -q --ignore-submodules --refresh
	err=0
	if ! git diff-files --quiet --ignore-submodules
	then
		...
		err=1
	fi
	if ! git diff-index --cached --quiet --ignore-submodules HEAD --
	then
		...
		err=1
	fi
	if test $err = 1
	then
		test -n "$2" && echo "$2" >&2
		exit 1
	fi
}

I.e. the second argument, "hint", is shown only when it was a non-empty string. It did not add "error:" prefix before the message.

In contrast, this is what wt-status.c has:
int require_clean_work_tree(struct repository *r,
			    const char *action,
			    const char *hint,
			    int ignore_submodules,
			    int gently)
{
	struct lock_file lock_file = LOCK_INIT;
	int err = 0, fd;
	...
	if (err) {
		if (hint)
			error("%s", hint);
		if (!gently)
			exit(128);
	}
	return err;
}

Arguably, using error() as a replacement for 'echo "$2" >&2' was a sloppy conversion made back in ea63b393 (pull: make code more similar to the shell script again, 2016-10-07), but I suspect that in-tree callers that do have something to say, and the end-users who are used to see the messages these callers produce, expect to see the "error:" prefix these days, so it needs further study if we wanted to "fix" the misuse of error() there. In any case, the observation that motivated your patch is not error() vs fputs().

For squelching a useless "hint" that is empty (other than that mistaken "error:" prefix), however, I think you can and should do better than replacing "" with NULL on the callers' side. As we can see from the comparison between the original, scripted version and the verison in C that is in wt-status.c of require_clean_work_tree, checking for NULL-ness of hint is another misconversion made when it was rewritten in C.

I think the right fix would be more like the attached patch, which will fix any other callsites that pass "" at the same time. Of course, you can fix the callers on top, but that is secondary.

 wt-status.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git i/wt-status.c w/wt-status.c
index 97b9c1c035..2b6dc4d6ac 100644
--- i/wt-status.c
+++ w/wt-status.c
@@ -2650,7 +2650,7 @@ int require_clean_work_tree(struct repository *r,
 	}
 
 	if (err) {
-		if (hint)
+		if (hint && *hint)
 			error("%s", hint);
 		if (!gently)
 			exit(128);
Previous: Oswald BuddenhagenNext: Oswald Buddenhagen
Message 3 of 15 in “sequencer: rectify empty hint in call of require_clean_work_tree()”
  1. sequencer: rectify empty hint in call of require_clean_work_tree()Oswald Buddenhagen, Mar 23, 2023
  2. Oswald BuddenhagenApr 27, 2023
  3. Junio C HamanoApr 27, 2023
  4. Oswald BuddenhagenApr 27, 2023
  5. Felipe ContrerasMay 2, 2023
  6. Oswald BuddenhagenMay 3, 2023
  7. sequencer: rectify empty hint in call of require_clean_work_tree()Oswald Buddenhagen, Aug 7, 2023
  8. Junio C HamanoAug 7, 2023
  9. sequencer: rectify empty hint in call of require_clean_work_tree()Oswald Buddenhagen, Aug 9, 2023
  10. Junio C HamanoAug 9, 2023
  11. Oswald BuddenhagenAug 10, 2023
  12. Junio C HamanoAug 10, 2023
  13. sequencer: rectify empty hint in call of require_clean_work_tree()Oswald Buddenhagen, Aug 24, 2023
  14. Junio C HamanoAug 24, 2023
  15. Junio C HamanoAug 9, 2023

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.