* [PATCH] Make find_commit_subject() more robust @ 2016-06-18 13:12 Johannes Schindelin 2016-06-20 19:35 ` Junio C Hamano 2016-06-21 12:43 ` [PATCH v2] " Johannes Schindelin 0 siblings, 2 replies; 15+ messages in thread From: Johannes Schindelin @ 2016-06-18 13:12 UTC (permalink / raw) To: git; +Cc: Junio C Hamano Just like the pretty printing machinery, we should simply ignore empty lines at the beginning of the commit messages. This discrepancy was noticed when an early version of the rebase--helper produced commit objects with more than one empty line between the header and the commit message. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> --- Published-As: https://github.com/dscho/git/releases/tag/leading-empty-lines-v1 Aaaaand another patch from the rebase--helper front. I guess I'll call it a day with this one. commit.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/commit.c b/commit.c index 3f4f371..7b00989 100644 --- a/commit.c +++ b/commit.c @@ -415,6 +415,8 @@ int find_commit_subject(const char *commit_buffer, const char **subject) p++; if (*p) { p += 2; + while (*p == '\n') + p++; for (eol = p; *eol && *eol != '\n'; eol++) ; /* do nothing */ } else -- 2.9.0.119.gb7b8d21 base-commit: 05219a1276341e72d8082d76b7f5ed394b7437a4 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH] Make find_commit_subject() more robust 2016-06-18 13:12 [PATCH] Make find_commit_subject() more robust Johannes Schindelin @ 2016-06-20 19:35 ` Junio C Hamano 2016-06-21 12:03 ` Johannes Schindelin 2016-06-21 12:43 ` [PATCH v2] " Johannes Schindelin 1 sibling, 1 reply; 15+ messages in thread From: Junio C Hamano @ 2016-06-20 19:35 UTC (permalink / raw) To: Johannes Schindelin; +Cc: git Johannes Schindelin <johannes.schindelin@gmx.de> writes: > Just like the pretty printing machinery, we should simply ignore empty > lines at the beginning of the commit messages. > > This discrepancy was noticed when an early version of the rebase--helper > produced commit objects with more than one empty line between the header > and the commit message. > > Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> > --- > Published-As: https://github.com/dscho/git/releases/tag/leading-empty-lines-v1 > > Aaaaand another patch from the rebase--helper front. I guess I'll > call it a day with this one. Makes sense. This has a trivial textual conflict with cleanup patches in flight, I think, but that is not a big problem. It does hint that we might want to find a library function that can replace a hand-rolled while loop we are adding here, though ;-) Perhaps cast this new behaviour in stone by adding a test? Thanks. > commit.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/commit.c b/commit.c > index 3f4f371..7b00989 100644 > --- a/commit.c > +++ b/commit.c > @@ -415,6 +415,8 @@ int find_commit_subject(const char *commit_buffer, const char **subject) > p++; > if (*p) { > p += 2; > + while (*p == '\n') > + p++; > for (eol = p; *eol && *eol != '\n'; eol++) > ; /* do nothing */ > } else ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] Make find_commit_subject() more robust 2016-06-20 19:35 ` Junio C Hamano @ 2016-06-21 12:03 ` Johannes Schindelin 2016-06-21 21:15 ` Junio C Hamano 0 siblings, 1 reply; 15+ messages in thread From: Johannes Schindelin @ 2016-06-21 12:03 UTC (permalink / raw) To: Junio C Hamano; +Cc: git Hi Junio, On Mon, 20 Jun 2016, Junio C Hamano wrote: > Johannes Schindelin <johannes.schindelin@gmx.de> writes: > > > Just like the pretty printing machinery, we should simply ignore empty > > lines at the beginning of the commit messages. > > > > This discrepancy was noticed when an early version of the rebase--helper > > produced commit objects with more than one empty line between the header > > and the commit message. > > > > Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> > > --- > > Published-As: https://github.com/dscho/git/releases/tag/leading-empty-lines-v1 > > > > Aaaaand another patch from the rebase--helper front. I guess I'll > > call it a day with this one. > > Makes sense. This has a trivial textual conflict with cleanup > patches in flight, I think, but that is not a big problem. I will gladly resend rebased to `next`, if you wish. > It does hint that we might want to find a library function that can > replace a hand-rolled while loop we are adding here, though ;-) Heh. I cannot help you with that ;-) > Perhaps cast this new behaviour in stone by adding a test? Will do. Ciao, Dscho ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] Make find_commit_subject() more robust 2016-06-21 12:03 ` Johannes Schindelin @ 2016-06-21 21:15 ` Junio C Hamano 2016-06-22 9:03 ` Johannes Schindelin 0 siblings, 1 reply; 15+ messages in thread From: Junio C Hamano @ 2016-06-21 21:15 UTC (permalink / raw) To: Johannes Schindelin; +Cc: git Johannes Schindelin <Johannes.Schindelin@gmx.de> writes: > Hi Junio, > > On Mon, 20 Jun 2016, Junio C Hamano wrote: > >> Johannes Schindelin <johannes.schindelin@gmx.de> writes: >> >> > Just like the pretty printing machinery, we should simply ignore empty >> > lines at the beginning of the commit messages. >> > >> > This discrepancy was noticed when an early version of the rebase--helper >> > produced commit objects with more than one empty line between the header >> > and the commit message. >> > >> > Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> >> > --- >> > Published-As: https://github.com/dscho/git/releases/tag/leading-empty-lines-v1 >> > >> > Aaaaand another patch from the rebase--helper front. I guess I'll >> > call it a day with this one. >> >> Makes sense. This has a trivial textual conflict with cleanup >> patches in flight, I think, but that is not a big problem. > > I will gladly resend rebased to `next`, if you wish. No, I'd prefer a patch that applies to 'master' for a new feature; there is no need to deliberately get taken hostage by other topics. >> It does hint that we might want to find a library function that can >> replace a hand-rolled while loop we are adding here, though ;-) > > Heh. I cannot help you with that ;-) The reason it hints such a thing is because the line nearby that does this: for (eol = p; *eol && *eol != '\n'; eol++) ; /* do nothing */ gets rewritten to eol = strchrnul(p, '\n'); i.e. "give me the pointer to the first byte that is '\n', or EOS". Your patch introduces a similar loop with similar (but different) purpose: while (*p == '\n') p++; which would have been helped if there were a helper with an opposite function, i.e. p = strcchrnul(p, '\n'); i.e. "give me the pointer to the first byte that is not '\n', or EOS". But there is no such thing. Although p += strcspn(p, "\n") is a possibility, that somehow feels a bit odd. And that is why I did not hint any existing function and said "might want to find". HOWEVER. Stepping back a bit, I think what we actually want is p = skip_blank_lines(p); that skips any and all blank lines, including an empty line that consists of all whitespace. For example ( # grab the header lines git cat-file commit HEAD | sed -e '/^$/q' # throw in random blank lines echo echo " " echo " " echo " " echo echo "Title line" ) | git hash-object -w -t commit --stdin would mint a commit object that has many blank lines in the front, some have whitespace and are not empty. If you give it to git show -s | cat -e git show -s --oneline | cat -e I think you would see what I mean. ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] Make find_commit_subject() more robust 2016-06-21 21:15 ` Junio C Hamano @ 2016-06-22 9:03 ` Johannes Schindelin 0 siblings, 0 replies; 15+ messages in thread From: Johannes Schindelin @ 2016-06-22 9:03 UTC (permalink / raw) To: Junio C Hamano; +Cc: git Hi Junio, On Tue, 21 Jun 2016, Junio C Hamano wrote: > Your patch introduces a similar loop with similar (but different) > purpose: > > while (*p == '\n') > p++; > > which would have been helped if there were a helper with an > opposite function, i.e. > > p = strcchrnul(p, '\n'); > > i.e. "give me the pointer to the first byte that is not '\n', or EOS". > > But there is no such thing. Although p += strcspn(p, "\n") is a > possibility, that somehow feels a bit odd. And that is why I did > not hint any existing function and said "might want to find". Sure. And strcspn() is less efficient than the loop if you already know that the second parameter contains only a single character. > HOWEVER. > > Stepping back a bit, I think what we actually want is > > p = skip_blank_lines(p); > > that skips any and all blank lines, including an empty line that > consists of all whitespace. My original aim was to make find_commit_subject() consistent with the pretty-printing machinery. I failed to realize that skip_blank_lines() does more than skipping empty lines, so let me re-roll the patch. Ciao, Dscho ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v2] Make find_commit_subject() more robust 2016-06-18 13:12 [PATCH] Make find_commit_subject() more robust Johannes Schindelin 2016-06-20 19:35 ` Junio C Hamano @ 2016-06-21 12:43 ` Johannes Schindelin 2016-06-21 20:34 ` Junio C Hamano 2016-06-22 9:34 ` [PATCH v3 0/2] Make find_commit_subject() consistent with --format=%s Johannes Schindelin 1 sibling, 2 replies; 15+ messages in thread From: Johannes Schindelin @ 2016-06-21 12:43 UTC (permalink / raw) To: git; +Cc: Junio C Hamano Just like the pretty printing machinery, we should simply ignore empty lines at the beginning of the commit messages. This discrepancy was noticed when an early version of the rebase--helper produced commit objects with more than one empty line between the header and the commit message. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> --- Published-As: https://github.com/dscho/git/releases/tag/leading-empty-lines-v2 git blame seemed to be the most accessible user of find_commit_subject()... commit.c | 2 ++ t/t8008-blame-formats.sh | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) Interdiff vs v1: diff --git a/t/t8008-blame-formats.sh b/t/t8008-blame-formats.sh index 29f84a6..03bd313 100755 --- a/t/t8008-blame-formats.sh +++ b/t/t8008-blame-formats.sh @@ -87,4 +87,21 @@ test_expect_success 'blame --line-porcelain output' ' test_cmp expect actual ' +test_expect_success '--porcelain detects first non-empty line as subject' ' + ( + GIT_INDEX_FILE=.git/tmp-index && + export GIT_INDEX_FILE && + echo "This is it" >single-file && + git add single-file && + tree=$(git write-tree) && + commit=$(printf "%s\n%s\n%s\n\n\noneline\n\nbody\n" \ + "tree $tree" \ + "author A <a@b.c> 123456789 +0000" \ + "committer C <c@d.e> 123456789 +0000" | + git hash-object -w -t commit --stdin) && + git blame --porcelain $commit -- single-file >output && + grep "^summary oneline$" output + ) +' + test_done diff --git a/commit.c b/commit.c index 3f4f371..7b00989 100644 --- a/commit.c +++ b/commit.c @@ -415,6 +415,8 @@ int find_commit_subject(const char *commit_buffer, const char **subject) p++; if (*p) { p += 2; + while (*p == '\n') + p++; for (eol = p; *eol && *eol != '\n'; eol++) ; /* do nothing */ } else diff --git a/t/t8008-blame-formats.sh b/t/t8008-blame-formats.sh index 29f84a6..03bd313 100755 --- a/t/t8008-blame-formats.sh +++ b/t/t8008-blame-formats.sh @@ -87,4 +87,21 @@ test_expect_success 'blame --line-porcelain output' ' test_cmp expect actual ' +test_expect_success '--porcelain detects first non-empty line as subject' ' + ( + GIT_INDEX_FILE=.git/tmp-index && + export GIT_INDEX_FILE && + echo "This is it" >single-file && + git add single-file && + tree=$(git write-tree) && + commit=$(printf "%s\n%s\n%s\n\n\noneline\n\nbody\n" \ + "tree $tree" \ + "author A <a@b.c> 123456789 +0000" \ + "committer C <c@d.e> 123456789 +0000" | + git hash-object -w -t commit --stdin) && + git blame --porcelain $commit -- single-file >output && + grep "^summary oneline$" output + ) +' + test_done -- 2.9.0.118.g0e1a633 base-commit: ab7797dbe95fff38d9265869ea367020046db118 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v2] Make find_commit_subject() more robust 2016-06-21 12:43 ` [PATCH v2] " Johannes Schindelin @ 2016-06-21 20:34 ` Junio C Hamano 2016-06-22 9:34 ` [PATCH v3 0/2] Make find_commit_subject() consistent with --format=%s Johannes Schindelin 1 sibling, 0 replies; 15+ messages in thread From: Junio C Hamano @ 2016-06-21 20:34 UTC (permalink / raw) To: Johannes Schindelin; +Cc: git Johannes Schindelin <johannes.schindelin@gmx.de> writes: > Just like the pretty printing machinery, we should simply ignore empty > lines at the beginning of the commit messages. Thanks. > > This discrepancy was noticed when an early version of the rebase--helper > produced commit objects with more than one empty line between the header > and the commit message. > > Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> > --- > Published-As: https://github.com/dscho/git/releases/tag/leading-empty-lines-v2 > > git blame seemed to be the most accessible user of > find_commit_subject()... > > commit.c | 2 ++ > t/t8008-blame-formats.sh | 17 +++++++++++++++++ > 2 files changed, 19 insertions(+) > Interdiff vs v1: > > diff --git a/t/t8008-blame-formats.sh b/t/t8008-blame-formats.sh > index 29f84a6..03bd313 100755 > --- a/t/t8008-blame-formats.sh > +++ b/t/t8008-blame-formats.sh > @@ -87,4 +87,21 @@ test_expect_success 'blame --line-porcelain output' ' > test_cmp expect actual > ' > > +test_expect_success '--porcelain detects first non-empty line as subject' ' > + ( > + GIT_INDEX_FILE=.git/tmp-index && > + export GIT_INDEX_FILE && > + echo "This is it" >single-file && > + git add single-file && > + tree=$(git write-tree) && > + commit=$(printf "%s\n%s\n%s\n\n\noneline\n\nbody\n" \ > + "tree $tree" \ > + "author A <a@b.c> 123456789 +0000" \ > + "committer C <c@d.e> 123456789 +0000" | > + git hash-object -w -t commit --stdin) && > + git blame --porcelain $commit -- single-file >output && > + grep "^summary oneline$" output > + ) > +' > + > test_done > > > diff --git a/commit.c b/commit.c > index 3f4f371..7b00989 100644 > --- a/commit.c > +++ b/commit.c > @@ -415,6 +415,8 @@ int find_commit_subject(const char *commit_buffer, const char **subject) > p++; > if (*p) { > p += 2; > + while (*p == '\n') > + p++; > for (eol = p; *eol && *eol != '\n'; eol++) > ; /* do nothing */ > } else > diff --git a/t/t8008-blame-formats.sh b/t/t8008-blame-formats.sh > index 29f84a6..03bd313 100755 > --- a/t/t8008-blame-formats.sh > +++ b/t/t8008-blame-formats.sh > @@ -87,4 +87,21 @@ test_expect_success 'blame --line-porcelain output' ' > test_cmp expect actual > ' > > +test_expect_success '--porcelain detects first non-empty line as subject' ' > + ( > + GIT_INDEX_FILE=.git/tmp-index && > + export GIT_INDEX_FILE && > + echo "This is it" >single-file && > + git add single-file && > + tree=$(git write-tree) && > + commit=$(printf "%s\n%s\n%s\n\n\noneline\n\nbody\n" \ > + "tree $tree" \ > + "author A <a@b.c> 123456789 +0000" \ > + "committer C <c@d.e> 123456789 +0000" | > + git hash-object -w -t commit --stdin) && > + git blame --porcelain $commit -- single-file >output && > + grep "^summary oneline$" output > + ) > +' > + > test_done ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v3 0/2] Make find_commit_subject() consistent with --format=%s 2016-06-21 12:43 ` [PATCH v2] " Johannes Schindelin 2016-06-21 20:34 ` Junio C Hamano @ 2016-06-22 9:34 ` Johannes Schindelin 2016-06-22 9:34 ` [PATCH v3 1/2] Make the skip_empty_lines() function public Johannes Schindelin ` (3 more replies) 1 sibling, 4 replies; 15+ messages in thread From: Johannes Schindelin @ 2016-06-22 9:34 UTC (permalink / raw) To: git; +Cc: Junio C Hamano In an intermediate iteration of my rebase--helper patches, I accidentally generated commits with more than one empty line between the header and the commit message. When using find_commit_subject() to show the oneline, it turned up empty, even if the output of `git show --format=%s` looked fine. Turned out that the pretty-printing machinery helpfully skipped any blank lines before the commit message. In the first iteration of this patch, I failed to notice that the skip_empty_lines() function used by the pretty printing (which is declared static, and therefore I originally did not use it in order to keep the patch as minimal as possible) skips also blank lines. To make things truly consistent, I now just make the skip_empty_lines() function public, and then use it. Johannes Schindelin (2): Make the skip_empty_lines() function public Make find_commit_subject() more robust commit.c | 2 +- commit.h | 1 + pretty.c | 2 +- t/t8008-blame-formats.sh | 17 +++++++++++++++++ 4 files changed, 20 insertions(+), 2 deletions(-) Published-As: https://github.com/dscho/git/releases/tag/leading-empty-lines-v3 Interdiff vs v2: diff --git a/commit.c b/commit.c index 7b00989..0bf868f 100644 --- a/commit.c +++ b/commit.c @@ -414,9 +414,7 @@ int find_commit_subject(const char *commit_buffer, const char **subject) while (*p && (*p != '\n' || p[1] != '\n')) p++; if (*p) { - p += 2; - while (*p == '\n') - p++; + p = skip_empty_lines(p + 2); for (eol = p; *eol && *eol != '\n'; eol++) ; /* do nothing */ } else diff --git a/commit.h b/commit.h index b06db4d..fbdd18d 100644 --- a/commit.h +++ b/commit.h @@ -177,6 +177,7 @@ extern const char *format_subject(struct strbuf *sb, const char *msg, const char *line_separator); extern void userformat_find_requirements(const char *fmt, struct userformat_want *w); extern int commit_format_is_empty(enum cmit_fmt); +extern const char *skip_empty_lines(const char *msg); extern void format_commit_message(const struct commit *commit, const char *format, struct strbuf *sb, const struct pretty_print_context *context); diff --git a/pretty.c b/pretty.c index c3ec430..1b807b4 100644 --- a/pretty.c +++ b/pretty.c @@ -516,7 +516,7 @@ static int is_empty_line(const char *line, int *len_p) return !len; } -static const char *skip_empty_lines(const char *msg) +const char *skip_empty_lines(const char *msg) { for (;;) { int linelen = get_one_line(msg); diff --git a/t/t8008-blame-formats.sh b/t/t8008-blame-formats.sh index 03bd313..b98f9a4 100755 --- a/t/t8008-blame-formats.sh +++ b/t/t8008-blame-formats.sh @@ -94,7 +94,7 @@ test_expect_success '--porcelain detects first non-empty line as subject' ' echo "This is it" >single-file && git add single-file && tree=$(git write-tree) && - commit=$(printf "%s\n%s\n%s\n\n\noneline\n\nbody\n" \ + commit=$(printf "%s\n%s\n%s\n\n\n \noneline\n\nbody\n" \ "tree $tree" \ "author A <a@b.c> 123456789 +0000" \ "committer C <c@d.e> 123456789 +0000" | -- 2.9.0.118.g0e1a633 base-commit: ab7797dbe95fff38d9265869ea367020046db118 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v3 1/2] Make the skip_empty_lines() function public 2016-06-22 9:34 ` [PATCH v3 0/2] Make find_commit_subject() consistent with --format=%s Johannes Schindelin @ 2016-06-22 9:34 ` Johannes Schindelin 2016-06-22 9:34 ` [PATCH v3 2/2] Make find_commit_subject() more robust Johannes Schindelin ` (2 subsequent siblings) 3 siblings, 0 replies; 15+ messages in thread From: Johannes Schindelin @ 2016-06-22 9:34 UTC (permalink / raw) To: git; +Cc: Junio C Hamano This function will be used also in the find_commit_subject() function. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> --- commit.h | 1 + pretty.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/commit.h b/commit.h index b06db4d..fbdd18d 100644 --- a/commit.h +++ b/commit.h @@ -177,6 +177,7 @@ extern const char *format_subject(struct strbuf *sb, const char *msg, const char *line_separator); extern void userformat_find_requirements(const char *fmt, struct userformat_want *w); extern int commit_format_is_empty(enum cmit_fmt); +extern const char *skip_empty_lines(const char *msg); extern void format_commit_message(const struct commit *commit, const char *format, struct strbuf *sb, const struct pretty_print_context *context); diff --git a/pretty.c b/pretty.c index c3ec430..1b807b4 100644 --- a/pretty.c +++ b/pretty.c @@ -516,7 +516,7 @@ static int is_empty_line(const char *line, int *len_p) return !len; } -static const char *skip_empty_lines(const char *msg) +const char *skip_empty_lines(const char *msg) { for (;;) { int linelen = get_one_line(msg); -- 2.9.0.118.g0e1a633 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v3 2/2] Make find_commit_subject() more robust 2016-06-22 9:34 ` [PATCH v3 0/2] Make find_commit_subject() consistent with --format=%s Johannes Schindelin 2016-06-22 9:34 ` [PATCH v3 1/2] Make the skip_empty_lines() function public Johannes Schindelin @ 2016-06-22 9:34 ` Johannes Schindelin 2016-06-22 17:21 ` [PATCH v3 0/2] Make find_commit_subject() consistent with --format=%s Junio C Hamano 2016-06-22 20:20 ` [PATCH v4 " Johannes Schindelin 3 siblings, 0 replies; 15+ messages in thread From: Johannes Schindelin @ 2016-06-22 9:34 UTC (permalink / raw) To: git; +Cc: Junio C Hamano Just like the pretty printing machinery, we should simply ignore blank lines at the beginning of the commit messages. This discrepancy was noticed when an early version of the rebase--helper produced commit objects with more than one empty line between the header and the commit message. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> --- commit.c | 2 +- t/t8008-blame-formats.sh | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/commit.c b/commit.c index 3f4f371..0bf868f 100644 --- a/commit.c +++ b/commit.c @@ -414,7 +414,7 @@ int find_commit_subject(const char *commit_buffer, const char **subject) while (*p && (*p != '\n' || p[1] != '\n')) p++; if (*p) { - p += 2; + p = skip_empty_lines(p + 2); for (eol = p; *eol && *eol != '\n'; eol++) ; /* do nothing */ } else diff --git a/t/t8008-blame-formats.sh b/t/t8008-blame-formats.sh index 29f84a6..b98f9a4 100755 --- a/t/t8008-blame-formats.sh +++ b/t/t8008-blame-formats.sh @@ -87,4 +87,21 @@ test_expect_success 'blame --line-porcelain output' ' test_cmp expect actual ' +test_expect_success '--porcelain detects first non-empty line as subject' ' + ( + GIT_INDEX_FILE=.git/tmp-index && + export GIT_INDEX_FILE && + echo "This is it" >single-file && + git add single-file && + tree=$(git write-tree) && + commit=$(printf "%s\n%s\n%s\n\n\n \noneline\n\nbody\n" \ + "tree $tree" \ + "author A <a@b.c> 123456789 +0000" \ + "committer C <c@d.e> 123456789 +0000" | + git hash-object -w -t commit --stdin) && + git blame --porcelain $commit -- single-file >output && + grep "^summary oneline$" output + ) +' + test_done -- 2.9.0.118.g0e1a633 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v3 0/2] Make find_commit_subject() consistent with --format=%s 2016-06-22 9:34 ` [PATCH v3 0/2] Make find_commit_subject() consistent with --format=%s Johannes Schindelin 2016-06-22 9:34 ` [PATCH v3 1/2] Make the skip_empty_lines() function public Johannes Schindelin 2016-06-22 9:34 ` [PATCH v3 2/2] Make find_commit_subject() more robust Johannes Schindelin @ 2016-06-22 17:21 ` Junio C Hamano 2016-06-22 20:20 ` Johannes Schindelin 2016-06-22 20:20 ` [PATCH v4 " Johannes Schindelin 3 siblings, 1 reply; 15+ messages in thread From: Junio C Hamano @ 2016-06-22 17:21 UTC (permalink / raw) To: Johannes Schindelin; +Cc: git Johannes Schindelin <johannes.schindelin@gmx.de> writes: > In an intermediate iteration of my rebase--helper patches, I > accidentally generated commits with more than one empty line > between the header and the commit message. When using > find_commit_subject() to show the oneline, it turned up empty, even > if the output of `git show --format=%s` looked fine. Much easier to read with s/this developer/I/g ;-) > Turned out that the pretty-printing machinery helpfully skipped any > blank lines before the commit message. > > In the first iteration of this patch, I failed to notice that > the skip_empty_lines() function used by the pretty printing (which is > declared static, and therefore I originally did not use it in order to > keep the patch as minimal as possible) skips also blank lines. By the way, I think skip_empty_lines() is misnamed, and I think your use of "blank lines" in the previous paragraph indicates that you agree ;-) It probably was OK back when it was a file-local static helper in pretty.c, but it becomes a part of the global API with 1/2, renaming it to skip_blank_lines() may be a good thing to do there at the same time. I could do the tweaking while queuing if you too think it should happen; that way we'd save one roundtrip ;-). > To make things truly consistent, I now just make the skip_empty_lines() > function public, and then use it. Thanks. Interdiff looks sensible. ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v3 0/2] Make find_commit_subject() consistent with --format=%s 2016-06-22 17:21 ` [PATCH v3 0/2] Make find_commit_subject() consistent with --format=%s Junio C Hamano @ 2016-06-22 20:20 ` Johannes Schindelin 0 siblings, 0 replies; 15+ messages in thread From: Johannes Schindelin @ 2016-06-22 20:20 UTC (permalink / raw) To: Junio C Hamano; +Cc: git Hi Junio, On Wed, 22 Jun 2016, Junio C Hamano wrote: > Johannes Schindelin <johannes.schindelin@gmx.de> writes: > > > In an intermediate iteration of my rebase--helper patches, I > > accidentally generated commits with more than one empty line > > between the header and the commit message. When using > > find_commit_subject() to show the oneline, it turned up empty, even > > if the output of `git show --format=%s` looked fine. > > Much easier to read with s/this developer/I/g ;-) :-P > > Turned out that the pretty-printing machinery helpfully skipped any > > blank lines before the commit message. > > > > In the first iteration of this patch, I failed to notice that > > the skip_empty_lines() function used by the pretty printing (which is > > declared static, and therefore I originally did not use it in order to > > keep the patch as minimal as possible) skips also blank lines. > > By the way, I think skip_empty_lines() is misnamed, and I think your > use of "blank lines" in the previous paragraph indicates that you > agree ;-) It probably was OK back when it was a file-local static > helper in pretty.c, but it becomes a part of the global API with > 1/2, renaming it to skip_blank_lines() may be a good thing to do > there at the same time. > > I could do the tweaking while queuing if you too think it should > happen; that way we'd save one roundtrip ;-). I just sent another iteration. Ciao, Dscho ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v4 0/2] Make find_commit_subject() consistent with --format=%s 2016-06-22 9:34 ` [PATCH v3 0/2] Make find_commit_subject() consistent with --format=%s Johannes Schindelin ` (2 preceding siblings ...) 2016-06-22 17:21 ` [PATCH v3 0/2] Make find_commit_subject() consistent with --format=%s Junio C Hamano @ 2016-06-22 20:20 ` Johannes Schindelin 2016-06-22 20:20 ` [PATCH v4 1/2] Make the skip_blank_lines() function public Johannes Schindelin 2016-06-22 20:20 ` [PATCH v4 2/2] Make find_commit_subject() more robust Johannes Schindelin 3 siblings, 2 replies; 15+ messages in thread From: Johannes Schindelin @ 2016-06-22 20:20 UTC (permalink / raw) To: git; +Cc: Junio C Hamano In an intermediate iteration of my rebase--helper patches, I accidentally generated commits with more than one empty line between the header and the commit message. When using find_commit_subject() to show the oneline, it turned up empty, even if the output of `git show --format=%s` looked fine. Turned out that the pretty-printing machinery helpfully skipped any blank lines before the commit message. I simply make pretty.c's skip_empty_lines() public (now appropriately named skip_blank_lines()) to make things consistent. Johannes Schindelin (2): Make the skip_blank_lines() function public Make find_commit_subject() more robust commit.c | 2 +- commit.h | 1 + pretty.c | 16 ++++++++-------- t/t8008-blame-formats.sh | 17 +++++++++++++++++ 4 files changed, 27 insertions(+), 9 deletions(-) Published-As: https://github.com/dscho/git/releases/tag/leading-empty-lines-v4 Interdiff vs v3: diff --git a/commit.c b/commit.c index 0bf868f..24d4715 100644 --- a/commit.c +++ b/commit.c @@ -414,7 +414,7 @@ int find_commit_subject(const char *commit_buffer, const char **subject) while (*p && (*p != '\n' || p[1] != '\n')) p++; if (*p) { - p = skip_empty_lines(p + 2); + p = skip_blank_lines(p + 2); for (eol = p; *eol && *eol != '\n'; eol++) ; /* do nothing */ } else diff --git a/commit.h b/commit.h index fbdd18d..5b78f83 100644 --- a/commit.h +++ b/commit.h @@ -177,7 +177,7 @@ extern const char *format_subject(struct strbuf *sb, const char *msg, const char *line_separator); extern void userformat_find_requirements(const char *fmt, struct userformat_want *w); extern int commit_format_is_empty(enum cmit_fmt); -extern const char *skip_empty_lines(const char *msg); +extern const char *skip_blank_lines(const char *msg); extern void format_commit_message(const struct commit *commit, const char *format, struct strbuf *sb, const struct pretty_print_context *context); diff --git a/pretty.c b/pretty.c index 1b807b4..3b6bff7 100644 --- a/pretty.c +++ b/pretty.c @@ -507,7 +507,7 @@ void pp_user_info(struct pretty_print_context *pp, } } -static int is_empty_line(const char *line, int *len_p) +static int is_blank_line(const char *line, int *len_p) { int len = *len_p; while (len && isspace(line[len - 1])) @@ -516,14 +516,14 @@ static int is_empty_line(const char *line, int *len_p) return !len; } -const char *skip_empty_lines(const char *msg) +const char *skip_blank_lines(const char *msg) { for (;;) { int linelen = get_one_line(msg); int ll = linelen; if (!linelen) break; - if (!is_empty_line(msg, &ll)) + if (!is_blank_line(msg, &ll)) break; msg += linelen; } @@ -875,7 +875,7 @@ const char *format_subject(struct strbuf *sb, const char *msg, int linelen = get_one_line(line); msg += linelen; - if (!linelen || is_empty_line(line, &linelen)) + if (!linelen || is_blank_line(line, &linelen)) break; if (!sb) @@ -894,11 +894,11 @@ static void parse_commit_message(struct format_commit_context *c) const char *msg = c->message + c->message_off; const char *start = c->message; - msg = skip_empty_lines(msg); + msg = skip_blank_lines(msg); c->subject_off = msg - start; msg = format_subject(NULL, msg, NULL); - msg = skip_empty_lines(msg); + msg = skip_blank_lines(msg); c->body_off = msg - start; c->commit_message_parsed = 1; @@ -1711,7 +1711,7 @@ void pp_remainder(struct pretty_print_context *pp, if (!linelen) break; - if (is_empty_line(line, &linelen)) { + if (is_blank_line(line, &linelen)) { if (first) continue; if (pp->fmt == CMIT_FMT_SHORT) @@ -1782,7 +1782,7 @@ void pretty_print_commit(struct pretty_print_context *pp, } /* Skip excess blank lines at the beginning of body, if any... */ - msg = skip_empty_lines(msg); + msg = skip_blank_lines(msg); /* These formats treat the title line specially. */ if (pp->fmt == CMIT_FMT_ONELINE || pp->fmt == CMIT_FMT_EMAIL) diff --git a/t/t8008-blame-formats.sh b/t/t8008-blame-formats.sh index b98f9a4..92c8e79 100755 --- a/t/t8008-blame-formats.sh +++ b/t/t8008-blame-formats.sh @@ -87,7 +87,7 @@ test_expect_success 'blame --line-porcelain output' ' test_cmp expect actual ' -test_expect_success '--porcelain detects first non-empty line as subject' ' +test_expect_success '--porcelain detects first non-blank line as subject' ' ( GIT_INDEX_FILE=.git/tmp-index && export GIT_INDEX_FILE && -- 2.9.0.118.g0e1a633 base-commit: ab7797dbe95fff38d9265869ea367020046db118 ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v4 1/2] Make the skip_blank_lines() function public 2016-06-22 20:20 ` [PATCH v4 " Johannes Schindelin @ 2016-06-22 20:20 ` Johannes Schindelin 2016-06-22 20:20 ` [PATCH v4 2/2] Make find_commit_subject() more robust Johannes Schindelin 1 sibling, 0 replies; 15+ messages in thread From: Johannes Schindelin @ 2016-06-22 20:20 UTC (permalink / raw) To: git; +Cc: Junio C Hamano This function will be used also in the find_commit_subject() function. While at it, rename the function to reflect that it skips not only empty lines, but any lines consisting of only whitespace, too. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> --- commit.h | 1 + pretty.c | 16 ++++++++-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/commit.h b/commit.h index b06db4d..5b78f83 100644 --- a/commit.h +++ b/commit.h @@ -177,6 +177,7 @@ extern const char *format_subject(struct strbuf *sb, const char *msg, const char *line_separator); extern void userformat_find_requirements(const char *fmt, struct userformat_want *w); extern int commit_format_is_empty(enum cmit_fmt); +extern const char *skip_blank_lines(const char *msg); extern void format_commit_message(const struct commit *commit, const char *format, struct strbuf *sb, const struct pretty_print_context *context); diff --git a/pretty.c b/pretty.c index c3ec430..3b6bff7 100644 --- a/pretty.c +++ b/pretty.c @@ -507,7 +507,7 @@ void pp_user_info(struct pretty_print_context *pp, } } -static int is_empty_line(const char *line, int *len_p) +static int is_blank_line(const char *line, int *len_p) { int len = *len_p; while (len && isspace(line[len - 1])) @@ -516,14 +516,14 @@ static int is_empty_line(const char *line, int *len_p) return !len; } -static const char *skip_empty_lines(const char *msg) +const char *skip_blank_lines(const char *msg) { for (;;) { int linelen = get_one_line(msg); int ll = linelen; if (!linelen) break; - if (!is_empty_line(msg, &ll)) + if (!is_blank_line(msg, &ll)) break; msg += linelen; } @@ -875,7 +875,7 @@ const char *format_subject(struct strbuf *sb, const char *msg, int linelen = get_one_line(line); msg += linelen; - if (!linelen || is_empty_line(line, &linelen)) + if (!linelen || is_blank_line(line, &linelen)) break; if (!sb) @@ -894,11 +894,11 @@ static void parse_commit_message(struct format_commit_context *c) const char *msg = c->message + c->message_off; const char *start = c->message; - msg = skip_empty_lines(msg); + msg = skip_blank_lines(msg); c->subject_off = msg - start; msg = format_subject(NULL, msg, NULL); - msg = skip_empty_lines(msg); + msg = skip_blank_lines(msg); c->body_off = msg - start; c->commit_message_parsed = 1; @@ -1711,7 +1711,7 @@ void pp_remainder(struct pretty_print_context *pp, if (!linelen) break; - if (is_empty_line(line, &linelen)) { + if (is_blank_line(line, &linelen)) { if (first) continue; if (pp->fmt == CMIT_FMT_SHORT) @@ -1782,7 +1782,7 @@ void pretty_print_commit(struct pretty_print_context *pp, } /* Skip excess blank lines at the beginning of body, if any... */ - msg = skip_empty_lines(msg); + msg = skip_blank_lines(msg); /* These formats treat the title line specially. */ if (pp->fmt == CMIT_FMT_ONELINE || pp->fmt == CMIT_FMT_EMAIL) -- 2.9.0.118.g0e1a633 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH v4 2/2] Make find_commit_subject() more robust 2016-06-22 20:20 ` [PATCH v4 " Johannes Schindelin 2016-06-22 20:20 ` [PATCH v4 1/2] Make the skip_blank_lines() function public Johannes Schindelin @ 2016-06-22 20:20 ` Johannes Schindelin 1 sibling, 0 replies; 15+ messages in thread From: Johannes Schindelin @ 2016-06-22 20:20 UTC (permalink / raw) To: git; +Cc: Junio C Hamano Just like the pretty printing machinery, we should simply ignore blank lines at the beginning of the commit messages. This discrepancy was noticed when an early version of the rebase--helper produced commit objects with more than one empty line between the header and the commit message. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> --- commit.c | 2 +- t/t8008-blame-formats.sh | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/commit.c b/commit.c index 3f4f371..24d4715 100644 --- a/commit.c +++ b/commit.c @@ -414,7 +414,7 @@ int find_commit_subject(const char *commit_buffer, const char **subject) while (*p && (*p != '\n' || p[1] != '\n')) p++; if (*p) { - p += 2; + p = skip_blank_lines(p + 2); for (eol = p; *eol && *eol != '\n'; eol++) ; /* do nothing */ } else diff --git a/t/t8008-blame-formats.sh b/t/t8008-blame-formats.sh index 29f84a6..92c8e79 100755 --- a/t/t8008-blame-formats.sh +++ b/t/t8008-blame-formats.sh @@ -87,4 +87,21 @@ test_expect_success 'blame --line-porcelain output' ' test_cmp expect actual ' +test_expect_success '--porcelain detects first non-blank line as subject' ' + ( + GIT_INDEX_FILE=.git/tmp-index && + export GIT_INDEX_FILE && + echo "This is it" >single-file && + git add single-file && + tree=$(git write-tree) && + commit=$(printf "%s\n%s\n%s\n\n\n \noneline\n\nbody\n" \ + "tree $tree" \ + "author A <a@b.c> 123456789 +0000" \ + "committer C <c@d.e> 123456789 +0000" | + git hash-object -w -t commit --stdin) && + git blame --porcelain $commit -- single-file >output && + grep "^summary oneline$" output + ) +' + test_done -- 2.9.0.118.g0e1a633 ^ permalink raw reply related [flat|nested] 15+ messages in thread
end of thread, other threads:[~2016-06-22 20:21 UTC | newest] Thread overview: 15+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-06-18 13:12 [PATCH] Make find_commit_subject() more robust Johannes Schindelin 2016-06-20 19:35 ` Junio C Hamano 2016-06-21 12:03 ` Johannes Schindelin 2016-06-21 21:15 ` Junio C Hamano 2016-06-22 9:03 ` Johannes Schindelin 2016-06-21 12:43 ` [PATCH v2] " Johannes Schindelin 2016-06-21 20:34 ` Junio C Hamano 2016-06-22 9:34 ` [PATCH v3 0/2] Make find_commit_subject() consistent with --format=%s Johannes Schindelin 2016-06-22 9:34 ` [PATCH v3 1/2] Make the skip_empty_lines() function public Johannes Schindelin 2016-06-22 9:34 ` [PATCH v3 2/2] Make find_commit_subject() more robust Johannes Schindelin 2016-06-22 17:21 ` [PATCH v3 0/2] Make find_commit_subject() consistent with --format=%s Junio C Hamano 2016-06-22 20:20 ` Johannes Schindelin 2016-06-22 20:20 ` [PATCH v4 " Johannes Schindelin 2016-06-22 20:20 ` [PATCH v4 1/2] Make the skip_blank_lines() function public Johannes Schindelin 2016-06-22 20:20 ` [PATCH v4 2/2] Make find_commit_subject() more robust Johannes Schindelin
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).