code: def undo(self, change=None, drop=False,
               task_handle=taskhandle.NullTaskHandle()):
          
          if not self._undo_list:
              raise exceptions.HistoryError('Undo list is empty')
          if change is None:
              change = self.undo_list[-1]
          dependencies = self._find_dependencies(self.undo_list, change)
          self._move_front(self.undo_list, dependencies)
          self._perform_undos(len(dependencies), task_handle)
          result = self.redo_list[-len(dependencies):]
          if drop:
              del self.redo_list[-len(dependencies):]
          return result
docs: Redo done changes from the history
  
          When `change` is `None`, the last done change will be undone.
          If change is not `None` it should be an item from
          `self.undo_list`; this change and all changes that depend on
          it will be undone.  In both cases the list of undone changes
          will be returned.
  
          If `drop` is `True`, the undone change will not be appended to
          the redo list.