def has_code(state, text, incorrect_msg="The checker expected to find `{{text}}` in your command.", fixed=False):
    """Check whether the student code contains text.

    This function is a simpler override of the `has_code` function in protowhat,
    because ``ast_node._get_text()`` is not implemented in the OSH parser

    Using ``has_code()`` should be a last resort. It is always better to look at the result of code
    or the side effects they had on the state of your program.

    Args:
        state: State instance describing student and solution code. Can be omitted if used with Ex().
        text : text that student code must contain. Can be a regex pattern or a simple string.
        incorrect_msg: if specified, this overrides the automatically generated feedback message
                       in case ``text`` is not found in the student code.
        fixed: whether to match ``text`` exactly, rather than using regular expressions.

    :Example:

        Suppose the solution requires you to do: ::

            git push origin master

        The following SCT can be written: ::

            Ex().has_code(r'git\\s+push\\s+origin\\s+master')

        Submissions that would pass: ::

            git push origin master
            git   push    origin    master

        Submissions that would fail: ::

            git push --force origin master
    """

    stu_code = state.student_code

    # either simple text matching or regex test
    res = text in stu_code if fixed else re.search(text, stu_code)

    if not res:
        _msg = state.build_message(incorrect_msg, fmt_kwargs={ 'text': text })
        state.do_test(_msg)

    return state