aboutsummaryrefslogtreecommitdiffstats
path: root/git-cvsserver.perl
diff options
context:
space:
mode:
authorAndy Parkins <andyparkins@gmail.com>2007-02-13 15:12:45 +0000
committerJunio C Hamano <junkio@cox.net>2007-02-14 02:15:42 -0800
commitb2741f63d43a17ce9dafd1f97614bd6dbba72887 (patch)
tree20bd1ab19f6418c8f09aaab2ddfb953c7fac4aea /git-cvsserver.perl
parent437b1b20df4b356c9342dac8d38849f24ef44f27 (diff)
downloadgit-b2741f63d43a17ce9dafd1f97614bd6dbba72887.tar.gz
Have git-cvsserver call hooks/update before really altering the ref
git-cvsserver is analogous to git-receive-pack; a checking from a cvs client to a central server is like a git-push from a working repository. Therefore it's nice to use the same access control (and email sending) that a receive-pack would perform. This patch tests for an executable update hook; if it is it is run with the ref being updated and the old and new hashes as normal. If the update hook returns an error code the update is aborted and the ref is never updated. The cvsserver returns "error 1" to the client to signal there was an EPERM error. Signed-off-by: Andy Parkins <andyparkins@gmail.com> Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'git-cvsserver.perl')
-rwxr-xr-xgit-cvsserver.perl15
1 files changed, 15 insertions, 0 deletions
diff --git a/git-cvsserver.perl b/git-cvsserver.perl
index 9371788fab..84520e7ad5 100755
--- a/git-cvsserver.perl
+++ b/git-cvsserver.perl
@@ -1171,6 +1171,21 @@ sub req_ci
exit;
}
+ # Check that this is allowed, just as we would with a receive-pack
+ my @cmd = ( $ENV{GIT_DIR}.'hooks/update', "refs/heads/$state->{module}",
+ $parenthash, $commithash );
+ if( -x $cmd[0] ) {
+ unless( system( @cmd ) == 0 )
+ {
+ $log->warn("Commit failed (update hook declined to update ref)");
+ print "error 1 Commit failed (update hook declined)\n";
+ close LOCKFILE;
+ unlink($lockfile);
+ chdir "/";
+ exit;
+ }
+ }
+
print LOCKFILE $commithash;
$updater->update();