convert.c: restructure the attribute checking part.

This separates the checkattr() call and interpretation of the
returned value specific to the 'crlf' attribute into separate
routines, so that we can run a single call to checkattr() to
check for more than one attributes, and then interprete what
the returned settings mean separately.

Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Junio C Hamano 2007-04-20 23:44:02 -07:00
parent e87b1c943a
commit 6073ee8571

View File

@ -200,7 +200,7 @@ static char *crlf_to_worktree(const char *path, const char *src, unsigned long *
return buffer; return buffer;
} }
static void setup_crlf_check(struct git_attr_check *check) static void setup_convert_check(struct git_attr_check *check)
{ {
static struct git_attr *attr_crlf; static struct git_attr *attr_crlf;
@ -209,33 +209,41 @@ static void setup_crlf_check(struct git_attr_check *check)
check->attr = attr_crlf; check->attr = attr_crlf;
} }
static int git_path_check_crlf(const char *path) static int git_path_check_crlf(const char *path, struct git_attr_check *check)
{ {
struct git_attr_check attr_crlf_check; const char *value = check->value;
setup_crlf_check(&attr_crlf_check); if (ATTR_TRUE(value))
return CRLF_TEXT;
if (!git_checkattr(path, 1, &attr_crlf_check)) { else if (ATTR_FALSE(value))
const char *value = attr_crlf_check.value; return CRLF_BINARY;
if (ATTR_TRUE(value)) else if (ATTR_UNSET(value))
return CRLF_TEXT; ;
else if (ATTR_FALSE(value)) else if (!strcmp(value, "input"))
return CRLF_BINARY; return CRLF_INPUT;
else if (ATTR_UNSET(value))
;
else if (!strcmp(value, "input"))
return CRLF_INPUT;
/* fallthru */
}
return CRLF_GUESS; return CRLF_GUESS;
} }
char *convert_to_git(const char *path, const char *src, unsigned long *sizep) char *convert_to_git(const char *path, const char *src, unsigned long *sizep)
{ {
return crlf_to_git(path, src, sizep, git_path_check_crlf(path)); struct git_attr_check check[1];
int crlf = CRLF_GUESS;
setup_convert_check(check);
if (!git_checkattr(path, 1, check)) {
crlf = git_path_check_crlf(path, check);
}
return crlf_to_git(path, src, sizep, crlf);
} }
char *convert_to_working_tree(const char *path, const char *src, unsigned long *sizep) char *convert_to_working_tree(const char *path, const char *src, unsigned long *sizep)
{ {
return crlf_to_worktree(path, src, sizep, git_path_check_crlf(path)); struct git_attr_check check[1];
int crlf = CRLF_GUESS;
setup_convert_check(check);
if (!git_checkattr(path, 1, check)) {
crlf = git_path_check_crlf(path, check);
}
return crlf_to_worktree(path, src, sizep, crlf);
} }