receive-pack.c: use a single transaction when atomic-push is negotiated

Update receive-pack to use an atomic transaction IFF the client negotiated
that it wanted atomic-push.
This leaves the default behaviour to be the old non-atomic one ref at a
time update. This is to cause as little disruption as possible to existing
clients. It is unknown if there are client scripts that depend on the old
non-atomic behaviour so we make it opt-in for now.

Later patch in this series also adds a configuration variable where you can
override the atomic push behaviour on the receiving repo and force it
to use atomic updates always.

If it turns out over time that there are no client scripts that depend on the
old behaviour we can change git to default to use atomic pushes by default
and instead offer an opt-out argument for people that do not want atomic
updates at all.

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
receive-pack.c: add receive.atomicpush configuration option

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
push.c: add an --atomic-push argument

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
refs.c: add a public is_branch function

Both refs.c and fsck.c have their own private copies of the is_branch function.
Delete the is_branch function from fsck.c and make the version in refs.c
public.

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
refs.c: create a public function for is_refname_available

Export a generic is_refname_available_function(). We will need this
as a public shared function later when we add additional refs backends
since we want to keep using the same rules for refnaming across
all backends.

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
refs-common.c: create a file to host all common refs code

Create refs-common.c which will hold all backend agnostic code that can be
used with any backend.

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
refs-common.c: move update_ref to refs-common.c

This change moves update_ref() to the refs-common.c file since this function
does not contain any backend specific code.

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
refs-common.c: move delete_ref to the common code

This change moves delete_ref() to the refs-common.c file since this function
does not contain any backend specific code.

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
refs-common.c: move rename_ref to the common code

This change moves rename_ref() to the refs-common.c file since this function
does not contain any backend specific code.

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
refs-common.c: move read_ref_at to the refs common file

This change moves read_ref_at() to the refs-common.c file since this function
does not contain any backend specific code.

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
refs-common.c: move the hidden refs functions to the common code

This change moves the hidden refs functions to the refs-common.c file since
these functions do not contain any backend specific code.

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
refs-common.c: move dwim and friend functions to refs common

These functions do not contain any backend specific code so we can move
them to the common code and share across all backends.

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
refs-common.c: move warn_if_dangling_symref* to refs-common

These functions do not use any backend specific code so we can move
them to the common code.

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
refs-common.c: move read_ref, read_ref_full and ref_exists to common

These functions do not depend on the backend implementation so we
can move them to the common code.

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
refs-common.c: move resolve_refdup to common

This function can be shared across all refs backends so move it
to the common code.

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
refs-common.c: move check_refname_component to the common code

This function does not contain any backend specific code so we
can move it to the common code.

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
refs-common.c: move is_branch to the common code

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
refs-common.c: move names_conflict to the common code

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
refs-common.c: move prettify_refname to the common code

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>
refs-common.c: more iterators to refs common

Signed-off-by: Ronnie Sahlberg <sahlberg@google.com>