Remotes configuration API
=========================

The API in remote.h gives access to the configuration related to
remotes. It handles all three configuration mechanisms historically
and currently used by git, and presents the information in a uniform
fashion. Note that the code also handles plain URLs without any
configuration, giving them just the default information.

struct remote
-------------

`name`::

	The user's nickname for the remote

`url`::

	An array of all of the url_nr URLs configured for the remote

`push`::

	 An array of refspecs configured for pushing, with
	 push_refspec being the literal strings, and push_refspec_nr
	 being the quantity.

`fetch`::

	An array of refspecs configured for fetching, with
	fetch_refspec being the literal strings, and fetch_refspec_nr
	being the quantity.

`fetch_tags`::

	The setting for whether to fetch tags (as a separate rule from
	the configured refspecs); -1 means never to fetch tags, 0
	means to auto-follow tags based on the default heuristic, 1
	means to always auto-follow tags, and 2 means to fetch all
	tags.

`receivepack`, `uploadpack`::

	The configured helper programs to run on the remote side, for
	git-native protocols.

`http_proxy`::

	The proxy to use for curl (http, https, ftp, etc.) URLs.

struct remotes can be found by name with remote_get(), and iterated
through with for_each_remote(). remote_get(NULL) will return the
default remote, given the current branch and configuration.

struct refspec
--------------

A struct refspec holds the parsed interpretation of a refspec. If it
will force updates (starts with a '+'), force is true. If it is a
pattern (sides end with '*') pattern is true. src and dest are the two
sides (if a pattern, only the part outside of the wildcards); if there
is only one side, it is src, and dst is NULL; if sides exist but are
empty (i.e., the refspec either starts or ends with ':'), the
corresponding side is "".

This parsing can be done to an array of strings to give an array of
struct refpsecs with parse_ref_spec().

remote_find_tracking(), given a remote and a struct refspec with
either src or dst filled out, will fill out the other such that the
result is in the "fetch" specification for the remote (note that this
evaluates patterns and returns a single result).

struct branch
-------------

Note that this may end up moving to branch.h

struct branch holds the configuration for a branch. It can be looked
up with branch_get(name) for "refs/heads/{name}", or with
branch_get(NULL) for HEAD.

It contains:

`name`::

	The short name of the branch.

`refname`::

	The full path for the branch ref.

`remote_name`::

	The name of the remote listed in the configuration.

`remote`::

	The struct remote for that remote.

`merge_name`::

	An array of the "merge" lines in the configuration.

`merge`::

	An array of the struct refspecs used for the merge lines. That
	is, merge[i]->dst is a local tracking ref which should be
	merged into this branch by default.

`merge_nr`::

	The number of merge configurations

branch_has_merge_config() returns true if the given branch has merge
configuration given.

Other stuff
-----------

There is other stuff in remote.h that is related, in general, to the
process of interacting with remotes.

(Daniel Barkalow)
