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 unsigned char *sha1,
			   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.

* `head_ref_submodule()`, `for_each_ref_submodule()`,
  `for_each_ref_in_submodule()`, `for_each_tag_ref_submodule()`,
  `for_each_branch_ref_submodule()`, `for_each_remote_ref_submodule()`
  do the same as the functions described above but for a specified
  submodule.

* `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 an non-zero value 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);
----
