2 #include "cache-tree.h"
4 #include "object-store.h"
10 #include "repository.h"
12 const char *tree_type
= "tree";
14 static int read_tree_1(struct repository
*r
,
15 struct tree
*tree
, struct strbuf
*base
,
16 int stage
, const struct pathspec
*pathspec
,
17 read_tree_fn_t fn
, void *context
)
19 struct tree_desc desc
;
20 struct name_entry entry
;
22 int len
, oldlen
= base
->len
;
23 enum interesting retval
= entry_not_interesting
;
28 init_tree_desc(&desc
, tree
->buffer
, tree
->size
);
30 while (tree_entry(&desc
, &entry
)) {
31 if (retval
!= all_entries_interesting
) {
32 retval
= tree_entry_interesting(r
->index
, &entry
,
34 if (retval
== all_entries_not_interesting
)
36 if (retval
== entry_not_interesting
)
40 switch (fn(&entry
.oid
, base
,
41 entry
.path
, entry
.mode
, stage
, context
)) {
44 case READ_TREE_RECURSIVE
:
50 if (S_ISDIR(entry
.mode
))
51 oidcpy(&oid
, &entry
.oid
);
52 else if (S_ISGITLINK(entry
.mode
)) {
53 struct commit
*commit
;
55 commit
= lookup_commit(r
, &entry
.oid
);
57 die("Commit %s in submodule path %s%s not found",
58 oid_to_hex(&entry
.oid
),
59 base
->buf
, entry
.path
);
61 if (parse_commit(commit
))
62 die("Invalid commit %s in submodule path %s%s",
63 oid_to_hex(&entry
.oid
),
64 base
->buf
, entry
.path
);
66 oidcpy(&oid
, get_commit_tree_oid(commit
));
71 len
= tree_entry_len(&entry
);
72 strbuf_add(base
, entry
.path
, len
);
73 strbuf_addch(base
, '/');
74 retval
= read_tree_1(r
, lookup_tree(r
, &oid
),
75 base
, stage
, pathspec
,
77 strbuf_setlen(base
, oldlen
);
84 int read_tree_recursive(struct repository
*r
,
86 const char *base
, int baselen
,
87 int stage
, const struct pathspec
*pathspec
,
88 read_tree_fn_t fn
, void *context
)
90 struct strbuf sb
= STRBUF_INIT
;
93 strbuf_add(&sb
, base
, baselen
);
94 ret
= read_tree_1(r
, tree
, &sb
, stage
, pathspec
, fn
, context
);
99 int cmp_cache_name_compare(const void *a_
, const void *b_
)
101 const struct cache_entry
*ce1
, *ce2
;
103 ce1
= *((const struct cache_entry
**)a_
);
104 ce2
= *((const struct cache_entry
**)b_
);
105 return cache_name_stage_compare(ce1
->name
, ce1
->ce_namelen
, ce_stage(ce1
),
106 ce2
->name
, ce2
->ce_namelen
, ce_stage(ce2
));
109 struct tree
*lookup_tree(struct repository
*r
, const struct object_id
*oid
)
111 struct object
*obj
= lookup_object(r
, oid
);
113 return create_object(r
, oid
, alloc_tree_node(r
));
114 return object_as_type(obj
, OBJ_TREE
, 0);
117 int parse_tree_buffer(struct tree
*item
, void *buffer
, unsigned long size
)
119 if (item
->object
.parsed
)
121 item
->object
.parsed
= 1;
122 item
->buffer
= buffer
;
128 int parse_tree_gently(struct tree
*item
, int quiet_on_missing
)
130 enum object_type type
;
134 if (item
->object
.parsed
)
136 buffer
= read_object_file(&item
->object
.oid
, &type
, &size
);
138 return quiet_on_missing
? -1 :
139 error("Could not read %s",
140 oid_to_hex(&item
->object
.oid
));
141 if (type
!= OBJ_TREE
) {
143 return error("Object %s not a tree",
144 oid_to_hex(&item
->object
.oid
));
146 return parse_tree_buffer(item
, buffer
, size
);
149 void free_tree_buffer(struct tree
*tree
)
151 FREE_AND_NULL(tree
->buffer
);
153 tree
->object
.parsed
= 0;
156 struct tree
*parse_tree_indirect(const struct object_id
*oid
)
158 struct repository
*r
= the_repository
;
159 struct object
*obj
= parse_object(r
, oid
);
160 return (struct tree
*)repo_peel_to_type(r
, NULL
, 0, obj
, OBJ_TREE
);