From: Omar Polo Subject: Re: improve error message with malformed `author' in got.conf To: Stefan Sperling Cc: gameoftrees@openbsd.org Date: Sun, 06 Feb 2022 15:22:52 +0100 Stefan Sperling 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