summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Fleischer <lfleischer@archlinux.org>2015-06-11 17:48:48 +0200
committerLukas Fleischer <lfleischer@archlinux.org>2015-06-11 17:56:26 +0200
commita0f3060f234418993aaeee0962cfdbd25f37b940 (patch)
tree9ec240c441cb1b108be5966282480d87179f832d
parente254a3154463b5705367c925c4edb5a094506e45 (diff)
git-update: Deny non-fast-forwards
To make sure we never lose any history, non-fast-forwards are forbidden. Instead of relying on receive.denyNonFastForwards, add a simple check to the update hook. This has the added benefit of more flexibility. Signed-off-by: Lukas Fleischer <lfleischer@archlinux.org>
-rw-r--r--INSTALL1
-rwxr-xr-xgit-interface/git-update.py9
2 files changed, 9 insertions, 1 deletions
diff --git a/INSTALL b/INSTALL
index 50405df..a2a6153 100644
--- a/INSTALL
+++ b/INSTALL
@@ -29,7 +29,6 @@ Setup on Arch Linux
# cd /srv/http/aurweb/aur.git/
# git init --bare
# ln -s ../../git-interface/git-update.py hooks/update
- # git config --local receive.denyNonFastForwards true
# chown -R aur .
7) Install the git-auth wrapper script:
diff --git a/git-interface/git-update.py b/git-interface/git-update.py
index 7898f39..3f6cfc1 100755
--- a/git-interface/git-update.py
+++ b/git-interface/git-update.py
@@ -178,6 +178,15 @@ if refname != "refs/heads/master":
die("pushing to a branch other than master is restricted")
repo = pygit2.Repository(repo_path)
+
+# Detect and deny non-fast-forwards.
+if sha1_old != "0000000000000000000000000000000000000000":
+ walker = repo.walk(sha1_old, pygit2.GIT_SORT_TOPOLOGICAL)
+ walker.hide(sha1_new)
+ if next(walker, None) != None:
+ die("denying non-fast-forward (you should pull first)")
+
+# Prepare the walker that validates new commits.
walker = repo.walk(sha1_new, pygit2.GIT_SORT_TOPOLOGICAL)
if sha1_old != "0000000000000000000000000000000000000000":
walker.hide(sha1_old)