commit 1d918cf99eb38998939247bea7f749f199390dc3 from: Omar Polo date: Sun Feb 06 14:56:36 2022 UTC improve error message due to malformed `author' in got.conf tweak and ok stsp@ commit - 9b4603c0290867d82a4f4f30cc49ae4e30789084 commit + 1d918cf99eb38998939247bea7f749f199390dc3 blob - 16b939dba60d2210e6c75b2ffbb51a4b1f8d608a blob + 03281c064021bf591b75ae61f102c19de7a4658f --- got/got.c +++ got/got.c @@ -594,6 +594,26 @@ import_progress(void *arg, const char *path) { printf("A %s\n", 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 * @@ -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 blob + bfdc8fac28522667c8ec28af0e4485c8e46a75a3 --- 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 blob + d878260cbb0d118bc817382895282a23ad5f98d7 --- 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