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>
This commit is contained in:
Torsten Bögershausen 2016-04-25 18:56:32 +02:00 committed by Junio C Hamano
parent 67e9bff06a
commit caa47adc5a
2 changed files with 8 additions and 13 deletions

View File

@ -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 stream_filter *get_stream_filter(const char *path, const unsigned char *sha1)
{ {
struct conv_attrs ca; struct conv_attrs ca;
enum crlf_action crlf_action;
struct stream_filter *filter = NULL; struct stream_filter *filter = NULL;
convert_attrs(&ca, path); convert_attrs(&ca, path);
if (ca.drv && (ca.drv->smudge || ca.drv->clean)) 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) if (ca.ident)
filter = ident_filter(sha1); filter = ident_filter(sha1);
crlf_action = ca.crlf_action; if (output_eol(ca.crlf_action) == EOL_CRLF)
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))
filter = cascade_filter(filter, lf_to_crlf_filter()); filter = cascade_filter(filter, lf_to_crlf_filter());
else
filter = cascade_filter(filter, &null_filter_singleton);
return filter; return filter;
} }

View File

@ -493,7 +493,7 @@ fi
export CRLF_MIX_LF_CR MIX NL export CRLF_MIX_LF_CR MIX NL
# Same handling with and without ident # Same handling with and without ident
for id in "" for id in "" ident
do do
for ceol in lf crlf native for ceol in lf crlf native
do do