зеркало из https://github.com/microsoft/git.git
convert.c: remove an implicit dependency on the_index
Make the convert API take an index_state instead of assuming the_index in convert.c. All external call sites are converted blindly to keep the patch simple and retain current behavior. Individual call sites may receive further updates to use the right index instead of the_index. Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
7a400a2c02
Коммит
7f944e264e
2
apply.c
2
apply.c
|
@ -4335,7 +4335,7 @@ static int try_create_file(const char *path, unsigned int mode, const char *buf,
|
|||
if (fd < 0)
|
||||
return 1;
|
||||
|
||||
if (convert_to_working_tree(path, buf, size, &nbuf)) {
|
||||
if (convert_to_working_tree(&the_index, path, buf, size, &nbuf)) {
|
||||
size = nbuf.len;
|
||||
buf = nbuf.buf;
|
||||
}
|
||||
|
|
|
@ -79,7 +79,7 @@ void *object_file_to_archive(const struct archiver_args *args,
|
|||
size_t size = 0;
|
||||
|
||||
strbuf_attach(&buf, buffer, *sizep, *sizep + 1);
|
||||
convert_to_working_tree(path, buf.buf, buf.len, &buf);
|
||||
convert_to_working_tree(&the_index, path, buf.buf, buf.len, &buf);
|
||||
if (commit)
|
||||
format_subst(commit, buf.buf, buf.len, &buf);
|
||||
buffer = strbuf_detach(&buf, &size);
|
||||
|
|
|
@ -39,7 +39,7 @@ static int filter_object(const char *path, unsigned mode,
|
|||
oid_to_hex(oid), path);
|
||||
if ((type == OBJ_BLOB) && S_ISREG(mode)) {
|
||||
struct strbuf strbuf = STRBUF_INIT;
|
||||
if (convert_to_working_tree(path, *buf, *size, &strbuf)) {
|
||||
if (convert_to_working_tree(&the_index, path, *buf, *size, &strbuf)) {
|
||||
free(*buf);
|
||||
*size = strbuf.len;
|
||||
*buf = strbuf_detach(&strbuf, NULL);
|
||||
|
|
|
@ -63,7 +63,7 @@ static void write_eolinfo(const struct index_state *istate,
|
|||
struct stat st;
|
||||
const char *i_txt = "";
|
||||
const char *w_txt = "";
|
||||
const char *a_txt = get_convert_attr_ascii(path);
|
||||
const char *a_txt = get_convert_attr_ascii(&the_index, path);
|
||||
if (ce && S_ISREG(ce->ce_mode))
|
||||
i_txt = get_cached_convert_stats_ascii(istate,
|
||||
ce->name);
|
||||
|
|
41
convert.c
41
convert.c
|
@ -1291,7 +1291,8 @@ struct conv_attrs {
|
|||
const char *working_tree_encoding; /* Supported encoding or default encoding if NULL */
|
||||
};
|
||||
|
||||
static void convert_attrs(struct conv_attrs *ca, const char *path)
|
||||
static void convert_attrs(const struct index_state *istate,
|
||||
struct conv_attrs *ca, const char *path)
|
||||
{
|
||||
static struct attr_check *check;
|
||||
|
||||
|
@ -1303,7 +1304,7 @@ static void convert_attrs(struct conv_attrs *ca, const char *path)
|
|||
git_config(read_convert_config, NULL);
|
||||
}
|
||||
|
||||
if (!git_check_attr(&the_index, path, check)) {
|
||||
if (!git_check_attr(istate, path, check)) {
|
||||
struct attr_check_item *ccheck = check->items;
|
||||
ca->crlf_action = git_path_check_crlf(ccheck + 4);
|
||||
if (ca->crlf_action == CRLF_UNDEFINED)
|
||||
|
@ -1340,11 +1341,11 @@ static void convert_attrs(struct conv_attrs *ca, const char *path)
|
|||
ca->crlf_action = CRLF_AUTO_INPUT;
|
||||
}
|
||||
|
||||
int would_convert_to_git_filter_fd(const char *path)
|
||||
int would_convert_to_git_filter_fd(const struct index_state *istate, const char *path)
|
||||
{
|
||||
struct conv_attrs ca;
|
||||
|
||||
convert_attrs(&ca, path);
|
||||
convert_attrs(istate, &ca, path);
|
||||
if (!ca.drv)
|
||||
return 0;
|
||||
|
||||
|
@ -1359,11 +1360,11 @@ int would_convert_to_git_filter_fd(const char *path)
|
|||
return apply_filter(path, NULL, 0, -1, NULL, ca.drv, CAP_CLEAN, NULL);
|
||||
}
|
||||
|
||||
const char *get_convert_attr_ascii(const char *path)
|
||||
const char *get_convert_attr_ascii(const struct index_state *istate, const char *path)
|
||||
{
|
||||
struct conv_attrs ca;
|
||||
|
||||
convert_attrs(&ca, path);
|
||||
convert_attrs(istate, &ca, path);
|
||||
switch (ca.attr_action) {
|
||||
case CRLF_UNDEFINED:
|
||||
return "";
|
||||
|
@ -1392,7 +1393,7 @@ int convert_to_git(const struct index_state *istate,
|
|||
int ret = 0;
|
||||
struct conv_attrs ca;
|
||||
|
||||
convert_attrs(&ca, path);
|
||||
convert_attrs(istate, &ca, path);
|
||||
|
||||
ret |= apply_filter(path, src, len, -1, dst, ca.drv, CAP_CLEAN, NULL);
|
||||
if (!ret && ca.drv && ca.drv->required)
|
||||
|
@ -1424,7 +1425,7 @@ void convert_to_git_filter_fd(const struct index_state *istate,
|
|||
int conv_flags)
|
||||
{
|
||||
struct conv_attrs ca;
|
||||
convert_attrs(&ca, path);
|
||||
convert_attrs(istate, &ca, path);
|
||||
|
||||
assert(ca.drv);
|
||||
assert(ca.drv->clean || ca.drv->process);
|
||||
|
@ -1437,14 +1438,15 @@ void convert_to_git_filter_fd(const struct index_state *istate,
|
|||
ident_to_git(path, dst->buf, dst->len, dst, ca.ident);
|
||||
}
|
||||
|
||||
static int convert_to_working_tree_internal(const char *path, const char *src,
|
||||
static int convert_to_working_tree_internal(const struct index_state *istate,
|
||||
const char *path, const char *src,
|
||||
size_t len, struct strbuf *dst,
|
||||
int normalizing, struct delayed_checkout *dco)
|
||||
{
|
||||
int ret = 0, ret_filter = 0;
|
||||
struct conv_attrs ca;
|
||||
|
||||
convert_attrs(&ca, path);
|
||||
convert_attrs(istate, &ca, path);
|
||||
|
||||
ret |= ident_to_worktree(path, src, len, dst, ca.ident);
|
||||
if (ret) {
|
||||
|
@ -1478,22 +1480,25 @@ static int convert_to_working_tree_internal(const char *path, const char *src,
|
|||
return ret | ret_filter;
|
||||
}
|
||||
|
||||
int async_convert_to_working_tree(const char *path, const char *src,
|
||||
int async_convert_to_working_tree(const struct index_state *istate,
|
||||
const char *path, const char *src,
|
||||
size_t len, struct strbuf *dst,
|
||||
void *dco)
|
||||
{
|
||||
return convert_to_working_tree_internal(path, src, len, dst, 0, dco);
|
||||
return convert_to_working_tree_internal(istate, path, src, len, dst, 0, dco);
|
||||
}
|
||||
|
||||
int convert_to_working_tree(const char *path, const char *src, size_t len, struct strbuf *dst)
|
||||
int convert_to_working_tree(const struct index_state *istate,
|
||||
const char *path, const char *src,
|
||||
size_t len, struct strbuf *dst)
|
||||
{
|
||||
return convert_to_working_tree_internal(path, src, len, dst, 0, NULL);
|
||||
return convert_to_working_tree_internal(istate, path, src, len, dst, 0, NULL);
|
||||
}
|
||||
|
||||
int renormalize_buffer(const struct index_state *istate, const char *path,
|
||||
const char *src, size_t len, struct strbuf *dst)
|
||||
{
|
||||
int ret = convert_to_working_tree_internal(path, src, len, dst, 1, NULL);
|
||||
int ret = convert_to_working_tree_internal(istate, path, src, len, dst, 1, NULL);
|
||||
if (ret) {
|
||||
src = dst->buf;
|
||||
len = dst->len;
|
||||
|
@ -1927,12 +1932,14 @@ static struct stream_filter *ident_filter(const struct object_id *oid)
|
|||
* Note that you would be crazy to set CRLF, smuge/clean or ident to a
|
||||
* large binary blob you would want us not to slurp into the memory!
|
||||
*/
|
||||
struct stream_filter *get_stream_filter(const char *path, const struct object_id *oid)
|
||||
struct stream_filter *get_stream_filter(const struct index_state *istate,
|
||||
const char *path,
|
||||
const struct object_id *oid)
|
||||
{
|
||||
struct conv_attrs ca;
|
||||
struct stream_filter *filter = NULL;
|
||||
|
||||
convert_attrs(&ca, path);
|
||||
convert_attrs(istate, &ca, path);
|
||||
if (ca.drv && (ca.drv->process || ca.drv->smudge || ca.drv->clean))
|
||||
return NULL;
|
||||
|
||||
|
|
15
convert.h
15
convert.h
|
@ -60,15 +60,18 @@ extern char *check_roundtrip_encoding;
|
|||
const char *get_cached_convert_stats_ascii(const struct index_state *istate,
|
||||
const char *path);
|
||||
const char *get_wt_convert_stats_ascii(const char *path);
|
||||
const char *get_convert_attr_ascii(const char *path);
|
||||
const char *get_convert_attr_ascii(const struct index_state *istate,
|
||||
const char *path);
|
||||
|
||||
/* returns 1 if *dst was used */
|
||||
int convert_to_git(const struct index_state *istate,
|
||||
const char *path, const char *src, size_t len,
|
||||
struct strbuf *dst, int conv_flags);
|
||||
int convert_to_working_tree(const char *path, const char *src,
|
||||
int convert_to_working_tree(const struct index_state *istate,
|
||||
const char *path, const char *src,
|
||||
size_t len, struct strbuf *dst);
|
||||
int async_convert_to_working_tree(const char *path, const char *src,
|
||||
int async_convert_to_working_tree(const struct index_state *istate,
|
||||
const char *path, const char *src,
|
||||
size_t len, struct strbuf *dst,
|
||||
void *dco);
|
||||
int async_query_available_blobs(const char *cmd,
|
||||
|
@ -86,7 +89,8 @@ void convert_to_git_filter_fd(const struct index_state *istate,
|
|||
const char *path, int fd,
|
||||
struct strbuf *dst,
|
||||
int conv_flags);
|
||||
int would_convert_to_git_filter_fd(const char *path);
|
||||
int would_convert_to_git_filter_fd(const struct index_state *istate,
|
||||
const char *path);
|
||||
|
||||
/*****************************************************************
|
||||
*
|
||||
|
@ -96,7 +100,8 @@ int would_convert_to_git_filter_fd(const char *path);
|
|||
|
||||
struct stream_filter; /* opaque */
|
||||
|
||||
struct stream_filter *get_stream_filter(const char *path,
|
||||
struct stream_filter *get_stream_filter(const struct index_state *istate,
|
||||
const char *path,
|
||||
const struct object_id *);
|
||||
void free_stream_filter(struct stream_filter *);
|
||||
int is_null_stream_filter(struct stream_filter *);
|
||||
|
|
2
diff.c
2
diff.c
|
@ -3893,7 +3893,7 @@ static void prep_temp_blob(const char *path, struct diff_tempfile *temp,
|
|||
temp->tempfile = mks_tempfile_ts(tempfile.buf, strlen(base) + 1);
|
||||
if (!temp->tempfile)
|
||||
die_errno("unable to create temp-file");
|
||||
if (convert_to_working_tree(path,
|
||||
if (convert_to_working_tree(&the_index, path,
|
||||
(const char *)blob, (size_t)size, &buf)) {
|
||||
blob = buf.buf;
|
||||
size = buf.len;
|
||||
|
|
6
entry.c
6
entry.c
|
@ -266,7 +266,7 @@ static int write_entry(struct cache_entry *ce,
|
|||
const struct submodule *sub;
|
||||
|
||||
if (ce_mode_s_ifmt == S_IFREG) {
|
||||
struct stream_filter *filter = get_stream_filter(ce->name,
|
||||
struct stream_filter *filter = get_stream_filter(&the_index, ce->name,
|
||||
&ce->oid);
|
||||
if (filter &&
|
||||
!streaming_write_entry(ce, path, filter,
|
||||
|
@ -314,14 +314,14 @@ static int write_entry(struct cache_entry *ce,
|
|||
* Convert from git internal format to working tree format
|
||||
*/
|
||||
if (dco && dco->state != CE_NO_DELAY) {
|
||||
ret = async_convert_to_working_tree(ce->name, new_blob,
|
||||
ret = async_convert_to_working_tree(&the_index, ce->name, new_blob,
|
||||
size, &buf, dco);
|
||||
if (ret && string_list_has_string(&dco->paths, ce->name)) {
|
||||
free(new_blob);
|
||||
goto delayed;
|
||||
}
|
||||
} else
|
||||
ret = convert_to_working_tree(ce->name, new_blob, size, &buf);
|
||||
ret = convert_to_working_tree(&the_index, ce->name, new_blob, size, &buf);
|
||||
|
||||
if (ret) {
|
||||
free(new_blob);
|
||||
|
|
|
@ -966,7 +966,7 @@ static int update_file_flags(struct merge_options *o,
|
|||
}
|
||||
if (S_ISREG(mode)) {
|
||||
struct strbuf strbuf = STRBUF_INIT;
|
||||
if (convert_to_working_tree(path, buf, size, &strbuf)) {
|
||||
if (convert_to_working_tree(&the_index, path, buf, size, &strbuf)) {
|
||||
free(buf);
|
||||
size = strbuf.len;
|
||||
buf = strbuf_detach(&strbuf, NULL);
|
||||
|
|
|
@ -1860,7 +1860,7 @@ static int index_stream_convert_blob(struct object_id *oid, int fd,
|
|||
struct strbuf sbuf = STRBUF_INIT;
|
||||
|
||||
assert(path);
|
||||
assert(would_convert_to_git_filter_fd(path));
|
||||
assert(would_convert_to_git_filter_fd(&the_index, path));
|
||||
|
||||
convert_to_git_filter_fd(&the_index, path, fd, &sbuf,
|
||||
get_conv_flags(flags));
|
||||
|
@ -1950,7 +1950,7 @@ int index_fd(struct object_id *oid, int fd, struct stat *st,
|
|||
* Call xsize_t() only when needed to avoid potentially unnecessary
|
||||
* die() for large files.
|
||||
*/
|
||||
if (type == OBJ_BLOB && path && would_convert_to_git_filter_fd(path))
|
||||
if (type == OBJ_BLOB && path && would_convert_to_git_filter_fd(&the_index, path))
|
||||
ret = index_stream_convert_blob(oid, fd, path, flags);
|
||||
else if (!S_ISREG(st->st_mode))
|
||||
ret = index_pipe(oid, fd, type, path, flags);
|
||||
|
|
Загрузка…
Ссылка в новой задаче