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