* commit a1f6baa5 (wrap long header lines) breaks my habit
@ 2011-05-24 16:02 Stefan-W. Hahn
2011-05-24 16:27 ` Junio C Hamano
0 siblings, 1 reply; 16+ messages in thread
From: Stefan-W. Hahn @ 2011-05-24 16:02 UTC (permalink / raw)
To: git
Hello,
for rebasing I'm using normally
git format-patch -k --stdout a..b | git am -k -3
With commit
commit a1f6baa5c97abc8b579fa7ac7c4dc21971bdc048
format-patch: wrap long header lines
(since >v1.7.4)
this isn't possible anymore for those patches which have more then 78
characters on the first line.
The wrapping of the lines in the commit message will not be seen when
commiting but when rebasing via format-patch.
Was this the intention of this change or was my sort of workflow just
not in focus?
Any suggestion?
Stefan
--
Stefan-W. Hahn It is easy to make things.
It is hard to make things simple.
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: commit a1f6baa5 (wrap long header lines) breaks my habit
2011-05-24 16:02 commit a1f6baa5 (wrap long header lines) breaks my habit Stefan-W. Hahn
@ 2011-05-24 16:27 ` Junio C Hamano
2011-05-24 16:46 ` Stefan-W. Hahn
0 siblings, 1 reply; 16+ messages in thread
From: Junio C Hamano @ 2011-05-24 16:27 UTC (permalink / raw)
To: Stefan-W. Hahn; +Cc: git
"Stefan-W. Hahn" <stefan.hahn@s-hahn.de> writes:
> git format-patch -k --stdout a..b | git am -k -3
Why -k to am?
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: commit a1f6baa5 (wrap long header lines) breaks my habit
2011-05-24 16:27 ` Junio C Hamano
@ 2011-05-24 16:46 ` Stefan-W. Hahn
2011-05-24 20:07 ` Jeff King
0 siblings, 1 reply; 16+ messages in thread
From: Stefan-W. Hahn @ 2011-05-24 16:46 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
Mail von Junio C Hamano, Tue, 24 May 2011 at 09:27:46 -0700:
> > git format-patch -k --stdout a..b | git am -k -3
>
> Why -k to am?
Just first "-k", and "git am -3". Wrong in mind here at home before my
computer.
Stefan
--
Stefan-W. Hahn It is easy to make things.
It is hard to make things simple.
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: commit a1f6baa5 (wrap long header lines) breaks my habit
2011-05-24 16:46 ` Stefan-W. Hahn
@ 2011-05-24 20:07 ` Jeff King
2011-05-25 15:40 ` Stefan-W. Hahn
0 siblings, 1 reply; 16+ messages in thread
From: Jeff King @ 2011-05-24 20:07 UTC (permalink / raw)
To: Stefan-W. Hahn; +Cc: Junio C Hamano, git
On Tue, May 24, 2011 at 06:46:16PM +0200, Stefan-W. Hahn wrote:
> Mail von Junio C Hamano, Tue, 24 May 2011 at 09:27:46 -0700:
>
> > > git format-patch -k --stdout a..b | git am -k -3
> >
> > Why -k to am?
>
> Just first "-k", and "git am -3". Wrong in mind here at home before my
> computer.
Then it should preserve your long subject line just fine, as mailsplit
(called by "am") will reassemble the folded line according to rfc822
header folding rules.
With "am -k", it does keep the fold. This is an artifact of the original
behavior, where the folds were literally included from a multi-line
subject. We should probably stop doing that now that we fold on length
(and should probably embed newlines via rfc2047 encoding in
format-patch, at least with "-k", so that you can losslessly move
multi-line subjects between the two if you always use "-k").
-Peff
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: commit a1f6baa5 (wrap long header lines) breaks my habit
2011-05-24 20:07 ` Jeff King
@ 2011-05-25 15:40 ` Stefan-W. Hahn
2011-05-26 20:36 ` Jeff King
0 siblings, 1 reply; 16+ messages in thread
From: Stefan-W. Hahn @ 2011-05-25 15:40 UTC (permalink / raw)
To: Jeff King; +Cc: Junio C Hamano, git
Mail von Jeff King, Tue, 24 May 2011 at 16:07:16 -0400:
Hello,
> > > > git format-patch -k --stdout a..b | git am -k -3
> > >
> > > Why -k to am?
> >
> > Just first "-k", and "git am -3". Wrong in mind here at home before my
> > computer.
Wrong. I really typed the second "-k". (Local intelligence in
fingers.)
> Then it should preserve your long subject line just fine, as mailsplit
> (called by "am") will reassemble the folded line according to rfc822
> header folding rules.
>
> With "am -k", it does keep the fold. This is an artifact of the original
> behavior, where the folds were literally included from a multi-line
Correct, I checked this, so with
git format-patch -k --stdout a..b | git am -3
(no second -k)
all is as before.
Thanks for your clarification, sorry for the noise.
Stefan
Perhaps a little clarification like this:
commit e8069848dffe72579aa7f2c542e39fde9eab84b1
Author: Stefan-W. Hahn <stefan.hahn@s-hahn.de>
Date: Wed May 25 17:33:03 2011 +0200
format-patch: Clarify the behaviour of '-k'.
Added clarification in documentation of of 'git format-patch'.
When using 'git format-patch' together with 'git am' for rebasing,
'git am' should be called without '-k' if long subject lines should be
reassembled. This is neccesary, because a wrapping of long header lines
was introduced with commit:
commit a1f6baa5c97abc8b579fa7ac7c4dc21971bdc048
format-patch: wrap long header lines
Signed-off-by: Stefan-W. Hahn <stefan.hahn@s-hahn.de>
diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt
index d13c9b2..4e62248 100644
--- a/Documentation/git-format-patch.txt
+++ b/Documentation/git-format-patch.txt
@@ -468,6 +468,16 @@ the current branch using 'git am' to cherry-pick them:
------------
$ git format-patch -k --stdout R1..R2 | git am -3 -k
------------
++
+In this example the subject lines of the commits will be folded after
+78 characters and 'git am' will keep this folding.
++
+To preserve long subject lines, 'git am' will reassemble the folded
+lines according to rfc822 if called without '-k' like this:
++
+------------
+$ git format-patch -k --stdout R1..R2 | git am -3
+------------
* Extract all commits which are in the current branch but not in the
origin branch:
--
Stefan-W. Hahn It is easy to make things.
It is hard to make things simple.
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: commit a1f6baa5 (wrap long header lines) breaks my habit
2011-05-25 15:40 ` Stefan-W. Hahn
@ 2011-05-26 20:36 ` Jeff King
2011-05-26 20:41 ` [PATCH 1/3] t: test subject handling in format-patch / am pipeline Jeff King
` (2 more replies)
0 siblings, 3 replies; 16+ messages in thread
From: Jeff King @ 2011-05-26 20:36 UTC (permalink / raw)
To: Stefan-W. Hahn; +Cc: Junio C Hamano, git
On Wed, May 25, 2011 at 05:40:46PM +0200, Stefan-W. Hahn wrote:
> > With "am -k", it does keep the fold. This is an artifact of the original
> > behavior, where the folds were literally included from a multi-line
>
> Correct, I checked this, so with
>
> git format-patch -k --stdout a..b | git am -3
> (no second -k)
>
> all is as before.
>
> Thanks for your clarification, sorry for the noise.
Actually, I don't think it's noise. Look at the documentation patch you
suggest:
> index d13c9b2..4e62248 100644
> --- a/Documentation/git-format-patch.txt
> +++ b/Documentation/git-format-patch.txt
> @@ -468,6 +468,16 @@ the current branch using 'git am' to cherry-pick them:
> ------------
> $ git format-patch -k --stdout R1..R2 | git am -3 -k
> ------------
> ++
> +In this example the subject lines of the commits will be folded after
> +78 characters and 'git am' will keep this folding.
You are using "format-patch -k | am -k". Surely that should preserve
your subject, no matter the length, and the fact that we need to
document it is a sign that the behavior is simply wrong.
So I think we should do the following series instead.
[1/3]: t: test subject handling in format-patch / am pipeline
[2/3]: mailinfo: always clean up rfc822 header folding
[3/3]: format-patch: preserve subject newlines with -k
-Peff
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 1/3] t: test subject handling in format-patch / am pipeline
2011-05-26 20:36 ` Jeff King
@ 2011-05-26 20:41 ` Jeff King
2011-05-26 20:53 ` [PATCH 2/3] mailinfo: always clean up rfc822 header folding Jeff King
2011-05-26 20:55 ` [PATCH 3/3] format-patch: preserve subject newlines with -k Jeff King
2 siblings, 0 replies; 16+ messages in thread
From: Jeff King @ 2011-05-26 20:41 UTC (permalink / raw)
To: Stefan-W. Hahn; +Cc: Junio C Hamano, git
Commit a1f6baa (format-patch: wrap long header lines,
2011-02-23) changed format-patch's behavior with respect to
long header lines, but made no accompanying changes to the
receiving side. It was thought that "git am" would handle
these folded subjects fine, but there is a regression when
using "am -k".
Let's add a test documenting this. While we're at it, let's
give more complete test coverage to document what should be
happening in each case. We test three types of subjects:
a short one, one long enough to require wrapping, and a
multiline subject. For each, we test these three
combinations:
format-patch | am
format-patch -k | am
format-patch -k | am -k
We don't bother testing "format-patch | am -k", which is
nonsense (you will be adding in [PATCH] cruft to each
subject).
This reveals the regression above (long subjects have
linebreaks introduced via "format-patch -k | am -k"),
as well as an existing non-optimal behavior (multiline
subjects are not preserved using "-k").
Signed-off-by: Jeff King <peff@peff.net>
---
This can go straight on top of the jk/format-patch-multiline-header
which went into v1.7.5 (the tip was c22e7de).
t/t4152-am-subjects.sh | 77 ++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 77 insertions(+), 0 deletions(-)
create mode 100755 t/t4152-am-subjects.sh
diff --git a/t/t4152-am-subjects.sh b/t/t4152-am-subjects.sh
new file mode 100755
index 0000000..7222c06
--- /dev/null
+++ b/t/t4152-am-subjects.sh
@@ -0,0 +1,77 @@
+#!/bin/sh
+
+test_description='test subject preservation with format-patch | am'
+. ./test-lib.sh
+
+make_patches() {
+ type=$1
+ subject=$2
+ test_expect_success "create patches with $type subject" '
+ git reset --hard baseline &&
+ echo $type >file &&
+ git commit -a -m "$subject" &&
+ git format-patch -1 --stdout >$type.patch &&
+ git format-patch -1 --stdout -k >$type-k.patch
+ '
+}
+
+check_subject() {
+ git reset --hard baseline &&
+ git am $2 $1.patch &&
+ git log -1 --pretty=format:%B >actual &&
+ test_cmp expect actual
+}
+
+test_expect_success 'setup baseline commit' '
+ test_commit baseline file
+'
+
+SHORT_SUBJECT='short subject'
+make_patches short "$SHORT_SUBJECT"
+
+LONG_SUBJECT1='this is a long subject that is virtually guaranteed'
+LONG_SUBJECT2='to require wrapping via format-patch if it is all'
+LONG_SUBJECT3='going to appear on a single line'
+LONG_SUBJECT="$LONG_SUBJECT1 $LONG_SUBJECT2 $LONG_SUBJECT3"
+make_patches long "$LONG_SUBJECT"
+
+MULTILINE_SUBJECT="$LONG_SUBJECT1
+$LONG_SUBJECT2
+$LONG_SUBJECT3"
+make_patches multiline "$MULTILINE_SUBJECT"
+
+echo "$SHORT_SUBJECT" >expect
+test_expect_success 'short subject preserved (format-patch | am)' '
+ check_subject short
+'
+test_expect_success 'short subject preserved (format-patch -k | am)' '
+ check_subject short-k
+'
+test_expect_success 'short subject preserved (format-patch -k | am -k)' '
+ check_subject short-k -k
+'
+
+echo "$LONG_SUBJECT" >expect
+test_expect_success 'long subject preserved (format-patch | am)' '
+ check_subject long
+'
+test_expect_success 'long subject preserved (format-patch -k | am)' '
+ check_subject long-k
+'
+test_expect_failure 'long subject preserved (format-patch -k | am -k)' '
+ check_subject long-k -k
+'
+
+echo "$LONG_SUBJECT" >expect
+test_expect_success 'multiline subject unwrapped (format-patch | am)' '
+ check_subject multiline
+'
+test_expect_success 'multiline subject unwrapped (format-patch -k | am)' '
+ check_subject multiline-k
+'
+echo "$MULTILINE_SUBJECT" >expect
+test_expect_failure 'multiline subject preserved (format-patch -k | am -k)' '
+ check_subject multiline-k -k
+'
+
+test_done
--
1.7.4.5.26.g0c6a2
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 2/3] mailinfo: always clean up rfc822 header folding
2011-05-26 20:36 ` Jeff King
2011-05-26 20:41 ` [PATCH 1/3] t: test subject handling in format-patch / am pipeline Jeff King
@ 2011-05-26 20:53 ` Jeff King
2011-05-26 20:55 ` [PATCH 3/3] format-patch: preserve subject newlines with -k Jeff King
2 siblings, 0 replies; 16+ messages in thread
From: Jeff King @ 2011-05-26 20:53 UTC (permalink / raw)
To: Stefan-W. Hahn; +Cc: Junio C Hamano, git
Without the "-k" option, mailinfo will convert a folded
subject header like:
Subject: this is a
subject that doesn't
fit on one line
into a single line. With "-k", however, we assumed that
these newlines were significant and represented something
that the sending side would want us to preserve.
For messages created by format-patch, this assumption was
broken by a1f6baa (format-patch: wrap long header lines,
2011-02-23). For messages sent by arbitrary MUAs, this was
probably never a good assumption to make, as they may have
been folding subjects in accordance with rfc822's line
length recommendations all along.
This patch now joins folded lines with a single whitespace
character. This treats header folding purely as a syntactic
feature of the transport mechanism, not as something that
format-patch is trying to tell us about the original
subject.
Signed-off-by: Jeff King <peff@peff.net>
---
The astute reader will notice that even with this patch, there is still
a regression when using new versions of format-patch (with a1f6baa) with
an older version of "git am". But you only see it when using "am -k", so
interoperability is probably not a huge deal:
1. Before this patch, "am -k" was arguably broken anyway for applying
random patches via email, since MUAs may have been doing arbitrary
header folding. So we can probably discount people running "am -k"
on random input as insane.
2. People doing "git format-patch -k | git am -k" will presumably use
the same version for both, and are OK.
3. People doing "git format-patch -k >file", followed by upgrading
git, and t hen "git am file" are still OK, since the newer version
of "am" handles the output of both old and new format-patch.
4. The problematic case is "git format-patch -k >file" with v1.7.5 or
newer, then _downgrading_ git, then using "git am -k" to apply. Or
more likely, using a newer version to create an mbox, shipping the
mbox to another machine, and then using an older "git am" to apply.
So I don't see it as all that likely a problem in practice. If we do
care, we can't fix it with a simple patch. We would have to revert the
header-folding from format-patch, fix am, wait N time units until all of
the old "am" no longer exists, and then re-apply.
builtin/mailinfo.c | 2 +-
t/t4152-am-subjects.sh | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/builtin/mailinfo.c b/builtin/mailinfo.c
index 71e6262..bfb32b7 100644
--- a/builtin/mailinfo.c
+++ b/builtin/mailinfo.c
@@ -400,7 +400,7 @@ static int read_one_header_line(struct strbuf *line, FILE *in)
break;
if (strbuf_getline(&continuation, in, '\n'))
break;
- continuation.buf[0] = '\n';
+ continuation.buf[0] = ' ';
strbuf_rtrim(&continuation);
strbuf_addbuf(line, &continuation);
}
diff --git a/t/t4152-am-subjects.sh b/t/t4152-am-subjects.sh
index 7222c06..37e5c03 100755
--- a/t/t4152-am-subjects.sh
+++ b/t/t4152-am-subjects.sh
@@ -58,7 +58,7 @@ test_expect_success 'long subject preserved (format-patch | am)' '
test_expect_success 'long subject preserved (format-patch -k | am)' '
check_subject long-k
'
-test_expect_failure 'long subject preserved (format-patch -k | am -k)' '
+test_expect_success 'long subject preserved (format-patch -k | am -k)' '
check_subject long-k -k
'
--
1.7.4.5.26.g0c6a2
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 3/3] format-patch: preserve subject newlines with -k
2011-05-26 20:36 ` Jeff King
2011-05-26 20:41 ` [PATCH 1/3] t: test subject handling in format-patch / am pipeline Jeff King
2011-05-26 20:53 ` [PATCH 2/3] mailinfo: always clean up rfc822 header folding Jeff King
@ 2011-05-26 20:55 ` Jeff King
2011-05-26 21:18 ` Junio C Hamano
2 siblings, 1 reply; 16+ messages in thread
From: Jeff King @ 2011-05-26 20:55 UTC (permalink / raw)
To: Stefan-W. Hahn; +Cc: Junio C Hamano, git
In older versions of git, we used rfc822 header folding to
indicate that the original subject line had multiple lines
in it. But since a1f6baa (format-patch: wrap long header
lines, 2011-02-23), we now use header folding whenever there
is a long line.
This means that "git am" cannot trust header folding as a
sign from format-patch that newlines should be preserved.
Instead, format-patch needs to signal more explicitly that
the newlines are significant. This patch does so by
rfc2047-encoding the newlines in the subject line. No
changes are needed on the "git am" end; it already decodes
the newlines properly.
Signed-off-by: Jeff King <peff@peff.net>
---
We have always treated multi-line subjects as second-class citizens, so
this is not a must-have patch. But I think it makes sense to do,
considering how simple it is, and the fact that it makes "format-patch
-k | am -k" always a no-op, even with multi-line subjects.
builtin/log.c | 3 ++-
commit.h | 4 +++-
log-tree.c | 1 +
pretty.c | 8 +++++---
revision.h | 3 ++-
t/t4152-am-subjects.sh | 2 +-
6 files changed, 14 insertions(+), 7 deletions(-)
diff --git a/builtin/log.c b/builtin/log.c
index d8c6c28..3fdf488 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -768,7 +768,7 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout,
pp_user_info(NULL, CMIT_FMT_EMAIL, &sb, committer, DATE_RFC2822,
encoding);
pp_title_line(CMIT_FMT_EMAIL, &msg, &sb, subject_start, extra_headers,
- encoding, need_8bit_cte);
+ encoding, need_8bit_cte, 0);
pp_remainder(CMIT_FMT_EMAIL, &msg, &sb, 0);
printf("%s\n", sb.buf);
@@ -1130,6 +1130,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
die ("-n and -k are mutually exclusive.");
if (keep_subject && subject_prefix)
die ("--subject-prefix and -k are mutually exclusive.");
+ rev.preserve_subject = keep_subject;
argc = setup_revisions(argc, argv, &rev, &s_r_opt);
if (argc > 1)
diff --git a/commit.h b/commit.h
index eb6c5af..30cb7bc 100644
--- a/commit.h
+++ b/commit.h
@@ -73,6 +73,7 @@ struct pretty_print_context
int abbrev;
const char *subject;
const char *after_subject;
+ int preserve_subject;
enum date_mode date_mode;
int need_8bit_cte;
int show_notes;
@@ -107,7 +108,8 @@ void pp_title_line(enum cmit_fmt fmt,
const char *subject,
const char *after_subject,
const char *encoding,
- int need_8bit_cte);
+ int need_8bit_cte,
+ int preserve_lines);
void pp_remainder(enum cmit_fmt fmt,
const char **msg_p,
struct strbuf *sb,
diff --git a/log-tree.c b/log-tree.c
index b46ed3b..9b9aaf2 100644
--- a/log-tree.c
+++ b/log-tree.c
@@ -504,6 +504,7 @@ void show_log(struct rev_info *opt)
ctx.date_mode = opt->date_mode;
ctx.abbrev = opt->diffopt.abbrev;
ctx.after_subject = extra_headers;
+ ctx.preserve_subject = opt->preserve_subject;
ctx.reflog_info = opt->reflog_info;
pretty_print_commit(opt->commit_format, commit, &msgbuf, &ctx);
diff --git a/pretty.c b/pretty.c
index 65d20a7..315f1d2 100644
--- a/pretty.c
+++ b/pretty.c
@@ -1121,12 +1121,13 @@ void pp_title_line(enum cmit_fmt fmt,
const char *subject,
const char *after_subject,
const char *encoding,
- int need_8bit_cte)
+ int need_8bit_cte,
+ int preserve_lines)
{
struct strbuf title;
strbuf_init(&title, 80);
- *msg_p = format_subject(&title, *msg_p, " ");
+ *msg_p = format_subject(&title, *msg_p, preserve_lines ? "\n" : " ");
strbuf_grow(sb, title.len + 1024);
if (subject) {
@@ -1254,7 +1255,8 @@ void pretty_print_commit(enum cmit_fmt fmt, const struct commit *commit,
/* These formats treat the title line specially. */
if (fmt == CMIT_FMT_ONELINE || fmt == CMIT_FMT_EMAIL)
pp_title_line(fmt, &msg, sb, context->subject,
- context->after_subject, encoding, need_8bit_cte);
+ context->after_subject, encoding, need_8bit_cte,
+ context->preserve_subject);
beginning_of_body = sb->len;
if (fmt != CMIT_FMT_ONELINE)
diff --git a/revision.h b/revision.h
index 05659c6..f8ddd83 100644
--- a/revision.h
+++ b/revision.h
@@ -90,7 +90,8 @@ struct rev_info {
abbrev_commit:1,
use_terminator:1,
missing_newline:1,
- date_mode_explicit:1;
+ date_mode_explicit:1,
+ preserve_subject:1;
unsigned int disable_stdin:1;
enum date_mode date_mode;
diff --git a/t/t4152-am-subjects.sh b/t/t4152-am-subjects.sh
index 37e5c03..4c68245 100755
--- a/t/t4152-am-subjects.sh
+++ b/t/t4152-am-subjects.sh
@@ -70,7 +70,7 @@ test_expect_success 'multiline subject unwrapped (format-patch -k | am)' '
check_subject multiline-k
'
echo "$MULTILINE_SUBJECT" >expect
-test_expect_failure 'multiline subject preserved (format-patch -k | am -k)' '
+test_expect_success 'multiline subject preserved (format-patch -k | am -k)' '
check_subject multiline-k -k
'
--
1.7.4.5.26.g0c6a2
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 3/3] format-patch: preserve subject newlines with -k
2011-05-26 20:55 ` [PATCH 3/3] format-patch: preserve subject newlines with -k Jeff King
@ 2011-05-26 21:18 ` Junio C Hamano
2011-05-26 21:19 ` Jeff King
0 siblings, 1 reply; 16+ messages in thread
From: Junio C Hamano @ 2011-05-26 21:18 UTC (permalink / raw)
To: Jeff King; +Cc: Stefan-W. Hahn, git
Jeff King <peff@peff.net> writes:
> We have always treated multi-line subjects as second-class citizens, so
> this is not a must-have patch. But I think it makes sense to do,
> considering how simple it is, and the fact that it makes "format-patch
> -k | am -k" always a no-op, even with multi-line subjects.
I think this is a good thing to have, as the reason why we treated
multi-line subjects as second-class citizens is exactly because we didn't
try to stuff multiple lines on "Subject:" like you did with this patch.
> diff --git a/builtin/log.c b/builtin/log.c
> index d8c6c28..3fdf488 100644
> --- a/builtin/log.c
> +++ b/builtin/log.c
> @@ -768,7 +768,7 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout,
> pp_user_info(NULL, CMIT_FMT_EMAIL, &sb, committer, DATE_RFC2822,
> encoding);
> pp_title_line(CMIT_FMT_EMAIL, &msg, &sb, subject_start, extra_headers,
> - encoding, need_8bit_cte);
> + encoding, need_8bit_cte, 0);
I do not appreciate a single-bit tweak as separate parameter to a
function. Back when pp_title_line() had only "do we need 8-bit cte", it
was Ok, but now that you are adding another bit, could we make it an
"unsigned flag"?
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 3/3] format-patch: preserve subject newlines with -k
2011-05-26 21:18 ` Junio C Hamano
@ 2011-05-26 21:19 ` Jeff King
2011-05-26 22:24 ` Jeff King
0 siblings, 1 reply; 16+ messages in thread
From: Jeff King @ 2011-05-26 21:19 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Stefan-W. Hahn, git
On Thu, May 26, 2011 at 02:18:33PM -0700, Junio C Hamano wrote:
> > diff --git a/builtin/log.c b/builtin/log.c
> > index d8c6c28..3fdf488 100644
> > --- a/builtin/log.c
> > +++ b/builtin/log.c
> > @@ -768,7 +768,7 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout,
> > pp_user_info(NULL, CMIT_FMT_EMAIL, &sb, committer, DATE_RFC2822,
> > encoding);
> > pp_title_line(CMIT_FMT_EMAIL, &msg, &sb, subject_start, extra_headers,
> > - encoding, need_8bit_cte);
> > + encoding, need_8bit_cte, 0);
>
> I do not appreciate a single-bit tweak as separate parameter to a
> function. Back when pp_title_line() had only "do we need 8-bit cte", it
> was Ok, but now that you are adding another bit, could we make it an
> "unsigned flag"?
Actually, I wonder if we can refactor to just pass the pretty_context to
pp_title_line. Let me see what I can do.
-Peff
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 3/3] format-patch: preserve subject newlines with -k
2011-05-26 21:19 ` Jeff King
@ 2011-05-26 22:24 ` Jeff King
2011-05-26 22:27 ` [PATCH 3/5] pretty: add pp_commit_easy function for simple callers Jeff King
` (2 more replies)
0 siblings, 3 replies; 16+ messages in thread
From: Jeff King @ 2011-05-26 22:24 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Stefan-W. Hahn, git
On Thu, May 26, 2011 at 05:19:52PM -0400, Jeff King wrote:
> > > pp_title_line(CMIT_FMT_EMAIL, &msg, &sb, subject_start, extra_headers,
> > > - encoding, need_8bit_cte);
> > > + encoding, need_8bit_cte, 0);
> >
> > I do not appreciate a single-bit tweak as separate parameter to a
> > function. Back when pp_title_line() had only "do we need 8-bit cte", it
> > was Ok, but now that you are adding another bit, could we make it an
> > "unsigned flag"?
>
> Actually, I wonder if we can refactor to just pass the pretty_context to
> pp_title_line. Let me see what I can do.
It ends up being a lot of lines changed, but I think the result is more
readable. Replace my 3/3 with (1/5 and 2/5 are the same as before):
[3/5]: pretty: add pp_commit_easy function for simple callers
[4/5]: clean up calling conventions for pretty.c functions
[5/5]: format-patch: preserve subject newlines with -k
-Peff
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 3/5] pretty: add pp_commit_easy function for simple callers
2011-05-26 22:24 ` Jeff King
@ 2011-05-26 22:27 ` Jeff King
2011-05-26 22:47 ` Junio C Hamano
2011-05-26 22:27 ` [PATCH 4/5] clean up calling conventions for pretty.c functions Jeff King
2011-05-26 22:28 ` [PATCH 5/5] format-patch: preserve subject newlines with -k Jeff King
2 siblings, 1 reply; 16+ messages in thread
From: Jeff King @ 2011-05-26 22:27 UTC (permalink / raw)
To: Stefan-W. Hahn; +Cc: Junio C Hamano, git
Many callers don't actually care about the pretty print
context at all; let's just give them a simple way of
pretty-printing a commit without having to create a context
struct.
Signed-off-by: Jeff King <peff@peff.net>
---
This trades off per-call lines for some infrastructure lines. It's a
slight lose in line count now, but as more callers are added, it may be
a win. But I think even now it's overall easier to read.
builtin/branch.c | 4 +---
builtin/checkout.c | 3 +--
builtin/log.c | 4 +---
builtin/shortlog.c | 3 +--
builtin/show-branch.c | 3 +--
commit.h | 2 ++
pretty.c | 7 +++++++
7 files changed, 14 insertions(+), 12 deletions(-)
diff --git a/builtin/branch.c b/builtin/branch.c
index 9e546e4..d8f1522 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -436,9 +436,7 @@ static void print_ref_item(struct ref_item *item, int maxwidth, int verbose,
commit = item->commit;
if (commit && !parse_commit(commit)) {
- struct pretty_print_context ctx = {0};
- pretty_print_commit(CMIT_FMT_ONELINE, commit,
- &subject, &ctx);
+ pp_commit_easy(CMIT_FMT_ONELINE, commit, &subject);
sub = subject.buf;
}
diff --git a/builtin/checkout.c b/builtin/checkout.c
index 757f9a0..c1759dc 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -300,9 +300,8 @@ static void show_local_changes(struct object *head, struct diff_options *opts)
static void describe_detached_head(char *msg, struct commit *commit)
{
struct strbuf sb = STRBUF_INIT;
- struct pretty_print_context ctx = {0};
parse_commit(commit);
- pretty_print_commit(CMIT_FMT_ONELINE, commit, &sb, &ctx);
+ pp_commit_easy(CMIT_FMT_ONELINE, commit, &sb);
fprintf(stderr, "%s %s... %s\n", msg,
find_unique_abbrev(commit->object.sha1, DEFAULT_ABBREV), sb.buf);
strbuf_release(&sb);
diff --git a/builtin/log.c b/builtin/log.c
index d8c6c28..cedfdb6 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -1439,9 +1439,7 @@ int cmd_cherry(int argc, const char **argv, const char *prefix)
if (verbose) {
struct strbuf buf = STRBUF_INIT;
- struct pretty_print_context ctx = {0};
- pretty_print_commit(CMIT_FMT_ONELINE, commit,
- &buf, &ctx);
+ pp_commit_easy(CMIT_FMT_ONELINE, commit, &buf);
printf("%c %s %s\n", sign,
find_unique_abbrev(commit->object.sha1, abbrev),
buf.buf);
diff --git a/builtin/shortlog.c b/builtin/shortlog.c
index 1a21e4b..90877b5 100644
--- a/builtin/shortlog.c
+++ b/builtin/shortlog.c
@@ -141,9 +141,8 @@ void shortlog_add_commit(struct shortlog *log, struct commit *commit)
const char *author = NULL, *buffer;
struct strbuf buf = STRBUF_INIT;
struct strbuf ufbuf = STRBUF_INIT;
- struct pretty_print_context ctx = {0};
- pretty_print_commit(CMIT_FMT_RAW, commit, &buf, &ctx);
+ pp_commit_easy(CMIT_FMT_RAW, commit, &buf);
buffer = buf.buf;
while (*buffer && *buffer != '\n') {
const char *eol = strchr(buffer, '\n');
diff --git a/builtin/show-branch.c b/builtin/show-branch.c
index da69581..a5fc2aa 100644
--- a/builtin/show-branch.c
+++ b/builtin/show-branch.c
@@ -293,8 +293,7 @@ static void show_one_commit(struct commit *commit, int no_name)
struct commit_name *name = commit->util;
if (commit->object.parsed) {
- struct pretty_print_context ctx = {0};
- pretty_print_commit(CMIT_FMT_ONELINE, commit, &pretty, &ctx);
+ pp_commit_easy(CMIT_FMT_ONELINE, commit, &pretty);
pretty_str = pretty.buf;
}
if (!prefixcmp(pretty_str, "[PATCH] "))
diff --git a/commit.h b/commit.h
index eb6c5af..3e733be 100644
--- a/commit.h
+++ b/commit.h
@@ -98,6 +98,8 @@ extern void format_commit_message(const struct commit *commit,
extern void pretty_print_commit(enum cmit_fmt fmt, const struct commit *commit,
struct strbuf *sb,
const struct pretty_print_context *context);
+extern void pp_commit_easy(enum cmit_fmt fmt, const struct commit *commit,
+ struct strbuf *sb);
void pp_user_info(const char *what, enum cmit_fmt fmt, struct strbuf *sb,
const char *line, enum date_mode dmode,
const char *encoding);
diff --git a/pretty.c b/pretty.c
index 65d20a7..38cd398 100644
--- a/pretty.c
+++ b/pretty.c
@@ -1279,3 +1279,10 @@ void pretty_print_commit(enum cmit_fmt fmt, const struct commit *commit,
free(reencoded);
}
+
+void pp_commit_easy(enum cmit_fmt fmt, const struct commit *commit,
+ struct strbuf *sb)
+{
+ struct pretty_print_context pp = {0};
+ pretty_print_commit(fmt, commit, sb, &pp);
+}
--
1.7.4.5.26.g0c6a2
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 4/5] clean up calling conventions for pretty.c functions
2011-05-26 22:24 ` Jeff King
2011-05-26 22:27 ` [PATCH 3/5] pretty: add pp_commit_easy function for simple callers Jeff King
@ 2011-05-26 22:27 ` Jeff King
2011-05-26 22:28 ` [PATCH 5/5] format-patch: preserve subject newlines with -k Jeff King
2 siblings, 0 replies; 16+ messages in thread
From: Jeff King @ 2011-05-26 22:27 UTC (permalink / raw)
To: Stefan-W. Hahn; +Cc: Junio C Hamano, git
We have a pretty_print_context representing the parameters
for a pretty-print session, but we did not use it uniformly.
As a result, functions kept growing more and more arguments.
Let's clean this up in a few ways:
1. All pretty-print pp_* functions now take a context.
This lets us reduce the number of arguments to these
functions, since we were just passing around the
context values separately.
2. The context argument now has a cmit_fmt field, which
was passed around separately. That's one less argument
per function.
3. The context argument always comes first, which makes
calling a little more uniform.
This drops lines from some callers, and adds lines in a few
places (because we need an extra line to set the context's
fmt field). Overall, we don't save many lines, but the lines
that are there are a lot simpler and more readable.
Signed-off-by: Jeff King <peff@peff.net>
---
builtin/log.c | 21 ++++++-----
builtin/merge.c | 3 +-
builtin/rev-list.c | 3 +-
builtin/shortlog.c | 3 +-
commit.h | 19 +++++-----
log-tree.c | 3 +-
pretty.c | 99 ++++++++++++++++++++++++---------------------------
7 files changed, 75 insertions(+), 76 deletions(-)
diff --git a/builtin/log.c b/builtin/log.c
index cedfdb6..8d842cb 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -327,9 +327,11 @@ int cmd_whatchanged(int argc, const char **argv, const char *prefix)
static void show_tagger(char *buf, int len, struct rev_info *rev)
{
struct strbuf out = STRBUF_INIT;
+ struct pretty_print_context pp = {0};
- pp_user_info("Tagger", rev->commit_format, &out, buf, rev->date_mode,
- get_log_output_encoding());
+ pp.fmt = rev->commit_format;
+ pp.date_mode = rev->date_mode;
+ pp_user_info(&pp, "Tagger", &out, buf, get_log_output_encoding());
printf("%s", out.buf);
strbuf_release(&out);
}
@@ -715,10 +717,8 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout,
int nr, struct commit **list, struct commit *head)
{
const char *committer;
- const char *subject_start = NULL;
const char *body = "*** SUBJECT HERE ***\n\n*** BLURB HERE ***\n";
const char *msg;
- const char *extra_headers = rev->extra_headers;
struct shortlog log;
struct strbuf sb = STRBUF_INIT;
int i;
@@ -726,6 +726,7 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout,
struct diff_options opts;
int need_8bit_cte = 0;
struct commit *commit = NULL;
+ struct pretty_print_context pp = {0};
if (rev->commit_format != CMIT_FMT_EMAIL)
die("Cover letter needs email format");
@@ -757,7 +758,7 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout,
free(commit);
}
- log_write_email_headers(rev, head, &subject_start, &extra_headers,
+ log_write_email_headers(rev, head, &pp.subject, &pp.after_subject,
&need_8bit_cte);
for (i = 0; !need_8bit_cte && i < nr; i++)
@@ -765,11 +766,11 @@ static void make_cover_letter(struct rev_info *rev, int use_stdout,
need_8bit_cte = 1;
msg = body;
- pp_user_info(NULL, CMIT_FMT_EMAIL, &sb, committer, DATE_RFC2822,
- encoding);
- pp_title_line(CMIT_FMT_EMAIL, &msg, &sb, subject_start, extra_headers,
- encoding, need_8bit_cte);
- pp_remainder(CMIT_FMT_EMAIL, &msg, &sb, 0);
+ pp.fmt = CMIT_FMT_EMAIL;
+ pp.date_mode = DATE_RFC2822;
+ pp_user_info(&pp, NULL, &sb, committer, encoding);
+ pp_title_line(&pp, &msg, &sb, encoding, need_8bit_cte);
+ pp_remainder(&pp, &msg, &sb, 0);
printf("%s\n", sb.buf);
strbuf_release(&sb);
diff --git a/builtin/merge.c b/builtin/merge.c
index 42fff38..c902e81 100644
--- a/builtin/merge.c
+++ b/builtin/merge.c
@@ -333,13 +333,14 @@ static void squash_message(void)
ctx.abbrev = rev.abbrev;
ctx.date_mode = rev.date_mode;
+ ctx.fmt = rev.commit_format;
strbuf_addstr(&out, "Squashed commit of the following:\n");
while ((commit = get_revision(&rev)) != NULL) {
strbuf_addch(&out, '\n');
strbuf_addf(&out, "commit %s\n",
sha1_to_hex(commit->object.sha1));
- pretty_print_commit(rev.commit_format, commit, &out, &ctx);
+ pretty_print_commit(&ctx, commit, &out);
}
if (write(fd, out.buf, out.len) < 0)
die_errno("Writing SQUASH_MSG");
diff --git a/builtin/rev-list.c b/builtin/rev-list.c
index ba27d39..0ec42fc 100644
--- a/builtin/rev-list.c
+++ b/builtin/rev-list.c
@@ -108,7 +108,8 @@ static void show_commit(struct commit *commit, void *data)
struct pretty_print_context ctx = {0};
ctx.abbrev = revs->abbrev;
ctx.date_mode = revs->date_mode;
- pretty_print_commit(revs->commit_format, commit, &buf, &ctx);
+ ctx.fmt = revs->commit_format;
+ pretty_print_commit(&ctx, commit, &buf);
if (revs->graph) {
if (buf.len) {
if (revs->commit_format != CMIT_FMT_ONELINE)
diff --git a/builtin/shortlog.c b/builtin/shortlog.c
index 90877b5..074fd26 100644
--- a/builtin/shortlog.c
+++ b/builtin/shortlog.c
@@ -161,11 +161,12 @@ void shortlog_add_commit(struct shortlog *log, struct commit *commit)
sha1_to_hex(commit->object.sha1));
if (log->user_format) {
struct pretty_print_context ctx = {0};
+ ctx.fmt = CMIT_FMT_USERFORMAT;
ctx.abbrev = log->abbrev;
ctx.subject = "";
ctx.after_subject = "";
ctx.date_mode = DATE_NORMAL;
- pretty_print_commit(CMIT_FMT_USERFORMAT, commit, &ufbuf, &ctx);
+ pretty_print_commit(&ctx, commit, &ufbuf);
buffer = ufbuf.buf;
} else if (*buffer) {
buffer++;
diff --git a/commit.h b/commit.h
index 3e733be..2935740 100644
--- a/commit.h
+++ b/commit.h
@@ -70,6 +70,7 @@ enum cmit_fmt {
struct pretty_print_context
{
+ enum cmit_fmt fmt;
int abbrev;
const char *subject;
const char *after_subject;
@@ -95,22 +96,20 @@ extern void userformat_find_requirements(const char *fmt, struct userformat_want
extern void format_commit_message(const struct commit *commit,
const char *format, struct strbuf *sb,
const struct pretty_print_context *context);
-extern void pretty_print_commit(enum cmit_fmt fmt, const struct commit *commit,
- struct strbuf *sb,
- const struct pretty_print_context *context);
+extern void pretty_print_commit(const struct pretty_print_context *pp,
+ const struct commit *commit,
+ struct strbuf *sb);
extern void pp_commit_easy(enum cmit_fmt fmt, const struct commit *commit,
struct strbuf *sb);
-void pp_user_info(const char *what, enum cmit_fmt fmt, struct strbuf *sb,
- const char *line, enum date_mode dmode,
- const char *encoding);
-void pp_title_line(enum cmit_fmt fmt,
+void pp_user_info(const struct pretty_print_context *pp,
+ const char *what, struct strbuf *sb,
+ const char *line, const char *encoding);
+void pp_title_line(const struct pretty_print_context *pp,
const char **msg_p,
struct strbuf *sb,
- const char *subject,
- const char *after_subject,
const char *encoding,
int need_8bit_cte);
-void pp_remainder(enum cmit_fmt fmt,
+void pp_remainder(const struct pretty_print_context *pp,
const char **msg_p,
struct strbuf *sb,
int indent);
diff --git a/log-tree.c b/log-tree.c
index b46ed3b..0d8cc7a 100644
--- a/log-tree.c
+++ b/log-tree.c
@@ -505,7 +505,8 @@ void show_log(struct rev_info *opt)
ctx.abbrev = opt->diffopt.abbrev;
ctx.after_subject = extra_headers;
ctx.reflog_info = opt->reflog_info;
- pretty_print_commit(opt->commit_format, commit, &msgbuf, &ctx);
+ ctx.fmt = opt->commit_format;
+ pretty_print_commit(&ctx, commit, &msgbuf);
if (opt->add_signoff)
append_signoff(&msgbuf, opt->add_signoff);
diff --git a/pretty.c b/pretty.c
index 38cd398..f920205 100644
--- a/pretty.c
+++ b/pretty.c
@@ -266,16 +266,16 @@ needquote:
strbuf_addstr(sb, "?=");
}
-void pp_user_info(const char *what, enum cmit_fmt fmt, struct strbuf *sb,
- const char *line, enum date_mode dmode,
- const char *encoding)
+void pp_user_info(const struct pretty_print_context *pp,
+ const char *what, struct strbuf *sb,
+ const char *line, const char *encoding)
{
char *date;
int namelen;
unsigned long time;
int tz;
- if (fmt == CMIT_FMT_ONELINE)
+ if (pp->fmt == CMIT_FMT_ONELINE)
return;
date = strchr(line, '>');
if (!date)
@@ -284,7 +284,7 @@ void pp_user_info(const char *what, enum cmit_fmt fmt, struct strbuf *sb,
time = strtoul(date, &date, 10);
tz = strtol(date, NULL, 10);
- if (fmt == CMIT_FMT_EMAIL) {
+ if (pp->fmt == CMIT_FMT_EMAIL) {
char *name_tail = strchr(line, '<');
int display_name_length;
if (!name_tail)
@@ -298,18 +298,18 @@ void pp_user_info(const char *what, enum cmit_fmt fmt, struct strbuf *sb,
strbuf_addch(sb, '\n');
} else {
strbuf_addf(sb, "%s: %.*s%.*s\n", what,
- (fmt == CMIT_FMT_FULLER) ? 4 : 0,
+ (pp->fmt == CMIT_FMT_FULLER) ? 4 : 0,
" ", namelen, line);
}
- switch (fmt) {
+ switch (pp->fmt) {
case CMIT_FMT_MEDIUM:
- strbuf_addf(sb, "Date: %s\n", show_date(time, tz, dmode));
+ strbuf_addf(sb, "Date: %s\n", show_date(time, tz, pp->date_mode));
break;
case CMIT_FMT_EMAIL:
strbuf_addf(sb, "Date: %s\n", show_date(time, tz, DATE_RFC2822));
break;
case CMIT_FMT_FULLER:
- strbuf_addf(sb, "%sDate: %s\n", what, show_date(time, tz, dmode));
+ strbuf_addf(sb, "%sDate: %s\n", what, show_date(time, tz, pp->date_mode));
break;
default:
/* notin' */
@@ -340,12 +340,12 @@ static const char *skip_empty_lines(const char *msg)
return msg;
}
-static void add_merge_info(enum cmit_fmt fmt, struct strbuf *sb,
- const struct commit *commit, int abbrev)
+static void add_merge_info(const struct pretty_print_context *pp,
+ struct strbuf *sb, const struct commit *commit)
{
struct commit_list *parent = commit->parents;
- if ((fmt == CMIT_FMT_ONELINE) || (fmt == CMIT_FMT_EMAIL) ||
+ if ((pp->fmt == CMIT_FMT_ONELINE) || (pp->fmt == CMIT_FMT_EMAIL) ||
!parent || !parent->next)
return;
@@ -354,8 +354,8 @@ static void add_merge_info(enum cmit_fmt fmt, struct strbuf *sb,
while (parent) {
struct commit *p = parent->item;
const char *hex = NULL;
- if (abbrev)
- hex = find_unique_abbrev(p->object.sha1, abbrev);
+ if (pp->abbrev)
+ hex = find_unique_abbrev(p->object.sha1, pp->abbrev);
if (!hex)
hex = sha1_to_hex(p->object.sha1);
parent = parent->next;
@@ -1052,9 +1052,7 @@ void format_commit_message(const struct commit *commit,
free(context.message);
}
-static void pp_header(enum cmit_fmt fmt,
- int abbrev,
- enum date_mode dmode,
+static void pp_header(const struct pretty_print_context *pp,
const char *encoding,
const struct commit *commit,
const char **msg_p,
@@ -1074,7 +1072,7 @@ static void pp_header(enum cmit_fmt fmt,
/* End of header */
return;
- if (fmt == CMIT_FMT_RAW) {
+ if (pp->fmt == CMIT_FMT_RAW) {
strbuf_add(sb, line, linelen);
continue;
}
@@ -1094,7 +1092,7 @@ static void pp_header(enum cmit_fmt fmt,
;
/* with enough slop */
strbuf_grow(sb, num * 50 + 20);
- add_merge_info(fmt, sb, commit, abbrev);
+ add_merge_info(pp, sb, commit);
parents_shown = 1;
}
@@ -1105,21 +1103,19 @@ static void pp_header(enum cmit_fmt fmt,
*/
if (!memcmp(line, "author ", 7)) {
strbuf_grow(sb, linelen + 80);
- pp_user_info("Author", fmt, sb, line + 7, dmode, encoding);
+ pp_user_info(pp, "Author", sb, line + 7, encoding);
}
if (!memcmp(line, "committer ", 10) &&
- (fmt == CMIT_FMT_FULL || fmt == CMIT_FMT_FULLER)) {
+ (pp->fmt == CMIT_FMT_FULL || pp->fmt == CMIT_FMT_FULLER)) {
strbuf_grow(sb, linelen + 80);
- pp_user_info("Commit", fmt, sb, line + 10, dmode, encoding);
+ pp_user_info(pp, "Commit", sb, line + 10, encoding);
}
}
}
-void pp_title_line(enum cmit_fmt fmt,
+void pp_title_line(const struct pretty_print_context *pp,
const char **msg_p,
struct strbuf *sb,
- const char *subject,
- const char *after_subject,
const char *encoding,
int need_8bit_cte)
{
@@ -1129,8 +1125,8 @@ void pp_title_line(enum cmit_fmt fmt,
*msg_p = format_subject(&title, *msg_p, " ");
strbuf_grow(sb, title.len + 1024);
- if (subject) {
- strbuf_addstr(sb, subject);
+ if (pp->subject) {
+ strbuf_addstr(sb, pp->subject);
add_rfc2047(sb, title.buf, title.len, encoding);
} else {
strbuf_addbuf(sb, &title);
@@ -1144,16 +1140,16 @@ void pp_title_line(enum cmit_fmt fmt,
"Content-Transfer-Encoding: 8bit\n";
strbuf_addf(sb, header_fmt, encoding);
}
- if (after_subject) {
- strbuf_addstr(sb, after_subject);
+ if (pp->after_subject) {
+ strbuf_addstr(sb, pp->after_subject);
}
- if (fmt == CMIT_FMT_EMAIL) {
+ if (pp->fmt == CMIT_FMT_EMAIL) {
strbuf_addch(sb, '\n');
}
strbuf_release(&title);
}
-void pp_remainder(enum cmit_fmt fmt,
+void pp_remainder(const struct pretty_print_context *pp,
const char **msg_p,
struct strbuf *sb,
int indent)
@@ -1170,7 +1166,7 @@ void pp_remainder(enum cmit_fmt fmt,
if (is_empty_line(line, &linelen)) {
if (first)
continue;
- if (fmt == CMIT_FMT_SHORT)
+ if (pp->fmt == CMIT_FMT_SHORT)
break;
}
first = 0;
@@ -1195,19 +1191,19 @@ char *reencode_commit_message(const struct commit *commit, const char **encoding
return logmsg_reencode(commit, encoding);
}
-void pretty_print_commit(enum cmit_fmt fmt, const struct commit *commit,
- struct strbuf *sb,
- const struct pretty_print_context *context)
+void pretty_print_commit(const struct pretty_print_context *pp,
+ const struct commit *commit,
+ struct strbuf *sb)
{
unsigned long beginning_of_body;
int indent = 4;
const char *msg = commit->buffer;
char *reencoded;
const char *encoding;
- int need_8bit_cte = context->need_8bit_cte;
+ int need_8bit_cte = pp->need_8bit_cte;
- if (fmt == CMIT_FMT_USERFORMAT) {
- format_commit_message(commit, user_format, sb, context);
+ if (pp->fmt == CMIT_FMT_USERFORMAT) {
+ format_commit_message(commit, user_format, sb, pp);
return;
}
@@ -1216,14 +1212,14 @@ void pretty_print_commit(enum cmit_fmt fmt, const struct commit *commit,
msg = reencoded;
}
- if (fmt == CMIT_FMT_ONELINE || fmt == CMIT_FMT_EMAIL)
+ if (pp->fmt == CMIT_FMT_ONELINE || pp->fmt == CMIT_FMT_EMAIL)
indent = 0;
/*
* We need to check and emit Content-type: to mark it
* as 8-bit if we haven't done so.
*/
- if (fmt == CMIT_FMT_EMAIL && need_8bit_cte == 0) {
+ if (pp->fmt == CMIT_FMT_EMAIL && need_8bit_cte == 0) {
int i, ch, in_body;
for (in_body = i = 0; (ch = msg[i]); i++) {
@@ -1242,9 +1238,8 @@ void pretty_print_commit(enum cmit_fmt fmt, const struct commit *commit,
}
}
- pp_header(fmt, context->abbrev, context->date_mode, encoding,
- commit, &msg, sb);
- if (fmt != CMIT_FMT_ONELINE && !context->subject) {
+ pp_header(pp, encoding, commit, &msg, sb);
+ if (pp->fmt != CMIT_FMT_ONELINE && !pp->subject) {
strbuf_addch(sb, '\n');
}
@@ -1252,17 +1247,16 @@ void pretty_print_commit(enum cmit_fmt fmt, const struct commit *commit,
msg = skip_empty_lines(msg);
/* These formats treat the title line specially. */
- if (fmt == CMIT_FMT_ONELINE || fmt == CMIT_FMT_EMAIL)
- pp_title_line(fmt, &msg, sb, context->subject,
- context->after_subject, encoding, need_8bit_cte);
+ if (pp->fmt == CMIT_FMT_ONELINE || pp->fmt == CMIT_FMT_EMAIL)
+ pp_title_line(pp, &msg, sb, encoding, need_8bit_cte);
beginning_of_body = sb->len;
- if (fmt != CMIT_FMT_ONELINE)
- pp_remainder(fmt, &msg, sb, indent);
+ if (pp->fmt != CMIT_FMT_ONELINE)
+ pp_remainder(pp, &msg, sb, indent);
strbuf_rtrim(sb);
/* Make sure there is an EOLN for the non-oneline case */
- if (fmt != CMIT_FMT_ONELINE)
+ if (pp->fmt != CMIT_FMT_ONELINE)
strbuf_addch(sb, '\n');
/*
@@ -1270,10 +1264,10 @@ void pretty_print_commit(enum cmit_fmt fmt, const struct commit *commit,
* format. Make sure we did not strip the blank line
* between the header and the body.
*/
- if (fmt == CMIT_FMT_EMAIL && sb->len <= beginning_of_body)
+ if (pp->fmt == CMIT_FMT_EMAIL && sb->len <= beginning_of_body)
strbuf_addch(sb, '\n');
- if (context->show_notes)
+ if (pp->show_notes)
format_display_notes(commit->object.sha1, sb, encoding,
NOTES_SHOW_HEADER | NOTES_INDENT);
@@ -1284,5 +1278,6 @@ void pp_commit_easy(enum cmit_fmt fmt, const struct commit *commit,
struct strbuf *sb)
{
struct pretty_print_context pp = {0};
- pretty_print_commit(fmt, commit, sb, &pp);
+ pp.fmt = fmt;
+ pretty_print_commit(&pp, commit, sb);
}
--
1.7.4.5.26.g0c6a2
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 5/5] format-patch: preserve subject newlines with -k
2011-05-26 22:24 ` Jeff King
2011-05-26 22:27 ` [PATCH 3/5] pretty: add pp_commit_easy function for simple callers Jeff King
2011-05-26 22:27 ` [PATCH 4/5] clean up calling conventions for pretty.c functions Jeff King
@ 2011-05-26 22:28 ` Jeff King
2 siblings, 0 replies; 16+ messages in thread
From: Jeff King @ 2011-05-26 22:28 UTC (permalink / raw)
To: Stefan-W. Hahn; +Cc: Junio C Hamano, git
In older versions of git, we used rfc822 header folding to
indicate that the original subject line had multiple lines
in it. But since a1f6baa (format-patch: wrap long header
lines, 2011-02-23), we now use header folding whenever there
is a long line.
This means that "git am" cannot trust header folding as a
sign from format-patch that newlines should be preserved.
Instead, format-patch needs to signal more explicitly that
the newlines are significant. This patch does so by
rfc2047-encoding the newlines in the subject line. No
changes are needed on the "git am" end; it already decodes
the newlines properly.
Signed-off-by: Jeff King <peff@peff.net>
---
builtin/log.c | 1 +
commit.h | 1 +
log-tree.c | 1 +
pretty.c | 3 ++-
revision.h | 3 ++-
t/t4152-am-subjects.sh | 2 +-
6 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/builtin/log.c b/builtin/log.c
index 8d842cb..0e46e5a 100644
--- a/builtin/log.c
+++ b/builtin/log.c
@@ -1131,6 +1131,7 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
die ("-n and -k are mutually exclusive.");
if (keep_subject && subject_prefix)
die ("--subject-prefix and -k are mutually exclusive.");
+ rev.preserve_subject = keep_subject;
argc = setup_revisions(argc, argv, &rev, &s_r_opt);
if (argc > 1)
diff --git a/commit.h b/commit.h
index 2935740..e985dcc 100644
--- a/commit.h
+++ b/commit.h
@@ -74,6 +74,7 @@ struct pretty_print_context
int abbrev;
const char *subject;
const char *after_subject;
+ int preserve_subject;
enum date_mode date_mode;
int need_8bit_cte;
int show_notes;
diff --git a/log-tree.c b/log-tree.c
index 0d8cc7a..0c41789 100644
--- a/log-tree.c
+++ b/log-tree.c
@@ -504,6 +504,7 @@ void show_log(struct rev_info *opt)
ctx.date_mode = opt->date_mode;
ctx.abbrev = opt->diffopt.abbrev;
ctx.after_subject = extra_headers;
+ ctx.preserve_subject = opt->preserve_subject;
ctx.reflog_info = opt->reflog_info;
ctx.fmt = opt->commit_format;
pretty_print_commit(&ctx, commit, &msgbuf);
diff --git a/pretty.c b/pretty.c
index f920205..905a082 100644
--- a/pretty.c
+++ b/pretty.c
@@ -1122,7 +1122,8 @@ void pp_title_line(const struct pretty_print_context *pp,
struct strbuf title;
strbuf_init(&title, 80);
- *msg_p = format_subject(&title, *msg_p, " ");
+ *msg_p = format_subject(&title, *msg_p,
+ pp->preserve_subject ? "\n" : " ");
strbuf_grow(sb, title.len + 1024);
if (pp->subject) {
diff --git a/revision.h b/revision.h
index 05659c6..f8ddd83 100644
--- a/revision.h
+++ b/revision.h
@@ -90,7 +90,8 @@ struct rev_info {
abbrev_commit:1,
use_terminator:1,
missing_newline:1,
- date_mode_explicit:1;
+ date_mode_explicit:1,
+ preserve_subject:1;
unsigned int disable_stdin:1;
enum date_mode date_mode;
diff --git a/t/t4152-am-subjects.sh b/t/t4152-am-subjects.sh
index 37e5c03..4c68245 100755
--- a/t/t4152-am-subjects.sh
+++ b/t/t4152-am-subjects.sh
@@ -70,7 +70,7 @@ test_expect_success 'multiline subject unwrapped (format-patch -k | am)' '
check_subject multiline-k
'
echo "$MULTILINE_SUBJECT" >expect
-test_expect_failure 'multiline subject preserved (format-patch -k | am -k)' '
+test_expect_success 'multiline subject preserved (format-patch -k | am -k)' '
check_subject multiline-k -k
'
--
1.7.4.5.26.g0c6a2
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 3/5] pretty: add pp_commit_easy function for simple callers
2011-05-26 22:27 ` [PATCH 3/5] pretty: add pp_commit_easy function for simple callers Jeff King
@ 2011-05-26 22:47 ` Junio C Hamano
0 siblings, 0 replies; 16+ messages in thread
From: Junio C Hamano @ 2011-05-26 22:47 UTC (permalink / raw)
To: Jeff King; +Cc: Stefan-W. Hahn, Junio C Hamano, git
Jeff King <peff@peff.net> writes:
> Many callers don't actually care about the pretty print context at all;
> let's just give them a simple way of pretty-printing a commit without
> having to create a context struct.
Very nice ;-).
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2011-05-26 22:47 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-05-24 16:02 commit a1f6baa5 (wrap long header lines) breaks my habit Stefan-W. Hahn
2011-05-24 16:27 ` Junio C Hamano
2011-05-24 16:46 ` Stefan-W. Hahn
2011-05-24 20:07 ` Jeff King
2011-05-25 15:40 ` Stefan-W. Hahn
2011-05-26 20:36 ` Jeff King
2011-05-26 20:41 ` [PATCH 1/3] t: test subject handling in format-patch / am pipeline Jeff King
2011-05-26 20:53 ` [PATCH 2/3] mailinfo: always clean up rfc822 header folding Jeff King
2011-05-26 20:55 ` [PATCH 3/3] format-patch: preserve subject newlines with -k Jeff King
2011-05-26 21:18 ` Junio C Hamano
2011-05-26 21:19 ` Jeff King
2011-05-26 22:24 ` Jeff King
2011-05-26 22:27 ` [PATCH 3/5] pretty: add pp_commit_easy function for simple callers Jeff King
2011-05-26 22:47 ` Junio C Hamano
2011-05-26 22:27 ` [PATCH 4/5] clean up calling conventions for pretty.c functions Jeff King
2011-05-26 22:28 ` [PATCH 5/5] format-patch: preserve subject newlines with -k Jeff King
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).