# vim: syn=sh:
# ----------
name "setup"
echo "
    @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
" | ugc

# reasonably complex setup; we'll do everything from one repo though
cd ~/td
runlocal git clone u1:aa
cd ~/td/aa
mdc; mdc; mdc
mdc; mdc; mdc
mdc; mdc; mdc
name "INTERNAL"
runlocal git push origin HEAD
expect "To u1:aa"
expect "\* \[new branch\]      HEAD -> master"

git branch dev
git branch foo

# u1 tries to rewind master; succeeds
name "u1 rewind master succeed"
runlocal git reset --hard HEAD^
mdc
runlocal git push origin +master
expect "+ .* master -> master (forced update)"

# u2 tries to rewind master; fails
name "u2 rewind master fail"
runlocal git reset --hard HEAD^
mdc
runlocal git push u2:aa +master
expect "remote: + refs/heads/master aa u2 DENIED by fallthru"

# u3 tries to rewind master; succeeds
name "u3 rewind master succeed"
runlocal git reset --hard HEAD^
mdc
runlocal git push u3:aa +master
expect "+ .* master -> master (forced update)"

# u4 tries to push master; succeeds
name "u4 push master succeed"
mdc
runlocal git push u4:aa master
expect "master -> master"

# u4 then tries to rewind master; fails
name "u4 rewind master fail"
runlocal git reset --hard HEAD^
runlocal git push u4:aa +master
expect "remote: + refs/heads/master aa u4 DENIED by fallthru"

# u3 and u4 try to push the other 2 branches; fail
name "u3 and u4 / dev foo -- all 4 fail"
runlocal git push u3:aa dev
expect "remote: W refs/heads/dev aa u3 DENIED by fallthru"
runlocal git push u4:aa dev
expect "remote: W refs/heads/dev aa u4 DENIED by fallthru"
runlocal git push u3:aa foo
expect "remote: W refs/heads/foo aa u3 DENIED by fallthru"
runlocal git push u4:aa foo
expect "remote: W refs/heads/foo aa u4 DENIED by fallthru"

# clean up for next set
runlocal git push -f origin master dev foo

# u5 tries to push master; fails
name "u5 push master fail"
mdc
runlocal git push u5:aa master
expect "remote: W refs/heads/master u5 DENIED by refs/heads/master"

# u5 tries to rewind dev; succeeds
name "u5 rewind dev succeed"
runlocal git push u5:aa +dev^:dev
expect "+ .* dev^ -> dev (forced update)"

# u5 tries to rewind foo; fails
name "u5 rewind foo fail"
runlocal git push u5:aa +foo^:foo
expect "remote: + refs/heads/foo aa u5 DENIED by fallthru"

# u5 tries to push foo; succeeds
name "INTERNAL"
runlocal git checkout foo
expect "Switched to branch 'foo'"

name "u5 push foo succeed"
mdc
runlocal git push u5:aa foo
expect "foo -> foo"

# u1 tries to delete branch dev
name "u1 delete branch dev succeed"
runlocal git push origin :dev
expect " - \[deleted\] *dev"

# quietly push it back again
name "INTERNAL"
runlocal git push origin dev
expect " * \[new branch\]      dev -> dev"

# u1 tries to delete dev on a new setup
name "INTERNAL"
echo "
    repo @gaa
        RWD     dev         =   u4
" | ugc
expect "master -> master"

# u1 tries to delete branch dev; fails
name "u1 delete branch dev fail"
runlocal git push origin :dev
expect "remote: D refs/heads/dev aa u1 DENIED by fallthru"

# u4 tries to delete branch dev; succeeds
name "u4 delete branch dev succeed"
runlocal git push u4:aa :dev
expect " - \[deleted\] *dev"

# ----------

name "INTERNAL"
echo "
@gr1 = r1
repo @gr1
    RW  refs/heads/v[0-9]   = u1
    RW  refs/heads          = tester
" | ugc
notexpect ABORT
cd ~/td
runlocal git clone gitolite:r1
expect "Cloning into r1..."
cd ~/td/r1
mdc; mdc; mdc
mdc; mdc; mdc
runlocal git push origin HEAD
expect "\* \[new branch\]      HEAD -> master"
runlocal git branch v1
runlocal git push origin v1
name "no deny rules -- push v1 succeeds"
expect "\* \[new branch\]      v1 -> v1"

name "INTERNAL"
echo "
@gr2 = r2
repo @gr2
    RW  refs/heads/v[0-9]   = u1
    -   refs/heads/v[0-9]   = tester
    RW  refs/heads          = tester
" | ugc
notexpect ABORT
cd ~/td
runlocal git clone gitolite:r2
expect "Cloning into r2..."
cd ~/td/r2
mdc; mdc; mdc
mdc; mdc; mdc
runlocal git push origin HEAD
expect "\* \[new branch\]      HEAD -> master"
runlocal git branch v1
runlocal git push origin v1
name "deny rules -- push v1 fails"
expect "remote: W refs/heads/v1 tester DENIED by refs/heads/v\[0-9\]"

name "INTERNAL"