docs: def _uninstall(
      action='remove',
      name=None,
      version=None,
      pkgs=None,
      normalize=True,
      ignore_epoch=False,
      **kwargs):
      '''
      Common function for package removal
      '''
      if action not in ('remove', 'purge'):
          return {'name': name,
                  'changes': {},
                  'result': False,
                  'comment': 'Invalid action \'{0}\'. '
                             'This is probably a bug.'.format(action)}
  
      try:
          pkg_params = __salt__['pkg_resource.parse_targets'](
              name,
              pkgs,
              normalize=normalize)[0]
      except MinionError as exc:
          return {'name': name,
                  'changes': {},
                  'result': False,
                  'comment': 'An error was encountered while parsing targets: '
                             '{0}'.format(exc)}
      targets = _find_remove_targets(name, version, pkgs, normalize,
                                     ignore_epoch=ignore_epoch, **kwargs)
      if isinstance(targets, dict) and 'result' in targets:
          return targets
      elif not isinstance(targets, list):
          return {'name': name,
                  'changes': {},
                  'result': False,
                  'comment': 'An error was encountered while checking targets: '
                             '{0}'.format(targets)}
      if action == 'purge':
          old_removed = __salt__['pkg.list_pkgs'](versions_as_list=True,
                                                  removed=True,
                                                  **kwargs)
          targets.extend([x for x in pkg_params if x in old_removed])
      targets.sort()
  
      if not targets:
          return {'name': name,
                  'changes': {},
                  'result': True,
                  'comment': 'None of the targeted packages are installed'
                             '{0}'.format(' or partially installed'
                                          if action == 'purge' else '')}
  
      if __opts__['test']:
          return {'name': name,
                  'changes': {},
                  'result': None,
                  'comment': 'The following packages will be {0}d: '
                             '{1}.'.format(action, ', '.join(targets))}
  
      changes = __salt__['pkg.{0}'.format(action)](name, pkgs=pkgs, version=version, **kwargs)
      new = __salt__['pkg.list_pkgs'](versions_as_list=True, **kwargs)
      failed = []
      for x in pkg_params:
          if __grains__['os_family'] in ['Suse', 'RedHat']:
              # Check if the package version set to be removed is actually removed:
              if x in new and not pkg_params[x]:
                  failed.append(x)
              elif x in new and pkg_params[x] in new[x]:
                  failed.append(x + "-" + pkg_params[x])
          elif x in new:
              failed.append(x)
  
      if action == 'purge':
          new_removed = __salt__['pkg.list_pkgs'](versions_as_list=True,
                                                  removed=True,
                                                  **kwargs)
          failed.extend([x for x in pkg_params if x in new_removed])
      failed.sort()
  
      if failed:
          return {'name': name,
                  'changes': changes,
                  'result': False,
                  'comment': 'The following packages failed to {0}: '
                             '{1}.'.format(action, ', '.join(failed))}
  
      comments = []
      not_installed = sorted([x for x in pkg_params if x not in targets])
      if not_installed:
          comments.append('The following packages were not installed: '
                          '{0}'.format(', '.join(not_installed)))
          comments.append('The following packages were {0}d: '
                          '{1}.'.format(action, ', '.join(targets)))
      else:
          comments.append('All targeted packages were {0}d.'.format(action))
  
      return {'name': name,
              'changes': changes,
              'result': True,
              'comment': ' '.join(comments)}