@@ -1097,14 +1097,18 @@ static const char *copy_email(const char *buf, struct used_atom *atom)
static char *copy_subject(const char *buf, unsigned long len)
{
- char *r = xmemdupz(buf, len);
- int i;
+ struct strbuf sb = STRBUF_INIT;
- for (i = 0; i < len; i++)
- if (r[i] == '\n')
- r[i] = ' ';
+ for (int i = 0; i < len; i++) {
+ if (buf[i] == '\r' && i + 1 < len && buf[i + 1] == '\n')
+ continue; /* ignore CR in CRLF */
- return r;
+ if (buf[i] == '\n')
+ strbuf_addch(&sb, ' ');
+ else
+ strbuf_addch(&sb, buf[i]);
+ }
+ return strbuf_detach(&sb, NULL);
}
static void grab_date(const char *buf, struct atom_value *v, const char *atomname)
@@ -1228,20 +1232,22 @@ static void find_subpos(const char *buf,
/* subject is first non-empty line */
*sub = buf;
- /* subject goes to first empty line */
- while (buf < *sig && *buf && *buf != '\n') {
- eol = strchrnul(buf, '\n');
- if (*eol)
- eol++;
- buf = eol;
- }
+ /* subject goes to first empty line before signature begins */
+ if ((eol = strstr(*sub, "\n\n"))) {
+ eol = eol < *sig ? eol : *sig;
+ /* check if message uses CRLF */
+ } else if (! (eol = strstr(*sub, "\r\n\r\n"))) {
+ /* treat whole message as subject */
+ eol = strrchr(*sub, '\0');
+ }
+ buf = eol;
*sublen = buf - *sub;
/* drop trailing newline, if present */
- if (*sublen && (*sub)[*sublen - 1] == '\n')
+ while (*sublen && ((*sub)[*sublen - 1] == '\n' || (*sub)[*sublen - 1] == '\r'))
*sublen -= 1;
/* skip any empty lines */
- while (*buf == '\n')
+ while (*buf == '\n' || *buf == '\r')
buf++;
*body = buf;
*bodylen = strlen(buf);
@@ -3,13 +3,11 @@
test_description='git branch display tests'
. ./test-lib.sh
. "$TEST_DIRECTORY"/lib-terminal.sh
+. "$TEST_DIRECTORY"/lib-crlf-messages.sh
test_expect_success 'make commits' '
- echo content >file &&
- git add file &&
- git commit -m one &&
- echo content >>file &&
- git commit -a -m two
+ test_commit one &&
+ test_commit two
'
test_expect_success 'make branches' '
@@ -95,6 +93,29 @@ test_expect_success 'git branch --ignore-case --list -v pattern shows branch sum
awk "{print \$NF}" <tmp >actual &&
test_cmp expect actual
'
+test_create_crlf_refs
+
+test_expect_success 'git branch -v works with CRLF input' '
+ cat >expect <<-EOF &&
+ two
+ one
+ Subject first line
+ Subject first line
+ Subject first line Subject second line
+ Subject first line Subject second line
+ Subject first line Subject second line
+ Subject first line Subject second line
+ EOF
+ git branch -v >tmp &&
+ # Remove first two columns, and the line for the currently checked out branch
+ current=$(git branch --show-current) &&
+ grep -v $current <tmp | awk "{\$1=\$2=\"\"}1" >actual &&
+ test_cmp expect actual
+'
+
+test_crlf_subject_body_and_contents branch --list crlf*
+
+test_cleanup_crlf_refs
test_expect_success 'git branch -v pattern does not show branch summaries' '
test_must_fail git branch -v branch*
@@ -8,6 +8,7 @@ test_description='for-each-ref test'
. ./test-lib.sh
. "$TEST_DIRECTORY"/lib-gpg.sh
. "$TEST_DIRECTORY"/lib-terminal.sh
+. "$TEST_DIRECTORY"/lib-crlf-messages.sh
# Mon Jul 3 23:18:43 2006 +0000
datestamp=1151968723
@@ -1030,4 +1031,8 @@ test_expect_success 'for-each-ref --ignore-case works on multiple sort keys' '
test_cmp expect actual
'
+test_create_crlf_refs
+
+test_crlf_subject_body_and_contents for-each-ref refs/heads/crlf*
+
test_done
@@ -10,6 +10,7 @@ Tests for operations with tags.'
. ./test-lib.sh
. "$TEST_DIRECTORY"/lib-gpg.sh
. "$TEST_DIRECTORY"/lib-terminal.sh
+. "$TEST_DIRECTORY"/lib-crlf-messages.sh
# creating and listing lightweight tags:
@@ -1970,6 +1971,12 @@ test_expect_success '--format should list tags as per format given' '
test_cmp expect actual
'
+test_create_crlf_refs
+
+test_crlf_subject_body_and_contents tag --list tag-crlf*
+
+test_cleanup_crlf_refs
+
test_expect_success "set up color tests" '
echo "<RED>v1.0<RESET>" >expect.color &&
echo "v1.0" >expect.bare &&