diff options
Diffstat (limited to '')
-rwxr-xr-x | t/branch-perms.t | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/t/branch-perms.t b/t/branch-perms.t new file mode 100755 index 0000000..e59baea --- /dev/null +++ b/t/branch-perms.t @@ -0,0 +1,122 @@ +#!/usr/bin/perl +use strict; +use warnings; + +# this is hardcoded; change it if needed +use lib "src/lib"; +use Gitolite::Test; + +# branch permissions test +# ---------------------------------------------------------------------- + +try "plan 82"; + +confreset;confadd ' + @g1 = u1 + @g2 = u2 + @g3 = u3 + @gaa = aa + repo @gaa + RW+ = @g1 + RW = @g2 + RW+ master = @g3 + RW master = u4 + - master = u5 + RW+ dev = u5 + RW = u5 + +'; + +try "ADMIN_PUSH set1; !/FATAL/" or die text(); + +try " + cd ..; ok + glt clone u1 file:///aa; ok + cd aa; ok + tc l-995 l-996 l-997 l-998 l-999 l-1000 l-1001 l-1002 l-1003; + ok; /master a788db9. l-1003/ + glt push u1 origin HEAD; ok; /To file:///aa/ + /\\* \\[new branch\\] HEAD -> master/ + + git branch dev; ok + git branch foo; ok + + # u1 rewind master succeed + git reset --hard HEAD^; ok; /HEAD is now at 65d5f4a l-1002/ + tc v-865; ok; /master 3053bb4. v-865/ + glt push u1 origin +master; ok; /\\+ a788db9...3053bb4 master -> master \\(forced update\\)/ + + # u2 rewind master fail + git reset --hard HEAD^; ok; /HEAD is now at 65d5f4a l-1002/ + tc s-361; ok; /master b331651. s-361/ + glt push u2 file:///aa +master; !ok; reject + /\\+ refs/heads/master aa u2 DENIED by fallthru/ + + # u3 rewind master succeed + git reset --hard HEAD^; ok + tc m-508; ok + glt push u3 file:///aa +master; ok; /\\+ .* master -> master \\(forced update\\)/ + + # u4 push master succeed + tc f-526; ok; + glt push u4 file:///aa master; ok; /master -> master/ + + # u4 rewind master fail + git reset --hard HEAD^; ok; + glt push u4 file:///aa +master; !ok; /\\+ refs/heads/master aa u4 DENIED by fallthru/ + + # u3 and u4 / dev foo -- all 4 fail + glt push u3 file:///aa dev; !ok; /W refs/heads/dev aa u3 DENIED by fallthru/ + glt push u4 file:///aa dev; !ok; /W refs/heads/dev aa u4 DENIED by fallthru/ + glt push u3 file:///aa foo; !ok; /W refs/heads/foo aa u3 DENIED by fallthru/ + glt push u4 file:///aa foo; !ok; /W refs/heads/foo aa u4 DENIED by fallthru/ + + # clean up for next set + glt push u1 -f origin master dev foo + ok + + # u5 push master fail + tc l-417; ok + glt push u5 file:///aa master; !ok; /W refs/heads/master aa u5 DENIED by refs/heads/master/ + + # u5 rewind dev succeed + glt push u5 file:///aa +dev^:dev + ok; /\\+ .* dev\\^ -> dev \\(forced update\\)/ + + # u5 rewind foo fail + glt push u5 file:///aa +foo^:foo + !ok; /\\+ refs/heads/foo aa u5 DENIED by fallthru/ + + # u5 tries to push foo; succeeds + git checkout foo; ok; /Switched to branch 'foo'/ + + # u5 push foo succeed + tc e-530; ok; + glt push u5 file:///aa foo; ok; /foo -> foo/ + + # u1 delete branch dev succeed + glt push u1 origin :dev; ok; / - \\[deleted\\] *dev/ + + # quietly push it back again + glt push u1 origin dev; ok; / * \\[new branch\\] dev -> dev/ + + "; + + confadd ' + repo @gaa + RWD dev = u4 + '; + +try "ADMIN_PUSH set2; !/FATAL/" or die text(); + +try " + # u1 tries to delete dev on a new setup + cd ../aa; ok; /master -> master/ + + # u1 delete branch dev fail + glt push u1 origin :dev; !ok; /D refs/heads/dev aa u1 DENIED by fallthru/ + + # u4 delete branch dev succeed + glt push u4 file:///aa :dev; ok; / - \\[deleted\\] *dev/ + +"; |