X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=receive-pack.c;h=ea2dbd4e3398ca90823dcd453cbb52c5dcea135c;hb=e70866f53a8d31cde6cfff6396ba0d1f64029afb;hp=78f75da5ca99bd5457fd4e0f6e3af2737afc335a;hpb=7bbf88c52b202d543310123e1bad9a44b2d6f028;p=git.git diff --git a/receive-pack.c b/receive-pack.c index 78f75da5c..ea2dbd4e3 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 "; @@ -127,6 +129,21 @@ 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, *ent; + + old_commit = (struct commit *)parse_object(old_sha1); + new_commit = (struct commit *)parse_object(new_sha1); + bases = get_merge_bases(old_commit, new_commit, 1); + for (ent = bases; ent; ent = ent->next) + if (!hashcmp(old_sha1, ent->item->object.sha1)) + break; + free_commit_list(bases); + if (!ent) + 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);