diff options
author | Junio C Hamano <junkio@cox.net> | 2006-09-27 22:23:12 -0700 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-09-27 22:23:12 -0700 |
commit | 2958d9b5dbebeb82e7230bbfd3f421781d90f3f7 (patch) | |
tree | 881c16a7442a1829d8959aee272f50065c53b582 /receive-pack.c | |
parent | 194db7e3bbab9669c511133549e6ae74481c9a4f (diff) | |
parent | 51b2dd4e3f730f6be6c19faf3b4a04caea9e0420 (diff) | |
download | git-2958d9b5dbebeb82e7230bbfd3f421781d90f3f7.tar.gz |
Merge branch 'master' into lj/refs
* master: (72 commits)
runstatus: do not recurse into subdirectories if not needed
grep: fix --fixed-strings combined with expression.
grep: free expressions and patterns when done.
Corrected copy-and-paste thinko in ignore executable bit test case.
An illustration of rev-list --parents --pretty=raw
Allow git-checkout when on a non-existant branch.
gitweb: Decode long title for link tooltips
git-svn: Fix fetch --no-ignore-externals with GIT_SVN_NO_LIB=1
Ignore executable bit when adding files if filemode=0.
Remove empty ref directories that prevent creating a ref.
Use const for interpolate arguments
git-archive: update documentation
Deprecate merge-recursive.py
gitweb: fix over-eager application of esc_html().
Allow '(no author)' in git-svn's authors file.
Allow 'svn fetch' on '(no date)' revisions in Subversion.
git-repack: allow git-repack to run in subdirectory
Remove upload-tar and make git-tar-tree a thin wrapper to git-archive
git-tar-tree: Move code for git-archive --format=tar to archive-tar.c
git-tar-tree: Remove duplicate git_config() call
...
Diffstat (limited to 'receive-pack.c')
-rw-r--r-- | receive-pack.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/receive-pack.c b/receive-pack.c index c8aacbbdd3..1fcf3a9112 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>"; @@ -94,6 +96,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"); + } if (run_update_hook(name, old_hex, new_hex)) { cmd->error_string = "hook declined"; return error("hook declined to update %s", name); |