summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Johannes Schindelin <Johannes.Schindelin@gmx.de>2006-09-21 01:07:54 +0200
committerLibravatar Junio C Hamano <junkio@cox.net>2006-09-20 16:15:45 -0700
commit11031d7e9f34f6a20ff4a4bd4fa3e5e3c0024a57 (patch)
tree681e2b85be05abc18b3fdd117b9aa18af4245c01
parentsha1_name.c: understand "describe" output as a valid object name (diff)
downloadtgif-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>
-rw-r--r--builtin-init-db.c1
-rw-r--r--cache.h1
-rw-r--r--environment.c1
-rw-r--r--receive-pack.c16
-rw-r--r--setup.c2
5 files changed, 21 insertions, 0 deletions
diff --git a/builtin-init-db.c b/builtin-init-db.c
index 5085018e46..c3ed1ce492 100644
--- a/builtin-init-db.c
+++ b/builtin-init-db.c
@@ -311,6 +311,7 @@ int cmd_init_db(int argc, const char **argv, const char *prefix)
*/
sprintf(buf, "%d", shared_repository);
git_config_set("core.sharedrepository", buf);
+ git_config_set("receive.denyNonFastforwards", "true");
}
return 0;
diff --git a/cache.h b/cache.h
index d557e75eb2..ef2e581475 100644
--- a/cache.h
+++ b/cache.h
@@ -188,6 +188,7 @@ extern int prefer_symlink_refs;
extern int log_all_ref_updates;
extern int warn_ambiguous_refs;
extern int shared_repository;
+extern int deny_non_fast_forwards;
extern const char *apply_default_whitespace;
extern int zlib_compression_level;
diff --git a/environment.c b/environment.c
index 84d870ca4e..63b1d155be 100644
--- a/environment.c
+++ b/environment.c
@@ -20,6 +20,7 @@ int warn_ambiguous_refs = 1;
int repository_format_version;
char git_commit_encoding[MAX_ENCODING_LENGTH] = "utf-8";
int shared_repository = PERM_UMASK;
+int deny_non_fast_forwards = 0;
const char *apply_default_whitespace;
int zlib_compression_level = Z_DEFAULT_COMPRESSION;
int pager_in_use;
diff --git a/receive-pack.c b/receive-pack.c
index 78f75da5ca..a6ec9f900d 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);
diff --git a/setup.c b/setup.c
index 2afdba414a..9a46a58a4a 100644
--- a/setup.c
+++ b/setup.c
@@ -244,6 +244,8 @@ int check_repository_format_version(const char *var, const char *value)
repository_format_version = git_config_int(var, value);
else if (strcmp(var, "core.sharedrepository") == 0)
shared_repository = git_config_perm(var, value);
+ else if (strcmp(var, "receive.denynonfastforwards") == 0)
+ deny_non_fast_forwards = git_config_bool(var, value);
return 0;
}