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