'Undo previous changes.  This call consumes the
undo stack. Calling it a second time has no effect unless
you do more monkeypatching after the undo call.
There is generally no need to call `undo()`, since it is
called automatically during tear-down.
Note that the same `monkeypatch` fixture is used across a
single test function invocation. If `monkeypatch` is used both by
the test function itself and one of the test fixtures,
calling `undo()` will undo all of the changes made in
both functions.'

def undo(self):

    for (obj, name, value) in reversed(self._setattr):
        if (value is not notset):
            setattr(obj, name, value)
        else:
            delattr(obj, name)
    self._setattr[:] = []
    for (dictionary, name, value) in reversed(self._setitem):
        if (value is notset):
            try:
                del dictionary[name]
            except KeyError:
                pass
        else:
            dictionary[name] = value
    self._setitem[:] = []
    if (self._savesyspath is not None):
        sys.path[:] = self._savesyspath
        self._savesyspath = None
    if (self._cwd is not None):
        os.chdir(self._cwd)
        self._cwd = None
