docs: def del_repo(repo, **kwargs):
      '''
      Delete a repo from the sources.list / sources.list.d
  
      If the .list file is in the sources.list.d directory
      and the file that the repo exists in does not contain any other
      repo configuration, the file itself will be deleted.
  
      The repo passed in must be a fully formed repository definition
      string.
  
      CLI Examples:
  
      .. code-block:: bash
  
          salt '*' pkg.del_repo "myrepo definition"
      '''
      _check_apt()
      is_ppa = False
      if repo.startswith('ppa:') and __grains__['os'] in ('Ubuntu', 'Mint', 'neon'):
          # This is a PPA definition meaning special handling is needed
          # to derive the name.
          is_ppa = True
          dist = __grains__['lsb_distrib_codename']
          if not HAS_SOFTWAREPROPERTIES:
              _warn_software_properties(repo)
              owner_name, ppa_name = repo[4:].split('/')
              if 'ppa_auth' in kwargs:
                  auth_info = '{0}@'.format(kwargs['ppa_auth'])
                  repo = LP_PVT_SRC_FORMAT.format(auth_info, dist, owner_name,
                                                  ppa_name)
              else:
                  repo = LP_SRC_FORMAT.format(owner_name, ppa_name, dist)
          else:
              if hasattr(softwareproperties.ppa, 'PPAShortcutHandler'):
                  repo = softwareproperties.ppa.PPAShortcutHandler(repo).expand(dist)[0]
              else:
                  repo = softwareproperties.ppa.expand_ppa_line(repo, dist)[0]
  
      sources = sourceslist.SourcesList()
      repos = [s for s in sources.list if not s.invalid]
      if repos:
          deleted_from = dict()
          try:
              repo_type, \
                  repo_architectures, \
                  repo_uri, \
                  repo_dist, \
                  repo_comps = _split_repo_str(repo)
          except SyntaxError:
              raise SaltInvocationError(
                  'Error: repo \'{0}\' not a well formatted definition'
                  .format(repo)
              )
  
          for source in repos:
              if (source.type == repo_type
                      and source.architectures == repo_architectures
                      and source.uri == repo_uri
                      and source.dist == repo_dist):
  
                  s_comps = set(source.comps)
                  r_comps = set(repo_comps)
                  if s_comps.intersection(r_comps):
                      deleted_from[source.file] = 0
                      source.comps = list(s_comps.difference(r_comps))
                      if not source.comps:
                          try:
                              sources.remove(source)
                          except ValueError:
                              pass
              # PPAs are special and can add deb-src where expand_ppa_line
              # doesn't always reflect this.  Lets just cleanup here for good
              # measure
              if (is_ppa and repo_type == 'deb' and source.type == 'deb-src' and
                      source.uri == repo_uri and source.dist == repo_dist):
  
                  s_comps = set(source.comps)
                  r_comps = set(repo_comps)
                  if s_comps.intersection(r_comps):
                      deleted_from[source.file] = 0
                      source.comps = list(s_comps.difference(r_comps))
                      if not source.comps:
                          try:
                              sources.remove(source)
                          except ValueError:
                              pass
              sources.save()
          if deleted_from:
              ret = ''
              for source in sources:
                  if source.file in deleted_from:
                      deleted_from[source.file] += 1
              for repo_file, count in six.iteritems(deleted_from):
                  msg = 'Repo \'{0}\' has been removed from {1}.\n'
                  if count == 0 and 'sources.list.d/' in repo_file:
                      if os.path.isfile(repo_file):
                          msg = ('File {1} containing repo \'{0}\' has been '
                                 'removed.')
                          try:
                              os.remove(repo_file)
                          except OSError:
                              pass
                  ret += msg.format(repo, repo_file)
              # explicit refresh after a repo is deleted
              refresh_db()
              return ret
  
      raise CommandExecutionError(
          'Repo {0} doesn\'t exist in the sources.list(s)'.format(repo)
      )