Re: [PATCH v2 05/10] sequencer.c: always separate "(cherry picked from" from commit body

2013-01-22 Thread Jonathan Nieder
Brandon Casey wrote:

> Start treating the "(cherry picked from" line added by cherry-pick -x
> the same way that the s-o-b lines are treated.  Namely, separate them
> from the main commit message body with an empty line.

Heh, you read my mind.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH v2 05/10] sequencer.c: always separate "(cherry picked from" from commit body

2013-01-21 Thread Brandon Casey
Start treating the "(cherry picked from" line added by cherry-pick -x
the same way that the s-o-b lines are treated.  Namely, separate them
from the main commit message body with an empty line.

Introduce tests to test this functionality.

Signed-off-by: Brandon Casey 
---
 sequencer.c  | 114 +--
 t/t3511-cherry-pick-x.sh |  53 ++
 2 files changed, 113 insertions(+), 54 deletions(-)

diff --git a/sequencer.c b/sequencer.c
index fe76a1d..163dc12 100644
--- a/sequencer.c
+++ b/sequencer.c
@@ -20,6 +20,64 @@
 const char sign_off_header[] = "Signed-off-by: ";
 static const char cherry_picked_prefix[] = "(cherry picked from commit ";
 
+static int is_rfc2822_line(const char *buf, int len)
+{
+   int i;
+
+   for (i = 0; i < len; i++) {
+   int ch = buf[i];
+   if (ch == ':')
+   break;
+   if (isalnum(ch) || (ch == '-'))
+   continue;
+   return 0;
+   }
+
+   return 1;
+}
+
+static int is_cherry_picked_from_line(const char *buf, int len)
+{
+   /*
+* We only care that it looks roughly like (cherry picked from ...)
+*/
+   return !prefixcmp(buf, cherry_picked_prefix) &&
+   (buf[len - 1] == ')' ||
+(buf[len - 1] == '\n' && buf[len - 2] == ')'));
+}
+
+static int has_conforming_footer(struct strbuf *sb, int ignore_footer)
+{
+   int hit = 0;
+   int i, k;
+   int len = sb->len - ignore_footer;
+   const char *buf = sb->buf;
+
+   for (i = len - 1; i > 0; i--) {
+   if (hit && buf[i] == '\n')
+   break;
+   hit = (buf[i] == '\n');
+   }
+
+   /* require at least one blank line */
+   if (!hit || buf[i] != '\n')
+   return 0;
+
+   while (i < len - 1 && buf[i] == '\n')
+   i++;
+
+   for (; i < len; i = k) {
+   for (k = i; k < len && buf[k] != '\n'; k++)
+   ; /* do nothing */
+   k++;
+
+   if (!(is_rfc2822_line(buf + i, k - i) ||
+   is_cherry_picked_from_line(buf + i, k - i)))
+   return 0;
+   }
+   return 1;
+}
+
 static void remove_sequencer_state(void)
 {
struct strbuf seq_dir = STRBUF_INIT;
@@ -497,6 +555,8 @@ static int do_pick_commit(struct commit *commit, struct 
replay_opts *opts)
}
 
if (opts->record_origin) {
+   if (!has_conforming_footer(&msgbuf, 0))
+   strbuf_addch(&msgbuf, '\n');
strbuf_addstr(&msgbuf, cherry_picked_prefix);
strbuf_addstr(&msgbuf, 
sha1_to_hex(commit->object.sha1));
strbuf_addstr(&msgbuf, ")\n");
@@ -1022,60 +1082,6 @@ int sequencer_pick_revisions(struct replay_opts *opts)
return pick_commits(todo_list, opts);
 }
 
-static int is_rfc2822_line(const char *buf, int len)
-{
-   int i;
-
-   for (i = 0; i < len; i++) {
-   int ch = buf[i];
-   if (ch == ':')
-   break;
-   if (isalnum(ch) || (ch == '-'))
-   continue;
-   return 0;
-   }
-
-   return 1;
-}
-
-static int is_cherry_picked_from_line(const char *buf, int len)
-{
-   /*
-* We only care that it looks roughly like (cherry picked from ...)
-*/
-   return !prefixcmp(buf, cherry_picked_prefix) &&
-   (buf[len - 1] == ')' ||
-(buf[len - 1] == '\n' && buf[len - 2] == ')'));
-}
-
-static int has_conforming_footer(struct strbuf *sb, int ignore_footer)
-{
-   int hit = 0;
-   int i, k;
-   int len = sb->len - ignore_footer;
-   const char *buf = sb->buf;
-
-   for (i = len - 1; i > 0; i--) {
-   if (hit && buf[i] == '\n')
-   break;
-   hit = (buf[i] == '\n');
-   }
-
-   while (i < len - 1 && buf[i] == '\n')
-   i++;
-
-   for (; i < len; i = k) {
-   for (k = i; k < len && buf[k] != '\n'; k++)
-   ; /* do nothing */
-   k++;
-
-   if (!(is_rfc2822_line(buf + i, k - i) ||
-   is_cherry_picked_from_line(buf + i, k - i)))
-   return 0;
-   }
-   return 1;
-}
-
 void append_signoff(struct strbuf *msgbuf, int ignore_footer)
 {
struct strbuf sob = STRBUF_INIT;
diff --git a/t/t3511-cherry-pick-x.sh b/t/t3511-cherry-pick-x.sh
index 32c0bb1..9dd6d5d 100755
--- a/t/t3511-cherry-pick-x.sh
+++ b/t/t3511-cherry-pick-x.sh
@@ -57,6 +57,19 @@ test_expect_success setup '
test_commit conflicting unrelated
 '
 
+test_expect_success 'cherry-pick -x inserts blank line after one line subject' 
'
+   pristine_detach initial &&
+   sha1=`git rev-parse mesg-one-line^0` &&
+   git che