[PATCH v2 44/51] do_for_each_ref_in_dir*(): take (ref_entry *) instead of (ref_dir *)
From: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
refs.c | 38 ++++++++++++++++++++++----------------
1 files changed, 22 insertions(+), 16 deletions(-)
diff --git a/refs.c b/refs.c
index 54f65e3..f6d9fe7 100644
--- a/refs.c
+++ b/refs.c
@@ -429,17 +429,20 @@ static int do_one_ref(const char *base, each_ref_fn fn, int trim,
return fn(entry->name + trim, entry->u.value.sha1, entry->flag, cb_data);
}
-static int do_for_each_ref_in_dir(struct ref_dir *dir, int offset,
+static int do_for_each_ref_in_dir(struct ref_entry *direntry, int offset,
const char *base,
each_ref_fn fn, int trim, int flags, void *cb_data)
{
int i;
+ struct ref_dir *dir;
+ assert(direntry->flag & REF_DIR);
+ dir = &direntry->u.subdir;
sort_ref_dir(dir);
for (i = offset; i < dir->nr; i++) {
struct ref_entry *entry = dir->entries[i];
int retval;
if (entry->flag & REF_DIR) {
- retval = do_for_each_ref_in_dir(&entry->u.subdir, 0,
+ retval = do_for_each_ref_in_dir(entry, 0,
base, fn, trim, flags, cb_data);
} else {
retval = do_one_ref(base, fn, trim, flags, cb_data, entry);
@@ -450,25 +453,30 @@ static int do_for_each_ref_in_dir(struct ref_dir *dir, int offset,
return 0;
}
-static int do_for_each_ref_in_dirs(struct ref_dir *dir1,
- struct ref_dir *dir2,
+static int do_for_each_ref_in_dirs(struct ref_entry *direntry1,
+ struct ref_entry *direntry2,
const char *base, each_ref_fn fn, int trim,
int flags, void *cb_data)
{
int retval;
int i1 = 0, i2 = 0;
+ struct ref_dir *dir1, *dir2;
+ assert(direntry1->flag & REF_DIR);
+ assert(direntry2->flag & REF_DIR);
+ dir1 = &direntry1->u.subdir;
+ dir2 = &direntry2->u.subdir;
sort_ref_dir(dir1);
sort_ref_dir(dir2);
while (1) {
struct ref_entry *e1, *e2, *entry;
int cmp;
if (i1 == dir1->nr) {
- return do_for_each_ref_in_dir(dir2, i2,
+ return do_for_each_ref_in_dir(direntry2, i2,
base, fn, trim, flags, cb_data);
}
if (i2 == dir2->nr) {
- return do_for_each_ref_in_dir(dir1, i1,
+ return do_for_each_ref_in_dir(direntry1, i1,
base, fn, trim, flags, cb_data);
}
e1 = dir1->entries[i1];
@@ -478,7 +486,7 @@ static int do_for_each_ref_in_dirs(struct ref_dir *dir1,
if ((e1->flag & REF_DIR) && (e2->flag & REF_DIR)) {
/* Both are directories; descend them in parallel. */
retval = do_for_each_ref_in_dirs(
- &e1->u.subdir, &e2->u.subdir,
+ e1, e2,
base, fn, trim, flags, cb_data);
i1++;
i2++;
@@ -501,7 +509,7 @@ static int do_for_each_ref_in_dirs(struct ref_dir *dir1,
}
if (entry->flag & REF_DIR) {
retval = do_for_each_ref_in_dir(
- &entry->u.subdir, 0,
+ entry, 0,
base, fn, trim, flags, cb_data);
} else {
retval = do_one_ref(base, fn, trim, flags, cb_data, entry);
@@ -563,7 +571,7 @@ static int is_refname_available(const char *refname, const char *oldrefname,
assert(direntry->flag & REF_DIR);
- if (do_for_each_ref_in_dir(&direntry->u.subdir, 0, "", name_conflict_fn,
+ if (do_for_each_ref_in_dir(direntry, 0, "", name_conflict_fn,
0, DO_FOR_EACH_INCLUDE_BROKEN,
&data)) {
error("'%s' exists; cannot create '%s'",
@@ -1161,21 +1169,20 @@ static int do_for_each_ref(const char *submodule, const char *base, each_ref_fn
if (extra_direntry)
retval = do_for_each_ref_in_dir(
- &extra_direntry->u.subdir, 0,
+ extra_direntry, 0,
base, fn, trim, flags, cb_data);
if (!retval) {
if (packed_direntry && loose_direntry)
retval = do_for_each_ref_in_dirs(
- &packed_direntry->u.subdir,
- &loose_direntry->u.subdir,
+ packed_direntry, loose_direntry,
base, fn, trim, flags, cb_data);
else if (packed_direntry)
retval = do_for_each_ref_in_dir(
- &packed_direntry->u.subdir, 0,
+ packed_direntry, 0,
base, fn, trim, flags, cb_data);
else if (loose_direntry)
retval = do_for_each_ref_in_dir(
- &loose_direntry->u.subdir, 0,
+ loose_direntry, 0,
base, fn, trim, flags, cb_data);
}
@@ -1626,8 +1633,7 @@ static int repack_without_ref(const char *refname)
unable_to_lock_error(git_path("packed-refs"), errno);
return error("cannot delete '%s' from packed refs", refname);
}
- do_for_each_ref_in_dir(&packed->u.subdir, 0,
- "", repack_without_ref_fn, 0, 0, &data);
+ do_for_each_ref_in_dir(packed, 0, "", repack_without_ref_fn, 0, 0, &data);
return commit_lock_file(&packlock);
}
--
1.7.8