push: introduce REJECT_FETCH_FIRST and REJECT_NEEDS_FORCE
authorJunio C Hamano <gitster@pobox.com>
Wed, 23 Jan 2013 21:55:30 +0000 (13:55 -0800)
committerJunio C Hamano <gitster@pobox.com>
Thu, 24 Jan 2013 22:37:23 +0000 (14:37 -0800)
commit75e5c0dc5529aed42122b3a774e6b17383e51b66
tree78600fde190fede594ec314d81bbc817220a8bf6
parent0f4d498dbecbc1b6da66f926df3bc12446bd44dd
push: introduce REJECT_FETCH_FIRST and REJECT_NEEDS_FORCE

When we push to update an existing ref, if:

 * the object at the tip of the remote is not a commit; or
 * the object we are pushing is not a commit,

it won't be correct to suggest to fetch, integrate and push again,
as the old and new objects will not "merge".  We should explain that
the push must be forced when there is a non-committish object is
involved in such a case.

If we do not have the current object at the tip of the remote, we do
not even know that object, when fetched, is something that can be
merged.  In such a case, suggesting to pull first just like
non-fast-forward case may not be technically correct, but in
practice, most such failures are seen when you try to push your work
to a branch without knowing that somebody else already pushed to
update the same branch since you forked, so "pull first" would work
as a suggestion most of the time.  And if the object at the tip is
not a commit, "pull first" will fail, without making any permanent
damage.  As a side effect, it also makes the error message the user
will get during the next "push" attempt easier to understand, now
the user is aware that a non-commit object is involved.

In these cases, the current code already rejects such a push on the
client end, but we used the same error and advice messages as the
ones used when rejecting a non-fast-forward push, i.e. pull from
there and integrate before pushing again.

Introduce new rejection reasons and reword the messages
appropriately.

[jc: with help by Peff on message details]

Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/config.txt
advice.c
advice.h
builtin/push.c
builtin/send-pack.c
cache.h
remote.c
send-pack.c
transport-helper.c
transport.c
transport.h