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(¤t_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, ¤t_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