@@ -96,7 +96,8 @@ int is_empty_ref_iterator(struct ref_iterator *ref_iterator)
96
96
struct merge_ref_iterator {
97
97
struct ref_iterator base ;
98
98
99
- struct ref_iterator * iter0 , * iter1 ;
99
+ struct ref_iterator * iter0 , * iter0_owned ;
100
+ struct ref_iterator * iter1 , * iter1_owned ;
100
101
101
102
ref_iterator_select_fn * select ;
102
103
void * cb_data ;
@@ -160,13 +161,11 @@ static int merge_ref_iterator_advance(struct ref_iterator *ref_iterator)
160
161
if (!iter -> current ) {
161
162
/* Initialize: advance both iterators to their first entries */
162
163
if ((ok = ref_iterator_advance (iter -> iter0 )) != ITER_OK ) {
163
- ref_iterator_free (iter -> iter0 );
164
164
iter -> iter0 = NULL ;
165
165
if (ok == ITER_ERROR )
166
166
goto error ;
167
167
}
168
168
if ((ok = ref_iterator_advance (iter -> iter1 )) != ITER_OK ) {
169
- ref_iterator_free (iter -> iter1 );
170
169
iter -> iter1 = NULL ;
171
170
if (ok == ITER_ERROR )
172
171
goto error ;
@@ -177,7 +176,6 @@ static int merge_ref_iterator_advance(struct ref_iterator *ref_iterator)
177
176
* entry:
178
177
*/
179
178
if ((ok = ref_iterator_advance (* iter -> current )) != ITER_OK ) {
180
- ref_iterator_free (* iter -> current );
181
179
* iter -> current = NULL ;
182
180
if (ok == ITER_ERROR )
183
181
goto error ;
@@ -206,7 +204,6 @@ static int merge_ref_iterator_advance(struct ref_iterator *ref_iterator)
206
204
207
205
if (selection & ITER_SKIP_SECONDARY ) {
208
206
if ((ok = ref_iterator_advance (* secondary )) != ITER_OK ) {
209
- ref_iterator_free (* secondary );
210
207
* secondary = NULL ;
211
208
if (ok == ITER_ERROR )
212
209
goto error ;
@@ -226,6 +223,28 @@ static int merge_ref_iterator_advance(struct ref_iterator *ref_iterator)
226
223
return ITER_ERROR ;
227
224
}
228
225
226
+ static int merge_ref_iterator_seek (struct ref_iterator * ref_iterator ,
227
+ const char * prefix )
228
+ {
229
+ struct merge_ref_iterator * iter =
230
+ (struct merge_ref_iterator * )ref_iterator ;
231
+ int ret ;
232
+
233
+ iter -> current = NULL ;
234
+ iter -> iter0 = iter -> iter0_owned ;
235
+ iter -> iter1 = iter -> iter1_owned ;
236
+
237
+ ret = ref_iterator_seek (iter -> iter0 , prefix );
238
+ if (ret < 0 )
239
+ return ret ;
240
+
241
+ ret = ref_iterator_seek (iter -> iter1 , prefix );
242
+ if (ret < 0 )
243
+ return ret ;
244
+
245
+ return 0 ;
246
+ }
247
+
229
248
static int merge_ref_iterator_peel (struct ref_iterator * ref_iterator ,
230
249
struct object_id * peeled )
231
250
{
@@ -242,12 +261,13 @@ static void merge_ref_iterator_release(struct ref_iterator *ref_iterator)
242
261
{
243
262
struct merge_ref_iterator * iter =
244
263
(struct merge_ref_iterator * )ref_iterator ;
245
- ref_iterator_free (iter -> iter0 );
246
- ref_iterator_free (iter -> iter1 );
264
+ ref_iterator_free (iter -> iter0_owned );
265
+ ref_iterator_free (iter -> iter1_owned );
247
266
}
248
267
249
268
static struct ref_iterator_vtable merge_ref_iterator_vtable = {
250
269
.advance = merge_ref_iterator_advance ,
270
+ .seek = merge_ref_iterator_seek ,
251
271
.peel = merge_ref_iterator_peel ,
252
272
.release = merge_ref_iterator_release ,
253
273
};
@@ -268,8 +288,8 @@ struct ref_iterator *merge_ref_iterator_begin(
268
288
*/
269
289
270
290
base_ref_iterator_init (ref_iterator , & merge_ref_iterator_vtable );
271
- iter -> iter0 = iter0 ;
272
- iter -> iter1 = iter1 ;
291
+ iter -> iter0 = iter -> iter0_owned = iter0 ;
292
+ iter -> iter1 = iter -> iter1_owned = iter1 ;
273
293
iter -> select = select ;
274
294
iter -> cb_data = cb_data ;
275
295
iter -> current = NULL ;
0 commit comments