@@ -22,33 +22,60 @@ static const char *get_mode(const char *str, unsigned int *modep)
22
22
return str ;
23
23
}
24
24
25
- static void decode_tree_entry (struct tree_desc * desc , const char * buf , unsigned long size )
25
+ static int decode_tree_entry (struct tree_desc * desc , const char * buf , unsigned long size , struct strbuf * err )
26
26
{
27
27
const char * path ;
28
28
unsigned int mode , len ;
29
29
30
- if (size < 23 || buf [size - 21 ])
31
- die (_ ("too-short tree object" ));
30
+ if (size < 23 || buf [size - 21 ]) {
31
+ strbuf_addstr (err , _ ("too-short tree object" ));
32
+ return -1 ;
33
+ }
32
34
33
35
path = get_mode (buf , & mode );
34
- if (!path )
35
- die (_ ("malformed mode in tree entry for tree" ));
36
- if (!* path )
37
- die (_ ("empty filename in tree entry for tree" ));
36
+ if (!path ) {
37
+ strbuf_addstr (err , _ ("malformed mode in tree entry" ));
38
+ return -1 ;
39
+ }
40
+ if (!* path ) {
41
+ strbuf_addstr (err , _ ("empty filename in tree entry" ));
42
+ return -1 ;
43
+ }
38
44
len = strlen (path ) + 1 ;
39
45
40
46
/* Initialize the descriptor entry */
41
47
desc -> entry .path = path ;
42
48
desc -> entry .mode = canon_mode (mode );
43
49
desc -> entry .oid = (const struct object_id * )(path + len );
50
+
51
+ return 0 ;
44
52
}
45
53
46
- void init_tree_desc (struct tree_desc * desc , const void * buffer , unsigned long size )
54
+ static int init_tree_desc_internal (struct tree_desc * desc , const void * buffer , unsigned long size , struct strbuf * err )
47
55
{
48
56
desc -> buffer = buffer ;
49
57
desc -> size = size ;
50
58
if (size )
51
- decode_tree_entry (desc , buffer , size );
59
+ return decode_tree_entry (desc , buffer , size , err );
60
+ return 0 ;
61
+ }
62
+
63
+ void init_tree_desc (struct tree_desc * desc , const void * buffer , unsigned long size )
64
+ {
65
+ struct strbuf err = STRBUF_INIT ;
66
+ if (init_tree_desc_internal (desc , buffer , size , & err ))
67
+ die ("%s" , err .buf );
68
+ strbuf_release (& err );
69
+ }
70
+
71
+ int init_tree_desc_gently (struct tree_desc * desc , const void * buffer , unsigned long size )
72
+ {
73
+ struct strbuf err = STRBUF_INIT ;
74
+ int result = init_tree_desc_internal (desc , buffer , size , & err );
75
+ if (result )
76
+ error ("%s" , err .buf );
77
+ strbuf_release (& err );
78
+ return result ;
52
79
}
53
80
54
81
void * fill_tree_descriptor (struct tree_desc * desc , const unsigned char * sha1 )
@@ -75,7 +102,7 @@ static void entry_extract(struct tree_desc *t, struct name_entry *a)
75
102
* a = t -> entry ;
76
103
}
77
104
78
- void update_tree_entry (struct tree_desc * desc )
105
+ static int update_tree_entry_internal (struct tree_desc * desc , struct strbuf * err )
79
106
{
80
107
const void * buf = desc -> buffer ;
81
108
const unsigned char * end = desc -> entry .oid -> hash + 20 ;
@@ -89,7 +116,30 @@ void update_tree_entry(struct tree_desc *desc)
89
116
desc -> buffer = buf ;
90
117
desc -> size = size ;
91
118
if (size )
92
- decode_tree_entry (desc , buf , size );
119
+ return decode_tree_entry (desc , buf , size , err );
120
+ return 0 ;
121
+ }
122
+
123
+ void update_tree_entry (struct tree_desc * desc )
124
+ {
125
+ struct strbuf err = STRBUF_INIT ;
126
+ if (update_tree_entry_internal (desc , & err ))
127
+ die ("%s" , err .buf );
128
+ strbuf_release (& err );
129
+ }
130
+
131
+ int update_tree_entry_gently (struct tree_desc * desc )
132
+ {
133
+ struct strbuf err = STRBUF_INIT ;
134
+ if (update_tree_entry_internal (desc , & err )) {
135
+ error ("%s" , err .buf );
136
+ strbuf_release (& err );
137
+ /* Stop processing this tree after error */
138
+ desc -> size = 0 ;
139
+ return -1 ;
140
+ }
141
+ strbuf_release (& err );
142
+ return 0 ;
93
143
}
94
144
95
145
int tree_entry (struct tree_desc * desc , struct name_entry * entry )
@@ -102,6 +152,17 @@ int tree_entry(struct tree_desc *desc, struct name_entry *entry)
102
152
return 1 ;
103
153
}
104
154
155
+ int tree_entry_gently (struct tree_desc * desc , struct name_entry * entry )
156
+ {
157
+ if (!desc -> size )
158
+ return 0 ;
159
+
160
+ * entry = desc -> entry ;
161
+ if (update_tree_entry_gently (desc ))
162
+ return 0 ;
163
+ return 1 ;
164
+ }
165
+
105
166
void setup_traverse_info (struct traverse_info * info , const char * base )
106
167
{
107
168
int pathlen = strlen (base );
0 commit comments