List for cgit developers and users
 help / color / mirror / Atom feed
From: cgit at cryptocrack.de (Lukas Fleischer)
Subject: [PATCH] Use split_ident_line() in parse_user()
Date: Wed, 17 Dec 2014 13:19:21 +0100	[thread overview]
Message-ID: <1418818761-17947-1-git-send-email-cgit@cryptocrack.de> (raw)

Use Git's built-in ident line splitting algorithm instead of
reimplementing it. This does not only simplify the code but also makes
sure that cgit is consistent with Git when it comes to author parsing.

Signed-off-by: Lukas Fleischer <cgit at cryptocrack.de>
---
I would also like to get rid of the angle brackets and only add them
when displaying the information as HTML. That would also result in email
filters getting email addresses without angle brackets which I consider
to be a good thing but it breaks backwards compatibility. Any opinions
on this are welcome.

 parsing.c | 45 +++++++++++++++++----------------------------
 1 file changed, 17 insertions(+), 28 deletions(-)

diff --git a/parsing.c b/parsing.c
index 3dbd122..7d34d11 100644
--- a/parsing.c
+++ b/parsing.c
@@ -71,36 +71,25 @@ static char *substr(const char *head, const char *tail)
 
 static const char *parse_user(const char *t, char **name, char **email, unsigned long *date)
 {
-	const char *p = t;
-	int mode = 1;
+	const char *line_end = strchrnul(t, '\n');
+	struct ident_split ident;
+	unsigned email_len;
 
-	while (p && *p) {
-		if (mode == 1 && *p == '<') {
-			*name = substr(t, p - 1);
-			t = p;
-			mode++;
-		} else if (mode == 1 && *p == '\n') {
-			*name = substr(t, p);
-			p++;
-			break;
-		} else if (mode == 2 && *p == '>') {
-			*email = substr(t, p + 1);
-			t = p;
-			mode++;
-		} else if (mode == 2 && *p == '\n') {
-			*email = substr(t, p);
-			p++;
-			break;
-		} else if (mode == 3 && isdigit(*p)) {
-			*date = atol(p);
-			mode++;
-		} else if (*p == '\n') {
-			p++;
-			break;
-		}
-		p++;
+	if (!split_ident_line(&ident, t, line_end - t)) {
+		*name = substr(ident.name_begin, ident.name_end);
+
+		email_len = ident.mail_end - ident.mail_begin;
+		*email = xmalloc(strlen("<") + email_len + strlen(">\0"));
+		sprintf(*email, "<%.*s>", email_len, ident.mail_begin);
+
+		if (ident.date_begin)
+			*date = strtoul(ident.date_begin, NULL, 10);
 	}
-	return p;
+
+	if (*line_end)
+		return line_end + 1;
+	else
+		return line_end;
 }
 
 #ifdef NO_ICONV
-- 
2.1.3



             reply	other threads:[~2014-12-17 12:19 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-12-17 12:19 cgit [this message]
2014-12-24  1:57 ` Jason
2014-12-24  7:49   ` cgit
2014-12-24  7:50 ` [PATCH v2] " cgit
2014-12-24  8:38   ` Jason

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1418818761-17947-1-git-send-email-cgit@cryptocrack.de \
    --to=cgit@lists.zx2c4.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).