docs: async def get_feed(config, url):
      """ Get a feed
  
      Arguments:
  
      config -- the configuration
      url -- The URL of the feed
  
      retval -- a tuple of feed,previous_version,changed
      """
  
      LOGGER.debug("++WAIT: cache get feed %s", url)
      previous = config.cache.get(
          'feed', url, schema_version=SCHEMA_VERSION) if config.cache else None
      LOGGER.debug("++DONE: cache get feed %s", url)
  
      headers = previous.caching if previous else None
  
      LOGGER.debug("++WAIT: request get %s", url)
      request = await utils.retry_get(config, url, headers=headers)
      LOGGER.debug("++DONE: request get %s", url)
      if not request or not request.success:
          LOGGER.error("Could not get feed %s: %d",
                       url,
                       request.status if request else -1)
          return None, previous, False
  
      if request.cached:
          LOGGER.debug("%s: Reusing cached version", url)
          return previous, previous, False
  
      current = Feed(request)
  
      if config.cache:
          LOGGER.debug("%s: Saving to cache", url)
          LOGGER.debug("++WAIT: cache set feed %s", url)
          config.cache.set('feed', url, current)
          LOGGER.debug("++DONE: cache set feed %s", url)
  
      LOGGER.debug("%s: Returning new content", url)
      return current, previous, (not previous
                                 or current.digest != previous.digest
                                 or current.status != previous.status)