"GOT", but the "O" is a cute, smiling pufferfish. Index | Thread | Search

From:
Omar Polo <op@omarpolo.com>
Subject:
Re: improve error message with malformed `author' in got.conf
To:
Stefan Sperling <stsp@stsp.name>
Cc:
gameoftrees@openbsd.org
Date:
Sun, 06 Feb 2022 15:22:52 +0100

Download raw body.

Thread
Stefan Sperling <stsp@stsp.name> writes:

> On Sun, Feb 06, 2022 at 12:44:21PM +0100, Omar Polo wrote:
>> With the following diff instead I would get
>> 
>> % got ci regular-file
>> got: foobar: an email address is required for compatibility with Git
>
> I like it. ok stsp@
>
> I would tweak your error message slightly for clarity of context:
>
>  got: foobar: commit author's email address is required for compatibility with Git

sure, here's the updated diff

diff 4cd2c1745cda66c359c86bea412d77af0b643a7e /home/op/w/got
blob - 16b939dba60d2210e6c75b2ffbb51a4b1f8d608a
file + got/got.c
--- got/got.c
+++ got/got.c
@@ -596,6 +596,26 @@ import_progress(void *arg, const char *path)
 	return NULL;
 }
 
+static int
+valid_author(const char *author)
+{
+	/*
+	 * Really dumb email address check; we're only doing this to
+	 * avoid git's object parser breaking on commits we create.
+	 */
+	while (*author && *author != '<')
+		author++;
+	if (*author != '<')
+		return 0;
+	while (*author && *author != '@')
+		author++;
+	if (*author != '@')
+		return 0;
+	while (*author && *author != '>')
+		author++;
+	return *author == '>';
+}
+
 static const struct got_error *
 get_author(char **author, struct got_repository *repo,
     struct got_worktree *worktree)
@@ -653,28 +673,8 @@ get_author(char **author, struct got_repository *repo,
 	if (*author == NULL)
 		return got_error_from_errno("strdup");
 
-	/*
-	 * Really dumb email address check; we're only doing this to
-	 * avoid git's object parser breaking on commits we create.
-	 */
-	while (*got_author && *got_author != '<')
-		got_author++;
-	if (*got_author != '<') {
-		err = got_error(GOT_ERR_COMMIT_NO_EMAIL);
-		goto done;
-	}
-	while (*got_author && *got_author != '@')
-		got_author++;
-	if (*got_author != '@') {
-		err = got_error(GOT_ERR_COMMIT_NO_EMAIL);
-		goto done;
-	}
-	while (*got_author && *got_author != '>')
-		got_author++;
-	if (*got_author != '>')
-		err = got_error(GOT_ERR_COMMIT_NO_EMAIL);
-done:
-	if (err) {
+	if (!valid_author(*author)) {
+		err = got_error_fmt(GOT_ERR_COMMIT_NO_EMAIL, "%s", *author);
 		free(*author);
 		*author = NULL;
 	}
blob - 78a5edb08ad1bbb3feb172d3b16c537a9fe1c3cb
file + include/got_error.h
--- include/got_error.h
+++ include/got_error.h
@@ -287,9 +287,8 @@ static const struct got_error {
 	{ GOT_ERR_STAGED_PATHS, "work tree contains files with staged "
 	    "changes; these changes must be committed or unstaged first" },
 	{ GOT_ERR_PATCH_CHOICE, "invalid patch choice" },
-	{ GOT_ERR_COMMIT_NO_EMAIL,"GOT_AUTHOR environment variable contains "
-	    "no email address; an email address is required for compatibility "
-	    "with Git" },
+	{ GOT_ERR_COMMIT_NO_EMAIL, "commit author's email address is required "
+	    "for compatibility with Git" },
 	{ GOT_ERR_TAG_EXISTS,"specified tag already exists" },
 	{ GOT_ERR_GIT_REPO_FORMAT,"unknown git repository format version" },
 	{ GOT_ERR_REBASE_REQUIRED,"specified branch must be rebased first" },
blob - 34d74d26fefb2a4461a2c489cade5dcd7ebfcd66
file + regress/cmdline/commit.sh
--- regress/cmdline/commit.sh
+++ regress/cmdline/commit.sh
@@ -649,11 +649,10 @@ test_commit_no_email() {
 		got commit -m 'test no email' > $testroot/stdout \
 		2> $testroot/stderr)
 
-	echo -n "got: GOT_AUTHOR environment variable contains no email " \
+	echo -n "got: :flan_hacker:: commit author's email address " \
 		> $testroot/stderr.expected
-	echo -n "address; an email address is required for compatibility "\
+	echo "is required for compatibility with Git" \
 		>> $testroot/stderr.expected
-	echo "with Git" >> $testroot/stderr.expected
 	cmp -s $testroot/stderr.expected $testroot/stderr
 	ret="$?"
 	if [ "$ret" != "0" ]; then