Thread (4 messages) flat view 4 messages, 2 authors, 2016-06-15

Re: [PATCH] commit: cope with scissors lines in commit message

From: SZEDER Gábor <hidden>
Date: 2016-06-15 23:05:12

Possibly related (same subject, not in this thread)

Quoting Junio C Hamano [off-list ref]:
SZEDER Gábor [off-list ref] writes:
quoted
The diff and submodule shortlog appended to the commit message template
by 'git commit --verbose' are not stripped when the commit message
contains an indented scissors line.

When cleaning up a commit message with 'git commit --verbose' or
'--cleanup=scissors' the code is careful and triggers only on a pure
scissors line, i.e. a line containing nothing but a comment character, a
space, and the scissors cut.  This is good, because people can embed
scissor lines in the commit message while using 'git commit --verbose',
and the text they write after their indented scissors line doesn't get
deleted.

While doing so, however, the cleanup function only looks at the first
line matching the scissors pattern and if it doesn't start at the
beginning of the line, then the function just returns without performing
any cleanup.  This is bad, because a "real" scissors line added by 'git
commit --verbose' might follow, and in that case the diff and submodule
shortlog get included in the commit message.
Yikes; this is not just "bad" but simply "wrong".  Thanks for
noticing.
Great, the other day I scored a "Gaaah" from Peff, now a "Yikes" from  
you...  Doin' good! ;)
quoted
 void wt_status_truncate_message_at_cut_line(struct strbuf *buf)
 {
-	const char *p;
+	const char *p = buf->buf;
 	struct strbuf pattern = STRBUF_INIT;

 	strbuf_addf(&pattern, "%c %s", comment_line_char, cut_line);
-	p = strstr(buf->buf, pattern.buf);
-	if (p && (p == buf->buf || p[-1] == '\n'))
-		strbuf_setlen(buf, p - buf->buf);
+	while ((p = strstr(p, pattern.buf))) {
+		if (p == buf->buf || p[-1] == '\n') {
+			strbuf_setlen(buf, p - buf->buf);
+			break;
+		}
+		p++;
+	}
I however wonder if we should make strstr() do more work for us.

	strbuf_addf(&pattern, "\n%c %s", comment_line_char, cut_line);
	if (starts_with(buf->buf, pattern.buf + 1))
		strbuf_setlen(buf, 0);
	else if ((p = strstr(buf->buf, pattern.buf)) != NULL)
        	strbuf_setlen(buf, p - buf->buf + 1);
	strbuf_release(&pattern);

perhaps?
Though this has one more if statement, it doesn't add a loop and  
eliminates the if (... || ...).
Good, will try to reroll in the evening.

Gábor
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help