code: def _check_skip_installed(self, req_to_install):
          # type: (InstallRequirement) -> Optional[str]
          
          if self.ignore_installed:
              return None
  
          req_to_install.check_if_exists(self.use_user_site)
          if not req_to_install.satisfied_by:
              return None
  
          if self.force_reinstall:
              self._set_req_to_reinstall(req_to_install)
              return None
  
          if not self._is_upgrade_allowed(req_to_install):
              if self.upgrade_strategy == "only-if-needed":
                  return 'already satisfied, skipping upgrade'
              return 'already satisfied'
  
          # Check for the possibility of an upgrade.  For link-based
          # requirements we have to pull the tree down and inspect to assess
          # the version #, so it's handled way down.
          if not req_to_install.link:
              try:
                  self.finder.find_requirement(req_to_install, upgrade=True)
              except BestVersionAlreadyInstalled:
                  # Then the best version is installed.
                  return 'already up-to-date'
              except DistributionNotFound:
                  # No distribution found, so we squash the error.  It will
                  # be raised later when we re-try later to do the install.
                  # Why don't we just raise here?
                  pass
  
          self._set_req_to_reinstall(req_to_install)
          return None
docs: Check if req_to_install should be skipped.
  
          This will check if the req is installed, and whether we should upgrade
          or reinstall it, taking into account all the relevant user options.
  
          After calling this req_to_install will only have satisfied_by set to
          None if the req_to_install is to be upgraded/reinstalled etc. Any
          other value will be a dist recording the current thing installed that
          satisfies the requirement.
  
          Note that for vcs urls and the like we can't assess skipping in this
          routine - we simply identify that we need to pull the thing down,
          then later on it is pulled down and introspected to assess upgrade/
          reinstalls etc.
  
          :return: A text reason for why it was skipped, or None.