From: "Philippe Blain via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Michael J Gruber <git@grubix.eu>,
Matthieu Moy <git@matthieu-moy.fr>,
John Keeping <john@keeping.me.uk>,
Karthik Nayak <karthik.188@gmail.com>, Jeff King <peff@peff.net>,
Alex Henrie <alexhenrie24@gmail.com>,
Philippe Blain <levraiphilippeblain@gmail.com>
Subject: [PATCH v2 0/3] Teach ref-filter API to correctly handle CRLF in messages
Date: Tue, 10 Mar 2020 02:24:50 +0000 [thread overview]
Message-ID: <pull.576.v2.git.1583807093.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.576.git.1583692184.gitgitgadget@gmail.com>
The ref-filter API does not correctly handle commit or tag messages that use
CRLF as the line terminator. Such messages can be created with the--verbatim
option of git commit and git tag, or by using git commit-tree directly.
This impacts the output git branch, git tag and git for-each-refwhen used
with a --format argument containing the atoms%(contents:subject) or
%(contents:body), as well as the output ofgit branch --verbose, which uses
%(contents:subject) internally.
The function find_subpos in ref-filter.c looks for two consecutive '\n' to
find the end of the subject line, a sequence which is absent in messages
using CRLF. This results in the whole message being parsed as the subject
line (%(contents:subject)), and the body of the message (%(contents:body))
being empty.
Moreover, in copy_subject, '\n' is replaced by space, but '\r' is untouched,
resulting in the escape sequence '^M' being output verbatim in most terminal
emulators:
$ git branch --verbose
* crlf 2113b0e Subject first line^M ^M Body first line^M Body second line
This bug is a regression for git branch --verbose, which bisects down to
949af06 (branch: use ref-filter printing APIs, 2017-01-10).
The first patch in this series adds a new test library,
t/lib-crlf-messages.sh, that contains functions to test this behaviour for
commands using either the ref-filter or the pretty API to display messages.
The second patch fixes the bug in ref-filter.c and adds corresponding tests.
Finally, the third patch adds a test that checks the behaviour of git log in
the presence of CRLF in messages, to prevent futur regressions.
changes since v1:
* improved the cover letter and the commit message of the 2nd patch to
actually describe the bug this series is fixing
----------------------------------------------------------------------------
v1:
The ref-filter API does not correctly handle commit or tag messages that use
CRLF as the line terminator. Such messages can be created with the--verbatim
option of git commit and git tag, or by using git commit-tree directly.
This impacts the output of git branch -v, and git branch, git tag and git
for-each-ref when used with a --format argument containing the atoms
%(contents:subject) or %(contents:body).
The first patch in this series adds a new test library,
t/lib-crlf-messages.sh, that contains functions to test this behaviour for
commands using either the ref-filter or the pretty API to display messages.
The second patch fixes the bug in ref-filter.c and adds corresponding tests.
Finally, the third patch adds a test that checks the behaviour of git log in
the presence of CRLF in messages, to prevent futur regressions.
Philippe Blain (3):
t: add lib-crlf-messages.sh for messages containing CRLF
ref-filter: fix the API to correctly handle CRLF
log: add tests for messages containing CRLF to t4202
ref-filter.c | 19 +++++++++--
t/lib-crlf-messages.sh | 73 ++++++++++++++++++++++++++++++++++++++++
t/t3203-branch-output.sh | 26 +++++++++++---
t/t4202-log.sh | 24 +++++++++++++
t/t6300-for-each-ref.sh | 5 +++
t/t7004-tag.sh | 7 ++++
6 files changed, 147 insertions(+), 7 deletions(-)
create mode 100644 t/lib-crlf-messages.sh
base-commit: 076cbdcd739aeb33c1be87b73aebae5e43d7bcc5
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-576%2Fphil-blain%2Ffix-branch-verbose-crlf-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-576/phil-blain/fix-branch-verbose-crlf-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/576
Range-diff vs v1:
1: b2521138035 = 1: b2521138035 t: add lib-crlf-messages.sh for messages containing CRLF
2: c68bc2b3788 ! 2: aab1f45ba97 ref-filter: teach the API to correctly handle CRLF
@@ -1,26 +1,49 @@
Author: Philippe Blain <levraiphilippeblain@gmail.com>
- ref-filter: teach the API to correctly handle CRLF
+ ref-filter: fix the API to correctly handle CRLF
The ref-filter API does not correctly handle commit or tag messages that
use CRLF as the line terminator. Such messages can be created with the
`--verbatim` option of `git commit` and `git tag`, or by using `git
commit-tree` directly.
- This impacts the output of `git branch -v`, and `git branch`, `git
- tag` and `git for-each-ref` when used with a `--format` argument
- containing the atoms `%(contents:subject)` or `%(contents:body)`.
+ This impacts the output `git branch`, `git tag` and `git for-each-ref`
+ when used with a `--format` argument containing the atoms
+ `%(contents:subject)` or `%(contents:body)`, as well as the output of
+ `git branch --verbose`, which uses `%(contents:subject)` internally.
- Fix this bug in ref-filter by improving the logic in `copy_subject` and
- `find_subpos`.
+ The function find_subpos in ref-filter.c looks for two consecutive '\n'
+ to find the end of the subject line, a sequence which is absent in
+ messages using CRLF. This results in the whole message being parsed as
+ the subject line (`%(contents:subject)`), and the body of the message
+ (`%(contents:body)`) being empty.
+
+ Moreover, in copy_subject, '\n' is replaced by space, but '\r' is
+ untouched, resulting in the escape sequence '^M' being output verbatim
+ in most terminal emulators:
+
+ $ git branch --verbose
+ * crlf 2113b0e Subject first line^M ^M Body first line^M Body second line
+
+ This bug is a regression for `git branch --verbose`, which
+ bisects down to 949af0684c (branch: use ref-filter printing APIs,
+ 2017-01-10).
+
+ Fix this bug in ref-filter by hardening the logic in `copy_subject` and
+ `find_subpos` to correctly parse messages containing CRFL.
Add tests for `branch`, `tag` and `for-each-ref` using
- lib-crlf-messages.sh. The 'make commits' test at the beginning of
- t3203-branch-output.sh needs to be modified since it did not use
- `test_tick` and thus the commit hashes were not reproducible. For
- simplicity, use `test_commit` as the content and name of the files
- created in this setup test are irrelevant to the rest of the test
- script.
+ lib-crlf-messages.sh.
+
+ The 'make commits' test at the beginning of t3203-branch-output.sh needs
+ to be modified since it did not use `test_tick` and thus the commit
+ hashes were not reproducible. For simplicity, use `test_commit` as the
+ content and name of the files created in this setup test are irrelevant
+ to the rest of the test script.
+
+ `test_cleanup_crlf_refs` is used in t3203-branch-output.sh and
+ t7004-tag.sh to avoid having to modify the expected output in later
+ tests.
Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
3: 3e5b8ace7b8 = 3: c84092e457c log: add tests for messages containing CRLF to t4202
--
gitgitgadget
next prev parent reply other threads:[~2020-03-10 2:24 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-08 18:29 [PATCH 0/3] Teach ref-filter API to correctly handle CRLF in messages Philippe Blain via GitGitGadget
2020-03-08 18:29 ` [PATCH 1/3] t: add lib-crlf-messages.sh for messages containing CRLF Philippe Blain via GitGitGadget
2020-03-08 18:29 ` [PATCH 2/3] ref-filter: teach the API to correctly handle CRLF Philippe Blain via GitGitGadget
2020-03-08 18:29 ` [PATCH 3/3] log: add tests for messages containing CRLF to t4202 Philippe Blain via GitGitGadget
2020-03-09 15:14 ` [PATCH 0/3] Teach ref-filter API to correctly handle CRLF in messages Junio C Hamano
2020-03-10 2:19 ` Philippe Blain
2020-03-10 2:24 ` Philippe Blain via GitGitGadget [this message]
2020-03-10 2:24 ` [PATCH v2 1/3] t: add lib-crlf-messages.sh for messages containing CRLF Philippe Blain via GitGitGadget
2020-03-10 2:24 ` [PATCH v2 2/3] ref-filter: fix the API to correctly handle CRLF Philippe Blain via GitGitGadget
2020-03-10 17:50 ` Junio C Hamano
2020-03-10 2:24 ` [PATCH v2 3/3] log: add tests for messages containing CRLF to t4202 Philippe Blain via GitGitGadget
2020-03-10 3:31 ` [PATCH v2 0/3] Teach ref-filter API to correctly handle CRLF in messages Junio C Hamano
2020-03-10 17:24 ` Junio C Hamano
2020-10-12 18:09 ` [PATCH v3 0/3] ref-filter: handle CRLF at end-of-line more gracefully Philippe Blain via GitGitGadget
2020-10-12 18:09 ` [PATCH v3 1/3] t: add lib-crlf-messages.sh for messages containing CRLF Philippe Blain via GitGitGadget
2020-10-12 22:22 ` Junio C Hamano
2020-10-14 13:22 ` Philippe Blain
2020-10-12 22:47 ` Eric Sunshine
2020-10-14 13:20 ` Philippe Blain
2020-10-14 13:45 ` Eric Sunshine
2020-10-14 13:52 ` Philippe Blain
2020-10-14 23:01 ` Eric Sunshine
2020-10-22 3:09 ` Philippe Blain
2020-10-12 18:09 ` [PATCH v3 2/3] ref-filter: handle CRLF at end-of-line more gracefully Philippe Blain via GitGitGadget
2020-10-12 22:24 ` Junio C Hamano
2020-10-14 13:09 ` Philippe Blain
2020-10-12 18:09 ` [PATCH v3 3/3] log, show: add tests for messages containing CRLF Philippe Blain via GitGitGadget
2020-10-22 3:01 ` [PATCH v4 0/2] ref-filter: handle CRLF at end-of-line more gracefully Philippe Blain via GitGitGadget
2020-10-22 3:01 ` [PATCH v4 1/2] " Philippe Blain via GitGitGadget
2020-10-23 0:52 ` Junio C Hamano
2020-10-23 1:46 ` Philippe Blain
2020-10-28 20:24 ` Junio C Hamano
2020-10-29 1:29 ` Philippe Blain
2020-10-22 3:01 ` [PATCH v4 2/2] log, show: add tests for messages containing CRLF Philippe Blain via GitGitGadget
2020-10-22 19:24 ` Philippe Blain
2020-10-29 12:48 ` [PATCH v5 0/2] ref-filter: handle CRLF at end-of-line more gracefully Philippe Blain via GitGitGadget
2020-10-29 12:48 ` [PATCH v5 1/2] " Philippe Blain via GitGitGadget
2020-10-29 12:48 ` [PATCH v5 2/2] log, show: add tests for messages containing CRLF Philippe Blain via GitGitGadget
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.576.v2.git.1583807093.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=alexhenrie24@gmail.com \
--cc=git@grubix.eu \
--cc=git@matthieu-moy.fr \
--cc=git@vger.kernel.org \
--cc=john@keeping.me.uk \
--cc=karthik.188@gmail.com \
--cc=levraiphilippeblain@gmail.com \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.