text: """
  Extraction and file list generation for pip.
  """
  
  __author__ = "Steve Dower <steve.dower@python.org>"
  __version__ = "3.8"
  
  
  import os
  import shutil
  import subprocess
  import sys
  
  from .filesets import *
  
  __all__ = ["extract_pip_files", "get_pip_layout"]
  
  
  def get_pip_dir(ns):
      if ns.copy:
          if ns.zip_lib:
              return ns.copy / "packages"
          return ns.copy / "Lib" / "site-packages"
      else:
          return ns.temp / "packages"
  
  
  def get_pip_layout(ns):
      pip_dir = get_pip_dir(ns)
      if not pip_dir.is_dir():
          log_warning("Failed to find {} - pip will not be included", pip_dir)
      else:
          pkg_root = "packages/{}" if ns.zip_lib else "Lib/site-packages/{}"
          for dest, src in rglob(pip_dir, "**/*"):
              yield pkg_root.format(dest), src
          if ns.include_pip_user:
              content = "\n".join(
                  "[{}]\nuser=yes".format(n)
                  for n in ["install", "uninstall", "freeze", "list"]
              )
              yield "pip.ini", ("pip.ini", content.encode())
  
  
  def extract_pip_files(ns):
      dest = get_pip_dir(ns)
      try:
          dest.mkdir(parents=True, exist_ok=False)
      except IOError:
          return
  
      src = ns.source / "Lib" / "ensurepip" / "_bundled"
  
      ns.temp.mkdir(parents=True, exist_ok=True)
      wheels = [shutil.copy(whl, ns.temp) for whl in src.glob("*.whl")]
      search_path = os.pathsep.join(wheels)
      if os.environ.get("PYTHONPATH"):
          search_path += ";" + os.environ["PYTHONPATH"]
  
      env = os.environ.copy()
      env["PYTHONPATH"] = search_path
  
      output = subprocess.check_output(
          [
              sys.executable,
              "-m",
              "pip",
              "--no-color",
              "install",
              "pip",
              "setuptools",
              "--upgrade",
              "--target",
              str(dest),
              "--no-index",
              "--no-compile",
              "--no-cache-dir",
              "-f",
              str(src),
              "--only-binary",
              ":all:",
          ],
          env=env,
      )
  
      try:
          shutil.rmtree(dest / "bin")
      except OSError:
          pass
  
      for file in wheels:
          try:
              os.remove(file)
          except OSError:
              pass
  