add receive.denyNonFastforwards config variable

If receive.denyNonFastforwards is set to true, git-receive-pack will deny
non fast-forwards, i.e. forced updates. Most notably, a push to a repository
which has that flag set will fail.

As a first user, 'git-init-db --shared' sets this flag, since in a shared
setup, you are most unlikely to want forced pushes to succeed.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Johannes Schindelin
2006-09-21 01:07:54 +02:00
committed by Junio C Hamano
parent 7dd45e15c2
commit 11031d7e9f
5 changed files with 21 additions and 0 deletions

View File

@ -2,6 +2,8 @@
#include "refs.h"
#include "pkt-line.h"
#include "run-command.h"
#include "commit.h"
#include "object.h"
static const char receive_pack_usage[] = "git-receive-pack <git-dir>";
@ -127,6 +129,20 @@ static int update(struct command *cmd)
return error("unpack should have generated %s, "
"but I can't find it!", new_hex);
}
if (deny_non_fast_forwards && !is_null_sha1(old_sha1)) {
struct commit *old_commit, *new_commit;
struct commit_list *bases;
old_commit = (struct commit *)parse_object(old_sha1);
new_commit = (struct commit *)parse_object(new_sha1);
for (bases = get_merge_bases(old_commit, new_commit, 1);
bases; bases = bases->next)
if (!hashcmp(old_sha1, bases->item->object.sha1))
break;
if (!bases)
return error("denying non-fast forward;"
" you should pull first");
}
safe_create_leading_directories(lock_name);
newfd = open(lock_name, O_CREAT | O_EXCL | O_WRONLY, 0666);