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>

Eric W. Biederman committed Oct 1, 2023 at 21:40 UTC efed687edcaa272601e0f4e192db368972daa7ac
28 files changed +80 -59
archive.c
+2 -1
@@ -339,7 +339,8 @@ int write_archive_entries(struct archiver_args *args,
339 opts.src_index = args->repo->index;
340 opts.dst_index = args->repo->index;
341 opts.fn = oneway_merge;
342 - init_tree_desc(&t, args->tree->buffer, args->tree->size);
342 + init_tree_desc(&t, &args->tree->object.oid,
343 + args->tree->buffer, args->tree->size);
344 if (unpack_trees(1, &t, &opts))
345 return -1;
346 git_attr_set_direction(GIT_ATTR_INDEX);
builtin/am.c
+3 -3
@@ -1991,8 +1991,8 @@ static int fast_forward_to(struct tree *head, struct tree *remote, int reset)
1991 opts.reset = reset ? UNPACK_RESET_PROTECT_UNTRACKED : 0;
1992 opts.preserve_ignored = 0; /* FIXME: !overwrite_ignore */
1993 opts.fn = twoway_merge;
1994 - init_tree_desc(&t[0], head->buffer, head->size);
1995 - init_tree_desc(&t[1], remote->buffer, remote->size);
1994 + init_tree_desc(&t[0], &head->object.oid, head->buffer, head->size);
1995 + init_tree_desc(&t[1], &remote->object.oid, remote->buffer, remote->size);
1996
1997 if (unpack_trees(2, t, &opts)) {
1998 rollback_lock_file(&lock_file);
@@ -2026,7 +2026,7 @@ static int merge_tree(struct tree *tree)
2026 opts.dst_index = &the_index;
2027 opts.merge = 1;
2028 opts.fn = oneway_merge;
2029 - init_tree_desc(&t[0], tree->buffer, tree->size);
2029 + init_tree_desc(&t[0], &tree->object.oid, tree->buffer, tree->size);
2030
2031 if (unpack_trees(1, t, &opts)) {
2032 rollback_lock_file(&lock_file);
builtin/checkout.c
+5 -3
@@ -701,7 +701,7 @@ static int reset_tree(struct tree *tree, const struct checkout_opts *o,
701 info->commit ? &info->commit->object.oid : null_oid(),
702 NULL);
703 parse_tree(tree);
704 - init_tree_desc(&tree_desc, tree->buffer, tree->size);
704 + init_tree_desc(&tree_desc, &tree->object.oid, tree->buffer, tree->size);
705 switch (unpack_trees(1, &tree_desc, &opts)) {
706 case -2:
707 *writeout_error = 1;
@@ -815,10 +815,12 @@ static int merge_working_tree(const struct checkout_opts *opts,
815 die(_("unable to parse commit %s"),
816 oid_to_hex(old_commit_oid));
817
818 - init_tree_desc(&trees[0], tree->buffer, tree->size);
818 + init_tree_desc(&trees[0], &tree->object.oid,
819 + tree->buffer, tree->size);
820 parse_tree(new_tree);
821 tree = new_tree;
821 - init_tree_desc(&trees[1], tree->buffer, tree->size);
822 + init_tree_desc(&trees[1], &tree->object.oid,
823 + tree->buffer, tree->size);
824
825 ret = unpack_trees(2, trees, &topts);
826 clear_unpack_trees_porcelain(&topts);
builtin/clone.c
+1 -1
@@ -737,7 +737,7 @@ static int checkout(int submodule_progress, int filter_submodules)
737 if (!tree)
738 die(_("unable to parse commit %s"), oid_to_hex(&oid));
739 parse_tree(tree);
740 - init_tree_desc(&t, tree->buffer, tree->size);
740 + init_tree_desc(&t, &tree->object.oid, tree->buffer, tree->size);
741 if (unpack_trees(1, &t, &opts) < 0)
742 die(_("unable to checkout working tree"));
743
builtin/commit.c
+1 -1
@@ -340,7 +340,7 @@ static void create_base_index(const struct commit *current_head)
340 if (!tree)
341 die(_("failed to unpack HEAD tree object"));
342 parse_tree(tree);
343 - init_tree_desc(&t, tree->buffer, tree->size);
343 + init_tree_desc(&t, &tree->object.oid, tree->buffer, tree->size);
344 if (unpack_trees(1, &t, &opts))
345 exit(128); /* We've already reported the error, finish dying */
346 }
builtin/grep.c
+4 -4
@@ -530,7 +530,7 @@ static int grep_submodule(struct grep_opt *opt,
530 strbuf_addstr(&base, filename);
531 strbuf_addch(&base, '/');
532
533 - init_tree_desc(&tree, data, size);
533 + init_tree_desc(&tree, oid, data, size);
534 hit = grep_tree(&subopt, pathspec, &tree, &base, base.len,
535 object_type == OBJ_COMMIT);
536 strbuf_release(&base);
@@ -574,7 +574,7 @@ static int grep_cache(struct grep_opt *opt,
574
575 data = repo_read_object_file(the_repository, &ce->oid,
576 &type, &size);
577 - init_tree_desc(&tree, data, size);
577 + init_tree_desc(&tree, &ce->oid, data, size);
578
579 hit |= grep_tree(opt, pathspec, &tree, &name, 0, 0);
580 strbuf_setlen(&name, name_base_len);
@@ -670,7 +670,7 @@ static int grep_tree(struct grep_opt *opt, const struct pathspec *pathspec,
670 oid_to_hex(&entry.oid));
671
672 strbuf_addch(base, '/');
673 - init_tree_desc(&sub, data, size);
673 + init_tree_desc(&sub, &entry.oid, data, size);
674 hit |= grep_tree(opt, pathspec, &sub, base, tn_len,
675 check_attr);
676 free(data);
@@ -714,7 +714,7 @@ static int grep_object(struct grep_opt *opt, const struct pathspec *pathspec,
714 strbuf_add(&base, name, len);
715 strbuf_addch(&base, ':');
716 }
717 - init_tree_desc(&tree, data, size);
717 + init_tree_desc(&tree, &obj->oid, data, size);
718 hit = grep_tree(opt, pathspec, &tree, &base, base.len,
719 obj->type == OBJ_COMMIT);
720 strbuf_release(&base);
builtin/merge.c
+2 -1
@@ -704,7 +704,8 @@ static int read_tree_trivial(struct object_id *common, struct object_id *head,
704 cache_tree_free(&the_index.cache_tree);
705 for (i = 0; i < nr_trees; i++) {
706 parse_tree(trees[i]);
707 - init_tree_desc(t+i, trees[i]->buffer, trees[i]->size);
707 + init_tree_desc(t+i, &trees[i]->object.oid,
708 + trees[i]->buffer, trees[i]->size);
709 }
710 if (unpack_trees(nr_trees, t, &opts))
711 return -1;
builtin/pack-objects.c
+4 -2
@@ -1756,7 +1756,8 @@ static void add_pbase_object(struct tree_desc *tree,
1756 tree = pbase_tree_get(&entry.oid);
1757 if (!tree)
1758 return;
1759 - init_tree_desc(&sub, tree->tree_data, tree->tree_size);
1759 + init_tree_desc(&sub, &tree->oid,
1760 + tree->tree_data, tree->tree_size);
1761
1762 add_pbase_object(&sub, down, downlen, fullname);
1763 pbase_tree_put(tree);
@@ -1816,7 +1817,8 @@ static void add_preferred_base_object(const char *name)
1817 }
1818 else {
1819 struct tree_desc tree;
1819 - init_tree_desc(&tree, it->pcache.tree_data, it->pcache.tree_size);
1820 + init_tree_desc(&tree, &it->pcache.oid,
1821 + it->pcache.tree_data, it->pcache.tree_size);
1822 add_pbase_object(&tree, name, cmplen, name);
1823 }
1824 }
builtin/read-tree.c
+1 -1
@@ -264,7 +264,7 @@ int cmd_read_tree(int argc, const char **argv, const char *cmd_prefix)
264 for (i = 0; i < nr_trees; i++) {
265 struct tree *tree = trees[i];
266 parse_tree(tree);
267 - init_tree_desc(t+i, tree->buffer, tree->size);
267 + init_tree_desc(t+i, &tree->object.oid, tree->buffer, tree->size);
268 }
269 if (unpack_trees(nr_trees, t, &opts))
270 return 128;
builtin/stash.c
+3 -2
@@ -285,7 +285,7 @@ static int reset_tree(struct object_id *i_tree, int update, int reset)
285 if (parse_tree(tree))
286 return -1;
287
288 - init_tree_desc(t, tree->buffer, tree->size);
288 + init_tree_desc(t, &tree->object.oid, tree->buffer, tree->size);
289
290 opts.head_idx = 1;
291 opts.src_index = &the_index;
@@ -871,7 +871,8 @@ static void diff_include_untracked(const struct stash_info *info, struct diff_op
871 tree[i] = parse_tree_indirect(oid[i]);
872 if (parse_tree(tree[i]) < 0)
873 die(_("failed to parse tree"));
874 - init_tree_desc(&tree_desc[i], tree[i]->buffer, tree[i]->size);
874 + init_tree_desc(&tree_desc[i], &tree[i]->object.oid,
875 + tree[i]->buffer, tree[i]->size);
876 }
877
878 unpack_tree_opt.head_idx = -1;
cache-tree.c
+1 -1
@@ -770,7 +770,7 @@ static void prime_cache_tree_rec(struct repository *r,
770
771 oidcpy(&it->oid, &tree->object.oid);
772
773 - init_tree_desc(&desc, tree->buffer, tree->size);
773 + init_tree_desc(&desc, &tree->object.oid, tree->buffer, tree->size);
774 cnt = 0;
775 while (tree_entry(&desc, &entry)) {
776 if (!S_ISDIR(entry.mode))
delta-islands.c
+1 -1
@@ -289,7 +289,7 @@ void resolve_tree_islands(struct repository *r,
289 if (!tree || parse_tree(tree) < 0)
290 die(_("bad tree object %s"), oid_to_hex(&ent->idx.oid));
291
292 - init_tree_desc(&desc, tree->buffer, tree->size);
292 + init_tree_desc(&desc, &tree->object.oid, tree->buffer, tree->size);
293 while (tree_entry(&desc, &entry)) {
294 struct object *obj;
295
diff-lib.c
+1 -1
@@ -558,7 +558,7 @@ static int diff_cache(struct rev_info *revs,
558 opts.pathspec = &revs->diffopt.pathspec;
559 opts.pathspec->recursive = 1;
560
561 - init_tree_desc(&t, tree->buffer, tree->size);
561 + init_tree_desc(&t, &tree->object.oid, tree->buffer, tree->size);
562 return unpack_trees(1, &t, &opts);
563 }
564
fsck.c
+4 -2
@@ -313,7 +313,8 @@ static int fsck_walk_tree(struct tree *tree, void *data, struct fsck_options *op
313 return -1;
314
315 name = fsck_get_object_name(options, &tree->object.oid);
316 - if (init_tree_desc_gently(&desc, tree->buffer, tree->size, 0))
316 + if (init_tree_desc_gently(&desc, &tree->object.oid,
317 + tree->buffer, tree->size, 0))
318 return -1;
319 while (tree_entry_gently(&desc, &entry)) {
320 struct object *obj;
@@ -583,7 +584,8 @@ static int fsck_tree(const struct object_id *tree_oid,
584 const char *o_name;
585 struct name_stack df_dup_candidates = { NULL };
586
586 - if (init_tree_desc_gently(&desc, buffer, size, TREE_DESC_RAW_MODES)) {
587 + if (init_tree_desc_gently(&desc, tree_oid, buffer, size,
588 + TREE_DESC_RAW_MODES)) {
589 retval += report(options, tree_oid, OBJ_TREE,
590 FSCK_MSG_BAD_TREE,
591 "cannot be parsed as a tree");
http-push.c
+1 -1
@@ -1308,7 +1308,7 @@ static struct object_list **process_tree(struct tree *tree,
1308 obj->flags |= SEEN;
1309 p = add_one_object(obj, p);
1310
1311 - init_tree_desc(&desc, tree->buffer, tree->size);
1311 + init_tree_desc(&desc, &tree->object.oid, tree->buffer, tree->size);
1312
1313 while (tree_entry(&desc, &entry))
1314 switch (object_type(entry.mode)) {
list-objects.c
+1 -1
@@ -97,7 +97,7 @@ static void process_tree_contents(struct traversal_context *ctx,
97 enum interesting match = ctx->revs->diffopt.pathspec.nr == 0 ?
98 all_entries_interesting : entry_not_interesting;
99
100 - init_tree_desc(&desc, tree->buffer, tree->size);
100 + init_tree_desc(&desc, &tree->object.oid, tree->buffer, tree->size);
101
102 while (tree_entry(&desc, &entry)) {
103 if (match != all_entries_interesting) {
match-trees.c
+2 -2
@@ -63,7 +63,7 @@ static void *fill_tree_desc_strict(struct tree_desc *desc,
63 die("unable to read tree (%s)", oid_to_hex(hash));
64 if (type != OBJ_TREE)
65 die("%s is not a tree", oid_to_hex(hash));
66 - init_tree_desc(desc, buffer, size);
66 + init_tree_desc(desc, hash, buffer, size);
67 return buffer;
68 }
69
@@ -194,7 +194,7 @@ static int splice_tree(const struct object_id *oid1, const char *prefix,
194 buf = repo_read_object_file(the_repository, oid1, &type, &sz);
195 if (!buf)
196 die("cannot read tree %s", oid_to_hex(oid1));
197 - init_tree_desc(&desc, buf, sz);
197 + init_tree_desc(&desc, oid1, buf, sz);
198
199 rewrite_here = NULL;
200 while (desc.size) {
merge-ort.c
+6 -5
@@ -1679,9 +1679,10 @@ static int collect_merge_info(struct merge_options *opt,
1679 parse_tree(merge_base);
1680 parse_tree(side1);
1681 parse_tree(side2);
1682 - init_tree_desc(t + 0, merge_base->buffer, merge_base->size);
1683 - init_tree_desc(t + 1, side1->buffer, side1->size);
1684 - init_tree_desc(t + 2, side2->buffer, side2->size);
1682 + init_tree_desc(t + 0, &merge_base->object.oid,
1683 + merge_base->buffer, merge_base->size);
1684 + init_tree_desc(t + 1, &side1->object.oid, side1->buffer, side1->size);
1685 + init_tree_desc(t + 2, &side2->object.oid, side2->buffer, side2->size);
1686
1687 trace2_region_enter("merge", "traverse_trees", opt->repo);
1688 ret = traverse_trees(NULL, 3, t, &info);
@@ -4400,9 +4401,9 @@ static int checkout(struct merge_options *opt,
4401 unpack_opts.fn = twoway_merge;
4402 unpack_opts.preserve_ignored = 0; /* FIXME: !opts->overwrite_ignore */
4403 parse_tree(prev);
4403 - init_tree_desc(&trees[0], prev->buffer, prev->size);
4404 + init_tree_desc(&trees[0], &prev->object.oid, prev->buffer, prev->size);
4405 parse_tree(next);
4405 - init_tree_desc(&trees[1], next->buffer, next->size);
4406 + init_tree_desc(&trees[1], &next->object.oid, next->buffer, next->size);
4407
4408 ret = unpack_trees(2, trees, &unpack_opts);
4409 clear_unpack_trees_porcelain(&unpack_opts);
merge-recursive.c
+1 -1
@@ -411,7 +411,7 @@ static inline int merge_detect_rename(struct merge_options *opt)
411 static void init_tree_desc_from_tree(struct tree_desc *desc, struct tree *tree)
412 {
413 parse_tree(tree);
414 - init_tree_desc(desc, tree->buffer, tree->size);
414 + init_tree_desc(desc, &tree->object.oid, tree->buffer, tree->size);
415 }
416
417 static int unpack_trees_start(struct merge_options *opt,
merge.c
+2 -1
@@ -81,7 +81,8 @@ int checkout_fast_forward(struct repository *r,
81 }
82 for (i = 0; i < nr_trees; i++) {
83 parse_tree(trees[i]);
84 - init_tree_desc(t+i, trees[i]->buffer, trees[i]->size);
84 + init_tree_desc(t+i, &trees[i]->object.oid,
85 + trees[i]->buffer, trees[i]->size);
86 }
87
88 memset(&opts, 0, sizeof(opts));
pack-bitmap-write.c
+1 -1
@@ -366,7 +366,7 @@ static int fill_bitmap_tree(struct bitmap *bitmap,
366 if (parse_tree(tree) < 0)
367 die("unable to load tree object %s",
368 oid_to_hex(&tree->object.oid));
369 - init_tree_desc(&desc, tree->buffer, tree->size);
369 + init_tree_desc(&desc, &tree->object.oid, tree->buffer, tree->size);
370
371 while (tree_entry(&desc, &entry)) {
372 switch (object_type(entry.mode)) {
packfile.c
+2 -1
@@ -2250,7 +2250,8 @@ static int add_promisor_object(const struct object_id *oid,
2250 struct tree *tree = (struct tree *)obj;
2251 struct tree_desc desc;
2252 struct name_entry entry;
2253 - if (init_tree_desc_gently(&desc, tree->buffer, tree->size, 0))
2253 + if (init_tree_desc_gently(&desc, &tree->object.oid,
2254 + tree->buffer, tree->size, 0))
2255 /*
2256 * Error messages are given when packs are
2257 * verified, so do not print any here.
reflog.c
+1 -1
@@ -40,7 +40,7 @@ static int tree_is_complete(const struct object_id *oid)
40 tree->buffer = data;
41 tree->size = size;
42 }
43 - init_tree_desc(&desc, tree->buffer, tree->size);
43 + init_tree_desc(&desc, &tree->object.oid, tree->buffer, tree->size);
44 complete = 1;
45 while (tree_entry(&desc, &entry)) {
46 if (!repo_has_object_file(the_repository, &entry.oid) ||
revision.c
+2 -2
@@ -82,7 +82,7 @@ static void mark_tree_contents_uninteresting(struct repository *r,
82 if (parse_tree_gently(tree, 1) < 0)
83 return;
84
85 - init_tree_desc(&desc, tree->buffer, tree->size);
85 + init_tree_desc(&desc, &tree->object.oid, tree->buffer, tree->size);
86 while (tree_entry(&desc, &entry)) {
87 switch (object_type(entry.mode)) {
88 case OBJ_TREE:
@@ -189,7 +189,7 @@ static void add_children_by_path(struct repository *r,
189 if (parse_tree_gently(tree, 1) < 0)
190 return;
191
192 - init_tree_desc(&desc, tree->buffer, tree->size);
192 + init_tree_desc(&desc, &tree->object.oid, tree->buffer, tree->size);
193 while (tree_entry(&desc, &entry)) {
194 switch (object_type(entry.mode)) {
195 case OBJ_TREE:
tree-walk.c
+21 -15
@@ -15,7 +15,7 @@ static int decode_tree_entry(struct tree_desc *desc, const char *buf, unsigned l
15 const char *path;
16 unsigned int len;
17 uint16_t mode;
18 - const unsigned hashsz = the_hash_algo->rawsz;
18 + const unsigned hashsz = desc->algo->rawsz;
19
20 if (size < hashsz + 3 || buf[size - (hashsz + 1)]) {
21 strbuf_addstr(err, _("too-short tree object"));
@@ -37,15 +37,19 @@ static int decode_tree_entry(struct tree_desc *desc, const char *buf, unsigned l
37 desc->entry.path = path;
38 desc->entry.mode = (desc->flags & TREE_DESC_RAW_MODES) ? mode : canon_mode(mode);
39 desc->entry.pathlen = len - 1;
40 - oidread(&desc->entry.oid, (const unsigned char *)path + len);
40 + oidread_algop(&desc->entry.oid, (const unsigned char *)path + len,
41 + desc->algo);
42
43 return 0;
44 }
45
45 -static int init_tree_desc_internal(struct tree_desc *desc, const void *buffer,
46 - unsigned long size, struct strbuf *err,
46 +static int init_tree_desc_internal(struct tree_desc *desc,
47 + const struct object_id *oid,
48 + const void *buffer, unsigned long size,
49 + struct strbuf *err,
50 enum tree_desc_flags flags)
51 {
52 + desc->algo = (oid && oid->algo) ? &hash_algos[oid->algo] : the_hash_algo;
53 desc->buffer = buffer;
54 desc->size = size;
55 desc->flags = flags;
@@ -54,19 +58,21 @@ static int init_tree_desc_internal(struct tree_desc *desc, const void *buffer,
58 return 0;
59 }
60
57 -void init_tree_desc(struct tree_desc *desc, const void *buffer, unsigned long size)
61 +void init_tree_desc(struct tree_desc *desc, const struct object_id *tree_oid,
62 + const void *buffer, unsigned long size)
63 {
64 struct strbuf err = STRBUF_INIT;
60 - if (init_tree_desc_internal(desc, buffer, size, &err, 0))
65 + if (init_tree_desc_internal(desc, tree_oid, buffer, size, &err, 0))
66 die("%s", err.buf);
67 strbuf_release(&err);
68 }
69
65 -int init_tree_desc_gently(struct tree_desc *desc, const void *buffer, unsigned long size,
70 +int init_tree_desc_gently(struct tree_desc *desc, const struct object_id *oid,
71 + const void *buffer, unsigned long size,
72 enum tree_desc_flags flags)
73 {
74 struct strbuf err = STRBUF_INIT;
69 - int result = init_tree_desc_internal(desc, buffer, size, &err, flags);
75 + int result = init_tree_desc_internal(desc, oid, buffer, size, &err, flags);
76 if (result)
77 error("%s", err.buf);
78 strbuf_release(&err);
@@ -85,7 +91,7 @@ void *fill_tree_descriptor(struct repository *r,
91 if (!buf)
92 die("unable to read tree %s", oid_to_hex(oid));
93 }
88 - init_tree_desc(desc, buf, size);
94 + init_tree_desc(desc, oid, buf, size);
95 return buf;
96 }
97
@@ -102,7 +108,7 @@ static void entry_extract(struct tree_desc *t, struct name_entry *a)
108 static int update_tree_entry_internal(struct tree_desc *desc, struct strbuf *err)
109 {
110 const void *buf = desc->buffer;
105 - const unsigned char *end = (const unsigned char *)desc->entry.path + desc->entry.pathlen + 1 + the_hash_algo->rawsz;
111 + const unsigned char *end = (const unsigned char *)desc->entry.path + desc->entry.pathlen + 1 + desc->algo->rawsz;
112 unsigned long size = desc->size;
113 unsigned long len = end - (const unsigned char *)buf;
114
@@ -611,7 +617,7 @@ int get_tree_entry(struct repository *r,
617 retval = -1;
618 } else {
619 struct tree_desc t;
614 - init_tree_desc(&t, tree, size);
620 + init_tree_desc(&t, tree_oid, tree, size);
621 retval = find_tree_entry(r, &t, name, oid, mode);
622 }
623 free(tree);
@@ -654,7 +660,7 @@ enum get_oid_result get_tree_entry_follow_symlinks(struct repository *r,
660 struct tree_desc t;
661 int follows_remaining = GET_TREE_ENTRY_FOLLOW_SYMLINKS_MAX_LINKS;
662
657 - init_tree_desc(&t, NULL, 0UL);
663 + init_tree_desc(&t, NULL, NULL, 0UL);
664 strbuf_addstr(&namebuf, name);
665 oidcpy(&current_tree_oid, tree_oid);
666
@@ -690,7 +696,7 @@ enum get_oid_result get_tree_entry_follow_symlinks(struct repository *r,
696 goto done;
697
698 /* descend */
693 - init_tree_desc(&t, tree, size);
699 + init_tree_desc(&t, &current_tree_oid, tree, size);
700 }
701
702 /* Handle symlinks to e.g. a//b by removing leading slashes */
@@ -724,7 +730,7 @@ enum get_oid_result get_tree_entry_follow_symlinks(struct repository *r,
730 free(parent->tree);
731 parents_nr--;
732 parent = &parents[parents_nr - 1];
727 - init_tree_desc(&t, parent->tree, parent->size);
733 + init_tree_desc(&t, &parent->oid, parent->tree, parent->size);
734 strbuf_remove(&namebuf, 0, remainder ? 3 : 2);
735 continue;
736 }
@@ -804,7 +810,7 @@ enum get_oid_result get_tree_entry_follow_symlinks(struct repository *r,
810 contents_start = contents;
811
812 parent = &parents[parents_nr - 1];
807 - init_tree_desc(&t, parent->tree, parent->size);
813 + init_tree_desc(&t, &parent->oid, parent->tree, parent->size);
814 strbuf_splice(&namebuf, 0, len,
815 contents_start, link_len);
816 if (remainder)
tree-walk.h
+5 -2
@@ -26,6 +26,7 @@ struct name_entry {
26 * A semi-opaque data structure used to maintain the current state of the walk.
27 */
28 struct tree_desc {
29 + const struct git_hash_algo *algo;
30 /*
31 * pointer into the memory representation of the tree. It always
32 * points at the current entry being visited.
@@ -85,9 +86,11 @@ int update_tree_entry_gently(struct tree_desc *);
86 * size parameters are assumed to be the same as the buffer and size
87 * members of `struct tree`.
88 */
88 -void init_tree_desc(struct tree_desc *desc, const void *buf, unsigned long size);
89 +void init_tree_desc(struct tree_desc *desc, const struct object_id *tree_oid,
90 + const void *buf, unsigned long size);
91
90 -int init_tree_desc_gently(struct tree_desc *desc, const void *buf, unsigned long size,
92 +int init_tree_desc_gently(struct tree_desc *desc, const struct object_id *oid,
93 + const void *buf, unsigned long size,
94 enum tree_desc_flags flags);
95
96 /*
tree.c
+1 -1
@@ -27,7 +27,7 @@ int read_tree_at(struct repository *r,
27 if (parse_tree(tree))
28 return -1;
29
30 - init_tree_desc(&desc, tree->buffer, tree->size);
30 + init_tree_desc(&desc, &tree->object.oid, tree->buffer, tree->size);
31
32 while (tree_entry(&desc, &entry)) {
33 if (retval != all_entries_interesting) {
walker.c
+1 -1
@@ -45,7 +45,7 @@ static int process_tree(struct walker *walker, struct tree *tree)
45 if (parse_tree(tree))
46 return -1;
47
48 - init_tree_desc(&desc, tree->buffer, tree->size);
48 + init_tree_desc(&desc, &tree->object.oid, tree->buffer, tree->size);
49 while (tree_entry(&desc, &entry)) {
50 struct object *obj = NULL;
51