зеркало из https://github.com/microsoft/git.git
Simplify calling of CR/LF conversion routines
Signed-off-by: Alex Riesen <raa.lkml@gmail.com> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Родитель
88e7fdf2cb
Коммит
ac78e54804
|
@ -1475,8 +1475,8 @@ static int read_old_data(struct stat *st, const char *path, char **buf_p, unsign
|
||||||
}
|
}
|
||||||
close(fd);
|
close(fd);
|
||||||
nsize = got;
|
nsize = got;
|
||||||
nbuf = buf;
|
nbuf = convert_to_git(path, buf, &nsize);
|
||||||
if (convert_to_git(path, &nbuf, &nsize)) {
|
if (nbuf) {
|
||||||
free(buf);
|
free(buf);
|
||||||
*buf_p = nbuf;
|
*buf_p = nbuf;
|
||||||
*alloc_p = nsize;
|
*alloc_p = nsize;
|
||||||
|
@ -2355,9 +2355,8 @@ static void add_index_file(const char *path, unsigned mode, void *buf, unsigned
|
||||||
|
|
||||||
static int try_create_file(const char *path, unsigned int mode, const char *buf, unsigned long size)
|
static int try_create_file(const char *path, unsigned int mode, const char *buf, unsigned long size)
|
||||||
{
|
{
|
||||||
int fd, converted;
|
int fd;
|
||||||
char *nbuf;
|
char *nbuf;
|
||||||
unsigned long nsize;
|
|
||||||
|
|
||||||
if (has_symlinks && S_ISLNK(mode))
|
if (has_symlinks && S_ISLNK(mode))
|
||||||
/* Although buf:size is counted string, it also is NUL
|
/* Although buf:size is counted string, it also is NUL
|
||||||
|
@ -2369,13 +2368,10 @@ static int try_create_file(const char *path, unsigned int mode, const char *buf,
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
nsize = size;
|
nbuf = convert_to_working_tree(path, buf, &size);
|
||||||
nbuf = (char *) buf;
|
if (nbuf)
|
||||||
converted = convert_to_working_tree(path, &nbuf, &nsize);
|
|
||||||
if (converted) {
|
|
||||||
buf = nbuf;
|
buf = nbuf;
|
||||||
size = nsize;
|
|
||||||
}
|
|
||||||
while (size) {
|
while (size) {
|
||||||
int written = xwrite(fd, buf, size);
|
int written = xwrite(fd, buf, size);
|
||||||
if (written < 0)
|
if (written < 0)
|
||||||
|
@ -2387,7 +2383,7 @@ static int try_create_file(const char *path, unsigned int mode, const char *buf,
|
||||||
}
|
}
|
||||||
if (close(fd) < 0)
|
if (close(fd) < 0)
|
||||||
die("closing file %s: %s", path, strerror(errno));
|
die("closing file %s: %s", path, strerror(errno));
|
||||||
if (converted)
|
if (nbuf)
|
||||||
free(nbuf);
|
free(nbuf);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
4
cache.h
4
cache.h
|
@ -496,8 +496,8 @@ extern void trace_printf(const char *format, ...);
|
||||||
extern void trace_argv_printf(const char **argv, int count, const char *format, ...);
|
extern void trace_argv_printf(const char **argv, int count, const char *format, ...);
|
||||||
|
|
||||||
/* convert.c */
|
/* convert.c */
|
||||||
extern int convert_to_git(const char *path, char **bufp, unsigned long *sizep);
|
extern char *convert_to_git(const char *path, const char *src, unsigned long *sizep);
|
||||||
extern int convert_to_working_tree(const char *path, char **bufp, unsigned long *sizep);
|
extern char *convert_to_working_tree(const char *path, const char *src, unsigned long *sizep);
|
||||||
|
|
||||||
/* match-trees.c */
|
/* match-trees.c */
|
||||||
void shift_tree(const unsigned char *, const unsigned char *, unsigned char *, int);
|
void shift_tree(const unsigned char *, const unsigned char *, unsigned char *, int);
|
||||||
|
|
71
convert.c
71
convert.c
|
@ -79,25 +79,24 @@ static int is_binary(unsigned long size, struct text_stat *stats)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int crlf_to_git(const char *path, char **bufp, unsigned long *sizep, int action)
|
static char *crlf_to_git(const char *path, const char *src, unsigned long *sizep, int action)
|
||||||
{
|
{
|
||||||
char *buffer, *nbuf;
|
char *buffer, *dst;
|
||||||
unsigned long size, nsize;
|
unsigned long size, nsize;
|
||||||
struct text_stat stats;
|
struct text_stat stats;
|
||||||
|
|
||||||
if ((action == CRLF_BINARY) || (action == CRLF_GUESS && !auto_crlf))
|
if ((action == CRLF_BINARY) || (action == CRLF_GUESS && !auto_crlf))
|
||||||
return 0;
|
return NULL;
|
||||||
|
|
||||||
size = *sizep;
|
size = *sizep;
|
||||||
if (!size)
|
if (!size)
|
||||||
return 0;
|
return NULL;
|
||||||
buffer = *bufp;
|
|
||||||
|
|
||||||
gather_stats(buffer, size, &stats);
|
gather_stats(src, size, &stats);
|
||||||
|
|
||||||
/* No CR? Nothing to convert, regardless. */
|
/* No CR? Nothing to convert, regardless. */
|
||||||
if (!stats.cr)
|
if (!stats.cr)
|
||||||
return 0;
|
return NULL;
|
||||||
|
|
||||||
if (action == CRLF_GUESS) {
|
if (action == CRLF_GUESS) {
|
||||||
/*
|
/*
|
||||||
|
@ -106,13 +105,13 @@ static int crlf_to_git(const char *path, char **bufp, unsigned long *sizep, int
|
||||||
* stuff?
|
* stuff?
|
||||||
*/
|
*/
|
||||||
if (stats.cr != stats.crlf)
|
if (stats.cr != stats.crlf)
|
||||||
return 0;
|
return NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* And add some heuristics for binary vs text, of course...
|
* And add some heuristics for binary vs text, of course...
|
||||||
*/
|
*/
|
||||||
if (is_binary(size, &stats))
|
if (is_binary(size, &stats))
|
||||||
return 0;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -120,10 +119,10 @@ static int crlf_to_git(const char *path, char **bufp, unsigned long *sizep, int
|
||||||
* to let the caller know that we switched buffers on it.
|
* to let the caller know that we switched buffers on it.
|
||||||
*/
|
*/
|
||||||
nsize = size - stats.crlf;
|
nsize = size - stats.crlf;
|
||||||
nbuf = xmalloc(nsize);
|
buffer = xmalloc(nsize);
|
||||||
*bufp = nbuf;
|
|
||||||
*sizep = nsize;
|
*sizep = nsize;
|
||||||
|
|
||||||
|
dst = buffer;
|
||||||
if (action == CRLF_GUESS) {
|
if (action == CRLF_GUESS) {
|
||||||
/*
|
/*
|
||||||
* If we guessed, we already know we rejected a file with
|
* If we guessed, we already know we rejected a file with
|
||||||
|
@ -131,54 +130,53 @@ static int crlf_to_git(const char *path, char **bufp, unsigned long *sizep, int
|
||||||
* follow it.
|
* follow it.
|
||||||
*/
|
*/
|
||||||
do {
|
do {
|
||||||
unsigned char c = *buffer++;
|
unsigned char c = *src++;
|
||||||
if (c != '\r')
|
if (c != '\r')
|
||||||
*nbuf++ = c;
|
*dst++ = c;
|
||||||
} while (--size);
|
} while (--size);
|
||||||
} else {
|
} else {
|
||||||
do {
|
do {
|
||||||
unsigned char c = *buffer++;
|
unsigned char c = *src++;
|
||||||
if (! (c == '\r' && (1 < size && *buffer == '\n')))
|
if (! (c == '\r' && (1 < size && *buffer == '\n')))
|
||||||
*nbuf++ = c;
|
*dst++ = c;
|
||||||
} while (--size);
|
} while (--size);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int crlf_to_worktree(const char *path, char **bufp, unsigned long *sizep, int action)
|
static char *crlf_to_worktree(const char *path, const char *src, unsigned long *sizep, int action)
|
||||||
{
|
{
|
||||||
char *buffer, *nbuf;
|
char *buffer, *dst;
|
||||||
unsigned long size, nsize;
|
unsigned long size, nsize;
|
||||||
struct text_stat stats;
|
struct text_stat stats;
|
||||||
unsigned char last;
|
unsigned char last;
|
||||||
|
|
||||||
if ((action == CRLF_BINARY) || (action == CRLF_INPUT) ||
|
if ((action == CRLF_BINARY) || (action == CRLF_INPUT) ||
|
||||||
(action == CRLF_GUESS && auto_crlf <= 0))
|
(action == CRLF_GUESS && auto_crlf <= 0))
|
||||||
return 0;
|
return NULL;
|
||||||
|
|
||||||
size = *sizep;
|
size = *sizep;
|
||||||
if (!size)
|
if (!size)
|
||||||
return 0;
|
return NULL;
|
||||||
buffer = *bufp;
|
|
||||||
|
|
||||||
gather_stats(buffer, size, &stats);
|
gather_stats(src, size, &stats);
|
||||||
|
|
||||||
/* No LF? Nothing to convert, regardless. */
|
/* No LF? Nothing to convert, regardless. */
|
||||||
if (!stats.lf)
|
if (!stats.lf)
|
||||||
return 0;
|
return NULL;
|
||||||
|
|
||||||
/* Was it already in CRLF format? */
|
/* Was it already in CRLF format? */
|
||||||
if (stats.lf == stats.crlf)
|
if (stats.lf == stats.crlf)
|
||||||
return 0;
|
return NULL;
|
||||||
|
|
||||||
if (action == CRLF_GUESS) {
|
if (action == CRLF_GUESS) {
|
||||||
/* If we have any bare CR characters, we're not going to touch it */
|
/* If we have any bare CR characters, we're not going to touch it */
|
||||||
if (stats.cr != stats.crlf)
|
if (stats.cr != stats.crlf)
|
||||||
return 0;
|
return NULL;
|
||||||
|
|
||||||
if (is_binary(size, &stats))
|
if (is_binary(size, &stats))
|
||||||
return 0;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -186,19 +184,20 @@ static int crlf_to_worktree(const char *path, char **bufp, unsigned long *sizep,
|
||||||
* to let the caller know that we switched buffers on it.
|
* to let the caller know that we switched buffers on it.
|
||||||
*/
|
*/
|
||||||
nsize = size + stats.lf - stats.crlf;
|
nsize = size + stats.lf - stats.crlf;
|
||||||
nbuf = xmalloc(nsize);
|
buffer = xmalloc(nsize);
|
||||||
*bufp = nbuf;
|
|
||||||
*sizep = nsize;
|
*sizep = nsize;
|
||||||
last = 0;
|
last = 0;
|
||||||
|
|
||||||
|
dst = buffer;
|
||||||
do {
|
do {
|
||||||
unsigned char c = *buffer++;
|
unsigned char c = *src++;
|
||||||
if (c == '\n' && last != '\r')
|
if (c == '\n' && last != '\r')
|
||||||
*nbuf++ = '\r';
|
*dst++ = '\r';
|
||||||
*nbuf++ = c;
|
*dst++ = c;
|
||||||
last = c;
|
last = c;
|
||||||
} while (--size);
|
} while (--size);
|
||||||
|
|
||||||
return 1;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void setup_crlf_check(struct git_attr_check *check)
|
static void setup_crlf_check(struct git_attr_check *check)
|
||||||
|
@ -231,12 +230,12 @@ static int git_path_check_crlf(const char *path)
|
||||||
return CRLF_GUESS;
|
return CRLF_GUESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int convert_to_git(const char *path, char **bufp, unsigned long *sizep)
|
char *convert_to_git(const char *path, const char *src, unsigned long *sizep)
|
||||||
{
|
{
|
||||||
return crlf_to_git(path, bufp, sizep, git_path_check_crlf(path));
|
return crlf_to_git(path, src, sizep, git_path_check_crlf(path));
|
||||||
}
|
}
|
||||||
|
|
||||||
int convert_to_working_tree(const char *path, char **bufp, unsigned long *sizep)
|
char *convert_to_working_tree(const char *path, const char *src, unsigned long *sizep)
|
||||||
{
|
{
|
||||||
return crlf_to_worktree(path, bufp, sizep, git_path_check_crlf(path));
|
return crlf_to_worktree(path, src, sizep, git_path_check_crlf(path));
|
||||||
}
|
}
|
||||||
|
|
4
diff.c
4
diff.c
|
@ -1493,9 +1493,9 @@ int diff_populate_filespec(struct diff_filespec *s, int size_only)
|
||||||
/*
|
/*
|
||||||
* Convert from working tree format to canonical git format
|
* Convert from working tree format to canonical git format
|
||||||
*/
|
*/
|
||||||
buf = s->data;
|
|
||||||
size = s->size;
|
size = s->size;
|
||||||
if (convert_to_git(s->path, &buf, &size)) {
|
buf = convert_to_git(s->path, s->data, &size);
|
||||||
|
if (buf) {
|
||||||
munmap(s->data, s->size);
|
munmap(s->data, s->size);
|
||||||
s->should_munmap = 0;
|
s->should_munmap = 0;
|
||||||
s->data = buf;
|
s->data = buf;
|
||||||
|
|
7
entry.c
7
entry.c
|
@ -79,7 +79,6 @@ static int write_entry(struct cache_entry *ce, char *path, struct checkout *stat
|
||||||
}
|
}
|
||||||
switch (ntohl(ce->ce_mode) & S_IFMT) {
|
switch (ntohl(ce->ce_mode) & S_IFMT) {
|
||||||
char *buf;
|
char *buf;
|
||||||
unsigned long nsize;
|
|
||||||
|
|
||||||
case S_IFREG:
|
case S_IFREG:
|
||||||
if (to_tempfile) {
|
if (to_tempfile) {
|
||||||
|
@ -96,12 +95,10 @@ static int write_entry(struct cache_entry *ce, char *path, struct checkout *stat
|
||||||
/*
|
/*
|
||||||
* Convert from git internal format to working tree format
|
* Convert from git internal format to working tree format
|
||||||
*/
|
*/
|
||||||
buf = new;
|
buf = convert_to_working_tree(ce->name, new, &size);
|
||||||
nsize = size;
|
if (buf) {
|
||||||
if (convert_to_working_tree(ce->name, &buf, &nsize)) {
|
|
||||||
free(new);
|
free(new);
|
||||||
new = buf;
|
new = buf;
|
||||||
size = nsize;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
wrote = write_in_full(fd, new, size);
|
wrote = write_in_full(fd, new, size);
|
||||||
|
|
|
@ -2277,10 +2277,9 @@ int index_fd(unsigned char *sha1, int fd, struct stat *st, int write_object,
|
||||||
*/
|
*/
|
||||||
if ((type == OBJ_BLOB) && S_ISREG(st->st_mode)) {
|
if ((type == OBJ_BLOB) && S_ISREG(st->st_mode)) {
|
||||||
unsigned long nsize = size;
|
unsigned long nsize = size;
|
||||||
char *nbuf = buf;
|
char *nbuf = convert_to_git(path, buf, &nsize);
|
||||||
if (convert_to_git(path, &nbuf, &nsize)) {
|
if (nbuf) {
|
||||||
if (size)
|
munmap(buf, size);
|
||||||
munmap(buf, size);
|
|
||||||
size = nsize;
|
size = nsize;
|
||||||
buf = nbuf;
|
buf = nbuf;
|
||||||
re_allocated = 1;
|
re_allocated = 1;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче