# ref iteration API

Iteration of refs is done by using an iterate function which will call a callback function for every ref. The callback function has this signature:

    int handle_one_ref(const char *refname, const struct object_id *oid,
    		   int flags, void *cb_data);

There are different kinds of iterate functions which all take a callback of this type. The callback is then called for each found ref until the callback returns nonzero. The returned value is then also returned by the iterate function.

## Iteration functions

- `head_ref()` just iterates the head ref.

- `for_each_ref()` iterates all refs.

- `for_each_ref_in()` iterates all refs which have a defined prefix and strips that prefix from the passed variable refname.

- `for_each_tag_ref()`, `for_each_branch_ref()`, `for_each_remote_ref()`, `for_each_replace_ref()` iterate refs from the respective area.

- `for_each_glob_ref()` iterates all refs that match the specified glob pattern.

- `for_each_glob_ref_in()` the previous and `for_each_ref_in()` combined.

- Use `refs_` API for accessing submodules. The submodule ref store could be obtained with `get_submodule_ref_store()`.

- `for_each_rawref()` can be used to learn about broken ref and symref.

- `for_each_reflog()` iterates each reflog file.

## Submodules

If you want to iterate the refs of a submodule you first need to add the submodules object database. You can do this by a code-snippet like this:

    const char *path = "path/to/submodule"
    if (add_submodule_odb(path))
    	die("Error submodule '%s' not populated.", path);

`add_submodule_odb()` will return zero on success. If you do not do this you will get an error for each ref that it does not point to a valid object.

Note: As a side-effect of this you can not safely assume that all objects you lookup are available in superproject. All submodule objects will be available the same way as the superprojects objects.

## Example:

    static int handle_remote_ref(const char *refname,
    		const unsigned char *sha1, int flags, void *cb_data)
    {
    	struct strbuf *output = cb_data;
    	strbuf_addf(output, "%s\n", refname);
    	return 0;
    }

    ...

    	struct strbuf output = STRBUF_INIT;
    	for_each_remote_ref(handle_remote_ref, &output);
    	printf("%s", output.buf);