diff options
author | Johannes Schindelin <Johannes.Schindelin@gmx.de> | 2006-09-21 01:07:54 +0200 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-09-20 16:15:45 -0700 |
commit | 11031d7e9f34f6a20ff4a4bd4fa3e5e3c0024a57 (patch) | |
tree | 681e2b85be05abc18b3fdd117b9aa18af4245c01 /receive-pack.c | |
parent | 7dd45e15c259e44b1c8b5ffdfc0c3d002c7f642c (diff) | |
download | git-11031d7e9f34f6a20ff4a4bd4fa3e5e3c0024a57.tar.gz git-11031d7e9f34f6a20ff4a4bd4fa3e5e3c0024a57.tar.xz |
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>
Diffstat (limited to 'receive-pack.c')
-rw-r--r-- | receive-pack.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/receive-pack.c b/receive-pack.c index 78f75da5c..a6ec9f900 100644 --- a/receive-pack.c +++ b/receive-pack.c @@ -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); |