The revert_list table is constructed using triggers in the recursive case. It used to do that for single item changes, but the code (recently) switched to direct insertion into revert_list rather than depending upon triggers. A similar change could be made for the recursive case. In adm_ops.c, there are places where svn_wc__db_revert_list_notify() is called. However, it is NOT called when notify_func is NULL. This means the revert_list table is not dropped. The code should be rejiggered to ensure that the revert_list table is always dropped, even when errors occur. This probably means a special call from svn_wc_revert4() after the variant sub-functions are called, and then compose any resultant errors, to then be returned from revert4().