# vim: syn=sh:
tsh pwd || die '## tsh not installed?'

for wr in 0 1
do
    for bc in 0 1
    do
        cd $TESTDIR
        $TESTDIR/rollback || die "rollback failed"
        editrc GL_WILDREPOS $wr
        editrc GL_BIG_CONFIG $bc

        # ----------

        name "INTERNAL"
        echo "
            repo  foo
                  RW+M      =   u1
                  RW+       =   u2
                  RWM      .=   u3
                  RW        =   u4
        " | ugc

        cd ~/td

        name "setup a merged push"

        tsh "ls -al foo; !ok; /cannot access foo: No such file or directory/
        clone u1:foo; ok; /Cloning into/; /You appear to have cloned an empty/"

        cd foo

        tsh "ls -Al; ok; /\.git/
        test-commit aa; ok; /1 files changed, 1 insertions/
        tag start; ok
        push-om; ok; /new branch.*master.-..master/
            /create.delete ignored.*merge-check/
        checkout -b new; ok; /Switched to a new branch 'new'/
        test-commit bb cc; ok
        checkout master; ok; /Switched to branch 'master'/
        test-commit dd ee; ok
        git merge new; ok; /Merge made.*recursive/
        test-commit ff; ok
        tag end; ok"

        name "push by u4 should fail"
        tsh "push u4:foo master
        /WM refs/heads/master foo u4 DENIED by fallthru/
        /To u4:foo/
        /remote rejected.*hook declined/
        /failed to push some refs/"

        name "push by u3 should succeed"
        tsh "push u3:foo master; ok; /To u3:foo/; /master.-..master/"

        name "rewind by u3 should fail"
        tsh "reset-h start; ok; /HEAD is now at .* aa /
        push u3:foo +master; !ok; /rejected.*hook declined/; /failed to push some refs/"

        name "rewind by u2 should succeed"
        tsh "push u2:foo +master; ok; /To u2:foo/; /forced update/"

        name "push by u2 should fail"
        tsh "reset-h end; ok; /HEAD is now at .* ff /
        push u2:foo master
        /WM refs/heads/master foo u2 DENIED by fallthru/
        /To u2:foo/
        /remote rejected.*hook declined/
        /failed to push some refs/"

        name "push by u1 should succeed"
        tsh "push u1:foo master; ok; /master.-..master/"

        name INTERNAL
    done
done
