Skip to content

Commit

Permalink
commit: accept "scissors" with CR/LF line endings
Browse files Browse the repository at this point in the history
This change enhances `git commit --cleanup=scissors` by detecting
scissors lines ending in either LF (UNIX-style) or CR/LF (DOS-style).

Regression tests are included to specifically test for trailing
comments after a CR/LF-terminated scissors line.

Signed-off-by: Luke Bonanomi <lbonanomi@gmail.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
  • Loading branch information
lbonanomi authored and dscho committed Sep 18, 2024
1 parent f8b122e commit 2dbe355
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 3 deletions.
42 changes: 42 additions & 0 deletions t/t7502-commit-porcelain.sh
Original file line number Diff line number Diff line change
Expand Up @@ -623,6 +623,48 @@ test_expect_success 'cleanup commit messages (scissors option,-F,-e, scissors on
test_must_be_empty actual
'

test_expect_success 'helper-editor' '
write_script lf-to-crlf.sh <<-\EOF
sed "s/\$/Q/" <"$1" | tr Q "\\015" >"$1".new &&
mv -f "$1".new "$1"
EOF
'

test_expect_success 'cleanup commit messages (scissors option,-F,-e, CR/LF line endings)' '
test_config core.editor "\"$PWD/lf-to-crlf.sh\"" &&
scissors="# ------------------------ >8 ------------------------" &&
test_write_lines >text \
"# Keep this comment" "" " $scissors" \
"# Keep this comment, too" "$scissors" \
"# Remove this comment" "$scissors" \
"Remove this comment, too" &&
test_write_lines >expect \
"# Keep this comment" "" " $scissors" \
"# Keep this comment, too" &&
git commit --cleanup=scissors -e -F text --allow-empty &&
git cat-file -p HEAD >raw &&
sed -e "1,/^\$/d" raw >actual &&
test_cmp expect actual
'

test_expect_success 'cleanup commit messages (scissors option,-F,-e, scissors on first line, CR/LF line endings)' '
scissors="# ------------------------ >8 ------------------------" &&
test_write_lines >text \
"$scissors" \
"# Remove this comment and any following lines" &&
cp text /tmp/test2-text &&
git commit --cleanup=scissors -e -F text --allow-empty --allow-empty-message &&
git cat-file -p HEAD >raw &&
sed -e "1,/^\$/d" raw >actual &&
test_must_be_empty actual
'

test_expect_success 'cleanup commit messages (strip option,-F)' '
echo >>negative &&
Expand Down
13 changes: 10 additions & 3 deletions wt-status.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
#define UF_DELAY_WARNING_IN_MS (2 * 1000)

static const char cut_line[] =
"------------------------ >8 ------------------------\n";
"------------------------ >8 ------------------------";

static char default_wt_status_colors[][COLOR_MAXLEN] = {
GIT_COLOR_NORMAL, /* WT_STATUS_HEADER */
Expand Down Expand Up @@ -1090,15 +1090,22 @@ static void wt_longstatus_print_other(struct wt_status *s,
status_printf_ln(s, GIT_COLOR_NORMAL, "%s", "");
}

static inline int starts_with_newline(const char *p)
{
return *p == '\n' || (*p == '\r' && p[1] == '\n');
}

size_t wt_status_locate_end(const char *s, size_t len)
{
const char *p;
struct strbuf pattern = STRBUF_INIT;

strbuf_addf(&pattern, "\n%s %s", comment_line_str, cut_line);
if (starts_with(s, pattern.buf + 1))
if (starts_with(s, pattern.buf + 1) &&
starts_with_newline(s + pattern.len - 1))
len = 0;
else if ((p = strstr(s, pattern.buf))) {
else if ((p = strstr(s, pattern.buf)) &&
starts_with_newline(p + pattern.len)) {
size_t newlen = p - s + 1;
if (newlen < len)
len = newlen;
Expand Down

0 comments on commit 2dbe355

Please sign in to comment.