# vim: ft=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
