mirror of
https://github.com/git/git.git
synced 2026-03-25 16:10:10 +01:00
tree-walk: init_tree_desc take an oid to get the hash algorithm
To make it possible for git ls-tree to display the tree encoded in the hash algorithm of the oid specified to git ls-tree, update init_tree_desc to take as a parameter the oid of the tree object. Update all callers of init_tree_desc and init_tree_desc_gently to pass the oid of the tree object. Use the oid of the tree object to discover the hash algorithm of the oid and store that hash algorithm in struct tree_desc. Use the hash algorithm in decode_tree_entry and update_tree_entry_internal to handle reading a tree object encoded in a hash algorithm that differs from the repositories hash algorithm. Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
d6222a2d05
commit
efed687edc
@@ -1991,8 +1991,8 @@ static int fast_forward_to(struct tree *head, struct tree *remote, int reset)
|
||||
opts.reset = reset ? UNPACK_RESET_PROTECT_UNTRACKED : 0;
|
||||
opts.preserve_ignored = 0; /* FIXME: !overwrite_ignore */
|
||||
opts.fn = twoway_merge;
|
||||
init_tree_desc(&t[0], head->buffer, head->size);
|
||||
init_tree_desc(&t[1], remote->buffer, remote->size);
|
||||
init_tree_desc(&t[0], &head->object.oid, head->buffer, head->size);
|
||||
init_tree_desc(&t[1], &remote->object.oid, remote->buffer, remote->size);
|
||||
|
||||
if (unpack_trees(2, t, &opts)) {
|
||||
rollback_lock_file(&lock_file);
|
||||
@@ -2026,7 +2026,7 @@ static int merge_tree(struct tree *tree)
|
||||
opts.dst_index = &the_index;
|
||||
opts.merge = 1;
|
||||
opts.fn = oneway_merge;
|
||||
init_tree_desc(&t[0], tree->buffer, tree->size);
|
||||
init_tree_desc(&t[0], &tree->object.oid, tree->buffer, tree->size);
|
||||
|
||||
if (unpack_trees(1, t, &opts)) {
|
||||
rollback_lock_file(&lock_file);
|
||||
|
||||
@@ -701,7 +701,7 @@ static int reset_tree(struct tree *tree, const struct checkout_opts *o,
|
||||
info->commit ? &info->commit->object.oid : null_oid(),
|
||||
NULL);
|
||||
parse_tree(tree);
|
||||
init_tree_desc(&tree_desc, tree->buffer, tree->size);
|
||||
init_tree_desc(&tree_desc, &tree->object.oid, tree->buffer, tree->size);
|
||||
switch (unpack_trees(1, &tree_desc, &opts)) {
|
||||
case -2:
|
||||
*writeout_error = 1;
|
||||
@@ -815,10 +815,12 @@ static int merge_working_tree(const struct checkout_opts *opts,
|
||||
die(_("unable to parse commit %s"),
|
||||
oid_to_hex(old_commit_oid));
|
||||
|
||||
init_tree_desc(&trees[0], tree->buffer, tree->size);
|
||||
init_tree_desc(&trees[0], &tree->object.oid,
|
||||
tree->buffer, tree->size);
|
||||
parse_tree(new_tree);
|
||||
tree = new_tree;
|
||||
init_tree_desc(&trees[1], tree->buffer, tree->size);
|
||||
init_tree_desc(&trees[1], &tree->object.oid,
|
||||
tree->buffer, tree->size);
|
||||
|
||||
ret = unpack_trees(2, trees, &topts);
|
||||
clear_unpack_trees_porcelain(&topts);
|
||||
|
||||
@@ -737,7 +737,7 @@ static int checkout(int submodule_progress, int filter_submodules)
|
||||
if (!tree)
|
||||
die(_("unable to parse commit %s"), oid_to_hex(&oid));
|
||||
parse_tree(tree);
|
||||
init_tree_desc(&t, tree->buffer, tree->size);
|
||||
init_tree_desc(&t, &tree->object.oid, tree->buffer, tree->size);
|
||||
if (unpack_trees(1, &t, &opts) < 0)
|
||||
die(_("unable to checkout working tree"));
|
||||
|
||||
|
||||
@@ -340,7 +340,7 @@ static void create_base_index(const struct commit *current_head)
|
||||
if (!tree)
|
||||
die(_("failed to unpack HEAD tree object"));
|
||||
parse_tree(tree);
|
||||
init_tree_desc(&t, tree->buffer, tree->size);
|
||||
init_tree_desc(&t, &tree->object.oid, tree->buffer, tree->size);
|
||||
if (unpack_trees(1, &t, &opts))
|
||||
exit(128); /* We've already reported the error, finish dying */
|
||||
}
|
||||
|
||||
@@ -530,7 +530,7 @@ static int grep_submodule(struct grep_opt *opt,
|
||||
strbuf_addstr(&base, filename);
|
||||
strbuf_addch(&base, '/');
|
||||
|
||||
init_tree_desc(&tree, data, size);
|
||||
init_tree_desc(&tree, oid, data, size);
|
||||
hit = grep_tree(&subopt, pathspec, &tree, &base, base.len,
|
||||
object_type == OBJ_COMMIT);
|
||||
strbuf_release(&base);
|
||||
@@ -574,7 +574,7 @@ static int grep_cache(struct grep_opt *opt,
|
||||
|
||||
data = repo_read_object_file(the_repository, &ce->oid,
|
||||
&type, &size);
|
||||
init_tree_desc(&tree, data, size);
|
||||
init_tree_desc(&tree, &ce->oid, data, size);
|
||||
|
||||
hit |= grep_tree(opt, pathspec, &tree, &name, 0, 0);
|
||||
strbuf_setlen(&name, name_base_len);
|
||||
@@ -670,7 +670,7 @@ static int grep_tree(struct grep_opt *opt, const struct pathspec *pathspec,
|
||||
oid_to_hex(&entry.oid));
|
||||
|
||||
strbuf_addch(base, '/');
|
||||
init_tree_desc(&sub, data, size);
|
||||
init_tree_desc(&sub, &entry.oid, data, size);
|
||||
hit |= grep_tree(opt, pathspec, &sub, base, tn_len,
|
||||
check_attr);
|
||||
free(data);
|
||||
@@ -714,7 +714,7 @@ static int grep_object(struct grep_opt *opt, const struct pathspec *pathspec,
|
||||
strbuf_add(&base, name, len);
|
||||
strbuf_addch(&base, ':');
|
||||
}
|
||||
init_tree_desc(&tree, data, size);
|
||||
init_tree_desc(&tree, &obj->oid, data, size);
|
||||
hit = grep_tree(opt, pathspec, &tree, &base, base.len,
|
||||
obj->type == OBJ_COMMIT);
|
||||
strbuf_release(&base);
|
||||
|
||||
@@ -704,7 +704,8 @@ static int read_tree_trivial(struct object_id *common, struct object_id *head,
|
||||
cache_tree_free(&the_index.cache_tree);
|
||||
for (i = 0; i < nr_trees; i++) {
|
||||
parse_tree(trees[i]);
|
||||
init_tree_desc(t+i, trees[i]->buffer, trees[i]->size);
|
||||
init_tree_desc(t+i, &trees[i]->object.oid,
|
||||
trees[i]->buffer, trees[i]->size);
|
||||
}
|
||||
if (unpack_trees(nr_trees, t, &opts))
|
||||
return -1;
|
||||
|
||||
@@ -1756,7 +1756,8 @@ static void add_pbase_object(struct tree_desc *tree,
|
||||
tree = pbase_tree_get(&entry.oid);
|
||||
if (!tree)
|
||||
return;
|
||||
init_tree_desc(&sub, tree->tree_data, tree->tree_size);
|
||||
init_tree_desc(&sub, &tree->oid,
|
||||
tree->tree_data, tree->tree_size);
|
||||
|
||||
add_pbase_object(&sub, down, downlen, fullname);
|
||||
pbase_tree_put(tree);
|
||||
@@ -1816,7 +1817,8 @@ static void add_preferred_base_object(const char *name)
|
||||
}
|
||||
else {
|
||||
struct tree_desc tree;
|
||||
init_tree_desc(&tree, it->pcache.tree_data, it->pcache.tree_size);
|
||||
init_tree_desc(&tree, &it->pcache.oid,
|
||||
it->pcache.tree_data, it->pcache.tree_size);
|
||||
add_pbase_object(&tree, name, cmplen, name);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -264,7 +264,7 @@ int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix)
|
||||
for (i = 0; i < nr_trees; i++) {
|
||||
struct tree *tree = trees[i];
|
||||
parse_tree(tree);
|
||||
init_tree_desc(t+i, tree->buffer, tree->size);
|
||||
init_tree_desc(t+i, &tree->object.oid, tree->buffer, tree->size);
|
||||
}
|
||||
if (unpack_trees(nr_trees, t, &opts))
|
||||
return 128;
|
||||
|
||||
@@ -285,7 +285,7 @@ static int reset_tree(struct object_id *i_tree, int update, int reset)
|
||||
if (parse_tree(tree))
|
||||
return -1;
|
||||
|
||||
init_tree_desc(t, tree->buffer, tree->size);
|
||||
init_tree_desc(t, &tree->object.oid, tree->buffer, tree->size);
|
||||
|
||||
opts.head_idx = 1;
|
||||
opts.src_index = &the_index;
|
||||
@@ -871,7 +871,8 @@ static void diff_include_untracked(const struct stash_info *info, struct diff_op
|
||||
tree[i] = parse_tree_indirect(oid[i]);
|
||||
if (parse_tree(tree[i]) < 0)
|
||||
die(_("failed to parse tree"));
|
||||
init_tree_desc(&tree_desc[i], tree[i]->buffer, tree[i]->size);
|
||||
init_tree_desc(&tree_desc[i], &tree[i]->object.oid,
|
||||
tree[i]->buffer, tree[i]->size);
|
||||
}
|
||||
|
||||
unpack_tree_opt.head_idx = -1;
|
||||
|
||||
Reference in New Issue
Block a user