Merge branch 'ew/autoconf-pthread'
[gitweb.git] / refs / iterator.c
index 93ba472f9148938c99bc0de7ac1bb2ec163a5bda..bce1f192f7d4c7e2e3efc6d5ea7df4560cb3cc0a 100644 (file)
@@ -353,3 +353,32 @@ struct ref_iterator *prefix_ref_iterator_begin(struct ref_iterator *iter0,
 
        return ref_iterator;
 }
+
+struct ref_iterator *current_ref_iter = NULL;
+
+int do_for_each_ref_iterator(struct ref_iterator *iter,
+                            each_ref_fn fn, void *cb_data)
+{
+       int retval = 0, ok;
+       struct ref_iterator *old_ref_iter = current_ref_iter;
+
+       current_ref_iter = iter;
+       while ((ok = ref_iterator_advance(iter)) == ITER_OK) {
+               retval = fn(iter->refname, iter->oid, iter->flags, cb_data);
+               if (retval) {
+                       /*
+                        * If ref_iterator_abort() returns ITER_ERROR,
+                        * we ignore that error in deference to the
+                        * callback function's return value.
+                        */
+                       ref_iterator_abort(iter);
+                       goto out;
+               }
+       }
+
+out:
+       current_ref_iter = old_ref_iter;
+       if (ok == ITER_ERROR)
+               return -1;
+       return retval;
+}