summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2005-12-15 00:31:06 (GMT)
committerJunio C Hamano <junkio@cox.net>2005-12-15 00:31:06 (GMT)
commite0e3ba208d235ab5623a86204fbd20b449520764 (patch)
tree6f9e317480401ff8910d28c986885bb501bf5c25
parent252fef7149204d52ed4b46fd7e8ac8c803ceb0aa (diff)
downloadgit-e0e3ba208d235ab5623a86204fbd20b449520764.zip
git-e0e3ba208d235ab5623a86204fbd20b449520764.tar.gz
git-e0e3ba208d235ab5623a86204fbd20b449520764.tar.bz2
mailinfo and git-am: allow "John Doe <johndoe>"
An isolated developer could have a local-only e-mail, which will be stripped out by mailinfo because it lacks '@'. Define a fallback parser to accomodate that. At the same time, reject authorless patch in git-am. Signed-off-by: Junio C Hamano <junkio@cox.net>
-rwxr-xr-xgit-am.sh7
-rw-r--r--mailinfo.c32
2 files changed, 38 insertions, 1 deletions
diff --git a/git-am.sh b/git-am.sh
index 343bee9..1a114bc 100755
--- a/git-am.sh
+++ b/git-am.sh
@@ -249,6 +249,13 @@ do
GIT_AUTHOR_NAME="$(sed -n '/^Author/ s/Author: //p' "$dotest/info")"
GIT_AUTHOR_EMAIL="$(sed -n '/^Email/ s/Email: //p' "$dotest/info")"
GIT_AUTHOR_DATE="$(sed -n '/^Date/ s/Date: //p' "$dotest/info")"
+
+ if test -z "$GIT_AUTHOR_EMAIL"
+ then
+ echo "Patch does not have a valid e-mail address."
+ stop_here $this
+ fi
+
export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE
SUBJECT="$(sed -n '/^Subject/ s/Subject: //p' "$dotest/info")"
diff --git a/mailinfo.c b/mailinfo.c
index d4b4163..9f95f37 100644
--- a/mailinfo.c
+++ b/mailinfo.c
@@ -40,13 +40,43 @@ static char *sanity_check(char *name, char *email)
return name;
}
+static int bogus_from(char *line)
+{
+ /* John Doe <johndoe> */
+ char *bra, *ket, *dst, *cp;
+
+ /* This is fallback, so do not bother if we already have an
+ * e-mail address.
+ */
+ if (*email)
+ return 0;
+
+ bra = strchr(line, '<');
+ if (!bra)
+ return 0;
+ ket = strchr(bra, '>');
+ if (!ket)
+ return 0;
+
+ for (dst = email, cp = bra+1; cp < ket; )
+ *dst++ = *cp++;
+ *dst = 0;
+ for (cp = line; isspace(*cp); cp++)
+ ;
+ for (bra--; isspace(*bra); bra--)
+ *bra = 0;
+ cp = sanity_check(cp, email);
+ strcpy(name, cp);
+ return 1;
+}
+
static int handle_from(char *line)
{
char *at = strchr(line, '@');
char *dst;
if (!at)
- return 0;
+ return bogus_from(line);
/*
* If we already have one email, don't take any confusing lines