[PATCH] Add a newline before appending "Signed-off-by: " line

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Franck Bui-Huu <vagabon.xyz@xxxxxxxxx>

Whef the last line of the commit log message does not end with
"^[-A-Za-z]+: [^@]+@", append a newline after it to separate
the body of the commit log message from the run of sign-off and
ack lines. e.g. "Signed-off-by: A U Thor <au.thor@xxxxxxxxxxx>" or
"Acked-by: Me <myself@xxxxxxxxxxx>".

Signed-off-by: Junio C Hamano <junkio@xxxxxxx>
---

 * This is based on one-month old patch from Franck, which was
   not applied back then, with updates suggested by Linus, but I
   did not do "^\S+:.*@.*$", which would have caught the last
   line of the commit log body of this commit itself.  RFC2822
   "field-name" can contain anything other than controls, SP and
   colon, but I think in practice "alnum plus dash" would be a
   reasonable and safer pattern to use (and we are not dealing
   with RFC2822 headers here anyway).

   It probably is not worth to do this as a "bugfix", so it 
   is queued for "next", not for "maint".

 log-tree.c |   44 +++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 43 insertions(+), 1 deletions(-)

diff --git a/log-tree.c b/log-tree.c
index 05ede0c..031af88 100644
--- a/log-tree.c
+++ b/log-tree.c
@@ -19,7 +19,7 @@ static int append_signoff(char *buf, int
 	char *cp = buf;
 
 	/* Do we have enough space to add it? */
-	if (buf_sz - at <= strlen(signed_off_by) + signoff_len + 2)
+	if (buf_sz - at <= strlen(signed_off_by) + signoff_len + 3)
 		return at;
 
 	/* First see if we already have the sign-off by the signer */
@@ -34,6 +34,48 @@ static int append_signoff(char *buf, int
 			return at; /* we already have him */
 	}
 
+	/* Does the last line already end with "^[-A-Za-z]+: [^@]+@"?
+	 * If not, add a blank line to separate the message from
+	 * the run of Signed-off-by: and Acked-by: lines.
+	 */
+	{
+		char ch;
+		int seen_colon, seen_at, seen_name, seen_head, not_signoff;
+		seen_colon = 0;
+		seen_at = 0;
+		seen_name = 0;
+		seen_head = 0;
+		not_signoff = 0;
+		cp = buf + at;
+		while (buf <= --cp && (ch = *cp) == '\n')
+			;
+		while (!not_signoff && buf <= cp && (ch = *cp--) != '\n') {
+			if (!seen_at) {
+				if (ch == '@')
+					seen_at = 1;
+				continue;
+			}
+			if (!seen_colon) {
+				if (ch == '@')
+					not_signoff = 1;
+				else if (ch == ':')
+					seen_colon = 1;
+				else
+					seen_name = 1;
+				continue;
+			}
+			if (('A' <= ch && ch <= 'Z') ||
+			    ('a' <= ch && ch <= 'z') ||
+			    ch == '-') {
+				seen_head = 1;
+				continue;
+			}
+			not_signoff = 1;
+		}
+		if (not_signoff || !seen_head || !seen_name)
+			buf[at++] = '\n';
+	}
+
 	strcpy(buf + at, signed_off_by);
 	at += strlen(signed_off_by);
 	strcpy(buf + at, signoff);
-- 
1.4.2.g10a6


-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]