summaryrefslogtreecommitdiff
path: root/refs.c
diff options
context:
space:
mode:
authorMichael Haggerty <mhagger@alum.mit.edu>2012-04-25 00:45:11 +0200
committerJunio C Hamano <gitster@pobox.com>2012-05-03 13:15:09 -0700
commitf348ac923c9f834c3cdc434e6266872cf5710b71 (patch)
tree659f2fb53d0cf3a066f0695bfc8e880cb481e789 /refs.c
parentabc390989f1086aa3a8620a81f87622a78cf393b (diff)
downloadgit-f348ac923c9f834c3cdc434e6266872cf5710b71.tar.gz
refs.c: extract function search_for_subdir()
Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'refs.c')
-rw-r--r--refs.c34
1 files changed, 24 insertions, 10 deletions
diff --git a/refs.c b/refs.c
index 113739f14f..9471b1d8a6 100644
--- a/refs.c
+++ b/refs.c
@@ -277,6 +277,27 @@ static struct ref_entry *search_ref_dir(struct ref_dir *dir, const char *refname
}
/*
+ * Search for a directory entry directly within dir (without
+ * recursing). Sort dir if necessary. subdirname must be a directory
+ * name (i.e., end in '/'). If mkdir is set, then create the
+ * directory if it is missing; otherwise, return NULL if the desired
+ * directory cannot be found.
+ */
+static struct ref_entry *search_for_subdir(struct ref_dir *dir,
+ const char *subdirname, int mkdir)
+{
+ struct ref_entry *entry = search_ref_dir(dir, subdirname);
+ if (!entry) {
+ if (!mkdir)
+ return NULL;
+ entry = create_dir_entry(subdirname);
+ add_entry_to_dir(dir, entry);
+ }
+ assert(entry->flag & REF_DIR);
+ return entry;
+}
+
+/*
* If refname is a reference name, find the ref_dir within the dir
* tree that should hold refname. If refname is a directory name
* (i.e., ends in '/'), then return that ref_dir itself. dir must
@@ -294,17 +315,10 @@ static struct ref_dir *find_containing_dir(struct ref_dir *dir,
for (slash = strchr(refname_copy, '/'); slash; slash = strchr(slash + 1, '/')) {
char tmp = slash[1];
slash[1] = '\0';
- entry = search_ref_dir(dir, refname_copy);
- if (!entry) {
- if (!mkdir) {
- dir = NULL;
- break;
- }
- entry = create_dir_entry(refname_copy);
- add_entry_to_dir(dir, entry);
- }
+ entry = search_for_subdir(dir, refname_copy, mkdir);
slash[1] = tmp;
- assert(entry->flag & REF_DIR);
+ if (!entry)
+ break;
dir = &entry->u.subdir;
}