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 cannot 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);
----
