do_for_each_ref_in_array(): new function
authorMichael Haggerty <mhagger@alum.mit.edu>
Tue, 10 Apr 2012 05:30:15 +0000 (07:30 +0200)
committerJunio C Hamano <gitster@pobox.com>
Tue, 10 Apr 2012 22:51:52 +0000 (15:51 -0700)
Extract function do_for_each_ref_in_array() from do_for_each_ref().
The new function will be a useful building block for storing refs
hierarchically.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
refs.c
diff --git a/refs.c b/refs.c
index 86e05dbd84d296034317db3d3de2019ef14decc9..d9dffc320f32fdd903c17fb8375337ed3830feb1 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -268,6 +268,25 @@ static int do_one_ref(const char *base, each_ref_fn fn, int trim,
        return retval;
 }
 
+/*
+ * Call fn for each reference in array that has index in the range
+ * offset <= index < array->nr.  This function does not sort the
+ * array; sorting should be done by the caller.
+ */
+static int do_for_each_ref_in_array(struct ref_array *array, int offset,
+                                   const char *base,
+                                   each_ref_fn fn, int trim, int flags, void *cb_data)
+{
+       int i;
+       assert(array->sorted == array->nr);
+       for (i = offset; i < array->nr; i++) {
+               int retval = do_one_ref(base, fn, trim, flags, cb_data, array->refs[i]);
+               if (retval)
+                       return retval;
+       }
+       return 0;
+}
+
 /*
  * Return true iff a reference named refname could be created without
  * conflicting with the name of an existing reference.  If oldrefname
@@ -878,16 +897,10 @@ static int do_for_each_ref(const char *submodule, const char *base, each_ref_fn
                        return retval;
        }
 
-       if (l < loose->nr) {
-               p = l;
-               packed = loose;
-       }
-
-       for (; p < packed->nr; p++) {
-               retval = do_one_ref(base, fn, trim, flags, cb_data, packed->refs[p]);
-               if (retval)
-                       return retval;
-       }
+       if (l < loose->nr)
+               return do_for_each_ref_in_array(loose, l, base, fn, trim, flags, cb_data);
+       if (p < packed->nr)
+               return do_for_each_ref_in_array(packed, p, base, fn, trim, flags, cb_data);
 
        return 0;
 }