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

pushurl

An array of all of the pushurl_nr push 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
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.