зеркало из https://github.com/microsoft/git.git
convert.c: simplify text_stat
Simplify the statistics: lonecr counts the CR which is not followed by a LF, lonelf counts the LF which is not preceded by a CR, crlf counts CRLF combinations. This simplifies the evaluation of the statistics. Signed-off-by: Torsten Bögershausen <tboegi@web.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
df747b818f
Коммит
6e336a530b
47
convert.c
47
convert.c
|
@ -31,7 +31,7 @@ enum crlf_action {
|
||||||
|
|
||||||
struct text_stat {
|
struct text_stat {
|
||||||
/* NUL, CR, LF and CRLF counts */
|
/* NUL, CR, LF and CRLF counts */
|
||||||
unsigned nul, cr, lf, crlf;
|
unsigned nul, lonecr, lonelf, crlf;
|
||||||
|
|
||||||
/* These are just approximations! */
|
/* These are just approximations! */
|
||||||
unsigned printable, nonprintable;
|
unsigned printable, nonprintable;
|
||||||
|
@ -46,13 +46,15 @@ static void gather_stats(const char *buf, unsigned long size, struct text_stat *
|
||||||
for (i = 0; i < size; i++) {
|
for (i = 0; i < size; i++) {
|
||||||
unsigned char c = buf[i];
|
unsigned char c = buf[i];
|
||||||
if (c == '\r') {
|
if (c == '\r') {
|
||||||
stats->cr++;
|
if (i+1 < size && buf[i+1] == '\n') {
|
||||||
if (i+1 < size && buf[i+1] == '\n')
|
|
||||||
stats->crlf++;
|
stats->crlf++;
|
||||||
|
i++;
|
||||||
|
} else
|
||||||
|
stats->lonecr++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (c == '\n') {
|
if (c == '\n') {
|
||||||
stats->lf++;
|
stats->lonelf++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (c == 127)
|
if (c == 127)
|
||||||
|
@ -86,7 +88,7 @@ static void gather_stats(const char *buf, unsigned long size, struct text_stat *
|
||||||
*/
|
*/
|
||||||
static int convert_is_binary(unsigned long size, const struct text_stat *stats)
|
static int convert_is_binary(unsigned long size, const struct text_stat *stats)
|
||||||
{
|
{
|
||||||
if (stats->cr != stats->crlf)
|
if (stats->lonecr)
|
||||||
return 1;
|
return 1;
|
||||||
if (stats->nul)
|
if (stats->nul)
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -98,19 +100,18 @@ static int convert_is_binary(unsigned long size, const struct text_stat *stats)
|
||||||
static unsigned int gather_convert_stats(const char *data, unsigned long size)
|
static unsigned int gather_convert_stats(const char *data, unsigned long size)
|
||||||
{
|
{
|
||||||
struct text_stat stats;
|
struct text_stat stats;
|
||||||
|
int ret = 0;
|
||||||
if (!data || !size)
|
if (!data || !size)
|
||||||
return 0;
|
return 0;
|
||||||
gather_stats(data, size, &stats);
|
gather_stats(data, size, &stats);
|
||||||
if (convert_is_binary(size, &stats))
|
if (convert_is_binary(size, &stats))
|
||||||
return CONVERT_STAT_BITS_BIN;
|
ret |= CONVERT_STAT_BITS_BIN;
|
||||||
else if (stats.crlf && stats.crlf == stats.lf)
|
if (stats.crlf)
|
||||||
return CONVERT_STAT_BITS_TXT_CRLF;
|
ret |= CONVERT_STAT_BITS_TXT_CRLF;
|
||||||
else if (stats.crlf && stats.lf)
|
if (stats.lonelf)
|
||||||
return CONVERT_STAT_BITS_TXT_CRLF | CONVERT_STAT_BITS_TXT_LF;
|
ret |= CONVERT_STAT_BITS_TXT_LF;
|
||||||
else if (stats.lf)
|
|
||||||
return CONVERT_STAT_BITS_TXT_LF;
|
return ret;
|
||||||
else
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *gather_convert_stats_ascii(const char *data, unsigned long size)
|
static const char *gather_convert_stats_ascii(const char *data, unsigned long size)
|
||||||
|
@ -207,7 +208,7 @@ static void check_safe_crlf(const char *path, enum crlf_action crlf_action,
|
||||||
* CRLFs would be added by checkout:
|
* CRLFs would be added by checkout:
|
||||||
* check if we have "naked" LFs
|
* check if we have "naked" LFs
|
||||||
*/
|
*/
|
||||||
if (stats->lf != stats->crlf) {
|
if (stats->lonelf) {
|
||||||
if (checksafe == SAFE_CRLF_WARN)
|
if (checksafe == SAFE_CRLF_WARN)
|
||||||
warning("LF will be replaced by CRLF in %s.\nThe file will have its original line endings in your working directory.", path);
|
warning("LF will be replaced by CRLF in %s.\nThe file will have its original line endings in your working directory.", path);
|
||||||
else /* i.e. SAFE_CRLF_FAIL */
|
else /* i.e. SAFE_CRLF_FAIL */
|
||||||
|
@ -266,8 +267,8 @@ static int crlf_to_git(const char *path, const char *src, size_t len,
|
||||||
|
|
||||||
check_safe_crlf(path, crlf_action, &stats, checksafe);
|
check_safe_crlf(path, crlf_action, &stats, checksafe);
|
||||||
|
|
||||||
/* Optimization: No CR? Nothing to convert, regardless. */
|
/* Optimization: No CRLF? Nothing to convert, regardless. */
|
||||||
if (!stats.cr)
|
if (!stats.crlf)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -314,19 +315,15 @@ static int crlf_to_worktree(const char *path, const char *src, size_t len,
|
||||||
|
|
||||||
gather_stats(src, len, &stats);
|
gather_stats(src, len, &stats);
|
||||||
|
|
||||||
/* No LF? Nothing to convert, regardless. */
|
/* No "naked" LF? Nothing to convert, regardless. */
|
||||||
if (!stats.lf)
|
if (!stats.lonelf)
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* Was it already in CRLF format? */
|
|
||||||
if (stats.lf == stats.crlf)
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (crlf_action == CRLF_AUTO || crlf_action == CRLF_AUTO_INPUT || crlf_action == CRLF_AUTO_CRLF) {
|
if (crlf_action == CRLF_AUTO || crlf_action == CRLF_AUTO_INPUT || crlf_action == CRLF_AUTO_CRLF) {
|
||||||
if (crlf_action == CRLF_AUTO_INPUT || crlf_action == CRLF_AUTO_CRLF) {
|
if (crlf_action == CRLF_AUTO_INPUT || crlf_action == CRLF_AUTO_CRLF) {
|
||||||
/* If we have any CR or CRLF line endings, we do not touch it */
|
/* If we have any CR or CRLF line endings, we do not touch it */
|
||||||
/* This is the new safer autocrlf-handling */
|
/* This is the new safer autocrlf-handling */
|
||||||
if (stats.cr > 0 || stats.crlf > 0)
|
if (stats.lonecr || stats.crlf )
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -338,7 +335,7 @@ static int crlf_to_worktree(const char *path, const char *src, size_t len,
|
||||||
if (src == buf->buf)
|
if (src == buf->buf)
|
||||||
to_free = strbuf_detach(buf, NULL);
|
to_free = strbuf_detach(buf, NULL);
|
||||||
|
|
||||||
strbuf_grow(buf, len + stats.lf - stats.crlf);
|
strbuf_grow(buf, len + stats.lonelf);
|
||||||
for (;;) {
|
for (;;) {
|
||||||
const char *nl = memchr(src, '\n', len);
|
const char *nl = memchr(src, '\n', len);
|
||||||
if (!nl)
|
if (!nl)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче