Browse Source

convert.c: ident + core.autocrlf didn't work

When the ident attributes is set, get_stream_filter() did not obey
core.autocrlf=true, and the file was checked out with LF.

Change the rule when a streaming filter can be used:
- if an external filter is specified, don't use a stream filter.
- if the worktree eol is CRLF and "auto" is active, don't use a stream filter.
- Otherwise the stream filter can be used.

Add test cases in t0027.

Signed-off-by: Torsten Bögershausen <tboegi@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Torsten Bögershausen 9 years ago committed by Junio C Hamano
parent
commit
caa47adc5a
  1. 19
      convert.c
  2. 2
      t/t0027-auto-crlf.sh

19
convert.c

@ -1380,27 +1380,22 @@ static struct stream_filter *ident_filter(const unsigned char *sha1) @@ -1380,27 +1380,22 @@ static struct stream_filter *ident_filter(const unsigned char *sha1)
struct stream_filter *get_stream_filter(const char *path, const unsigned char *sha1)
{
struct conv_attrs ca;
enum crlf_action crlf_action;
struct stream_filter *filter = NULL;

convert_attrs(&ca, path);

if (ca.drv && (ca.drv->smudge || ca.drv->clean))
return filter;
return NULL;

if (ca.crlf_action == CRLF_AUTO || ca.crlf_action == CRLF_AUTO_CRLF)
return NULL;

if (ca.ident)
filter = ident_filter(sha1);

crlf_action = ca.crlf_action;

if ((crlf_action == CRLF_BINARY) ||
crlf_action == CRLF_AUTO_INPUT ||
(crlf_action == CRLF_TEXT_INPUT))
filter = cascade_filter(filter, &null_filter_singleton);

else if (output_eol(crlf_action) == EOL_CRLF &&
!(crlf_action == CRLF_AUTO || crlf_action == CRLF_AUTO_CRLF))
if (output_eol(ca.crlf_action) == EOL_CRLF)
filter = cascade_filter(filter, lf_to_crlf_filter());
else
filter = cascade_filter(filter, &null_filter_singleton);

return filter;
}

2
t/t0027-auto-crlf.sh

@ -493,7 +493,7 @@ fi @@ -493,7 +493,7 @@ fi
export CRLF_MIX_LF_CR MIX NL

# Same handling with and without ident
for id in ""
for id in "" ident
do
for ceol in lf crlf native
do

Loading…
Cancel
Save