refs/files: extract function to iterate through root refs

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>
This commit is contained in:
Patrick Steinhardt
2024-06-06 07:29:20 +02:00
committed by Junio C Hamano
parent 66275a6311
commit 120b67172f

View 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,