summaryrefslogtreecommitdiffstats
path: root/t/repo-specific-hooks.t
diff options
context:
space:
mode:
Diffstat (limited to 't/repo-specific-hooks.t')
-rwxr-xr-xt/repo-specific-hooks.t231
1 files changed, 231 insertions, 0 deletions
diff --git a/t/repo-specific-hooks.t b/t/repo-specific-hooks.t
new file mode 100755
index 0000000..90a23c6
--- /dev/null
+++ b/t/repo-specific-hooks.t
@@ -0,0 +1,231 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+
+# this is hardcoded; change it if needed
+use lib "src/lib";
+use Gitolite::Test;
+
+# test script for partial copy feature
+# ----------------------------------------------------------------------
+
+try "plan 128";
+my $h = $ENV{HOME};
+my $rb = `gitolite query-rc -n GL_REPO_BASE`;
+
+try 'cd tsh_tempdir; mkdir -p local/hooks/repo-specific';
+
+foreach my $h (qw/first second/) {
+ put "local/hooks/repo-specific/$h", "#!/bin/sh
+echo \$0
+if [ \$# -ne 0 ]; then
+ echo \$0 has args: \$@
+else
+ echo \$0 has stdin: `cat`
+fi
+";
+}
+try 'chmod +x local/hooks/repo-specific/*';
+
+try 'pwd';
+my $tempdir = join("\n", sort (lines()));
+try 'cd gitolite-admin';
+
+try "# Enable LOCAL_CODE and repo-specific-hooks
+ cat $h/.gitolite.rc
+ perl s/# 'repo-specific-hooks'/'repo-specific-hooks'/
+ perl s%# LOCAL_CODE%LOCAL_CODE => '$tempdir/local', #%
+ put $h/.gitolite.rc
+";
+
+confreset;confadd '
+ repo foo
+ RW+ = @all
+
+ repo bar
+ RW+ = @all
+
+ repo baz
+ RW+ = @all
+
+ repo frob
+ RW+ = @all
+';
+
+try "ADMIN_PUSH repo-specific-hooks-0; !/FATAL/" or die text();
+
+try "
+ /Init.*empty.*foo\\.git/
+ /Init.*empty.*bar\\.git/
+ /Init.*empty.*baz\\.git/
+ /Init.*empty.*frob\\.git/
+";
+
+my $failing_hook = "#!/bin/sh
+exit 1
+";
+
+# Place a existing hooks in repos
+put "$rb/foo.git/hooks/post-recieve", $failing_hook;
+put "$rb/bar.git/hooks/pre-recieve", $failing_hook;
+put "$rb/baz.git/hooks/post-update", $failing_hook;
+put "$rb/frob.git/hooks/post-update", $failing_hook;
+
+try "# Verify hooks
+ ls -l $rb/foo.git/hooks/*; ok; !/post-receive -. .*local/hooks/multi-hook-driver/
+ ls -l $rb/bar.git/hooks/*; ok; !/pre-receive -. .*local/hooks/multi-hook-driver/
+ ls -l $rb/baz.git/hooks/*; ok; !/post-update -. .*local/hooks/multi-hook-driver/
+ ls -l $rb/frob.git/hooks/*; ok; !/post-update -. .*local/hooks/multi-hook-driver/
+";
+
+confreset;confadd '
+ repo foo
+ RW+ = @all
+ option hook.post-receive = first
+
+ repo bar
+ RW+ = @all
+ option hook.pre-receive = first second
+
+ repo baz
+ RW+ = @all
+ option hook.post-receive = first
+ option hook.post-update = first second
+
+ repo frob
+ RW+ = @all
+ option hook.post-receive.b = first
+ option hook.post-receive.a = second
+
+ repo gitolite-admin
+ option hook.post-receive = second
+';
+
+
+try "ADMIN_PUSH repo-specific-hooks-1; !/FATAL/" or die text();
+
+try "# Verify hooks
+ ls -l $rb/foo.git/hooks/*; ok; /post-receive.h00-first/
+ !/post-receive.h01/
+ /post-receive -. .*local/hooks/multi-hook-driver/
+ ls -l $rb/bar.git/hooks/*; ok; /pre-receive.h00-first/
+ /pre-receive.h01-second/
+ /pre-receive -. .*local/hooks/multi-hook-driver/
+ ls -l $rb/baz.git/hooks/*; ok; /post-receive.h00-first/
+ /post-update.h00-first/
+ /post-update.h01-second/
+ /post-update -. .*local/hooks/multi-hook-driver/
+ ls -l $rb/frob.git/hooks/*; ok; /post-receive.h00-second/
+ /post-receive.h01-first/
+ /post-receive -. .*local/hooks/multi-hook-driver/
+ ls -l $rb/gitolite-admin.git/hooks/*
+ ok; /post-receive.h/
+ /post-receive -. .*local/hooks/multi-hook-driver/
+ !/post-update -. .*local/hooks/multi-hook-driver/
+";
+
+try "
+ cd ..
+
+ # Single hook still works
+ [ -d foo ]; !ok;
+ CLONE admin foo; ok; /empty/; /cloned/
+ cd foo
+ tc a1; ok; /ee47f8b/
+ PUSH admin master; ok; /new.*master -. master/
+ /hooks/post-receive.h00-first/
+ !/post-receive.*has args:/
+ /post-receive.h00-first has stdin: 0000000000000000000000000000000000000000 ee47f8b6be2160ad1a3f69c97a0cb3d488e6657e refs/heads/master/
+
+ cd ..
+
+ # Multiple hooks fired
+ [ -d bar ]; !ok;
+ CLONE admin bar; ok; /empty/; /cloned/
+ cd bar
+ tc a2; ok; /cfc8561/
+ PUSH admin master; ok; /new.*master -. master/
+ /hooks/pre-receive.h00-first/
+ !/hooks/pre-recieve.*has args:/
+ /hooks/pre-receive.h00-first has stdin: 0000000000000000000000000000000000000000 cfc8561c7827a8b94df6c5dad156383d4cb210f5 refs/heads/master/
+ /hooks/pre-receive.h01-second/
+ !/hooks/pre-receive.h01.*has args:/
+ /hooks/pre-receive.h01-second has stdin: 0000000000000000000000000000000000000000 cfc8561c7827a8b94df6c5dad156383d4cb210f5 refs/heads/master/
+
+ cd ..
+
+ # Post-update has stdin instead of arguments
+ [ -d baz ]; !ok;
+ CLONE admin baz; ok; /empty/; /cloned/
+ cd baz
+ tc a3; ok; /2863617/
+ PUSH admin master; ok; /new.*master -. master/
+ /hooks/post-receive.h00-first/
+ !/hooks/post-receive.h00.*has args:/
+ /hooks/post-receive.h00-first has stdin: 0000000000000000000000000000000000000000 28636171ae703f42fb17c312c6b6a078ed07a2cd refs/heads/master/
+ /hooks/post-update.h00-first/
+ /hooks/post-update.h00-first has args: refs/heads/master/
+ !/hooks/post-update.h00.*has stdin:/
+ /hooks/post-update.h01-second/
+ /hooks/post-update.h01-second has args: refs/heads/master/
+ !/hooks/post-update.h01.*has stdin:/
+";
+
+# Verify hooks are removed properly
+
+confadd '
+ repo foo
+ RW+ = @all
+ option hook.post-receive = ""
+
+ repo bar
+ RW+ = @all
+ option hook.pre-receive = second
+
+ repo baz
+ RW+ = @all
+ option hook.post-receive = ""
+ option hook.post-update = second
+';
+
+try "ADMIN_PUSH repo-specific-hooks-02; !/FATAL/" or die text();
+
+try "
+ ls $rb/foo.git/hooks/*; ok; !/post-receive.h0/
+ ls $rb/bar.git/hooks/*; ok; !/pre-receive.*first/
+ /pre-receive.h00-second/
+ ls $rb/baz.git/hooks/*; ok; !/post-receive.h0/
+ !/post-update.*first/
+ /post-update.h00-second/
+";
+
+try "
+ cd ..
+
+ # Foo has no hooks
+ cd foo
+ tc b1; ok; /7ef69de/
+ PUSH admin master; ok; /master -. master/
+ !/hooks/post-receive/
+
+ cd ..
+
+ # Bar only has the second hook
+ cd bar
+ tc b2; ok; /cc7808f/
+ PUSH admin master; ok; /master -. master/
+ /hooks/pre-receive.h00-second/
+ !/hooks/pre-receive.*has args:/
+ /hooks/pre-receive.h00-second has stdin: cfc8561c7827a8b94df6c5dad156383d4cb210f5 cc7808f77c7c7d705f82dc54dc3152146175768f refs/heads/master/
+
+ cd ..
+
+ # Baz has no post-receive and keeps the second hook for post-update
+ cd baz
+ tc b3; ok; /8d20101/
+ PUSH admin master; ok; /master -. master/
+ !/hooks/post-receive.*/
+ /hooks/post-update.h00-second/
+ /hooks/post-update.h00-second has args: refs/heads/master/
+ !/hooks/post-update.*has stdin/
+";