]> git.ipfire.org Git - thirdparty/git.git/commitdiff
refs/files: extract function to iterate through root refs
authorPatrick Steinhardt <ps@pks.im>
Thu, 6 Jun 2024 05:29:20 +0000 (07:29 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 6 Jun 2024 16:04:32 +0000 (09:04 -0700)
Extract a new function that can be used to iterate through all root refs
known to the "files" backend. This will be used in the next commit,
where we start to teach ref backends to remove themselves.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
refs/files-backend.c

index b4e5437ffeb674fd56cd2f246c1fedd40343fc5c..de8cc83174007fa78fd25d3b227db6d1a6fd77da 100644 (file)
@@ -323,17 +323,15 @@ static void loose_fill_ref_dir(struct ref_store *ref_store,
        add_per_worktree_entries_to_dir(dir, dirname);
 }
 
-/*
- * Add root refs to the ref dir by parsing the directory for any files which
- * follow the root ref syntax.
- */
-static void add_root_refs(struct files_ref_store *refs,
-                         struct ref_dir *dir)
+static int for_each_root_ref(struct files_ref_store *refs,
+                            int (*cb)(const char *refname, void *cb_data),
+                            void *cb_data)
 {
        struct strbuf path = STRBUF_INIT, refname = STRBUF_INIT;
        const char *dirname = refs->loose->root->name;
        struct dirent *de;
        size_t dirnamelen;
+       int ret;
        DIR *d;
 
        files_ref_path(refs, &path, dirname);
@@ -341,7 +339,7 @@ static void add_root_refs(struct files_ref_store *refs,
        d = opendir(path.buf);
        if (!d) {
                strbuf_release(&path);
-               return;
+               return -1;
        }
 
        strbuf_addstr(&refname, dirname);
@@ -357,14 +355,49 @@ static void add_root_refs(struct files_ref_store *refs,
                strbuf_addstr(&refname, de->d_name);
 
                dtype = get_dtype(de, &path, 1);
-               if (dtype == DT_REG && is_root_ref(de->d_name))
-                       loose_fill_ref_dir_regular_file(refs, refname.buf, dir);
+               if (dtype == DT_REG && is_root_ref(de->d_name)) {
+                       ret = cb(refname.buf, cb_data);
+                       if (ret)
+                               goto done;
+               }
 
                strbuf_setlen(&refname, dirnamelen);
        }
+
+       ret = 0;
+
+done:
        strbuf_release(&refname);
        strbuf_release(&path);
        closedir(d);
+       return ret;
+}
+
+struct fill_root_ref_data {
+       struct files_ref_store *refs;
+       struct ref_dir *dir;
+};
+
+static int fill_root_ref(const char *refname, void *cb_data)
+{
+       struct fill_root_ref_data *data = cb_data;
+       loose_fill_ref_dir_regular_file(data->refs, refname, data->dir);
+       return 0;
+}
+
+/*
+ * Add root refs to the ref dir by parsing the directory for any files which
+ * follow the root ref syntax.
+ */
+static void add_root_refs(struct files_ref_store *refs,
+                         struct ref_dir *dir)
+{
+       struct fill_root_ref_data data = {
+               .refs = refs,
+               .dir = dir,
+       };
+
+       for_each_root_ref(refs, fill_root_ref, &data);
 }
 
 static struct ref_cache *get_loose_ref_cache(struct files_ref_store *refs,