2
2
#include "tree-walk.h"
5
static const char *get_mode(const char *str, unsigned int *modep)
10
while ((c = *str++) != ' ') {
11
if (c < '0' || c > '7')
13
mode = (mode << 3) + (c - '0');
19
static void decode_tree_entry(struct tree_desc *desc, const void *buf, unsigned long size)
22
unsigned int mode, len;
24
path = get_mode(buf, &mode);
26
die("corrupt tree file");
27
len = strlen(path) + 1;
29
/* Initialize the descriptor entry */
30
desc->entry.path = path;
31
desc->entry.mode = mode;
32
desc->entry.sha1 = (const unsigned char *)(path + len);
35
void init_tree_desc(struct tree_desc *desc, const void *buffer, unsigned long size)
37
desc->buffer = buffer;
40
decode_tree_entry(desc, buffer, size);
5
43
void *fill_tree_descriptor(struct tree_desc *desc, const unsigned char *sha1)
7
45
unsigned long size = 0;
13
51
die("unable to read tree %s", sha1_to_hex(sha1));
53
init_tree_desc(desc, buf, size);
20
57
static int entry_compare(struct name_entry *a, struct name_entry *b)
22
59
return base_name_compare(
23
a->path, a->pathlen, a->mode,
24
b->path, b->pathlen, b->mode);
60
a->path, tree_entry_len(a->path, a->sha1), a->mode,
61
b->path, tree_entry_len(b->path, b->sha1), b->mode);
27
64
static void entry_clear(struct name_entry *a)
32
69
static void entry_extract(struct tree_desc *t, struct name_entry *a)
34
a->sha1 = tree_entry_extract(t, &a->path, &a->mode);
35
a->pathlen = strlen(a->path);
38
74
void update_tree_entry(struct tree_desc *desc)
40
const void *buf = desc->buf;
76
const void *buf = desc->buffer;
77
const unsigned char *end = desc->entry.sha1 + 20;
41
78
unsigned long size = desc->size;
42
int len = strlen(buf) + 1 + 20;
79
unsigned long len = end - (const unsigned char *)buf;
45
82
die("corrupt tree file");
46
desc->buf = (char *) buf + len;
47
desc->size = size - len;
50
static const char *get_mode(const char *str, unsigned int *modep)
53
unsigned int mode = 0;
55
while ((c = *str++) != ' ') {
56
if (c < '0' || c > '7')
58
mode = (mode << 3) + (c - '0');
64
const unsigned char *tree_entry_extract(struct tree_desc *desc, const char **pathp, unsigned int *modep)
66
const void *tree = desc->buf;
67
unsigned long size = desc->size;
68
int len = strlen(tree)+1;
69
const unsigned char *sha1 = (unsigned char *) tree + len;
73
path = get_mode(tree, &mode);
74
if (!path || size < len + 20)
75
die("corrupt tree file");
77
*modep = canon_mode(mode);
88
decode_tree_entry(desc, buf, size);
81
91
int tree_entry(struct tree_desc *desc, struct name_entry *entry)
83
const void *tree = desc->buf;
85
unsigned long len, size = desc->size;
90
path = get_mode(tree, &entry->mode);
92
die("corrupt tree file");
99
entry->sha1 = (const unsigned char *) path;
102
len = path - (char *) tree;
104
die("corrupt tree file");
107
desc->size = size - len;
97
update_tree_entry(desc);
171
160
sha1 = tree_entry_extract(t, &entry, mode);
172
161
update_tree_entry(t);
173
entrylen = strlen(entry);
162
entrylen = tree_entry_len(entry, sha1);
174
163
if (entrylen > namelen)
176
165
cmp = memcmp(name, entry, entrylen);
202
192
struct tree_desc t;
193
unsigned char root[20];
204
tree = read_object_with_reference(tree_sha1, tree_type, &t.size, NULL);
195
tree = read_object_with_reference(tree_sha1, tree_type, &size, root);
199
if (name[0] == '\0') {
204
init_tree_desc(&t, tree, size);
208
205
retval = find_tree_entry(&t, name, sha1, mode);