diff --git a/docs/html/cli/index.md b/docs/html/cli/index.md new file mode 100644 index 00000000000..f608da52113 --- /dev/null +++ b/docs/html/cli/index.md @@ -0,0 +1,48 @@ +# Commands + +The general options that apply to all the commands listed below can be +found [under the `pip` page in this section](pip). + +```{toctree} +:maxdepth: 1 +:hidden: + +pip +``` + +```{toctree} +:maxdepth: 1 +:caption: Environment Management and Introspection + +pip_install +pip_uninstall +pip_list +pip_freeze +pip_check +``` + +```{toctree} +:maxdepth: 1 +:caption: Handling Distribution Files + +pip_download +pip_wheel +pip_hash +``` + +```{toctree} +:maxdepth: 1 +:caption: Package Index information + +pip_show +pip_search +``` + +```{toctree} +:maxdepth: 1 +:caption: Managing pip itself + +pip_cache +pip_config +pip_debug +``` diff --git a/docs/html/cli/pip.rst b/docs/html/cli/pip.rst new file mode 100644 index 00000000000..1f52630f69f --- /dev/null +++ b/docs/html/cli/pip.rst @@ -0,0 +1,255 @@ +=== +pip +=== + + +Usage +***** + +.. tab:: Unix/macOS + + .. code-block:: shell + + python -m pip [options] + +.. tab:: Windows + + .. code-block:: shell + + py -m pip [options] + +Description +*********** + + +.. _`Logging`: + + +Logging +======= + +Console logging +~~~~~~~~~~~~~~~ + +pip offers :ref:`-v, --verbose <--verbose>` and :ref:`-q, --quiet <--quiet>` +to control the console log level. By default, some messages (error and warnings) +are colored in the terminal. If you want to suppress the colored output use +:ref:`--no-color <--no-color>`. + + +.. _`FileLogging`: + +File logging +~~~~~~~~~~~~ + +pip offers the :ref:`--log <--log>` option for specifying a file where a maximum +verbosity log will be kept. This option is empty by default. This log appends +to previous logging. + +Like all pip options, ``--log`` can also be set as an environment variable, or +placed into the pip config file. See the :ref:`Configuration` section. + +.. _`exists-action`: + +--exists-action option +====================== + +This option specifies default behavior when path already exists. +Possible cases: downloading files or checking out repositories for installation, +creating archives. If ``--exists-action`` is not defined, pip will prompt +when decision is needed. + +*(s)witch* + Only relevant to VCS checkout. Attempt to switch the checkout + to the appropriate URL and/or revision. +*(i)gnore* + Abort current operation (e.g. don't copy file, don't create archive, + don't modify a checkout). +*(w)ipe* + Delete the file or VCS checkout before trying to create, download, or checkout a new one. +*(b)ackup* + Rename the file or checkout to ``{name}{'.bak' * n}``, where n is some number + of ``.bak`` extensions, such that the file didn't exist at some point. + So the most recent backup will be the one with the largest number after ``.bak``. +*(a)abort* + Abort pip and return non-zero exit status. + +.. _`build-interface`: + + +Build System Interface +====================== + +pip builds packages by invoking the build system. By default, builds will use +``setuptools``, but if a project specifies a different build system using a +``pyproject.toml`` file, as per :pep:`517`, pip will use that instead. As well +as package building, the build system is also invoked to install packages +direct from source. This is handled by invoking the build system to build a +wheel, and then installing from that wheel. The built wheel is cached locally +by pip to avoid repeated identical builds. + +The current interface to the build system is via the ``setup.py`` command line +script - all build actions are defined in terms of the specific ``setup.py`` +command line that will be run to invoke the required action. + +Setuptools Injection +~~~~~~~~~~~~~~~~~~~~ + +When :pep:`517` is not used, the supported build system is ``setuptools``. +However, not all packages use ``setuptools`` in their build scripts. To support +projects that use "pure ``distutils``", pip injects ``setuptools`` into +``sys.modules`` before invoking ``setup.py``. The injection should be +transparent to ``distutils``-based projects, but 3rd party build tools wishing +to provide a ``setup.py`` emulating the commands pip requires may need to be +aware that it takes place. + +Projects using :pep:`517` *must* explicitly use setuptools - pip does not do +the above injection process in this case. + +Build System Output +~~~~~~~~~~~~~~~~~~~ + +Any output produced by the build system will be read by pip (for display to the +user if requested). In order to correctly read the build system output, pip +requires that the output is written in a well-defined encoding, specifically +the encoding the user has configured for text output (which can be obtained in +Python using ``locale.getpreferredencoding``). If the configured encoding is +ASCII, pip assumes UTF-8 (to account for the behaviour of some Unix systems). + +Build systems should ensure that any tools they invoke (compilers, etc) produce +output in the correct encoding. In practice - and in particular on Windows, +where tools are inconsistent in their use of the "OEM" and "ANSI" codepages - +this may not always be possible. pip will therefore attempt to recover cleanly +if presented with incorrectly encoded build tool output, by translating +unexpected byte sequences to Python-style hexadecimal escape sequences +(``"\x80\xff"``, etc). However, it is still possible for output to be displayed +using an incorrect encoding (mojibake). + +Under :pep:`517`, handling of build tool output is the backend's responsibility, +and pip simply displays the output produced by the backend. (Backends, however, +will likely still have to address the issues described above). + +PEP 517 and 518 Support +~~~~~~~~~~~~~~~~~~~~~~~ + +As of version 10.0, pip supports projects declaring dependencies that are +required at install time using a ``pyproject.toml`` file, in the form described +in :pep:`518`. When building a project, pip will install the required +dependencies locally, and make them available to the build process. +Furthermore, from version 19.0 onwards, pip supports projects specifying the +build backend they use in ``pyproject.toml``, in the form described in +:pep:`517`. + +When making build requirements available, pip does so in an *isolated +environment*. That is, pip does not install those requirements into the user's +``site-packages``, but rather installs them in a temporary directory which it +adds to the user's ``sys.path`` for the duration of the build. This ensures +that build requirements are handled independently of the user's runtime +environment. For example, a project that needs a recent version of setuptools +to build can still be installed, even if the user has an older version +installed (and without silently replacing that version). + +In certain cases, projects (or redistributors) may have workflows that +explicitly manage the build environment. For such workflows, build isolation +can be problematic. If this is the case, pip provides a +``--no-build-isolation`` flag to disable build isolation. Users supplying this +flag are responsible for ensuring the build environment is managed +appropriately (including ensuring that all required build dependencies are +installed). + +By default, pip will continue to use the legacy (direct ``setup.py`` execution +based) build processing for projects that do not have a ``pyproject.toml`` file. +Projects with a ``pyproject.toml`` file will use a :pep:`517` backend. Projects +with a ``pyproject.toml`` file, but which don't have a ``build-system`` section, +will be assumed to have the following backend settings:: + + [build-system] + requires = ["setuptools>=40.8.0", "wheel"] + build-backend = "setuptools.build_meta:__legacy__" + +.. note:: + + ``setuptools`` 40.8.0 is the first version of setuptools that offers a + :pep:`517` backend that closely mimics directly executing ``setup.py``. + +If a project has ``[build-system]``, but no ``build-backend``, pip will also use +``setuptools.build_meta:__legacy__``, but will expect the project requirements +to include ``setuptools`` and ``wheel`` (and will report an error if the +installed version of ``setuptools`` is not recent enough). + +If a user wants to explicitly request :pep:`517` handling even though a project +doesn't have a ``pyproject.toml`` file, this can be done using the +``--use-pep517`` command line option. Similarly, to request legacy processing +even though ``pyproject.toml`` is present, the ``--no-use-pep517`` option is +available (although obviously it is an error to choose ``--no-use-pep517`` if +the project has no ``setup.py``, or explicitly requests a build backend). As +with other command line flags, pip recognises the ``PIP_USE_PEP517`` +environment veriable and a ``use-pep517`` config file option (set to true or +false) to set this option globally. Note that overriding pip's choice of +whether to use :pep:`517` processing in this way does *not* affect whether pip +will use an isolated build environment (which is controlled via +``--no-build-isolation`` as noted above). + +Except in the case noted above (projects with no :pep:`518` ``[build-system]`` +section in ``pyproject.toml``), pip will never implicitly install a build +system. Projects **must** ensure that the correct build system is listed in +their ``requires`` list (this applies even if pip assumes that the +``setuptools`` backend is being used, as noted above). + +.. _pep-518-limitations: + +**Historical Limitations**: + +* ``pip<18.0``: only supports installing build requirements from wheels, and + does not support the use of environment markers and extras (only version + specifiers are respected). + +* ``pip<18.1``: build dependencies using .pth files are not properly supported; + as a result namespace packages do not work under Python 3.2 and earlier. + +Future Developments +~~~~~~~~~~~~~~~~~~~ + +:pep:`426` notes that the intention is to add hooks to project metadata in +version 2.1 of the metadata spec, to explicitly define how to build a project +from its source. Once this version of the metadata spec is final, pip will +migrate to using that interface. At that point, the ``setup.py`` interface +documented here will be retained solely for legacy purposes, until projects +have migrated. + +Specifically, applications should *not* expect to rely on there being any form +of backward compatibility guarantees around the ``setup.py`` interface. + + +Build Options +~~~~~~~~~~~~~ + +The ``--global-option`` and ``--build-option`` arguments to the ``pip install`` +and ``pip wheel`` inject additional arguments into the ``setup.py`` command +(``--build-option`` is only available in ``pip wheel``). These arguments are +included in the command as follows: + +.. tab:: Unix/macOS + + .. code-block:: console + + python setup.py BUILD COMMAND + +.. tab:: Windows + + .. code-block:: shell + + py setup.py BUILD COMMAND + +The options are passed unmodified, and presently offer direct access to the +distutils command line. Use of ``--global-option`` and ``--build-option`` +should be considered as build system dependent, and may not be supported in the +current form if support for alternative build systems is added to pip. + + +.. _`General Options`: + +General Options +*************** + +.. pip-general-options:: diff --git a/docs/html/cli/pip_cache.rst b/docs/html/cli/pip_cache.rst new file mode 100644 index 00000000000..0a23c510d6f --- /dev/null +++ b/docs/html/cli/pip_cache.rst @@ -0,0 +1,27 @@ + +.. _`pip cache`: + +pip cache +--------- + + +Usage +***** + +.. tab:: Unix/macOS + + .. pip-command-usage:: cache "python -m pip" + +.. tab:: Windows + + .. pip-command-usage:: cache "py -m pip" + +Description +*********** + +.. pip-command-description:: cache + +Options +******* + +.. pip-command-options:: cache diff --git a/docs/html/cli/pip_check.rst b/docs/html/cli/pip_check.rst new file mode 100644 index 00000000000..268cf9a143c --- /dev/null +++ b/docs/html/cli/pip_check.rst @@ -0,0 +1,87 @@ +.. _`pip check`: + +========= +pip check +========= + + +Usage +===== + +.. tab:: Unix/macOS + + .. pip-command-usage:: check "python -m pip" + +.. tab:: Windows + + .. pip-command-usage:: check "py -m pip" + + +Description +=========== + +.. pip-command-description:: check + + +Examples +======== + +#. If all dependencies are compatible: + + .. tab:: Unix/macOS + + .. code-block:: console + + $ python -m pip check + No broken requirements found. + $ echo $? + 0 + + .. tab:: Windows + + .. code-block:: console + + C:\> py -m pip check + No broken requirements found. + C:\> echo %errorlevel% + 0 + +#. If a package is missing: + + .. tab:: Unix/macOS + + .. code-block:: console + + $ python -m pip check + pyramid 1.5.2 requires WebOb, which is not installed. + $ echo $? + 1 + + .. tab:: Windows + + .. code-block:: console + + C:\> py -m pip check + pyramid 1.5.2 requires WebOb, which is not installed. + C:\> echo %errorlevel% + 1 + +#. If a package has the wrong version: + + .. tab:: Unix/macOS + + .. code-block:: console + + $ python -m pip check + pyramid 1.5.2 has requirement WebOb>=1.3.1, but you have WebOb 0.8. + $ echo $? + 1 + + .. tab:: Windows + + .. code-block:: console + + C:\> py -m pip check + pyramid 1.5.2 has requirement WebOb>=1.3.1, but you have WebOb 0.8. + C:\> echo %errorlevel% + 1 diff --git a/docs/html/cli/pip_config.rst b/docs/html/cli/pip_config.rst new file mode 100644 index 00000000000..8b2f846304f --- /dev/null +++ b/docs/html/cli/pip_config.rst @@ -0,0 +1,30 @@ + +.. _`pip config`: + +========== +pip config +========== + + +Usage +===== + +.. tab:: Unix/macOS + + .. pip-command-usage:: config "python -m pip" + +.. tab:: Windows + + .. pip-command-usage:: config "py -m pip" + + +Description +=========== + +.. pip-command-description:: config + + +Options +======= + +.. pip-command-options:: config diff --git a/docs/html/cli/pip_debug.rst b/docs/html/cli/pip_debug.rst new file mode 100644 index 00000000000..4023533c905 --- /dev/null +++ b/docs/html/cli/pip_debug.rst @@ -0,0 +1,35 @@ +.. _`pip debug`: + +========= +pip debug +========= + + +Usage +===== + +.. tab:: Unix/macOS + + .. pip-command-usage:: debug "python -m pip" + +.. tab:: Windows + + .. pip-command-usage:: debug "py -m pip" + + +.. warning:: + + This command is only meant for debugging. + Its options and outputs are provisional and may change without notice. + + +Description +=========== + +.. pip-command-description:: debug + + +Options +======= + +.. pip-command-options:: debug diff --git a/docs/html/cli/pip_download.rst b/docs/html/cli/pip_download.rst new file mode 100644 index 00000000000..4f15314d765 --- /dev/null +++ b/docs/html/cli/pip_download.rst @@ -0,0 +1,226 @@ + +.. _`pip download`: + +============ +pip download +============ + + +Usage +===== + +.. tab:: Unix/macOS + + .. pip-command-usage:: download "python -m pip" + +.. tab:: Windows + + .. pip-command-usage:: download "py -m pip" + + +Description +=========== + +.. pip-command-description:: download + +Overview +-------- + +``pip download`` does the same resolution and downloading as ``pip install``, +but instead of installing the dependencies, it collects the downloaded +distributions into the directory provided (defaulting to the current +directory). This directory can later be passed as the value to ``pip install +--find-links`` to facilitate offline or locked down package installation. + +``pip download`` with the ``--platform``, ``--python-version``, +``--implementation``, and ``--abi`` options provides the ability to fetch +dependencies for an interpreter and system other than the ones that pip is +running on. ``--only-binary=:all:`` or ``--no-deps`` is required when using any +of these options. It is important to note that these options all default to the +current system/interpreter, and not to the most restrictive constraints (e.g. +platform any, abi none, etc). To avoid fetching dependencies that happen to +match the constraint of the current interpreter (but not your target one), it +is recommended to specify all of these options if you are specifying one of +them. Generic dependencies (e.g. universal wheels, or dependencies with no +platform, abi, or implementation constraints) will still match an over- +constrained download requirement. + + + +Options +======= + +.. pip-command-options:: download + +.. pip-index-options:: download + + +Examples +======== + +#. Download a package and all of its dependencies + + .. tab:: Unix/macOS + + .. code-block:: shell + + python -m pip download SomePackage + python -m pip download -d . SomePackage # equivalent to above + python -m pip download --no-index --find-links=/tmp/wheelhouse -d /tmp/otherwheelhouse SomePackage + + .. tab:: Windows + + .. code-block:: shell + + py -m pip download SomePackage + py -m pip download -d . SomePackage # equivalent to above + py -m pip download --no-index --find-links=/tmp/wheelhouse -d /tmp/otherwheelhouse SomePackage + + +#. Download a package and all of its dependencies with OSX specific interpreter constraints. + This forces OSX 10.10 or lower compatibility. Since OSX deps are forward compatible, + this will also match ``macosx-10_9_x86_64``, ``macosx-10_8_x86_64``, ``macosx-10_8_intel``, + etc. + It will also match deps with platform ``any``. Also force the interpreter version to ``27`` + (or more generic, i.e. ``2``) and implementation to ``cp`` (or more generic, i.e. ``py``). + + .. tab:: Unix/macOS + + .. code-block:: shell + + python -m pip download \ + --only-binary=:all: \ + --platform macosx-10_10_x86_64 \ + --python-version 27 \ + --implementation cp \ + SomePackage + + .. tab:: Windows + + .. code-block:: shell + + py -m pip download ^ + --only-binary=:all: ^ + --platform macosx-10_10_x86_64 ^ + --python-version 27 ^ + --implementation cp ^ + SomePackage + +#. Download a package and its dependencies with linux specific constraints. + Force the interpreter to be any minor version of py3k, and only accept + ``cp34m`` or ``none`` as the abi. + + .. tab:: Unix/macOS + + .. code-block:: shell + + python -m pip download \ + --only-binary=:all: \ + --platform linux_x86_64 \ + --python-version 3 \ + --implementation cp \ + --abi cp34m \ + SomePackage + + .. tab:: Windows + + .. code-block:: shell + + py -m pip download ^ + --only-binary=:all: ^ + --platform linux_x86_64 ^ + --python-version 3 ^ + --implementation cp ^ + --abi cp34m ^ + SomePackage + +#. Force platform, implementation, and abi agnostic deps. + + .. tab:: Unix/macOS + + .. code-block:: shell + + python -m pip download \ + --only-binary=:all: \ + --platform any \ + --python-version 3 \ + --implementation py \ + --abi none \ + SomePackage + + .. tab:: Windows + + .. code-block:: shell + + py -m pip download ^ + --only-binary=:all: ^ + --platform any ^ + --python-version 3 ^ + --implementation py ^ + --abi none ^ + SomePackage + +#. Even when overconstrained, this will still correctly fetch the pip universal wheel. + + .. tab:: Unix/macOS + + .. code-block:: console + + $ python -m pip download \ + --only-binary=:all: \ + --platform linux_x86_64 \ + --python-version 33 \ + --implementation cp \ + --abi cp34m \ + pip>=8 + + .. code-block:: console + + $ ls pip-8.1.1-py2.py3-none-any.whl + pip-8.1.1-py2.py3-none-any.whl + + .. tab:: Windows + + .. code-block:: console + + C:\> py -m pip download ^ + --only-binary=:all: ^ + --platform linux_x86_64 ^ + --python-version 33 ^ + --implementation cp ^ + --abi cp34m ^ + pip>=8 + + .. code-block:: console + + C:\> dir pip-8.1.1-py2.py3-none-any.whl + pip-8.1.1-py2.py3-none-any.whl + +#. Download a package supporting one of several ABIs and platforms. + This is useful when fetching wheels for a well-defined interpreter, whose + supported ABIs and platforms are known and fixed, different than the one pip is + running under. + + .. tab:: Unix/macOS + + .. code-block:: console + + $ python -m pip download \ + --only-binary=:all: \ + --platform manylinux1_x86_64 --platform linux_x86_64 --platform any \ + --python-version 36 \ + --implementation cp \ + --abi cp36m --abi cp36 --abi abi3 --abi none \ + SomePackage + + .. tab:: Windows + + .. code-block:: console + + C:> py -m pip download ^ + --only-binary=:all: ^ + --platform manylinux1_x86_64 --platform linux_x86_64 --platform any ^ + --python-version 36 ^ + --implementation cp ^ + --abi cp36m --abi cp36 --abi abi3 --abi none ^ + SomePackage diff --git a/docs/html/cli/pip_freeze.rst b/docs/html/cli/pip_freeze.rst new file mode 100644 index 00000000000..352f7d32168 --- /dev/null +++ b/docs/html/cli/pip_freeze.rst @@ -0,0 +1,74 @@ + +.. _`pip freeze`: + +========== +pip freeze +========== + + +Usage +===== + +.. tab:: Unix/macOS + + .. pip-command-usage:: freeze "python -m pip" + +.. tab:: Windows + + .. pip-command-usage:: freeze "py -m pip" + + +Description +=========== + +.. pip-command-description:: freeze + + +Options +======= + +.. pip-command-options:: freeze + + +Examples +======== + +#. Generate output suitable for a requirements file. + + .. tab:: Unix/macOS + + .. code-block:: console + + $ python -m pip freeze + docutils==0.11 + Jinja2==2.7.2 + MarkupSafe==0.19 + Pygments==1.6 + Sphinx==1.2.2 + + .. tab:: Windows + + .. code-block:: console + + C:\> py -m pip freeze + docutils==0.11 + Jinja2==2.7.2 + MarkupSafe==0.19 + Pygments==1.6 + Sphinx==1.2.2 + +#. Generate a requirements file and then install from it in another environment. + + .. tab:: Unix/macOS + + .. code-block:: shell + + env1/bin/python -m pip freeze > requirements.txt + env2/bin/python -m pip install -r requirements.txt + + .. tab:: Windows + + .. code-block:: shell + + env1\bin\python -m pip freeze > requirements.txt + env2\bin\python -m pip install -r requirements.txt diff --git a/docs/html/cli/pip_hash.rst b/docs/html/cli/pip_hash.rst new file mode 100644 index 00000000000..7df0d5a4f13 --- /dev/null +++ b/docs/html/cli/pip_hash.rst @@ -0,0 +1,72 @@ +.. _`pip hash`: + +======== +pip hash +======== + + +Usage +===== + +.. tab:: Unix/macOS + + .. pip-command-usage:: hash "python -m pip" + +.. tab:: Windows + + .. pip-command-usage:: hash "py -m pip" + + +Description +=========== + +.. pip-command-description:: hash + +Overview +-------- + +``pip hash`` is a convenient way to get a hash digest for use with +:ref:`hash-checking mode`, especially for packages with multiple archives. The +error message from ``pip install --require-hashes ...`` will give you one +hash, but, if there are multiple archives (like source and binary ones), you +will need to manually download and compute a hash for the others. Otherwise, a +spurious hash mismatch could occur when :ref:`pip install` is passed a +different set of options, like :ref:`--no-binary `. + + +Options +======= + +.. pip-command-options:: hash + + +Example +======= + +Compute the hash of a downloaded archive: + +.. tab:: Unix/macOS + + .. code-block:: console + + $ python -m pip download SomePackage + Collecting SomePackage + Downloading SomePackage-2.2.tar.gz + Saved ./pip_downloads/SomePackage-2.2.tar.gz + Successfully downloaded SomePackage + $ python -m pip hash ./pip_downloads/SomePackage-2.2.tar.gz + ./pip_downloads/SomePackage-2.2.tar.gz: + --hash=sha256:93e62e05c7ad3da1a233def6731e8285156701e3419a5fe279017c429ec67ce0 + +.. tab:: Windows + + .. code-block:: console + + C:\> py -m pip download SomePackage + Collecting SomePackage + Downloading SomePackage-2.2.tar.gz + Saved ./pip_downloads/SomePackage-2.2.tar.gz + Successfully downloaded SomePackage + C:\> py -m pip hash ./pip_downloads/SomePackage-2.2.tar.gz + ./pip_downloads/SomePackage-2.2.tar.gz: + --hash=sha256:93e62e05c7ad3da1a233def6731e8285156701e3419a5fe279017c429ec67ce0 diff --git a/docs/html/cli/pip_install.rst b/docs/html/cli/pip_install.rst new file mode 100644 index 00000000000..c60267f1cf1 --- /dev/null +++ b/docs/html/cli/pip_install.rst @@ -0,0 +1,1211 @@ +.. _`pip install`: + +=========== +pip install +=========== + + + +Usage +===== + +.. tab:: Unix/macOS + + .. pip-command-usage:: install "python -m pip" + +.. tab:: Windows + + .. pip-command-usage:: install "py -m pip" + + + +Description +=========== + +.. pip-command-description:: install + +Overview +-------- + +pip install has several stages: + +1. Identify the base requirements. The user supplied arguments are processed + here. +2. Resolve dependencies. What will be installed is determined here. +3. Build wheels. All the dependencies that can be are built into wheels. +4. Install the packages (and uninstall anything being upgraded/replaced). + +Note that ``pip install`` prefers to leave the installed version as-is +unless ``--upgrade`` is specified. + +Argument Handling +----------------- + +When looking at the items to be installed, pip checks what type of item +each is, in the following order: + +1. Project or archive URL. +2. Local directory (which must contain a ``setup.py``, or pip will report + an error). +3. Local file (a sdist or wheel format archive, following the naming + conventions for those formats). +4. A requirement, as specified in :pep:`440`. + +Each item identified is added to the set of requirements to be satisfied by +the install. + +Working Out the Name and Version +-------------------------------- + +For each candidate item, pip needs to know the project name and version. For +wheels (identified by the ``.whl`` file extension) this can be obtained from +the filename, as per the Wheel spec. For local directories, or explicitly +specified sdist files, the ``setup.py egg_info`` command is used to determine +the project metadata. For sdists located via an index, the filename is parsed +for the name and project version (this is in theory slightly less reliable +than using the ``egg_info`` command, but avoids downloading and processing +unnecessary numbers of files). + +Any URL may use the ``#egg=name`` syntax (see :ref:`VCS Support`) to +explicitly state the project name. + +Satisfying Requirements +----------------------- + +Once pip has the set of requirements to satisfy, it chooses which version of +each requirement to install using the simple rule that the latest version that +satisfies the given constraints will be installed (but see :ref:`here
`
+for an exception regarding pre-release versions). Where more than one source of
+the chosen version is available, it is assumed that any source is acceptable
+(as otherwise the versions would differ).
+
+Installation Order
+------------------
+
+.. note::
+
+   This section is only about installation order of runtime dependencies, and
+   does not apply to build dependencies (those are specified using PEP 518).
+
+As of v6.1.0, pip installs dependencies before their dependents, i.e. in
+"topological order."  This is the only commitment pip currently makes related
+to order.  While it may be coincidentally true that pip will install things in
+the order of the install arguments or in the order of the items in a
+requirements file, this is not a promise.
+
+In the event of a dependency cycle (aka "circular dependency"), the current
+implementation (which might possibly change later) has it such that the first
+encountered member of the cycle is installed last.
+
+For instance, if quux depends on foo which depends on bar which depends on baz,
+which depends on foo:
+
+.. tab:: Unix/macOS
+
+   .. code-block:: console
+
+      $ python -m pip install quux
+      ...
+      Installing collected packages baz, bar, foo, quux
+
+      $ python -m pip install bar
+      ...
+      Installing collected packages foo, baz, bar
+
+.. tab:: Windows
+
+   .. code-block:: console
+
+      C:\> py -m pip install quux
+      ...
+      Installing collected packages baz, bar, foo, quux
+
+      C:\> py -m pip install bar
+      ...
+      Installing collected packages foo, baz, bar
+
+
+Prior to v6.1.0, pip made no commitments about install order.
+
+The decision to install topologically is based on the principle that
+installations should proceed in a way that leaves the environment usable at each
+step. This has two main practical benefits:
+
+1. Concurrent use of the environment during the install is more likely to work.
+2. A failed install is less likely to leave a broken environment.  Although pip
+   would like to support failure rollbacks eventually, in the mean time, this is
+   an improvement.
+
+Although the new install order is not intended to replace (and does not replace)
+the use of ``setup_requires`` to declare build dependencies, it may help certain
+projects install from sdist (that might previously fail) that fit the following
+profile:
+
+1. They have build dependencies that are also declared as install dependencies
+   using ``install_requires``.
+2. ``python setup.py egg_info`` works without their build dependencies being
+   installed.
+3. For whatever reason, they don't or won't declare their build dependencies using
+   ``setup_requires``.
+
+
+.. _`Requirements File Format`:
+
+Requirements File Format
+------------------------
+
+Each line of the requirements file indicates something to be installed,
+and like arguments to :ref:`pip install`, the following forms are supported::
+
+    [[--option]...]
+     [; markers] [[--option]...]
+    
+    [-e] 
+    [-e] 
+
+For details on requirement specifiers, see :ref:`Requirement Specifiers`.
+
+See the :ref:`pip install Examples` for examples of all these forms.
+
+A line that begins with ``#`` is treated as a comment and ignored. Whitespace
+followed by a ``#`` causes the ``#`` and the remainder of the line to be
+treated as a comment.
+
+A line ending in an unescaped ``\`` is treated as a line continuation
+and the newline following it is effectively ignored.
+
+Comments are stripped *after* line continuations are processed.
+
+To interpret the requirements file in UTF-8 format add a comment
+``# -*- coding: utf-8 -*-`` to the first or second line of the file.
+
+The following options are supported:
+
+.. pip-requirements-file-options-ref-list::
+
+Please note that the above options are global options, and should be specified on their individual lines.
+The options which can be applied to individual requirements are
+:ref:`--install-option `, :ref:`--global-option ` and ``--hash``.
+
+For example, to specify :ref:`--pre `, :ref:`--no-index ` and two
+:ref:`--find-links ` locations:
+
+::
+
+--pre
+--no-index
+--find-links /my/local/archives
+--find-links http://some.archives.com/archives
+
+
+If you wish, you can refer to other requirements files, like this::
+
+    -r more_requirements.txt
+
+You can also refer to :ref:`constraints files `, like this::
+
+    -c some_constraints.txt
+
+.. _`Using Environment Variables`:
+
+Using Environment Variables
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Since version 10, pip supports the use of environment variables inside the
+requirements file. You can now store sensitive data (tokens, keys, etc.) in
+environment variables and only specify the variable name for your requirements,
+letting pip lookup the value at runtime. This approach aligns with the commonly
+used `12-factor configuration pattern `_.
+
+You have to use the POSIX format for variable names including brackets around
+the uppercase name as shown in this example: ``${API_TOKEN}``. pip will attempt
+to find the corresponding environment variable defined on the host system at
+runtime.
+
+.. note::
+
+   There is no support for other variable expansion syntaxes such as
+   ``$VARIABLE`` and ``%VARIABLE%``.
+
+
+.. _`Example Requirements File`:
+
+Example Requirements File
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Use ``pip install -r example-requirements.txt`` to install::
+
+    #
+    ####### example-requirements.txt #######
+    #
+    ###### Requirements without Version Specifiers ######
+    nose
+    nose-cov
+    beautifulsoup4
+    #
+    ###### Requirements with Version Specifiers ######
+    #   See https://www.python.org/dev/peps/pep-0440/#version-specifiers
+    docopt == 0.6.1             # Version Matching. Must be version 0.6.1
+    keyring >= 4.1.1            # Minimum version 4.1.1
+    coverage != 3.5             # Version Exclusion. Anything except version 3.5
+    Mopidy-Dirble ~= 1.1        # Compatible release. Same as >= 1.1, == 1.*
+    #
+    ###### Refer to other requirements files ######
+    -r other-requirements.txt
+    #
+    #
+    ###### A particular file ######
+    ./downloads/numpy-1.9.2-cp34-none-win32.whl
+    http://wxpython.org/Phoenix/snapshot-builds/wxPython_Phoenix-3.0.3.dev1820+49a8884-cp34-none-win_amd64.whl
+    #
+    ###### Additional Requirements without Version Specifiers ######
+    #   Same as 1st section, just here to show that you can put things in any order.
+    rejected
+    green
+    #
+
+.. _`Requirement Specifiers`:
+
+Requirement Specifiers
+----------------------
+
+pip supports installing from a package index using a :term:`requirement
+specifier `. Generally speaking, a requirement
+specifier is composed of a project name followed by optional :term:`version
+specifiers `.  :pep:`508` contains a full specification
+of the format of a requirement. Since version 18.1 pip supports the
+``url_req``-form specification.
+
+Some examples:
+
+ ::
+
+  SomeProject
+  SomeProject == 1.3
+  SomeProject >=1.2,<2.0
+  SomeProject[foo, bar]
+  SomeProject~=1.4.2
+
+Since version 6.0, pip also supports specifiers containing `environment markers
+`__ like so:
+
+ ::
+
+  SomeProject ==5.4 ; python_version < '3.8'
+  SomeProject; sys_platform == 'win32'
+
+Since version 19.1, pip also supports `direct references
+`__ like so:
+
+ ::
+
+  SomeProject @ file:///somewhere/...
+
+Environment markers are supported in the command line and in requirements files.
+
+.. note::
+
+   Use quotes around specifiers in the shell when using ``>``, ``<``, or when
+   using environment markers. Don't use quotes in requirement files. [1]_
+
+
+.. _`Per-requirement Overrides`:
+
+Per-requirement Overrides
+-------------------------
+
+Since version 7.0 pip supports controlling the command line options given to
+``setup.py`` via requirements files. This disables the use of wheels (cached or
+otherwise) for that package, as ``setup.py`` does not exist for wheels.
+
+The ``--global-option`` and ``--install-option`` options are used to pass
+options to ``setup.py``. For example:
+
+ ::
+
+    FooProject >= 1.2 --global-option="--no-user-cfg" \
+                      --install-option="--prefix='/usr/local'" \
+                      --install-option="--no-compile"
+
+The above translates roughly into running FooProject's ``setup.py``
+script as:
+
+ ::
+
+   python setup.py --no-user-cfg install --prefix='/usr/local' --no-compile
+
+Note that the only way of giving more than one option to ``setup.py``
+is through multiple ``--global-option`` and ``--install-option``
+options, as shown in the example above. The value of each option is
+passed as a single argument to the ``setup.py`` script. Therefore, a
+line such as the following is invalid and would result in an
+installation error.
+
+::
+
+   # Invalid. Please use '--install-option' twice as shown above.
+   FooProject >= 1.2 --install-option="--prefix=/usr/local --no-compile"
+
+
+.. _`Pre Release Versions`:
+
+Pre-release Versions
+--------------------
+
+Starting with v1.4, pip will only install stable versions as specified by
+`pre-releases`_ by default. If a version cannot be parsed as a compliant :pep:`440`
+version then it is assumed to be a pre-release.
+
+If a Requirement specifier includes a pre-release or development version
+(e.g. ``>=0.0.dev0``) then pip will allow pre-release and development versions
+for that requirement. This does not include the != flag.
+
+The ``pip install`` command also supports a :ref:`--pre ` flag
+that enables installation of pre-releases and development releases.
+
+
+.. _pre-releases: https://www.python.org/dev/peps/pep-0440/#handling-of-pre-releases
+
+
+.. _`VCS Support`:
+
+VCS Support
+-----------
+
+pip supports installing from Git, Mercurial, Subversion and Bazaar, and detects
+the type of VCS using URL prefixes: ``git+``, ``hg+``, ``svn+``, and ``bzr+``.
+
+pip requires a working VCS command on your path: ``git``, ``hg``, ``svn``, or
+``bzr``.
+
+VCS projects can be installed in :ref:`editable mode ` (using
+the :ref:`--editable ` option) or not.
+
+* For editable installs, the clone location by default is ``/src/SomeProject`` in virtual environments, and
+  ``/src/SomeProject``
+  for global installs.  The :ref:`--src ` option can be used to
+  modify this location.
+* For non-editable installs, the project is built locally in a temp dir and then
+  installed normally. Note that if a satisfactory version of the package is
+  already installed, the VCS source will not overwrite it without an
+  ``--upgrade`` flag. VCS requirements pin the package version (specified
+  in the ``setup.py`` file) of the target commit, not necessarily the commit
+  itself.
+* The :ref:`pip freeze` subcommand will record the VCS requirement specifier
+  (referencing a specific commit) if and only if the install is done using the
+  editable option.
+
+The "project name" component of the URL suffix ``egg=``
+is used by pip in its dependency logic to identify the project prior
+to pip downloading and analyzing the metadata. For projects
+where ``setup.py`` is not in the root of project, the "subdirectory" component
+is used. The value of the "subdirectory" component should be a path starting
+from the root of the project to where ``setup.py`` is located.
+
+If your repository layout is::
+
+   pkg_dir
+   ├── setup.py  # setup.py for package "pkg"
+   └── some_module.py
+   other_dir
+   └── some_file
+   some_other_file
+
+Then, to install from this repository, the syntax would be:
+
+.. tab:: Unix/macOS
+
+   .. code-block:: shell
+
+      python -m pip install -e "vcs+protocol://repo_url/#egg=pkg&subdirectory=pkg_dir"
+
+.. tab:: Windows
+
+   .. code-block:: shell
+
+      py -m pip install -e "vcs+protocol://repo_url/#egg=pkg&subdirectory=pkg_dir"
+
+
+Git
+^^^
+
+pip currently supports cloning over ``git``, ``git+http``, ``git+https``,
+``git+ssh``, ``git+git`` and ``git+file``.
+
+.. warning::
+
+    Note that the use of ``git``, ``git+git``, and ``git+http`` is discouraged.
+    The former two use `the Git Protocol`_, which lacks authentication, and HTTP is
+    insecure due to lack of TLS based encryption.
+
+Here are the supported forms::
+
+    [-e] git+http://git.example.com/MyProject#egg=MyProject
+    [-e] git+https://git.example.com/MyProject#egg=MyProject
+    [-e] git+ssh://git.example.com/MyProject#egg=MyProject
+    [-e] git+file:///home/user/projects/MyProject#egg=MyProject
+
+Passing a branch name, a commit hash, a tag name or a git ref is possible like so::
+
+    [-e] git+https://git.example.com/MyProject.git@main#egg=MyProject
+    [-e] git+https://git.example.com/MyProject.git@v1.0#egg=MyProject
+    [-e] git+https://git.example.com/MyProject.git@da39a3ee5e6b4b0d3255bfef95601890afd80709#egg=MyProject
+    [-e] git+https://git.example.com/MyProject.git@refs/pull/123/head#egg=MyProject
+
+When passing a commit hash, specifying a full hash is preferable to a partial
+hash because a full hash allows pip to operate more efficiently (e.g. by
+making fewer network calls).
+
+.. _`the Git Protocol`: https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols
+
+Mercurial
+^^^^^^^^^
+
+The supported schemes are: ``hg+file``, ``hg+http``, ``hg+https``,
+``hg+static-http``, and ``hg+ssh``.
+
+Here are the supported forms::
+
+    [-e] hg+http://hg.myproject.org/MyProject#egg=MyProject
+    [-e] hg+https://hg.myproject.org/MyProject#egg=MyProject
+    [-e] hg+ssh://hg.myproject.org/MyProject#egg=MyProject
+    [-e] hg+file:///home/user/projects/MyProject#egg=MyProject
+
+You can also specify a revision number, a revision hash, a tag name or a local
+branch name like so::
+
+    [-e] hg+http://hg.example.com/MyProject@da39a3ee5e6b#egg=MyProject
+    [-e] hg+http://hg.example.com/MyProject@2019#egg=MyProject
+    [-e] hg+http://hg.example.com/MyProject@v1.0#egg=MyProject
+    [-e] hg+http://hg.example.com/MyProject@special_feature#egg=MyProject
+
+Subversion
+^^^^^^^^^^
+
+pip supports the URL schemes ``svn``, ``svn+svn``, ``svn+http``, ``svn+https``, ``svn+ssh``.
+
+Here are some of the supported forms::
+
+    [-e] svn+https://svn.example.com/MyProject#egg=MyProject
+    [-e] svn+ssh://svn.example.com/MyProject#egg=MyProject
+    [-e] svn+ssh://user@svn.example.com/MyProject#egg=MyProject
+
+You can also give specific revisions to an SVN URL, like so::
+
+    [-e] svn+svn://svn.example.com/svn/MyProject#egg=MyProject
+    [-e] svn+http://svn.example.com/svn/MyProject/trunk@2019#egg=MyProject
+
+which will check out revision 2019.  ``@{20080101}`` would also check
+out the revision from 2008-01-01. You can only check out specific
+revisions using ``-e svn+...``.
+
+Bazaar
+^^^^^^
+
+pip supports Bazaar using the ``bzr+http``, ``bzr+https``, ``bzr+ssh``,
+``bzr+sftp``, ``bzr+ftp`` and ``bzr+lp`` schemes.
+
+Here are the supported forms::
+
+    [-e] bzr+http://bzr.example.com/MyProject/trunk#egg=MyProject
+    [-e] bzr+sftp://user@example.com/MyProject/trunk#egg=MyProject
+    [-e] bzr+ssh://user@example.com/MyProject/trunk#egg=MyProject
+    [-e] bzr+ftp://user@example.com/MyProject/trunk#egg=MyProject
+    [-e] bzr+lp:MyProject#egg=MyProject
+
+Tags or revisions can be installed like so::
+
+    [-e] bzr+https://bzr.example.com/MyProject/trunk@2019#egg=MyProject
+    [-e] bzr+http://bzr.example.com/MyProject/trunk@v1.0#egg=MyProject
+
+Using Environment Variables
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Since version 10, pip also makes it possible to use environment variables which
+makes it possible to reference private repositories without having to store
+access tokens in the requirements file. For example, a private git repository
+allowing Basic Auth for authentication can be refenced like this::
+
+    [-e] git+http://${AUTH_USER}:${AUTH_PASSWORD}@git.example.com/MyProject#egg=MyProject
+    [-e] git+https://${AUTH_USER}:${AUTH_PASSWORD}@git.example.com/MyProject#egg=MyProject
+
+.. note::
+
+   Only ``${VARIABLE}`` is supported, other formats like ``$VARIABLE`` or
+   ``%VARIABLE%`` won't work.
+
+Finding Packages
+----------------
+
+pip searches for packages on `PyPI`_ using the
+`HTTP simple interface `_,
+which is documented `here `_
+and `there `_.
+
+pip offers a number of package index options for modifying how packages are
+found.
+
+pip looks for packages in a number of places: on PyPI (if not disabled via
+``--no-index``), in the local filesystem, and in any additional repositories
+specified via ``--find-links`` or ``--index-url``. There is no ordering in
+the locations that are searched. Rather they are all checked, and the "best"
+match for the requirements (in terms of version number - see :pep:`440` for
+details) is selected.
+
+See the :ref:`pip install Examples`.
+
+
+.. _`SSL Certificate Verification`:
+
+SSL Certificate Verification
+----------------------------
+
+Starting with v1.3, pip provides SSL certificate verification over HTTP, to
+prevent man-in-the-middle attacks against PyPI downloads. This does not use
+the system certificate store but instead uses a bundled CA certificate
+store. The default bundled CA certificate store certificate store may be
+overridden by using ``--cert`` option or by using ``PIP_CERT``,
+``REQUESTS_CA_BUNDLE``, or ``CURL_CA_BUNDLE`` environment variables.
+
+
+.. _`Caching`:
+
+Caching
+-------
+
+Starting with v6.0, pip provides an on-by-default cache which functions
+similarly to that of a web browser. While the cache is on by default and is
+designed do the right thing by default you can disable the cache and always
+access PyPI by utilizing the ``--no-cache-dir`` option.
+
+When making any HTTP request pip will first check its local cache to determine
+if it has a suitable response stored for that request which has not expired. If
+it does then it simply returns that response and doesn't make the request.
+
+If it has a response stored, but it has expired, then it will attempt to make a
+conditional request to refresh the cache which will either return an empty
+response telling pip to simply use the cached item (and refresh the expiration
+timer) or it will return a whole new response which pip can then store in the
+cache.
+
+While this cache attempts to minimize network activity, it does not prevent
+network access altogether. If you want a local install solution that
+circumvents accessing PyPI, see :ref:`Installing from local packages`.
+
+The default location for the cache directory depends on the operating system:
+
+Unix
+  :file:`~/.cache/pip` and it respects the ``XDG_CACHE_HOME`` directory.
+macOS
+  :file:`~/Library/Caches/pip`.
+Windows
+  :file:`\\pip\\Cache`
+
+Run ``pip cache dir`` to show the cache directory and see :ref:`pip cache` to
+inspect and manage pip’s cache.
+
+
+.. _`Wheel cache`:
+
+Wheel Cache
+^^^^^^^^^^^
+
+pip will read from the subdirectory ``wheels`` within the pip cache directory
+and use any packages found there. This is disabled via the same
+``--no-cache-dir`` option that disables the HTTP cache. The internal structure
+of that is not part of the pip API. As of 7.0, pip makes a subdirectory for
+each sdist that wheels are built from and places the resulting wheels inside.
+
+As of version 20.0, pip also caches wheels when building from an immutable Git
+reference (i.e. a commit hash).
+
+pip attempts to choose the best wheels from those built in preference to
+building a new wheel. Note that this means when a package has both optional
+C extensions and builds ``py`` tagged wheels when the C extension can't be built
+that pip will not attempt to build a better wheel for Pythons that would have
+supported it, once any generic wheel is built. To correct this, make sure that
+the wheels are built with Python specific tags - e.g. pp on PyPy.
+
+When no wheels are found for an sdist, pip will attempt to build a wheel
+automatically and insert it into the wheel cache.
+
+
+.. _`hash-checking mode`:
+
+Hash-Checking Mode
+------------------
+
+Since version 8.0, pip can check downloaded package archives against local
+hashes to protect against remote tampering. To verify a package against one or
+more hashes, add them to the end of the line::
+
+    FooProject == 1.2 --hash=sha256:2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 \
+                      --hash=sha256:486ea46224d1bb4fb680f34f7c9ad96a8f24ec88be73ea8e5a6c65260e9cb8a7
+
+(The ability to use multiple hashes is important when a package has both
+binary and source distributions or when it offers binary distributions for a
+variety of platforms.)
+
+The recommended hash algorithm at the moment is sha256, but stronger ones are
+allowed, including all those supported by ``hashlib``. However, weaker ones
+such as md5, sha1, and sha224 are excluded to avoid giving a false sense of
+security.
+
+Hash verification is an all-or-nothing proposition. Specifying a ``--hash``
+against any requirement not only checks that hash but also activates a global
+*hash-checking mode*, which imposes several other security restrictions:
+
+* Hashes are required for all requirements. This is because a partially-hashed
+  requirements file is of little use and thus likely an error: a malicious
+  actor could slip bad code into the installation via one of the unhashed
+  requirements. Note that hashes embedded in URL-style requirements via the
+  ``#md5=...`` syntax suffice to satisfy this rule (regardless of hash
+  strength, for legacy reasons), though you should use a stronger
+  hash like sha256 whenever possible.
+* Hashes are required for all dependencies. An error results if there is a
+  dependency that is not spelled out and hashed in the requirements file.
+* Requirements that take the form of project names (rather than URLs or local
+  filesystem paths) must be pinned to a specific version using ``==``. This
+  prevents a surprising hash mismatch upon the release of a new version
+  that matches the requirement specifier.
+* ``--egg`` is disallowed, because it delegates installation of dependencies
+  to setuptools, giving up pip's ability to enforce any of the above.
+
+.. _`--require-hashes`:
+
+Hash-checking mode can be forced on with the ``--require-hashes`` command-line
+option:
+
+.. tab:: Unix/macOS
+
+   .. code-block:: console
+
+      $ python -m pip install --require-hashes -r requirements.txt
+      ...
+      Hashes are required in --require-hashes mode (implicitly on when a hash is
+      specified for any package). These requirements were missing hashes,
+      leaving them open to tampering. These are the hashes the downloaded
+      archives actually had. You can add lines like these to your requirements
+      files to prevent tampering.
+         pyelasticsearch==1.0 --hash=sha256:44ddfb1225054d7d6b1d02e9338e7d4809be94edbe9929a2ec0807d38df993fa
+         more-itertools==2.2 --hash=sha256:93e62e05c7ad3da1a233def6731e8285156701e3419a5fe279017c429ec67ce0
+
+.. tab:: Windows
+
+   .. code-block:: console
+
+      C:\> py -m pip install --require-hashes -r requirements.txt
+      ...
+      Hashes are required in --require-hashes mode (implicitly on when a hash is
+      specified for any package). These requirements were missing hashes,
+      leaving them open to tampering. These are the hashes the downloaded
+      archives actually had. You can add lines like these to your requirements
+      files to prevent tampering.
+         pyelasticsearch==1.0 --hash=sha256:44ddfb1225054d7d6b1d02e9338e7d4809be94edbe9929a2ec0807d38df993fa
+         more-itertools==2.2 --hash=sha256:93e62e05c7ad3da1a233def6731e8285156701e3419a5fe279017c429ec67ce0
+
+
+This can be useful in deploy scripts, to ensure that the author of the
+requirements file provided hashes. It is also a convenient way to bootstrap
+your list of hashes, since it shows the hashes of the packages it fetched. It
+fetches only the preferred archive for each package, so you may still need to
+add hashes for alternatives archives using :ref:`pip hash`: for instance if
+there is both a binary and a source distribution.
+
+The :ref:`wheel cache ` is disabled in hash-checking mode to
+prevent spurious hash mismatch errors. These would otherwise occur while
+installing sdists that had already been automatically built into cached wheels:
+those wheels would be selected for installation, but their hashes would not
+match the sdist ones from the requirements file. A further complication is that
+locally built wheels are nondeterministic: contemporary modification times make
+their way into the archive, making hashes unpredictable across machines and
+cache flushes. Compilation of C code adds further nondeterminism, as many
+compilers include random-seeded values in their output. However, wheels fetched
+from index servers are the same every time. They land in pip's HTTP cache, not
+its wheel cache, and are used normally in hash-checking mode. The only downside
+of having the wheel cache disabled is thus extra build time for sdists, and
+this can be solved by making sure pre-built wheels are available from the index
+server.
+
+Hash-checking mode also works with :ref:`pip download` and :ref:`pip wheel`. A
+:ref:`comparison of hash-checking mode with other repeatability strategies
+` is available in the User Guide.
+
+.. warning::
+
+   Beware of the ``setup_requires`` keyword arg in :file:`setup.py`. The
+   (rare) packages that use it will cause those dependencies to be downloaded
+   by setuptools directly, skipping pip's hash-checking. If you need to use
+   such a package, see :ref:`Controlling
+   setup_requires`.
+
+.. warning::
+
+   Be careful not to nullify all your security work when you install your
+   actual project by using setuptools directly: for example, by calling
+   ``python setup.py install``, ``python setup.py develop``, or
+   ``easy_install``. Setuptools will happily go out and download, unchecked,
+   anything you missed in your requirements file—and it’s easy to miss things
+   as your project evolves. To be safe, install your project using pip and
+   :ref:`--no-deps `.
+
+   Instead of ``python setup.py develop``, use...
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: shell
+
+         python -m pip install --no-deps -e .
+
+   .. tab:: Windows
+
+      .. code-block:: shell
+
+         py -m pip install --no-deps -e .
+
+
+   Instead of ``python setup.py install``, use...
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: shell
+
+         python -m pip install --no-deps .
+
+   .. tab:: Windows
+
+      .. code-block:: shell
+
+         py -m pip install --no-deps .
+
+Hashes from PyPI
+^^^^^^^^^^^^^^^^
+
+PyPI provides an MD5 hash in the fragment portion of each package download URL,
+like ``#md5=123...``, which pip checks as a protection against download
+corruption. Other hash algorithms that have guaranteed support from ``hashlib``
+are also supported here: sha1, sha224, sha384, sha256, and sha512. Since this
+hash originates remotely, it is not a useful guard against tampering and thus
+does not satisfy the ``--require-hashes`` demand that every package have a
+local hash.
+
+
+Local project installs
+----------------------
+
+pip supports installing local project in both regular mode and editable mode.
+You can install local projects by specifying the project path to pip:
+
+.. tab:: Unix/macOS
+
+   .. code-block:: shell
+
+      python -m pip install path/to/SomeProject
+
+.. tab:: Windows
+
+   .. code-block:: shell
+
+      py -m pip install path/to/SomeProject
+
+During regular installation, pip will copy the entire project directory to a
+temporary location and install from there. The exception is that pip will
+exclude .tox and .nox directories present in the top level of the project from
+being copied. This approach is the cause of several performance and correctness
+issues, so it is planned that pip 21.3 will change to install directly from the
+local project directory. Depending on the build backend used by the project,
+this may generate secondary build artifacts in the project directory, such as
+the ``.egg-info`` and ``build`` directories in the case of the setuptools
+backend.
+
+To opt in to the future behavior, specify the ``--use-feature=in-tree-build``
+option in pip's command line.
+
+
+.. _`editable-installs`:
+
+"Editable" Installs
+^^^^^^^^^^^^^^^^^^^
+
+"Editable" installs are fundamentally `"setuptools develop mode"
+`_
+installs.
+
+You can install local projects or VCS projects in "editable" mode:
+
+.. tab:: Unix/macOS
+
+   .. code-block:: shell
+
+      python -m pip install -e path/to/SomeProject
+      python -m pip install -e git+http://repo/my_project.git#egg=SomeProject
+
+.. tab:: Windows
+
+   .. code-block:: shell
+
+      py -m pip install -e path/to/SomeProject
+      py -m pip install -e git+http://repo/my_project.git#egg=SomeProject
+
+
+(See the :ref:`VCS Support` section above for more information on VCS-related syntax.)
+
+For local projects, the "SomeProject.egg-info" directory is created relative to
+the project path.  This is one advantage over just using ``setup.py develop``,
+which creates the "egg-info" directly relative the current working directory.
+
+
+.. _`controlling-setup-requires`:
+
+Controlling setup_requires
+--------------------------
+
+Setuptools offers the ``setup_requires`` `setup() keyword
+`_
+for specifying dependencies that need to be present in order for the
+``setup.py`` script to run.  Internally, Setuptools uses ``easy_install``
+to fulfill these dependencies.
+
+pip has no way to control how these dependencies are located.  None of the
+package index options have an effect.
+
+The solution is to configure a "system" or "personal" `Distutils configuration
+file
+`_ to
+manage the fulfillment.
+
+For example, to have the dependency located at an alternate index, add this:
+
+::
+
+  [easy_install]
+  index_url = https://my.index-mirror.com
+
+To have the dependency located from a local directory and not crawl PyPI, add this:
+
+::
+
+  [easy_install]
+  allow_hosts = ''
+  find_links = file:///path/to/local/archives/
+
+
+Build System Interface
+----------------------
+
+In order for pip to install a package from source, ``setup.py`` must implement
+the following commands::
+
+    setup.py egg_info [--egg-base XXX]
+    setup.py install --record XXX [--single-version-externally-managed] [--root XXX] [--compile|--no-compile] [--install-headers XXX]
+
+The ``egg_info`` command should create egg metadata for the package, as
+described in the setuptools documentation at
+https://setuptools.readthedocs.io/en/latest/setuptools.html#egg-info-create-egg-metadata-and-set-build-tags
+
+The ``install`` command should implement the complete process of installing the
+package to the target directory XXX.
+
+To install a package in "editable" mode (``pip install -e``), ``setup.py`` must
+implement the following command::
+
+    setup.py develop --no-deps
+
+This should implement the complete process of installing the package in
+"editable" mode.
+
+All packages will be attempted to built into wheels::
+
+    setup.py bdist_wheel -d XXX
+
+One further ``setup.py`` command is invoked by ``pip install``::
+
+    setup.py clean
+
+This command is invoked to clean up temporary commands from the build. (TODO:
+Investigate in more detail when this command is required).
+
+No other build system commands are invoked by the ``pip install`` command.
+
+Installing a package from a wheel does not invoke the build system at all.
+
+.. _PyPI: https://pypi.org/
+.. _setuptools extras: https://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-extras-optional-features-with-their-own-dependencies
+
+
+
+.. _`pip install Options`:
+
+
+Options
+=======
+
+.. pip-command-options:: install
+
+.. pip-index-options:: install
+
+
+.. _`pip install Examples`:
+
+
+Examples
+========
+
+#. Install ``SomePackage`` and its dependencies from `PyPI`_ using :ref:`Requirement Specifiers`
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: shell
+
+         python -m pip install SomePackage            # latest version
+         python -m pip install SomePackage==1.0.4     # specific version
+         python -m pip install 'SomePackage>=1.0.4'   # minimum version
+
+   .. tab:: Windows
+
+      .. code-block:: shell
+
+         py -m pip install SomePackage            # latest version
+         py -m pip install SomePackage==1.0.4     # specific version
+         py -m pip install 'SomePackage>=1.0.4'   # minimum version
+
+
+#. Install a list of requirements specified in a file.  See the :ref:`Requirements files `.
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: shell
+
+         python -m pip install -r requirements.txt
+
+   .. tab:: Windows
+
+      .. code-block:: shell
+
+         py -m pip install -r requirements.txt
+
+
+#. Upgrade an already installed ``SomePackage`` to the latest from PyPI.
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: shell
+
+         python -m pip install --upgrade SomePackage
+
+   .. tab:: Windows
+
+      .. code-block:: shell
+
+         py -m pip install --upgrade SomePackage
+
+
+#. Install a local project in "editable" mode. See the section on :ref:`Editable Installs `.
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: shell
+
+         python -m pip install -e .                # project in current directory
+         python -m pip install -e path/to/project  # project in another directory
+
+   .. tab:: Windows
+
+      .. code-block:: shell
+
+         py -m pip install -e .                 # project in current directory
+         py -m pip install -e path/to/project   # project in another directory
+
+
+#. Install a project from VCS
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: shell
+
+         python -m pip install SomeProject@git+https://git.repo/some_pkg.git@1.3.1
+
+   .. tab:: Windows
+
+      .. code-block:: shell
+
+         py -m pip install SomeProject@git+https://git.repo/some_pkg.git@1.3.1
+
+
+#. Install a project from VCS in "editable" mode. See the sections on :ref:`VCS Support ` and :ref:`Editable Installs `.
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: shell
+
+         python -m pip install -e git+https://git.repo/some_pkg.git#egg=SomePackage          # from git
+         python -m pip install -e hg+https://hg.repo/some_pkg.git#egg=SomePackage            # from mercurial
+         python -m pip install -e svn+svn://svn.repo/some_pkg/trunk/#egg=SomePackage         # from svn
+         python -m pip install -e git+https://git.repo/some_pkg.git@feature#egg=SomePackage  # from 'feature' branch
+         python -m pip install -e "git+https://git.repo/some_repo.git#egg=subdir&subdirectory=subdir_path" # install a python package from a repo subdirectory
+
+   .. tab:: Windows
+
+      .. code-block:: shell
+
+         py -m pip install -e git+https://git.repo/some_pkg.git#egg=SomePackage          # from git
+         py -m pip install -e hg+https://hg.repo/some_pkg.git#egg=SomePackage            # from mercurial
+         py -m pip install -e svn+svn://svn.repo/some_pkg/trunk/#egg=SomePackage         # from svn
+         py -m pip install -e git+https://git.repo/some_pkg.git@feature#egg=SomePackage  # from 'feature' branch
+         py -m pip install -e "git+https://git.repo/some_repo.git#egg=subdir&subdirectory=subdir_path" # install a python package from a repo subdirectory
+
+#. Install a package with `setuptools extras`_.
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: shell
+
+         python -m pip install SomePackage[PDF]
+         python -m pip install "SomePackage[PDF] @ git+https://git.repo/SomePackage@main#subdirectory=subdir_path"
+         python -m pip install .[PDF]  # project in current directory
+         python -m pip install SomePackage[PDF]==3.0
+         python -m pip install SomePackage[PDF,EPUB]  # multiple extras
+
+   .. tab:: Windows
+
+      .. code-block:: shell
+
+         py -m pip install SomePackage[PDF]
+         py -m pip install "SomePackage[PDF] @ git+https://git.repo/SomePackage@main#subdirectory=subdir_path"
+         py -m pip install .[PDF]  # project in current directory
+         py -m pip install SomePackage[PDF]==3.0
+         py -m pip install SomePackage[PDF,EPUB]  # multiple extras
+
+#. Install a particular source archive file.
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: shell
+
+         python -m pip install ./downloads/SomePackage-1.0.4.tar.gz
+         python -m pip install http://my.package.repo/SomePackage-1.0.4.zip
+
+   .. tab:: Windows
+
+      .. code-block:: shell
+
+         py -m pip install ./downloads/SomePackage-1.0.4.tar.gz
+         py -m pip install http://my.package.repo/SomePackage-1.0.4.zip
+
+#. Install a particular source archive file following :pep:`440` direct references.
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: shell
+
+         python -m pip install SomeProject@http://my.package.repo/SomeProject-1.2.3-py33-none-any.whl
+         python -m pip install "SomeProject @ http://my.package.repo/SomeProject-1.2.3-py33-none-any.whl"
+         python -m pip install SomeProject@http://my.package.repo/1.2.3.tar.gz
+
+   .. tab:: Windows
+
+      .. code-block:: shell
+
+         py -m pip install SomeProject@http://my.package.repo/SomeProject-1.2.3-py33-none-any.whl
+         py -m pip install "SomeProject @ http://my.package.repo/SomeProject-1.2.3-py33-none-any.whl"
+         py -m pip install SomeProject@http://my.package.repo/1.2.3.tar.gz
+
+#. Install from alternative package repositories.
+
+   Install from a different index, and not `PyPI`_
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: shell
+
+         python -m pip install --index-url http://my.package.repo/simple/ SomePackage
+
+   .. tab:: Windows
+
+      .. code-block:: shell
+
+         py -m pip install --index-url http://my.package.repo/simple/ SomePackage
+
+   Search an additional index during install, in addition to `PyPI`_
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: shell
+
+         python -m pip install --extra-index-url http://my.package.repo/simple SomePackage
+
+   .. tab:: Windows
+
+      .. code-block:: shell
+
+         py -m pip install --extra-index-url http://my.package.repo/simple SomePackage
+
+   Install from a local flat directory containing archives (and don't scan indexes):
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: shell
+
+         python -m pip install --no-index --find-links=file:///local/dir/ SomePackage
+         python -m pip install --no-index --find-links=/local/dir/ SomePackage
+         python -m pip install --no-index --find-links=relative/dir/ SomePackage
+
+   .. tab:: Windows
+
+      .. code-block:: shell
+
+         py -m pip install --no-index --find-links=file:///local/dir/ SomePackage
+         py -m pip install --no-index --find-links=/local/dir/ SomePackage
+         py -m pip install --no-index --find-links=relative/dir/ SomePackage
+
+
+#. Find pre-release and development versions, in addition to stable versions.  By default, pip only finds stable versions.
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: shell
+
+         python -m pip install --pre SomePackage
+
+   .. tab:: Windows
+
+      .. code-block:: shell
+
+         py -m pip install --pre SomePackage
+
+
+#. Install packages from source.
+
+   Do not use any binary packages
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: shell
+
+         python -m pip install SomePackage1 SomePackage2 --no-binary :all:
+
+   .. tab:: Windows
+
+      .. code-block:: shell
+
+         py -m pip install SomePackage1 SomePackage2 --no-binary :all:
+
+   Specify ``SomePackage1`` to be installed from source:
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: shell
+
+         python -m pip install SomePackage1 SomePackage2 --no-binary SomePackage1
+
+   .. tab:: Windows
+
+      .. code-block:: shell
+
+         py -m pip install SomePackage1 SomePackage2 --no-binary SomePackage1
+
+----
+
+.. [1] This is true with the exception that pip v7.0 and v7.0.1 required quotes
+       around specifiers containing environment markers in requirement files.
diff --git a/docs/html/cli/pip_list.rst b/docs/html/cli/pip_list.rst
new file mode 100644
index 00000000000..5119a804c0d
--- /dev/null
+++ b/docs/html/cli/pip_list.rst
@@ -0,0 +1,201 @@
+.. _`pip list`:
+
+========
+pip list
+========
+
+
+
+Usage
+=====
+
+.. tab:: Unix/macOS
+
+   .. pip-command-usage:: list "python -m pip"
+
+.. tab:: Windows
+
+   .. pip-command-usage:: list "py -m pip"
+
+
+Description
+===========
+
+.. pip-command-description:: list
+
+
+Options
+=======
+
+.. pip-command-options:: list
+
+.. pip-index-options:: list
+
+
+Examples
+========
+
+#. List installed packages.
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: console
+
+         $ python -m pip list
+         docutils (0.10)
+         Jinja2 (2.7.2)
+         MarkupSafe (0.18)
+         Pygments (1.6)
+         Sphinx (1.2.1)
+
+   .. tab:: Windows
+
+      .. code-block:: console
+
+         C:\> py -m pip list
+         docutils (0.10)
+         Jinja2 (2.7.2)
+         MarkupSafe (0.18)
+         Pygments (1.6)
+         Sphinx (1.2.1)
+
+#. List outdated packages (excluding editables), and the latest version available.
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: console
+
+         $ python -m pip list --outdated
+         docutils (Current: 0.10 Latest: 0.11)
+         Sphinx (Current: 1.2.1 Latest: 1.2.2)
+
+   .. tab:: Windows
+
+      .. code-block:: console
+
+         C:\> py -m pip list --outdated
+         docutils (Current: 0.10 Latest: 0.11)
+         Sphinx (Current: 1.2.1 Latest: 1.2.2)
+
+#. List installed packages with column formatting.
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: console
+
+         $ python -m pip list --format columns
+         Package Version
+         ------- -------
+         docopt  0.6.2
+         idlex   1.13
+         jedi    0.9.0
+
+   .. tab:: Windows
+
+      .. code-block:: console
+
+         C:\> py -m pip list --format columns
+         Package Version
+         ------- -------
+         docopt  0.6.2
+         idlex   1.13
+         jedi    0.9.0
+
+#. List outdated packages with column formatting.
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: console
+
+         $ python -m pip list -o --format columns
+         Package    Version Latest Type
+         ---------- ------- ------ -----
+         retry      0.8.1   0.9.1  wheel
+         setuptools 20.6.7  21.0.0 wheel
+
+   .. tab:: Windows
+
+      .. code-block:: console
+
+         C:\> py -m pip list -o --format columns
+         Package    Version Latest Type
+         ---------- ------- ------ -----
+         retry      0.8.1   0.9.1  wheel
+         setuptools 20.6.7  21.0.0 wheel
+
+#. List packages that are not dependencies of other packages. Can be combined with
+   other options.
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: console
+
+         $ python -m pip list --outdated --not-required
+         docutils (Current: 0.10 Latest: 0.11)
+
+   .. tab:: Windows
+
+      .. code-block:: console
+
+         C:\> py -m pip list --outdated --not-required
+         docutils (Current: 0.10 Latest: 0.11)
+
+#. Use legacy formatting
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: console
+
+         $ python -m pip list --format=legacy
+         colorama (0.3.7)
+         docopt (0.6.2)
+         idlex (1.13)
+         jedi (0.9.0)
+
+   .. tab:: Windows
+
+      .. code-block:: console
+
+         C:\> py -m pip list --format=legacy
+         colorama (0.3.7)
+         docopt (0.6.2)
+         idlex (1.13)
+         jedi (0.9.0)
+
+#. Use json formatting
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: console
+
+         $ python -m pip list --format=json
+         [{'name': 'colorama', 'version': '0.3.7'}, {'name': 'docopt', 'version': '0.6.2'}, ...
+
+   .. tab:: Windows
+
+      .. code-block:: console
+
+         C:\> py -m pip list --format=json
+         [{'name': 'colorama', 'version': '0.3.7'}, {'name': 'docopt', 'version': '0.6.2'}, ...
+
+#. Use freeze formatting
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: console
+
+         $ python -m pip list --format=freeze
+         colorama==0.3.7
+         docopt==0.6.2
+         idlex==1.13
+         jedi==0.9.0
+
+   .. tab:: Windows
+
+      .. code-block:: console
+
+         C:\> py -m pip list --format=freeze
+         colorama==0.3.7
+         docopt==0.6.2
+         idlex==1.13
+         jedi==0.9.0
diff --git a/docs/html/cli/pip_search.rst b/docs/html/cli/pip_search.rst
new file mode 100644
index 00000000000..9905a1bafac
--- /dev/null
+++ b/docs/html/cli/pip_search.rst
@@ -0,0 +1,52 @@
+.. _`pip search`:
+
+==========
+pip search
+==========
+
+
+
+Usage
+=====
+
+.. tab:: Unix/macOS
+
+   .. pip-command-usage:: search "python -m pip"
+
+.. tab:: Windows
+
+   .. pip-command-usage:: search "py -m pip"
+
+
+Description
+===========
+
+.. pip-command-description:: search
+
+
+Options
+=======
+
+.. pip-command-options:: search
+
+
+Examples
+========
+
+#. Search for "peppercorn"
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: console
+
+         $ python -m pip search peppercorn
+         pepperedform    - Helpers for using peppercorn with formprocess.
+         peppercorn      - A library for converting a token stream into [...]
+
+   .. tab:: Windows
+
+      .. code-block:: console
+
+         C:\> py -m pip search peppercorn
+         pepperedform    - Helpers for using peppercorn with formprocess.
+         peppercorn      - A library for converting a token stream into [...]
diff --git a/docs/html/cli/pip_show.rst b/docs/html/cli/pip_show.rst
new file mode 100644
index 00000000000..b603f786fd9
--- /dev/null
+++ b/docs/html/cli/pip_show.rst
@@ -0,0 +1,154 @@
+.. _`pip show`:
+
+========
+pip show
+========
+
+
+
+Usage
+=====
+
+.. tab:: Unix/macOS
+
+   .. pip-command-usage:: show "python -m pip"
+
+.. tab:: Windows
+
+   .. pip-command-usage:: show "py -m pip"
+
+
+Description
+===========
+
+.. pip-command-description:: show
+
+
+Options
+=======
+
+.. pip-command-options:: show
+
+
+Examples
+========
+
+#. Show information about a package:
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: console
+
+         $ python -m pip show sphinx
+         Name: Sphinx
+         Version: 1.4.5
+         Summary: Python documentation generator
+         Home-page: http://sphinx-doc.org/
+         Author: Georg Brandl
+         Author-email: georg@python.org
+         License: BSD
+         Location: /my/env/lib/python2.7/site-packages
+         Requires: docutils, snowballstemmer, alabaster, Pygments, imagesize, Jinja2, babel, six
+
+   .. tab:: Windows
+
+      .. code-block:: console
+
+         C:\> py -m pip show sphinx
+         Name: Sphinx
+         Version: 1.4.5
+         Summary: Python documentation generator
+         Home-page: http://sphinx-doc.org/
+         Author: Georg Brandl
+         Author-email: georg@python.org
+         License: BSD
+         Location: /my/env/lib/python2.7/site-packages
+         Requires: docutils, snowballstemmer, alabaster, Pygments, imagesize, Jinja2, babel, six
+
+#. Show all information about a package
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: console
+
+         $ python -m pip show --verbose sphinx
+         Name: Sphinx
+         Version: 1.4.5
+         Summary: Python documentation generator
+         Home-page: http://sphinx-doc.org/
+         Author: Georg Brandl
+         Author-email: georg@python.org
+         License: BSD
+         Location: /my/env/lib/python2.7/site-packages
+         Requires: docutils, snowballstemmer, alabaster, Pygments, imagesize, Jinja2, babel, six
+         Metadata-Version: 2.0
+         Installer:
+         Classifiers:
+            Development Status :: 5 - Production/Stable
+            Environment :: Console
+            Environment :: Web Environment
+            Intended Audience :: Developers
+            Intended Audience :: Education
+            License :: OSI Approved :: BSD License
+            Operating System :: OS Independent
+            Programming Language :: Python
+            Programming Language :: Python :: 2
+            Programming Language :: Python :: 3
+            Framework :: Sphinx
+            Framework :: Sphinx :: Extension
+            Framework :: Sphinx :: Theme
+            Topic :: Documentation
+            Topic :: Documentation :: Sphinx
+            Topic :: Text Processing
+            Topic :: Utilities
+         Entry-points:
+            [console_scripts]
+            sphinx-apidoc = sphinx.apidoc:main
+            sphinx-autogen = sphinx.ext.autosummary.generate:main
+            sphinx-build = sphinx:main
+            sphinx-quickstart = sphinx.quickstart:main
+            [distutils.commands]
+            build_sphinx = sphinx.setup_command:BuildDoc
+
+   .. tab:: Windows
+
+      .. code-block:: console
+
+         C:\> py -m pip show --verbose sphinx
+         Name: Sphinx
+         Version: 1.4.5
+         Summary: Python documentation generator
+         Home-page: http://sphinx-doc.org/
+         Author: Georg Brandl
+         Author-email: georg@python.org
+         License: BSD
+         Location: /my/env/lib/python2.7/site-packages
+         Requires: docutils, snowballstemmer, alabaster, Pygments, imagesize, Jinja2, babel, six
+         Metadata-Version: 2.0
+         Installer:
+         Classifiers:
+            Development Status :: 5 - Production/Stable
+            Environment :: Console
+            Environment :: Web Environment
+            Intended Audience :: Developers
+            Intended Audience :: Education
+            License :: OSI Approved :: BSD License
+            Operating System :: OS Independent
+            Programming Language :: Python
+            Programming Language :: Python :: 2
+            Programming Language :: Python :: 3
+            Framework :: Sphinx
+            Framework :: Sphinx :: Extension
+            Framework :: Sphinx :: Theme
+            Topic :: Documentation
+            Topic :: Documentation :: Sphinx
+            Topic :: Text Processing
+            Topic :: Utilities
+         Entry-points:
+            [console_scripts]
+            sphinx-apidoc = sphinx.apidoc:main
+            sphinx-autogen = sphinx.ext.autosummary.generate:main
+            sphinx-build = sphinx:main
+            sphinx-quickstart = sphinx.quickstart:main
+            [distutils.commands]
+            build_sphinx = sphinx.setup_command:BuildDoc
diff --git a/docs/html/cli/pip_uninstall.rst b/docs/html/cli/pip_uninstall.rst
new file mode 100644
index 00000000000..e6eeb5ebf6a
--- /dev/null
+++ b/docs/html/cli/pip_uninstall.rst
@@ -0,0 +1,58 @@
+.. _`pip uninstall`:
+
+=============
+pip uninstall
+=============
+
+
+
+Usage
+=====
+
+.. tab:: Unix/macOS
+
+   .. pip-command-usage:: uninstall "python -m pip"
+
+.. tab:: Windows
+
+   .. pip-command-usage:: uninstall "py -m pip"
+
+
+Description
+===========
+
+.. pip-command-description:: uninstall
+
+
+Options
+=======
+
+.. pip-command-options:: uninstall
+
+
+Examples
+========
+
+#. Uninstall a package.
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: console
+
+         $ python -m pip uninstall simplejson
+         Uninstalling simplejson:
+            /home/me/env/lib/python3.9/site-packages/simplejson
+            /home/me/env/lib/python3.9/site-packages/simplejson-2.2.1-py3.9.egg-info
+         Proceed (y/n)? y
+            Successfully uninstalled simplejson
+
+   .. tab:: Windows
+
+      .. code-block:: console
+
+         C:\> py -m pip uninstall simplejson
+         Uninstalling simplejson:
+            /home/me/env/lib/python3.9/site-packages/simplejson
+            /home/me/env/lib/python3.9/site-packages/simplejson-2.2.1-py3.9.egg-info
+         Proceed (y/n)? y
+            Successfully uninstalled simplejson
diff --git a/docs/html/cli/pip_wheel.rst b/docs/html/cli/pip_wheel.rst
new file mode 100644
index 00000000000..c2a9543fc99
--- /dev/null
+++ b/docs/html/cli/pip_wheel.rst
@@ -0,0 +1,125 @@
+
+.. _`pip wheel`:
+
+=========
+pip wheel
+=========
+
+
+
+Usage
+=====
+
+.. tab:: Unix/macOS
+
+   .. pip-command-usage:: wheel "python -m pip"
+
+.. tab:: Windows
+
+   .. pip-command-usage:: wheel "py -m pip"
+
+
+Description
+===========
+
+.. pip-command-description:: wheel
+
+
+Build System Interface
+----------------------
+
+In order for pip to build a wheel, ``setup.py`` must implement the
+``bdist_wheel`` command with the following syntax:
+
+.. tab:: Unix/macOS
+
+   .. code-block:: shell
+
+      python setup.py bdist_wheel -d TARGET
+
+.. tab:: Windows
+
+   .. code-block:: shell
+
+      py setup.py bdist_wheel -d TARGET
+
+
+This command must create a wheel compatible with the invoking Python
+interpreter, and save that wheel in the directory TARGET.
+
+No other build system commands are invoked by the ``pip wheel`` command.
+
+Customising the build
+^^^^^^^^^^^^^^^^^^^^^
+
+It is possible using ``--global-option`` to include additional build commands
+with their arguments in the ``setup.py`` command. This is currently the only
+way to influence the building of C extensions from the command line. For
+example:
+
+.. tab:: Unix/macOS
+
+   .. code-block:: shell
+
+      python -m pip wheel --global-option bdist_ext --global-option -DFOO wheel
+
+.. tab:: Windows
+
+   .. code-block:: shell
+
+      py -m pip wheel --global-option bdist_ext --global-option -DFOO wheel
+
+
+will result in a build command of
+
+::
+
+    setup.py bdist_ext -DFOO bdist_wheel -d TARGET
+
+which passes a preprocessor symbol to the extension build.
+
+Such usage is considered highly build-system specific and more an accident of
+the current implementation than a supported interface.
+
+
+
+Options
+=======
+
+.. pip-command-options:: wheel
+
+.. pip-index-options:: wheel
+
+
+Examples
+========
+
+#. Build wheels for a requirement (and all its dependencies), and then install
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: shell
+
+         python -m pip wheel --wheel-dir=/tmp/wheelhouse SomePackage
+         python -m pip install --no-index --find-links=/tmp/wheelhouse SomePackage
+
+   .. tab:: Windows
+
+      .. code-block:: shell
+
+         py -m pip wheel --wheel-dir=/tmp/wheelhouse SomePackage
+         py -m pip install --no-index --find-links=/tmp/wheelhouse SomePackage
+
+#. Build a wheel for a package from source
+
+   .. tab:: Unix/macOS
+
+      .. code-block:: shell
+
+         python -m pip wheel --no-binary SomePackage SomePackage
+
+   .. tab:: Windows
+
+      .. code-block:: shell
+
+         py -m pip wheel --no-binary SomePackage SomePackage
diff --git a/docs/html/index.md b/docs/html/index.md
index 351d8f79ff5..a84c2665d0e 100644
--- a/docs/html/index.md
+++ b/docs/html/index.md
@@ -13,7 +13,7 @@ install packages from the [Python Package Index][pypi] and other indexes.
 quickstart
 installing
 user_guide
-reference/index
+cli/index
 ```
 
 ```{toctree}
diff --git a/docs/html/reference/index.rst b/docs/html/reference/index.rst
index d21b7a9801a..5e81105c9ad 100644
--- a/docs/html/reference/index.rst
+++ b/docs/html/reference/index.rst
@@ -1,21 +1,11 @@
-===============
-Reference Guide
-===============
+:orphan:
 
-.. toctree::
-   :maxdepth: 2
+.. meta::
 
-   pip
-   pip_install
-   pip_download
-   pip_uninstall
-   pip_freeze
-   pip_list
-   pip_show
-   pip_search
-   pip_cache
-   pip_check
-   pip_config
-   pip_wheel
-   pip_hash
-   pip_debug
+  :http-equiv=refresh: 3; url=../cli/
+
+This page has moved
+===================
+
+You should be redirected automatically in 3 seconds. If that didn't
+work, here's a link: :doc:`../cli/index`
diff --git a/docs/html/reference/pip.rst b/docs/html/reference/pip.rst
index 1f52630f69f..53b1c9e0d41 100644
--- a/docs/html/reference/pip.rst
+++ b/docs/html/reference/pip.rst
@@ -1,255 +1,11 @@
-===
-pip
-===
+:orphan:
 
+.. meta::
 
-Usage
-*****
+  :http-equiv=refresh: 3; url=../../cli/pip/
 
-.. tab:: Unix/macOS
+This page has moved
+===================
 
-    .. code-block:: shell
-
-        python -m pip  [options]
-
-.. tab:: Windows
-
-    .. code-block:: shell
-
-        py -m pip  [options]
-
-Description
-***********
-
-
-.. _`Logging`:
-
-
-Logging
-=======
-
-Console logging
-~~~~~~~~~~~~~~~
-
-pip offers :ref:`-v, --verbose <--verbose>` and :ref:`-q, --quiet <--quiet>`
-to control the console log level. By default, some messages (error and warnings)
-are colored in the terminal. If you want to suppress the colored output use
-:ref:`--no-color <--no-color>`.
-
-
-.. _`FileLogging`:
-
-File logging
-~~~~~~~~~~~~
-
-pip offers the :ref:`--log <--log>` option for specifying a file where a maximum
-verbosity log will be kept.  This option is empty by default. This log appends
-to previous logging.
-
-Like all pip options, ``--log`` can also be set as an environment variable, or
-placed into the pip config file.  See the :ref:`Configuration` section.
-
-.. _`exists-action`:
-
---exists-action option
-======================
-
-This option specifies default behavior when path already exists.
-Possible cases: downloading files or checking out repositories for installation,
-creating archives. If ``--exists-action`` is not defined, pip will prompt
-when decision is needed.
-
-*(s)witch*
-    Only relevant to VCS checkout. Attempt to switch the checkout
-    to the appropriate URL and/or revision.
-*(i)gnore*
-    Abort current operation (e.g. don't copy file, don't create archive,
-    don't modify a checkout).
-*(w)ipe*
-    Delete the file or VCS checkout before trying to create, download, or checkout a new one.
-*(b)ackup*
-    Rename the file or checkout to ``{name}{'.bak' * n}``, where n is some number
-    of ``.bak`` extensions, such that the file didn't exist at some point.
-    So the most recent backup will be the one with the largest number after ``.bak``.
-*(a)abort*
-    Abort pip and return non-zero exit status.
-
-.. _`build-interface`:
-
-
-Build System Interface
-======================
-
-pip builds packages by invoking the build system. By default, builds will use
-``setuptools``, but if a project specifies a different build system using a
-``pyproject.toml`` file, as per :pep:`517`, pip will use that instead.  As well
-as package building, the build system is also invoked to install packages
-direct from source.  This is handled by invoking the build system to build a
-wheel, and then installing from that wheel.  The built wheel is cached locally
-by pip to avoid repeated identical builds.
-
-The current interface to the build system is via the ``setup.py`` command line
-script - all build actions are defined in terms of the specific ``setup.py``
-command line that will be run to invoke the required action.
-
-Setuptools Injection
-~~~~~~~~~~~~~~~~~~~~
-
-When :pep:`517` is not used, the supported build system is ``setuptools``.
-However, not all packages use ``setuptools`` in their build scripts. To support
-projects that use "pure ``distutils``", pip injects ``setuptools`` into
-``sys.modules`` before invoking ``setup.py``. The injection should be
-transparent to ``distutils``-based projects, but 3rd party build tools wishing
-to provide a ``setup.py`` emulating the commands pip requires may need to be
-aware that it takes place.
-
-Projects using :pep:`517` *must* explicitly use setuptools - pip does not do
-the above injection process in this case.
-
-Build System Output
-~~~~~~~~~~~~~~~~~~~
-
-Any output produced by the build system will be read by pip (for display to the
-user if requested). In order to correctly read the build system output, pip
-requires that the output is written in a well-defined encoding, specifically
-the encoding the user has configured for text output (which can be obtained in
-Python using ``locale.getpreferredencoding``). If the configured encoding is
-ASCII, pip assumes UTF-8 (to account for the behaviour of some Unix systems).
-
-Build systems should ensure that any tools they invoke (compilers, etc) produce
-output in the correct encoding. In practice - and in particular on Windows,
-where tools are inconsistent in their use of the "OEM" and "ANSI" codepages -
-this may not always be possible. pip will therefore attempt to recover cleanly
-if presented with incorrectly encoded build tool output, by translating
-unexpected byte sequences to Python-style hexadecimal escape sequences
-(``"\x80\xff"``, etc). However, it is still possible for output to be displayed
-using an incorrect encoding (mojibake).
-
-Under :pep:`517`, handling of build tool output is the backend's responsibility,
-and pip simply displays the output produced by the backend. (Backends, however,
-will likely still have to address the issues described above).
-
-PEP 517 and 518 Support
-~~~~~~~~~~~~~~~~~~~~~~~
-
-As of version 10.0, pip supports projects declaring dependencies that are
-required at install time using a ``pyproject.toml`` file, in the form described
-in :pep:`518`. When building a project, pip will install the required
-dependencies locally, and make them available to the build process.
-Furthermore, from version 19.0 onwards, pip supports projects specifying the
-build backend they use in ``pyproject.toml``, in the form described in
-:pep:`517`.
-
-When making build requirements available, pip does so in an *isolated
-environment*. That is, pip does not install those requirements into the user's
-``site-packages``, but rather installs them in a temporary directory which it
-adds to the user's ``sys.path`` for the duration of the build. This ensures
-that build requirements are handled independently of the user's runtime
-environment. For example, a project that needs a recent version of setuptools
-to build can still be installed, even if the user has an older version
-installed (and without silently replacing that version).
-
-In certain cases, projects (or redistributors) may have workflows that
-explicitly manage the build environment. For such workflows, build isolation
-can be problematic. If this is the case, pip provides a
-``--no-build-isolation`` flag to disable build isolation. Users supplying this
-flag are responsible for ensuring the build environment is managed
-appropriately (including ensuring that all required build dependencies are
-installed).
-
-By default, pip will continue to use the legacy (direct ``setup.py`` execution
-based) build processing for projects that do not have a ``pyproject.toml`` file.
-Projects with a ``pyproject.toml`` file will use a :pep:`517` backend. Projects
-with a ``pyproject.toml`` file, but which don't have a ``build-system`` section,
-will be assumed to have the following backend settings::
-
-    [build-system]
-    requires = ["setuptools>=40.8.0", "wheel"]
-    build-backend = "setuptools.build_meta:__legacy__"
-
-.. note::
-
-    ``setuptools`` 40.8.0 is the first version of setuptools that offers a
-    :pep:`517` backend that closely mimics directly executing ``setup.py``.
-
-If a project has ``[build-system]``, but no ``build-backend``, pip will also use
-``setuptools.build_meta:__legacy__``, but will expect the project requirements
-to include ``setuptools`` and ``wheel`` (and will report an error if the
-installed version of ``setuptools`` is not recent enough).
-
-If a user wants to explicitly request :pep:`517` handling even though a project
-doesn't have a ``pyproject.toml`` file, this can be done using the
-``--use-pep517`` command line option. Similarly, to request legacy processing
-even though ``pyproject.toml`` is present, the ``--no-use-pep517`` option is
-available (although obviously it is an error to choose ``--no-use-pep517`` if
-the project has no ``setup.py``, or explicitly requests a build backend). As
-with other command line flags, pip recognises the ``PIP_USE_PEP517``
-environment veriable and a ``use-pep517`` config file option (set to true or
-false) to set this option globally. Note that overriding pip's choice of
-whether to use :pep:`517` processing in this way does *not* affect whether pip
-will use an isolated build environment (which is controlled via
-``--no-build-isolation`` as noted above).
-
-Except in the case noted above (projects with no :pep:`518` ``[build-system]``
-section in ``pyproject.toml``), pip will never implicitly install a build
-system. Projects **must** ensure that the correct build system is listed in
-their ``requires`` list (this applies even if pip assumes that the
-``setuptools`` backend is being used, as noted above).
-
-.. _pep-518-limitations:
-
-**Historical Limitations**:
-
-* ``pip<18.0``: only supports installing build requirements from wheels, and
-  does not support the use of environment markers and extras (only version
-  specifiers are respected).
-
-* ``pip<18.1``: build dependencies using .pth files are not properly supported;
-  as a result namespace packages do not work under Python 3.2 and earlier.
-
-Future Developments
-~~~~~~~~~~~~~~~~~~~
-
-:pep:`426` notes that the intention is to add hooks to project metadata in
-version 2.1 of the metadata spec, to explicitly define how to build a project
-from its source. Once this version of the metadata spec is final, pip will
-migrate to using that interface. At that point, the ``setup.py`` interface
-documented here will be retained solely for legacy purposes, until projects
-have migrated.
-
-Specifically, applications should *not* expect to rely on there being any form
-of backward compatibility guarantees around the ``setup.py`` interface.
-
-
-Build Options
-~~~~~~~~~~~~~
-
-The ``--global-option`` and ``--build-option`` arguments to the ``pip install``
-and ``pip wheel`` inject additional arguments into the ``setup.py`` command
-(``--build-option`` is only available in ``pip wheel``).  These arguments are
-included in the command as follows:
-
-.. tab:: Unix/macOS
-
-    .. code-block:: console
-
-        python setup.py  BUILD COMMAND 
-
-.. tab:: Windows
-
-    .. code-block:: shell
-
-        py setup.py  BUILD COMMAND 
-
-The options are passed unmodified, and presently offer direct access to the
-distutils command line. Use of ``--global-option`` and ``--build-option``
-should be considered as build system dependent, and may not be supported in the
-current form if support for alternative build systems is added to pip.
-
-
-.. _`General Options`:
-
-General Options
-***************
-
-.. pip-general-options::
+You should be redirected automatically in 3 seconds. If that didn't
+work, here's a link: :doc:`../cli/pip`
diff --git a/docs/html/reference/pip_cache.rst b/docs/html/reference/pip_cache.rst
index 0a23c510d6f..a9cbd69dae5 100644
--- a/docs/html/reference/pip_cache.rst
+++ b/docs/html/reference/pip_cache.rst
@@ -1,27 +1,11 @@
+:orphan:
 
-.. _`pip cache`:
+.. meta::
 
-pip cache
----------
+  :http-equiv=refresh: 3; url=../../cli/pip_cache/
 
+This page has moved
+===================
 
-Usage
-*****
-
-.. tab:: Unix/macOS
-
-   .. pip-command-usage:: cache "python -m pip"
-
-.. tab:: Windows
-
-   .. pip-command-usage:: cache "py -m pip"
-
-Description
-***********
-
-.. pip-command-description:: cache
-
-Options
-*******
-
-.. pip-command-options:: cache
+You should be redirected automatically in 3 seconds. If that didn't
+work, here's a link: :doc:`../cli/pip_cache`
diff --git a/docs/html/reference/pip_check.rst b/docs/html/reference/pip_check.rst
index 268cf9a143c..5bb7fc84fcb 100644
--- a/docs/html/reference/pip_check.rst
+++ b/docs/html/reference/pip_check.rst
@@ -1,87 +1,11 @@
-.. _`pip check`:
+:orphan:
 
-=========
-pip check
-=========
+.. meta::
 
+  :http-equiv=refresh: 3; url=../../cli/pip_check/
 
-Usage
-=====
+This page has moved
+===================
 
-.. tab:: Unix/macOS
-
-   .. pip-command-usage:: check "python -m pip"
-
-.. tab:: Windows
-
-   .. pip-command-usage:: check "py -m pip"
-
-
-Description
-===========
-
-.. pip-command-description:: check
-
-
-Examples
-========
-
-#. If all dependencies are compatible:
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: console
-
-         $ python -m pip check
-         No broken requirements found.
-         $ echo $?
-         0
-
-   .. tab:: Windows
-
-      .. code-block:: console
-
-         C:\> py -m pip check
-         No broken requirements found.
-         C:\> echo %errorlevel%
-         0
-
-#. If a package is missing:
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: console
-
-         $ python -m pip check
-         pyramid 1.5.2 requires WebOb, which is not installed.
-         $ echo $?
-         1
-
-   .. tab:: Windows
-
-      .. code-block:: console
-
-         C:\> py -m pip check
-         pyramid 1.5.2 requires WebOb, which is not installed.
-         C:\> echo %errorlevel%
-         1
-
-#. If a package has the wrong version:
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: console
-
-         $ python -m pip check
-         pyramid 1.5.2 has requirement WebOb>=1.3.1, but you have WebOb 0.8.
-         $ echo $?
-         1
-
-   .. tab:: Windows
-
-      .. code-block:: console
-
-         C:\> py -m pip check
-         pyramid 1.5.2 has requirement WebOb>=1.3.1, but you have WebOb 0.8.
-         C:\> echo %errorlevel%
-         1
+You should be redirected automatically in 3 seconds. If that didn't
+work, here's a link: :doc:`../cli/pip_check`
diff --git a/docs/html/reference/pip_config.rst b/docs/html/reference/pip_config.rst
index 8b2f846304f..31a048a513a 100644
--- a/docs/html/reference/pip_config.rst
+++ b/docs/html/reference/pip_config.rst
@@ -1,30 +1,11 @@
+:orphan:
 
-.. _`pip config`:
+.. meta::
 
-==========
-pip config
-==========
+  :http-equiv=refresh: 3; url=../../cli/pip_config/
 
+This page has moved
+===================
 
-Usage
-=====
-
-.. tab:: Unix/macOS
-
-   .. pip-command-usage:: config "python -m pip"
-
-.. tab:: Windows
-
-   .. pip-command-usage:: config "py -m pip"
-
-
-Description
-===========
-
-.. pip-command-description:: config
-
-
-Options
-=======
-
-.. pip-command-options:: config
+You should be redirected automatically in 3 seconds. If that didn't
+work, here's a link: :doc:`../cli/pip_config`
diff --git a/docs/html/reference/pip_debug.rst b/docs/html/reference/pip_debug.rst
index 4023533c905..b0de682751f 100644
--- a/docs/html/reference/pip_debug.rst
+++ b/docs/html/reference/pip_debug.rst
@@ -1,35 +1,11 @@
-.. _`pip debug`:
+:orphan:
 
-=========
-pip debug
-=========
+.. meta::
 
+  :http-equiv=refresh: 3; url=../../cli/pip_debug/
 
-Usage
-=====
+This page has moved
+===================
 
-.. tab:: Unix/macOS
-
-   .. pip-command-usage:: debug "python -m pip"
-
-.. tab:: Windows
-
-   .. pip-command-usage:: debug "py -m pip"
-
-
-.. warning::
-
-    This command is only meant for debugging.
-    Its options and outputs are provisional and may change without notice.
-
-
-Description
-===========
-
-.. pip-command-description:: debug
-
-
-Options
-=======
-
-.. pip-command-options:: debug
+You should be redirected automatically in 3 seconds. If that didn't
+work, here's a link: :doc:`../cli/pip_debug`
diff --git a/docs/html/reference/pip_download.rst b/docs/html/reference/pip_download.rst
index 4f15314d765..d54a7bec554 100644
--- a/docs/html/reference/pip_download.rst
+++ b/docs/html/reference/pip_download.rst
@@ -1,226 +1,11 @@
+:orphan:
 
-.. _`pip download`:
+.. meta::
 
-============
-pip download
-============
+  :http-equiv=refresh: 3; url=../../cli/pip_download/
 
+This page has moved
+===================
 
-Usage
-=====
-
-.. tab:: Unix/macOS
-
-   .. pip-command-usage:: download "python -m pip"
-
-.. tab:: Windows
-
-   .. pip-command-usage:: download "py -m pip"
-
-
-Description
-===========
-
-.. pip-command-description:: download
-
-Overview
---------
-
-``pip download`` does the same resolution and downloading as ``pip install``,
-but instead of installing the dependencies, it collects the downloaded
-distributions into the directory provided (defaulting to the current
-directory). This directory can later be passed as the value to ``pip install
---find-links`` to facilitate offline or locked down package installation.
-
-``pip download`` with the ``--platform``, ``--python-version``,
-``--implementation``, and ``--abi`` options provides the ability to fetch
-dependencies for an interpreter and system other than the ones that pip is
-running on. ``--only-binary=:all:`` or ``--no-deps`` is required when using any
-of these options. It is important to note that these options all default to the
-current system/interpreter, and not to the most restrictive constraints (e.g.
-platform any, abi none, etc). To avoid fetching dependencies that happen to
-match the constraint of the current interpreter (but not your target one), it
-is recommended to specify all of these options if you are specifying one of
-them. Generic dependencies (e.g. universal wheels, or dependencies with no
-platform, abi, or implementation constraints) will still match an over-
-constrained download requirement.
-
-
-
-Options
-=======
-
-.. pip-command-options:: download
-
-.. pip-index-options:: download
-
-
-Examples
-========
-
-#. Download a package and all of its dependencies
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: shell
-
-         python -m pip download SomePackage
-         python -m pip download -d . SomePackage  # equivalent to above
-         python -m pip download --no-index --find-links=/tmp/wheelhouse -d /tmp/otherwheelhouse SomePackage
-
-   .. tab:: Windows
-
-      .. code-block:: shell
-
-         py -m pip download SomePackage
-         py -m pip download -d . SomePackage  # equivalent to above
-         py -m pip download --no-index --find-links=/tmp/wheelhouse -d /tmp/otherwheelhouse SomePackage
-
-
-#. Download a package and all of its dependencies with OSX specific interpreter constraints.
-   This forces OSX 10.10 or lower compatibility. Since OSX deps are forward compatible,
-   this will also match ``macosx-10_9_x86_64``, ``macosx-10_8_x86_64``, ``macosx-10_8_intel``,
-   etc.
-   It will also match deps with platform ``any``. Also force the interpreter version to ``27``
-   (or more generic, i.e. ``2``) and implementation to ``cp`` (or more generic, i.e. ``py``).
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: shell
-
-         python -m pip download \
-            --only-binary=:all: \
-            --platform macosx-10_10_x86_64 \
-            --python-version 27 \
-            --implementation cp \
-            SomePackage
-
-   .. tab:: Windows
-
-      .. code-block:: shell
-
-         py -m pip download ^
-            --only-binary=:all: ^
-            --platform macosx-10_10_x86_64 ^
-            --python-version 27 ^
-            --implementation cp ^
-            SomePackage
-
-#. Download a package and its dependencies with linux specific constraints.
-   Force the interpreter to be any minor version of py3k, and only accept
-   ``cp34m`` or ``none`` as the abi.
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: shell
-
-         python -m pip download \
-            --only-binary=:all: \
-            --platform linux_x86_64 \
-            --python-version 3 \
-            --implementation cp \
-            --abi cp34m \
-            SomePackage
-
-   .. tab:: Windows
-
-      .. code-block:: shell
-
-         py -m pip download ^
-            --only-binary=:all: ^
-            --platform linux_x86_64 ^
-            --python-version 3 ^
-            --implementation cp ^
-            --abi cp34m ^
-            SomePackage
-
-#. Force platform, implementation, and abi agnostic deps.
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: shell
-
-         python -m pip download \
-            --only-binary=:all: \
-            --platform any \
-            --python-version 3 \
-            --implementation py \
-            --abi none \
-            SomePackage
-
-   .. tab:: Windows
-
-      .. code-block:: shell
-
-         py -m pip download ^
-            --only-binary=:all: ^
-            --platform any ^
-            --python-version 3 ^
-            --implementation py ^
-            --abi none ^
-            SomePackage
-
-#. Even when overconstrained, this will still correctly fetch the pip universal wheel.
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: console
-
-         $ python -m pip download \
-            --only-binary=:all: \
-            --platform linux_x86_64 \
-            --python-version 33 \
-            --implementation cp \
-            --abi cp34m \
-            pip>=8
-
-      .. code-block:: console
-
-         $ ls pip-8.1.1-py2.py3-none-any.whl
-         pip-8.1.1-py2.py3-none-any.whl
-
-   .. tab:: Windows
-
-      .. code-block:: console
-
-         C:\> py -m pip download ^
-            --only-binary=:all: ^
-            --platform linux_x86_64 ^
-            --python-version 33 ^
-            --implementation cp ^
-            --abi cp34m ^
-            pip>=8
-
-      .. code-block:: console
-
-         C:\> dir pip-8.1.1-py2.py3-none-any.whl
-         pip-8.1.1-py2.py3-none-any.whl
-
-#. Download a package supporting one of several ABIs and platforms.
-    This is useful when fetching wheels for a well-defined interpreter, whose
-    supported ABIs and platforms are known and fixed, different than the one pip is
-    running under.
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: console
-
-         $ python -m pip download \
-            --only-binary=:all: \
-            --platform manylinux1_x86_64 --platform linux_x86_64 --platform any \
-            --python-version 36 \
-            --implementation cp \
-            --abi cp36m --abi cp36 --abi abi3 --abi none \
-            SomePackage
-
-   .. tab:: Windows
-
-      .. code-block:: console
-
-         C:> py -m pip download ^
-            --only-binary=:all: ^
-            --platform manylinux1_x86_64 --platform linux_x86_64 --platform any ^
-            --python-version 36 ^
-            --implementation cp ^
-            --abi cp36m --abi cp36 --abi abi3 --abi none ^
-            SomePackage
+You should be redirected automatically in 3 seconds. If that didn't
+work, here's a link: :doc:`../cli/pip_download`
diff --git a/docs/html/reference/pip_freeze.rst b/docs/html/reference/pip_freeze.rst
index 352f7d32168..1cf31d5d708 100644
--- a/docs/html/reference/pip_freeze.rst
+++ b/docs/html/reference/pip_freeze.rst
@@ -1,74 +1,11 @@
+:orphan:
 
-.. _`pip freeze`:
+.. meta::
 
-==========
-pip freeze
-==========
+  :http-equiv=refresh: 3; url=../../cli/pip_freeze/
 
+This page has moved
+===================
 
-Usage
-=====
-
-.. tab:: Unix/macOS
-
-   .. pip-command-usage:: freeze "python -m pip"
-
-.. tab:: Windows
-
-   .. pip-command-usage:: freeze "py -m pip"
-
-
-Description
-===========
-
-.. pip-command-description:: freeze
-
-
-Options
-=======
-
-.. pip-command-options:: freeze
-
-
-Examples
-========
-
-#. Generate output suitable for a requirements file.
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: console
-
-         $ python -m pip freeze
-         docutils==0.11
-         Jinja2==2.7.2
-         MarkupSafe==0.19
-         Pygments==1.6
-         Sphinx==1.2.2
-
-   .. tab:: Windows
-
-      .. code-block:: console
-
-         C:\> py -m pip freeze
-         docutils==0.11
-         Jinja2==2.7.2
-         MarkupSafe==0.19
-         Pygments==1.6
-         Sphinx==1.2.2
-
-#. Generate a requirements file and then install from it in another environment.
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: shell
-
-         env1/bin/python -m pip freeze > requirements.txt
-         env2/bin/python -m pip install -r requirements.txt
-
-   .. tab:: Windows
-
-      .. code-block:: shell
-
-         env1\bin\python -m pip freeze > requirements.txt
-         env2\bin\python -m pip install -r requirements.txt
+You should be redirected automatically in 3 seconds. If that didn't
+work, here's a link: :doc:`../cli/pip_freeze`
diff --git a/docs/html/reference/pip_hash.rst b/docs/html/reference/pip_hash.rst
index 7df0d5a4f13..6112bec5fa3 100644
--- a/docs/html/reference/pip_hash.rst
+++ b/docs/html/reference/pip_hash.rst
@@ -1,72 +1,11 @@
-.. _`pip hash`:
+:orphan:
 
-========
-pip hash
-========
+.. meta::
 
+  :http-equiv=refresh: 3; url=../../cli/pip_hash/
 
-Usage
-=====
+This page has moved
+===================
 
-.. tab:: Unix/macOS
-
-   .. pip-command-usage:: hash "python -m pip"
-
-.. tab:: Windows
-
-   .. pip-command-usage:: hash "py -m pip"
-
-
-Description
-===========
-
-.. pip-command-description:: hash
-
-Overview
---------
-
-``pip hash`` is a convenient way to get a hash digest for use with
-:ref:`hash-checking mode`, especially for packages with multiple archives. The
-error message from ``pip install --require-hashes ...`` will give you one
-hash, but, if there are multiple archives (like source and binary ones), you
-will need to manually download and compute a hash for the others. Otherwise, a
-spurious hash mismatch could occur when :ref:`pip install` is passed a
-different set of options, like :ref:`--no-binary `.
-
-
-Options
-=======
-
-.. pip-command-options:: hash
-
-
-Example
-=======
-
-Compute the hash of a downloaded archive:
-
-.. tab:: Unix/macOS
-
-   .. code-block:: console
-
-      $ python -m pip download SomePackage
-      Collecting SomePackage
-         Downloading SomePackage-2.2.tar.gz
-         Saved ./pip_downloads/SomePackage-2.2.tar.gz
-      Successfully downloaded SomePackage
-      $ python -m pip hash ./pip_downloads/SomePackage-2.2.tar.gz
-      ./pip_downloads/SomePackage-2.2.tar.gz:
-      --hash=sha256:93e62e05c7ad3da1a233def6731e8285156701e3419a5fe279017c429ec67ce0
-
-.. tab:: Windows
-
-   .. code-block:: console
-
-      C:\> py -m pip download SomePackage
-      Collecting SomePackage
-         Downloading SomePackage-2.2.tar.gz
-         Saved ./pip_downloads/SomePackage-2.2.tar.gz
-      Successfully downloaded SomePackage
-      C:\> py -m pip hash ./pip_downloads/SomePackage-2.2.tar.gz
-      ./pip_downloads/SomePackage-2.2.tar.gz:
-      --hash=sha256:93e62e05c7ad3da1a233def6731e8285156701e3419a5fe279017c429ec67ce0
+You should be redirected automatically in 3 seconds. If that didn't
+work, here's a link: :doc:`../cli/pip_hash`
diff --git a/docs/html/reference/pip_install.rst b/docs/html/reference/pip_install.rst
index c60267f1cf1..580900cfb93 100644
--- a/docs/html/reference/pip_install.rst
+++ b/docs/html/reference/pip_install.rst
@@ -1,1211 +1,11 @@
-.. _`pip install`:
+:orphan:
 
-===========
-pip install
-===========
+.. meta::
 
+  :http-equiv=refresh: 3; url=../../cli/pip_install/
 
+This page has moved
+===================
 
-Usage
-=====
-
-.. tab:: Unix/macOS
-
-   .. pip-command-usage:: install "python -m pip"
-
-.. tab:: Windows
-
-   .. pip-command-usage:: install "py -m pip"
-
-
-
-Description
-===========
-
-.. pip-command-description:: install
-
-Overview
---------
-
-pip install has several stages:
-
-1. Identify the base requirements. The user supplied arguments are processed
-   here.
-2. Resolve dependencies. What will be installed is determined here.
-3. Build wheels. All the dependencies that can be are built into wheels.
-4. Install the packages (and uninstall anything being upgraded/replaced).
-
-Note that ``pip install`` prefers to leave the installed version as-is
-unless ``--upgrade`` is specified.
-
-Argument Handling
------------------
-
-When looking at the items to be installed, pip checks what type of item
-each is, in the following order:
-
-1. Project or archive URL.
-2. Local directory (which must contain a ``setup.py``, or pip will report
-   an error).
-3. Local file (a sdist or wheel format archive, following the naming
-   conventions for those formats).
-4. A requirement, as specified in :pep:`440`.
-
-Each item identified is added to the set of requirements to be satisfied by
-the install.
-
-Working Out the Name and Version
---------------------------------
-
-For each candidate item, pip needs to know the project name and version. For
-wheels (identified by the ``.whl`` file extension) this can be obtained from
-the filename, as per the Wheel spec. For local directories, or explicitly
-specified sdist files, the ``setup.py egg_info`` command is used to determine
-the project metadata. For sdists located via an index, the filename is parsed
-for the name and project version (this is in theory slightly less reliable
-than using the ``egg_info`` command, but avoids downloading and processing
-unnecessary numbers of files).
-
-Any URL may use the ``#egg=name`` syntax (see :ref:`VCS Support`) to
-explicitly state the project name.
-
-Satisfying Requirements
------------------------
-
-Once pip has the set of requirements to satisfy, it chooses which version of
-each requirement to install using the simple rule that the latest version that
-satisfies the given constraints will be installed (but see :ref:`here 
`
-for an exception regarding pre-release versions). Where more than one source of
-the chosen version is available, it is assumed that any source is acceptable
-(as otherwise the versions would differ).
-
-Installation Order
-------------------
-
-.. note::
-
-   This section is only about installation order of runtime dependencies, and
-   does not apply to build dependencies (those are specified using PEP 518).
-
-As of v6.1.0, pip installs dependencies before their dependents, i.e. in
-"topological order."  This is the only commitment pip currently makes related
-to order.  While it may be coincidentally true that pip will install things in
-the order of the install arguments or in the order of the items in a
-requirements file, this is not a promise.
-
-In the event of a dependency cycle (aka "circular dependency"), the current
-implementation (which might possibly change later) has it such that the first
-encountered member of the cycle is installed last.
-
-For instance, if quux depends on foo which depends on bar which depends on baz,
-which depends on foo:
-
-.. tab:: Unix/macOS
-
-   .. code-block:: console
-
-      $ python -m pip install quux
-      ...
-      Installing collected packages baz, bar, foo, quux
-
-      $ python -m pip install bar
-      ...
-      Installing collected packages foo, baz, bar
-
-.. tab:: Windows
-
-   .. code-block:: console
-
-      C:\> py -m pip install quux
-      ...
-      Installing collected packages baz, bar, foo, quux
-
-      C:\> py -m pip install bar
-      ...
-      Installing collected packages foo, baz, bar
-
-
-Prior to v6.1.0, pip made no commitments about install order.
-
-The decision to install topologically is based on the principle that
-installations should proceed in a way that leaves the environment usable at each
-step. This has two main practical benefits:
-
-1. Concurrent use of the environment during the install is more likely to work.
-2. A failed install is less likely to leave a broken environment.  Although pip
-   would like to support failure rollbacks eventually, in the mean time, this is
-   an improvement.
-
-Although the new install order is not intended to replace (and does not replace)
-the use of ``setup_requires`` to declare build dependencies, it may help certain
-projects install from sdist (that might previously fail) that fit the following
-profile:
-
-1. They have build dependencies that are also declared as install dependencies
-   using ``install_requires``.
-2. ``python setup.py egg_info`` works without their build dependencies being
-   installed.
-3. For whatever reason, they don't or won't declare their build dependencies using
-   ``setup_requires``.
-
-
-.. _`Requirements File Format`:
-
-Requirements File Format
-------------------------
-
-Each line of the requirements file indicates something to be installed,
-and like arguments to :ref:`pip install`, the following forms are supported::
-
-    [[--option]...]
-     [; markers] [[--option]...]
-    
-    [-e] 
-    [-e] 
-
-For details on requirement specifiers, see :ref:`Requirement Specifiers`.
-
-See the :ref:`pip install Examples` for examples of all these forms.
-
-A line that begins with ``#`` is treated as a comment and ignored. Whitespace
-followed by a ``#`` causes the ``#`` and the remainder of the line to be
-treated as a comment.
-
-A line ending in an unescaped ``\`` is treated as a line continuation
-and the newline following it is effectively ignored.
-
-Comments are stripped *after* line continuations are processed.
-
-To interpret the requirements file in UTF-8 format add a comment
-``# -*- coding: utf-8 -*-`` to the first or second line of the file.
-
-The following options are supported:
-
-.. pip-requirements-file-options-ref-list::
-
-Please note that the above options are global options, and should be specified on their individual lines.
-The options which can be applied to individual requirements are
-:ref:`--install-option `, :ref:`--global-option ` and ``--hash``.
-
-For example, to specify :ref:`--pre `, :ref:`--no-index ` and two
-:ref:`--find-links ` locations:
-
-::
-
---pre
---no-index
---find-links /my/local/archives
---find-links http://some.archives.com/archives
-
-
-If you wish, you can refer to other requirements files, like this::
-
-    -r more_requirements.txt
-
-You can also refer to :ref:`constraints files `, like this::
-
-    -c some_constraints.txt
-
-.. _`Using Environment Variables`:
-
-Using Environment Variables
-^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Since version 10, pip supports the use of environment variables inside the
-requirements file. You can now store sensitive data (tokens, keys, etc.) in
-environment variables and only specify the variable name for your requirements,
-letting pip lookup the value at runtime. This approach aligns with the commonly
-used `12-factor configuration pattern `_.
-
-You have to use the POSIX format for variable names including brackets around
-the uppercase name as shown in this example: ``${API_TOKEN}``. pip will attempt
-to find the corresponding environment variable defined on the host system at
-runtime.
-
-.. note::
-
-   There is no support for other variable expansion syntaxes such as
-   ``$VARIABLE`` and ``%VARIABLE%``.
-
-
-.. _`Example Requirements File`:
-
-Example Requirements File
-^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Use ``pip install -r example-requirements.txt`` to install::
-
-    #
-    ####### example-requirements.txt #######
-    #
-    ###### Requirements without Version Specifiers ######
-    nose
-    nose-cov
-    beautifulsoup4
-    #
-    ###### Requirements with Version Specifiers ######
-    #   See https://www.python.org/dev/peps/pep-0440/#version-specifiers
-    docopt == 0.6.1             # Version Matching. Must be version 0.6.1
-    keyring >= 4.1.1            # Minimum version 4.1.1
-    coverage != 3.5             # Version Exclusion. Anything except version 3.5
-    Mopidy-Dirble ~= 1.1        # Compatible release. Same as >= 1.1, == 1.*
-    #
-    ###### Refer to other requirements files ######
-    -r other-requirements.txt
-    #
-    #
-    ###### A particular file ######
-    ./downloads/numpy-1.9.2-cp34-none-win32.whl
-    http://wxpython.org/Phoenix/snapshot-builds/wxPython_Phoenix-3.0.3.dev1820+49a8884-cp34-none-win_amd64.whl
-    #
-    ###### Additional Requirements without Version Specifiers ######
-    #   Same as 1st section, just here to show that you can put things in any order.
-    rejected
-    green
-    #
-
-.. _`Requirement Specifiers`:
-
-Requirement Specifiers
-----------------------
-
-pip supports installing from a package index using a :term:`requirement
-specifier `. Generally speaking, a requirement
-specifier is composed of a project name followed by optional :term:`version
-specifiers `.  :pep:`508` contains a full specification
-of the format of a requirement. Since version 18.1 pip supports the
-``url_req``-form specification.
-
-Some examples:
-
- ::
-
-  SomeProject
-  SomeProject == 1.3
-  SomeProject >=1.2,<2.0
-  SomeProject[foo, bar]
-  SomeProject~=1.4.2
-
-Since version 6.0, pip also supports specifiers containing `environment markers
-`__ like so:
-
- ::
-
-  SomeProject ==5.4 ; python_version < '3.8'
-  SomeProject; sys_platform == 'win32'
-
-Since version 19.1, pip also supports `direct references
-`__ like so:
-
- ::
-
-  SomeProject @ file:///somewhere/...
-
-Environment markers are supported in the command line and in requirements files.
-
-.. note::
-
-   Use quotes around specifiers in the shell when using ``>``, ``<``, or when
-   using environment markers. Don't use quotes in requirement files. [1]_
-
-
-.. _`Per-requirement Overrides`:
-
-Per-requirement Overrides
--------------------------
-
-Since version 7.0 pip supports controlling the command line options given to
-``setup.py`` via requirements files. This disables the use of wheels (cached or
-otherwise) for that package, as ``setup.py`` does not exist for wheels.
-
-The ``--global-option`` and ``--install-option`` options are used to pass
-options to ``setup.py``. For example:
-
- ::
-
-    FooProject >= 1.2 --global-option="--no-user-cfg" \
-                      --install-option="--prefix='/usr/local'" \
-                      --install-option="--no-compile"
-
-The above translates roughly into running FooProject's ``setup.py``
-script as:
-
- ::
-
-   python setup.py --no-user-cfg install --prefix='/usr/local' --no-compile
-
-Note that the only way of giving more than one option to ``setup.py``
-is through multiple ``--global-option`` and ``--install-option``
-options, as shown in the example above. The value of each option is
-passed as a single argument to the ``setup.py`` script. Therefore, a
-line such as the following is invalid and would result in an
-installation error.
-
-::
-
-   # Invalid. Please use '--install-option' twice as shown above.
-   FooProject >= 1.2 --install-option="--prefix=/usr/local --no-compile"
-
-
-.. _`Pre Release Versions`:
-
-Pre-release Versions
---------------------
-
-Starting with v1.4, pip will only install stable versions as specified by
-`pre-releases`_ by default. If a version cannot be parsed as a compliant :pep:`440`
-version then it is assumed to be a pre-release.
-
-If a Requirement specifier includes a pre-release or development version
-(e.g. ``>=0.0.dev0``) then pip will allow pre-release and development versions
-for that requirement. This does not include the != flag.
-
-The ``pip install`` command also supports a :ref:`--pre ` flag
-that enables installation of pre-releases and development releases.
-
-
-.. _pre-releases: https://www.python.org/dev/peps/pep-0440/#handling-of-pre-releases
-
-
-.. _`VCS Support`:
-
-VCS Support
------------
-
-pip supports installing from Git, Mercurial, Subversion and Bazaar, and detects
-the type of VCS using URL prefixes: ``git+``, ``hg+``, ``svn+``, and ``bzr+``.
-
-pip requires a working VCS command on your path: ``git``, ``hg``, ``svn``, or
-``bzr``.
-
-VCS projects can be installed in :ref:`editable mode ` (using
-the :ref:`--editable ` option) or not.
-
-* For editable installs, the clone location by default is ``/src/SomeProject`` in virtual environments, and
-  ``/src/SomeProject``
-  for global installs.  The :ref:`--src ` option can be used to
-  modify this location.
-* For non-editable installs, the project is built locally in a temp dir and then
-  installed normally. Note that if a satisfactory version of the package is
-  already installed, the VCS source will not overwrite it without an
-  ``--upgrade`` flag. VCS requirements pin the package version (specified
-  in the ``setup.py`` file) of the target commit, not necessarily the commit
-  itself.
-* The :ref:`pip freeze` subcommand will record the VCS requirement specifier
-  (referencing a specific commit) if and only if the install is done using the
-  editable option.
-
-The "project name" component of the URL suffix ``egg=``
-is used by pip in its dependency logic to identify the project prior
-to pip downloading and analyzing the metadata. For projects
-where ``setup.py`` is not in the root of project, the "subdirectory" component
-is used. The value of the "subdirectory" component should be a path starting
-from the root of the project to where ``setup.py`` is located.
-
-If your repository layout is::
-
-   pkg_dir
-   ├── setup.py  # setup.py for package "pkg"
-   └── some_module.py
-   other_dir
-   └── some_file
-   some_other_file
-
-Then, to install from this repository, the syntax would be:
-
-.. tab:: Unix/macOS
-
-   .. code-block:: shell
-
-      python -m pip install -e "vcs+protocol://repo_url/#egg=pkg&subdirectory=pkg_dir"
-
-.. tab:: Windows
-
-   .. code-block:: shell
-
-      py -m pip install -e "vcs+protocol://repo_url/#egg=pkg&subdirectory=pkg_dir"
-
-
-Git
-^^^
-
-pip currently supports cloning over ``git``, ``git+http``, ``git+https``,
-``git+ssh``, ``git+git`` and ``git+file``.
-
-.. warning::
-
-    Note that the use of ``git``, ``git+git``, and ``git+http`` is discouraged.
-    The former two use `the Git Protocol`_, which lacks authentication, and HTTP is
-    insecure due to lack of TLS based encryption.
-
-Here are the supported forms::
-
-    [-e] git+http://git.example.com/MyProject#egg=MyProject
-    [-e] git+https://git.example.com/MyProject#egg=MyProject
-    [-e] git+ssh://git.example.com/MyProject#egg=MyProject
-    [-e] git+file:///home/user/projects/MyProject#egg=MyProject
-
-Passing a branch name, a commit hash, a tag name or a git ref is possible like so::
-
-    [-e] git+https://git.example.com/MyProject.git@main#egg=MyProject
-    [-e] git+https://git.example.com/MyProject.git@v1.0#egg=MyProject
-    [-e] git+https://git.example.com/MyProject.git@da39a3ee5e6b4b0d3255bfef95601890afd80709#egg=MyProject
-    [-e] git+https://git.example.com/MyProject.git@refs/pull/123/head#egg=MyProject
-
-When passing a commit hash, specifying a full hash is preferable to a partial
-hash because a full hash allows pip to operate more efficiently (e.g. by
-making fewer network calls).
-
-.. _`the Git Protocol`: https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols
-
-Mercurial
-^^^^^^^^^
-
-The supported schemes are: ``hg+file``, ``hg+http``, ``hg+https``,
-``hg+static-http``, and ``hg+ssh``.
-
-Here are the supported forms::
-
-    [-e] hg+http://hg.myproject.org/MyProject#egg=MyProject
-    [-e] hg+https://hg.myproject.org/MyProject#egg=MyProject
-    [-e] hg+ssh://hg.myproject.org/MyProject#egg=MyProject
-    [-e] hg+file:///home/user/projects/MyProject#egg=MyProject
-
-You can also specify a revision number, a revision hash, a tag name or a local
-branch name like so::
-
-    [-e] hg+http://hg.example.com/MyProject@da39a3ee5e6b#egg=MyProject
-    [-e] hg+http://hg.example.com/MyProject@2019#egg=MyProject
-    [-e] hg+http://hg.example.com/MyProject@v1.0#egg=MyProject
-    [-e] hg+http://hg.example.com/MyProject@special_feature#egg=MyProject
-
-Subversion
-^^^^^^^^^^
-
-pip supports the URL schemes ``svn``, ``svn+svn``, ``svn+http``, ``svn+https``, ``svn+ssh``.
-
-Here are some of the supported forms::
-
-    [-e] svn+https://svn.example.com/MyProject#egg=MyProject
-    [-e] svn+ssh://svn.example.com/MyProject#egg=MyProject
-    [-e] svn+ssh://user@svn.example.com/MyProject#egg=MyProject
-
-You can also give specific revisions to an SVN URL, like so::
-
-    [-e] svn+svn://svn.example.com/svn/MyProject#egg=MyProject
-    [-e] svn+http://svn.example.com/svn/MyProject/trunk@2019#egg=MyProject
-
-which will check out revision 2019.  ``@{20080101}`` would also check
-out the revision from 2008-01-01. You can only check out specific
-revisions using ``-e svn+...``.
-
-Bazaar
-^^^^^^
-
-pip supports Bazaar using the ``bzr+http``, ``bzr+https``, ``bzr+ssh``,
-``bzr+sftp``, ``bzr+ftp`` and ``bzr+lp`` schemes.
-
-Here are the supported forms::
-
-    [-e] bzr+http://bzr.example.com/MyProject/trunk#egg=MyProject
-    [-e] bzr+sftp://user@example.com/MyProject/trunk#egg=MyProject
-    [-e] bzr+ssh://user@example.com/MyProject/trunk#egg=MyProject
-    [-e] bzr+ftp://user@example.com/MyProject/trunk#egg=MyProject
-    [-e] bzr+lp:MyProject#egg=MyProject
-
-Tags or revisions can be installed like so::
-
-    [-e] bzr+https://bzr.example.com/MyProject/trunk@2019#egg=MyProject
-    [-e] bzr+http://bzr.example.com/MyProject/trunk@v1.0#egg=MyProject
-
-Using Environment Variables
-^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Since version 10, pip also makes it possible to use environment variables which
-makes it possible to reference private repositories without having to store
-access tokens in the requirements file. For example, a private git repository
-allowing Basic Auth for authentication can be refenced like this::
-
-    [-e] git+http://${AUTH_USER}:${AUTH_PASSWORD}@git.example.com/MyProject#egg=MyProject
-    [-e] git+https://${AUTH_USER}:${AUTH_PASSWORD}@git.example.com/MyProject#egg=MyProject
-
-.. note::
-
-   Only ``${VARIABLE}`` is supported, other formats like ``$VARIABLE`` or
-   ``%VARIABLE%`` won't work.
-
-Finding Packages
-----------------
-
-pip searches for packages on `PyPI`_ using the
-`HTTP simple interface `_,
-which is documented `here `_
-and `there `_.
-
-pip offers a number of package index options for modifying how packages are
-found.
-
-pip looks for packages in a number of places: on PyPI (if not disabled via
-``--no-index``), in the local filesystem, and in any additional repositories
-specified via ``--find-links`` or ``--index-url``. There is no ordering in
-the locations that are searched. Rather they are all checked, and the "best"
-match for the requirements (in terms of version number - see :pep:`440` for
-details) is selected.
-
-See the :ref:`pip install Examples`.
-
-
-.. _`SSL Certificate Verification`:
-
-SSL Certificate Verification
-----------------------------
-
-Starting with v1.3, pip provides SSL certificate verification over HTTP, to
-prevent man-in-the-middle attacks against PyPI downloads. This does not use
-the system certificate store but instead uses a bundled CA certificate
-store. The default bundled CA certificate store certificate store may be
-overridden by using ``--cert`` option or by using ``PIP_CERT``,
-``REQUESTS_CA_BUNDLE``, or ``CURL_CA_BUNDLE`` environment variables.
-
-
-.. _`Caching`:
-
-Caching
--------
-
-Starting with v6.0, pip provides an on-by-default cache which functions
-similarly to that of a web browser. While the cache is on by default and is
-designed do the right thing by default you can disable the cache and always
-access PyPI by utilizing the ``--no-cache-dir`` option.
-
-When making any HTTP request pip will first check its local cache to determine
-if it has a suitable response stored for that request which has not expired. If
-it does then it simply returns that response and doesn't make the request.
-
-If it has a response stored, but it has expired, then it will attempt to make a
-conditional request to refresh the cache which will either return an empty
-response telling pip to simply use the cached item (and refresh the expiration
-timer) or it will return a whole new response which pip can then store in the
-cache.
-
-While this cache attempts to minimize network activity, it does not prevent
-network access altogether. If you want a local install solution that
-circumvents accessing PyPI, see :ref:`Installing from local packages`.
-
-The default location for the cache directory depends on the operating system:
-
-Unix
-  :file:`~/.cache/pip` and it respects the ``XDG_CACHE_HOME`` directory.
-macOS
-  :file:`~/Library/Caches/pip`.
-Windows
-  :file:`\\pip\\Cache`
-
-Run ``pip cache dir`` to show the cache directory and see :ref:`pip cache` to
-inspect and manage pip’s cache.
-
-
-.. _`Wheel cache`:
-
-Wheel Cache
-^^^^^^^^^^^
-
-pip will read from the subdirectory ``wheels`` within the pip cache directory
-and use any packages found there. This is disabled via the same
-``--no-cache-dir`` option that disables the HTTP cache. The internal structure
-of that is not part of the pip API. As of 7.0, pip makes a subdirectory for
-each sdist that wheels are built from and places the resulting wheels inside.
-
-As of version 20.0, pip also caches wheels when building from an immutable Git
-reference (i.e. a commit hash).
-
-pip attempts to choose the best wheels from those built in preference to
-building a new wheel. Note that this means when a package has both optional
-C extensions and builds ``py`` tagged wheels when the C extension can't be built
-that pip will not attempt to build a better wheel for Pythons that would have
-supported it, once any generic wheel is built. To correct this, make sure that
-the wheels are built with Python specific tags - e.g. pp on PyPy.
-
-When no wheels are found for an sdist, pip will attempt to build a wheel
-automatically and insert it into the wheel cache.
-
-
-.. _`hash-checking mode`:
-
-Hash-Checking Mode
-------------------
-
-Since version 8.0, pip can check downloaded package archives against local
-hashes to protect against remote tampering. To verify a package against one or
-more hashes, add them to the end of the line::
-
-    FooProject == 1.2 --hash=sha256:2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 \
-                      --hash=sha256:486ea46224d1bb4fb680f34f7c9ad96a8f24ec88be73ea8e5a6c65260e9cb8a7
-
-(The ability to use multiple hashes is important when a package has both
-binary and source distributions or when it offers binary distributions for a
-variety of platforms.)
-
-The recommended hash algorithm at the moment is sha256, but stronger ones are
-allowed, including all those supported by ``hashlib``. However, weaker ones
-such as md5, sha1, and sha224 are excluded to avoid giving a false sense of
-security.
-
-Hash verification is an all-or-nothing proposition. Specifying a ``--hash``
-against any requirement not only checks that hash but also activates a global
-*hash-checking mode*, which imposes several other security restrictions:
-
-* Hashes are required for all requirements. This is because a partially-hashed
-  requirements file is of little use and thus likely an error: a malicious
-  actor could slip bad code into the installation via one of the unhashed
-  requirements. Note that hashes embedded in URL-style requirements via the
-  ``#md5=...`` syntax suffice to satisfy this rule (regardless of hash
-  strength, for legacy reasons), though you should use a stronger
-  hash like sha256 whenever possible.
-* Hashes are required for all dependencies. An error results if there is a
-  dependency that is not spelled out and hashed in the requirements file.
-* Requirements that take the form of project names (rather than URLs or local
-  filesystem paths) must be pinned to a specific version using ``==``. This
-  prevents a surprising hash mismatch upon the release of a new version
-  that matches the requirement specifier.
-* ``--egg`` is disallowed, because it delegates installation of dependencies
-  to setuptools, giving up pip's ability to enforce any of the above.
-
-.. _`--require-hashes`:
-
-Hash-checking mode can be forced on with the ``--require-hashes`` command-line
-option:
-
-.. tab:: Unix/macOS
-
-   .. code-block:: console
-
-      $ python -m pip install --require-hashes -r requirements.txt
-      ...
-      Hashes are required in --require-hashes mode (implicitly on when a hash is
-      specified for any package). These requirements were missing hashes,
-      leaving them open to tampering. These are the hashes the downloaded
-      archives actually had. You can add lines like these to your requirements
-      files to prevent tampering.
-         pyelasticsearch==1.0 --hash=sha256:44ddfb1225054d7d6b1d02e9338e7d4809be94edbe9929a2ec0807d38df993fa
-         more-itertools==2.2 --hash=sha256:93e62e05c7ad3da1a233def6731e8285156701e3419a5fe279017c429ec67ce0
-
-.. tab:: Windows
-
-   .. code-block:: console
-
-      C:\> py -m pip install --require-hashes -r requirements.txt
-      ...
-      Hashes are required in --require-hashes mode (implicitly on when a hash is
-      specified for any package). These requirements were missing hashes,
-      leaving them open to tampering. These are the hashes the downloaded
-      archives actually had. You can add lines like these to your requirements
-      files to prevent tampering.
-         pyelasticsearch==1.0 --hash=sha256:44ddfb1225054d7d6b1d02e9338e7d4809be94edbe9929a2ec0807d38df993fa
-         more-itertools==2.2 --hash=sha256:93e62e05c7ad3da1a233def6731e8285156701e3419a5fe279017c429ec67ce0
-
-
-This can be useful in deploy scripts, to ensure that the author of the
-requirements file provided hashes. It is also a convenient way to bootstrap
-your list of hashes, since it shows the hashes of the packages it fetched. It
-fetches only the preferred archive for each package, so you may still need to
-add hashes for alternatives archives using :ref:`pip hash`: for instance if
-there is both a binary and a source distribution.
-
-The :ref:`wheel cache ` is disabled in hash-checking mode to
-prevent spurious hash mismatch errors. These would otherwise occur while
-installing sdists that had already been automatically built into cached wheels:
-those wheels would be selected for installation, but their hashes would not
-match the sdist ones from the requirements file. A further complication is that
-locally built wheels are nondeterministic: contemporary modification times make
-their way into the archive, making hashes unpredictable across machines and
-cache flushes. Compilation of C code adds further nondeterminism, as many
-compilers include random-seeded values in their output. However, wheels fetched
-from index servers are the same every time. They land in pip's HTTP cache, not
-its wheel cache, and are used normally in hash-checking mode. The only downside
-of having the wheel cache disabled is thus extra build time for sdists, and
-this can be solved by making sure pre-built wheels are available from the index
-server.
-
-Hash-checking mode also works with :ref:`pip download` and :ref:`pip wheel`. A
-:ref:`comparison of hash-checking mode with other repeatability strategies
-` is available in the User Guide.
-
-.. warning::
-
-   Beware of the ``setup_requires`` keyword arg in :file:`setup.py`. The
-   (rare) packages that use it will cause those dependencies to be downloaded
-   by setuptools directly, skipping pip's hash-checking. If you need to use
-   such a package, see :ref:`Controlling
-   setup_requires`.
-
-.. warning::
-
-   Be careful not to nullify all your security work when you install your
-   actual project by using setuptools directly: for example, by calling
-   ``python setup.py install``, ``python setup.py develop``, or
-   ``easy_install``. Setuptools will happily go out and download, unchecked,
-   anything you missed in your requirements file—and it’s easy to miss things
-   as your project evolves. To be safe, install your project using pip and
-   :ref:`--no-deps `.
-
-   Instead of ``python setup.py develop``, use...
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: shell
-
-         python -m pip install --no-deps -e .
-
-   .. tab:: Windows
-
-      .. code-block:: shell
-
-         py -m pip install --no-deps -e .
-
-
-   Instead of ``python setup.py install``, use...
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: shell
-
-         python -m pip install --no-deps .
-
-   .. tab:: Windows
-
-      .. code-block:: shell
-
-         py -m pip install --no-deps .
-
-Hashes from PyPI
-^^^^^^^^^^^^^^^^
-
-PyPI provides an MD5 hash in the fragment portion of each package download URL,
-like ``#md5=123...``, which pip checks as a protection against download
-corruption. Other hash algorithms that have guaranteed support from ``hashlib``
-are also supported here: sha1, sha224, sha384, sha256, and sha512. Since this
-hash originates remotely, it is not a useful guard against tampering and thus
-does not satisfy the ``--require-hashes`` demand that every package have a
-local hash.
-
-
-Local project installs
-----------------------
-
-pip supports installing local project in both regular mode and editable mode.
-You can install local projects by specifying the project path to pip:
-
-.. tab:: Unix/macOS
-
-   .. code-block:: shell
-
-      python -m pip install path/to/SomeProject
-
-.. tab:: Windows
-
-   .. code-block:: shell
-
-      py -m pip install path/to/SomeProject
-
-During regular installation, pip will copy the entire project directory to a
-temporary location and install from there. The exception is that pip will
-exclude .tox and .nox directories present in the top level of the project from
-being copied. This approach is the cause of several performance and correctness
-issues, so it is planned that pip 21.3 will change to install directly from the
-local project directory. Depending on the build backend used by the project,
-this may generate secondary build artifacts in the project directory, such as
-the ``.egg-info`` and ``build`` directories in the case of the setuptools
-backend.
-
-To opt in to the future behavior, specify the ``--use-feature=in-tree-build``
-option in pip's command line.
-
-
-.. _`editable-installs`:
-
-"Editable" Installs
-^^^^^^^^^^^^^^^^^^^
-
-"Editable" installs are fundamentally `"setuptools develop mode"
-`_
-installs.
-
-You can install local projects or VCS projects in "editable" mode:
-
-.. tab:: Unix/macOS
-
-   .. code-block:: shell
-
-      python -m pip install -e path/to/SomeProject
-      python -m pip install -e git+http://repo/my_project.git#egg=SomeProject
-
-.. tab:: Windows
-
-   .. code-block:: shell
-
-      py -m pip install -e path/to/SomeProject
-      py -m pip install -e git+http://repo/my_project.git#egg=SomeProject
-
-
-(See the :ref:`VCS Support` section above for more information on VCS-related syntax.)
-
-For local projects, the "SomeProject.egg-info" directory is created relative to
-the project path.  This is one advantage over just using ``setup.py develop``,
-which creates the "egg-info" directly relative the current working directory.
-
-
-.. _`controlling-setup-requires`:
-
-Controlling setup_requires
---------------------------
-
-Setuptools offers the ``setup_requires`` `setup() keyword
-`_
-for specifying dependencies that need to be present in order for the
-``setup.py`` script to run.  Internally, Setuptools uses ``easy_install``
-to fulfill these dependencies.
-
-pip has no way to control how these dependencies are located.  None of the
-package index options have an effect.
-
-The solution is to configure a "system" or "personal" `Distutils configuration
-file
-`_ to
-manage the fulfillment.
-
-For example, to have the dependency located at an alternate index, add this:
-
-::
-
-  [easy_install]
-  index_url = https://my.index-mirror.com
-
-To have the dependency located from a local directory and not crawl PyPI, add this:
-
-::
-
-  [easy_install]
-  allow_hosts = ''
-  find_links = file:///path/to/local/archives/
-
-
-Build System Interface
-----------------------
-
-In order for pip to install a package from source, ``setup.py`` must implement
-the following commands::
-
-    setup.py egg_info [--egg-base XXX]
-    setup.py install --record XXX [--single-version-externally-managed] [--root XXX] [--compile|--no-compile] [--install-headers XXX]
-
-The ``egg_info`` command should create egg metadata for the package, as
-described in the setuptools documentation at
-https://setuptools.readthedocs.io/en/latest/setuptools.html#egg-info-create-egg-metadata-and-set-build-tags
-
-The ``install`` command should implement the complete process of installing the
-package to the target directory XXX.
-
-To install a package in "editable" mode (``pip install -e``), ``setup.py`` must
-implement the following command::
-
-    setup.py develop --no-deps
-
-This should implement the complete process of installing the package in
-"editable" mode.
-
-All packages will be attempted to built into wheels::
-
-    setup.py bdist_wheel -d XXX
-
-One further ``setup.py`` command is invoked by ``pip install``::
-
-    setup.py clean
-
-This command is invoked to clean up temporary commands from the build. (TODO:
-Investigate in more detail when this command is required).
-
-No other build system commands are invoked by the ``pip install`` command.
-
-Installing a package from a wheel does not invoke the build system at all.
-
-.. _PyPI: https://pypi.org/
-.. _setuptools extras: https://setuptools.readthedocs.io/en/latest/setuptools.html#declaring-extras-optional-features-with-their-own-dependencies
-
-
-
-.. _`pip install Options`:
-
-
-Options
-=======
-
-.. pip-command-options:: install
-
-.. pip-index-options:: install
-
-
-.. _`pip install Examples`:
-
-
-Examples
-========
-
-#. Install ``SomePackage`` and its dependencies from `PyPI`_ using :ref:`Requirement Specifiers`
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: shell
-
-         python -m pip install SomePackage            # latest version
-         python -m pip install SomePackage==1.0.4     # specific version
-         python -m pip install 'SomePackage>=1.0.4'   # minimum version
-
-   .. tab:: Windows
-
-      .. code-block:: shell
-
-         py -m pip install SomePackage            # latest version
-         py -m pip install SomePackage==1.0.4     # specific version
-         py -m pip install 'SomePackage>=1.0.4'   # minimum version
-
-
-#. Install a list of requirements specified in a file.  See the :ref:`Requirements files `.
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: shell
-
-         python -m pip install -r requirements.txt
-
-   .. tab:: Windows
-
-      .. code-block:: shell
-
-         py -m pip install -r requirements.txt
-
-
-#. Upgrade an already installed ``SomePackage`` to the latest from PyPI.
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: shell
-
-         python -m pip install --upgrade SomePackage
-
-   .. tab:: Windows
-
-      .. code-block:: shell
-
-         py -m pip install --upgrade SomePackage
-
-
-#. Install a local project in "editable" mode. See the section on :ref:`Editable Installs `.
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: shell
-
-         python -m pip install -e .                # project in current directory
-         python -m pip install -e path/to/project  # project in another directory
-
-   .. tab:: Windows
-
-      .. code-block:: shell
-
-         py -m pip install -e .                 # project in current directory
-         py -m pip install -e path/to/project   # project in another directory
-
-
-#. Install a project from VCS
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: shell
-
-         python -m pip install SomeProject@git+https://git.repo/some_pkg.git@1.3.1
-
-   .. tab:: Windows
-
-      .. code-block:: shell
-
-         py -m pip install SomeProject@git+https://git.repo/some_pkg.git@1.3.1
-
-
-#. Install a project from VCS in "editable" mode. See the sections on :ref:`VCS Support ` and :ref:`Editable Installs `.
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: shell
-
-         python -m pip install -e git+https://git.repo/some_pkg.git#egg=SomePackage          # from git
-         python -m pip install -e hg+https://hg.repo/some_pkg.git#egg=SomePackage            # from mercurial
-         python -m pip install -e svn+svn://svn.repo/some_pkg/trunk/#egg=SomePackage         # from svn
-         python -m pip install -e git+https://git.repo/some_pkg.git@feature#egg=SomePackage  # from 'feature' branch
-         python -m pip install -e "git+https://git.repo/some_repo.git#egg=subdir&subdirectory=subdir_path" # install a python package from a repo subdirectory
-
-   .. tab:: Windows
-
-      .. code-block:: shell
-
-         py -m pip install -e git+https://git.repo/some_pkg.git#egg=SomePackage          # from git
-         py -m pip install -e hg+https://hg.repo/some_pkg.git#egg=SomePackage            # from mercurial
-         py -m pip install -e svn+svn://svn.repo/some_pkg/trunk/#egg=SomePackage         # from svn
-         py -m pip install -e git+https://git.repo/some_pkg.git@feature#egg=SomePackage  # from 'feature' branch
-         py -m pip install -e "git+https://git.repo/some_repo.git#egg=subdir&subdirectory=subdir_path" # install a python package from a repo subdirectory
-
-#. Install a package with `setuptools extras`_.
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: shell
-
-         python -m pip install SomePackage[PDF]
-         python -m pip install "SomePackage[PDF] @ git+https://git.repo/SomePackage@main#subdirectory=subdir_path"
-         python -m pip install .[PDF]  # project in current directory
-         python -m pip install SomePackage[PDF]==3.0
-         python -m pip install SomePackage[PDF,EPUB]  # multiple extras
-
-   .. tab:: Windows
-
-      .. code-block:: shell
-
-         py -m pip install SomePackage[PDF]
-         py -m pip install "SomePackage[PDF] @ git+https://git.repo/SomePackage@main#subdirectory=subdir_path"
-         py -m pip install .[PDF]  # project in current directory
-         py -m pip install SomePackage[PDF]==3.0
-         py -m pip install SomePackage[PDF,EPUB]  # multiple extras
-
-#. Install a particular source archive file.
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: shell
-
-         python -m pip install ./downloads/SomePackage-1.0.4.tar.gz
-         python -m pip install http://my.package.repo/SomePackage-1.0.4.zip
-
-   .. tab:: Windows
-
-      .. code-block:: shell
-
-         py -m pip install ./downloads/SomePackage-1.0.4.tar.gz
-         py -m pip install http://my.package.repo/SomePackage-1.0.4.zip
-
-#. Install a particular source archive file following :pep:`440` direct references.
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: shell
-
-         python -m pip install SomeProject@http://my.package.repo/SomeProject-1.2.3-py33-none-any.whl
-         python -m pip install "SomeProject @ http://my.package.repo/SomeProject-1.2.3-py33-none-any.whl"
-         python -m pip install SomeProject@http://my.package.repo/1.2.3.tar.gz
-
-   .. tab:: Windows
-
-      .. code-block:: shell
-
-         py -m pip install SomeProject@http://my.package.repo/SomeProject-1.2.3-py33-none-any.whl
-         py -m pip install "SomeProject @ http://my.package.repo/SomeProject-1.2.3-py33-none-any.whl"
-         py -m pip install SomeProject@http://my.package.repo/1.2.3.tar.gz
-
-#. Install from alternative package repositories.
-
-   Install from a different index, and not `PyPI`_
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: shell
-
-         python -m pip install --index-url http://my.package.repo/simple/ SomePackage
-
-   .. tab:: Windows
-
-      .. code-block:: shell
-
-         py -m pip install --index-url http://my.package.repo/simple/ SomePackage
-
-   Search an additional index during install, in addition to `PyPI`_
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: shell
-
-         python -m pip install --extra-index-url http://my.package.repo/simple SomePackage
-
-   .. tab:: Windows
-
-      .. code-block:: shell
-
-         py -m pip install --extra-index-url http://my.package.repo/simple SomePackage
-
-   Install from a local flat directory containing archives (and don't scan indexes):
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: shell
-
-         python -m pip install --no-index --find-links=file:///local/dir/ SomePackage
-         python -m pip install --no-index --find-links=/local/dir/ SomePackage
-         python -m pip install --no-index --find-links=relative/dir/ SomePackage
-
-   .. tab:: Windows
-
-      .. code-block:: shell
-
-         py -m pip install --no-index --find-links=file:///local/dir/ SomePackage
-         py -m pip install --no-index --find-links=/local/dir/ SomePackage
-         py -m pip install --no-index --find-links=relative/dir/ SomePackage
-
-
-#. Find pre-release and development versions, in addition to stable versions.  By default, pip only finds stable versions.
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: shell
-
-         python -m pip install --pre SomePackage
-
-   .. tab:: Windows
-
-      .. code-block:: shell
-
-         py -m pip install --pre SomePackage
-
-
-#. Install packages from source.
-
-   Do not use any binary packages
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: shell
-
-         python -m pip install SomePackage1 SomePackage2 --no-binary :all:
-
-   .. tab:: Windows
-
-      .. code-block:: shell
-
-         py -m pip install SomePackage1 SomePackage2 --no-binary :all:
-
-   Specify ``SomePackage1`` to be installed from source:
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: shell
-
-         python -m pip install SomePackage1 SomePackage2 --no-binary SomePackage1
-
-   .. tab:: Windows
-
-      .. code-block:: shell
-
-         py -m pip install SomePackage1 SomePackage2 --no-binary SomePackage1
-
-----
-
-.. [1] This is true with the exception that pip v7.0 and v7.0.1 required quotes
-       around specifiers containing environment markers in requirement files.
+You should be redirected automatically in 3 seconds. If that didn't
+work, here's a link: :doc:`../cli/pip_install`
diff --git a/docs/html/reference/pip_list.rst b/docs/html/reference/pip_list.rst
index 5119a804c0d..3768baf60d6 100644
--- a/docs/html/reference/pip_list.rst
+++ b/docs/html/reference/pip_list.rst
@@ -1,201 +1,11 @@
-.. _`pip list`:
+:orphan:
 
-========
-pip list
-========
+.. meta::
 
+  :http-equiv=refresh: 3; url=../../cli/pip_list/
 
+This page has moved
+===================
 
-Usage
-=====
-
-.. tab:: Unix/macOS
-
-   .. pip-command-usage:: list "python -m pip"
-
-.. tab:: Windows
-
-   .. pip-command-usage:: list "py -m pip"
-
-
-Description
-===========
-
-.. pip-command-description:: list
-
-
-Options
-=======
-
-.. pip-command-options:: list
-
-.. pip-index-options:: list
-
-
-Examples
-========
-
-#. List installed packages.
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: console
-
-         $ python -m pip list
-         docutils (0.10)
-         Jinja2 (2.7.2)
-         MarkupSafe (0.18)
-         Pygments (1.6)
-         Sphinx (1.2.1)
-
-   .. tab:: Windows
-
-      .. code-block:: console
-
-         C:\> py -m pip list
-         docutils (0.10)
-         Jinja2 (2.7.2)
-         MarkupSafe (0.18)
-         Pygments (1.6)
-         Sphinx (1.2.1)
-
-#. List outdated packages (excluding editables), and the latest version available.
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: console
-
-         $ python -m pip list --outdated
-         docutils (Current: 0.10 Latest: 0.11)
-         Sphinx (Current: 1.2.1 Latest: 1.2.2)
-
-   .. tab:: Windows
-
-      .. code-block:: console
-
-         C:\> py -m pip list --outdated
-         docutils (Current: 0.10 Latest: 0.11)
-         Sphinx (Current: 1.2.1 Latest: 1.2.2)
-
-#. List installed packages with column formatting.
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: console
-
-         $ python -m pip list --format columns
-         Package Version
-         ------- -------
-         docopt  0.6.2
-         idlex   1.13
-         jedi    0.9.0
-
-   .. tab:: Windows
-
-      .. code-block:: console
-
-         C:\> py -m pip list --format columns
-         Package Version
-         ------- -------
-         docopt  0.6.2
-         idlex   1.13
-         jedi    0.9.0
-
-#. List outdated packages with column formatting.
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: console
-
-         $ python -m pip list -o --format columns
-         Package    Version Latest Type
-         ---------- ------- ------ -----
-         retry      0.8.1   0.9.1  wheel
-         setuptools 20.6.7  21.0.0 wheel
-
-   .. tab:: Windows
-
-      .. code-block:: console
-
-         C:\> py -m pip list -o --format columns
-         Package    Version Latest Type
-         ---------- ------- ------ -----
-         retry      0.8.1   0.9.1  wheel
-         setuptools 20.6.7  21.0.0 wheel
-
-#. List packages that are not dependencies of other packages. Can be combined with
-   other options.
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: console
-
-         $ python -m pip list --outdated --not-required
-         docutils (Current: 0.10 Latest: 0.11)
-
-   .. tab:: Windows
-
-      .. code-block:: console
-
-         C:\> py -m pip list --outdated --not-required
-         docutils (Current: 0.10 Latest: 0.11)
-
-#. Use legacy formatting
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: console
-
-         $ python -m pip list --format=legacy
-         colorama (0.3.7)
-         docopt (0.6.2)
-         idlex (1.13)
-         jedi (0.9.0)
-
-   .. tab:: Windows
-
-      .. code-block:: console
-
-         C:\> py -m pip list --format=legacy
-         colorama (0.3.7)
-         docopt (0.6.2)
-         idlex (1.13)
-         jedi (0.9.0)
-
-#. Use json formatting
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: console
-
-         $ python -m pip list --format=json
-         [{'name': 'colorama', 'version': '0.3.7'}, {'name': 'docopt', 'version': '0.6.2'}, ...
-
-   .. tab:: Windows
-
-      .. code-block:: console
-
-         C:\> py -m pip list --format=json
-         [{'name': 'colorama', 'version': '0.3.7'}, {'name': 'docopt', 'version': '0.6.2'}, ...
-
-#. Use freeze formatting
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: console
-
-         $ python -m pip list --format=freeze
-         colorama==0.3.7
-         docopt==0.6.2
-         idlex==1.13
-         jedi==0.9.0
-
-   .. tab:: Windows
-
-      .. code-block:: console
-
-         C:\> py -m pip list --format=freeze
-         colorama==0.3.7
-         docopt==0.6.2
-         idlex==1.13
-         jedi==0.9.0
+You should be redirected automatically in 3 seconds. If that didn't
+work, here's a link: :doc:`../cli/pip_list`
diff --git a/docs/html/reference/pip_search.rst b/docs/html/reference/pip_search.rst
index 9905a1bafac..0a7532ee79d 100644
--- a/docs/html/reference/pip_search.rst
+++ b/docs/html/reference/pip_search.rst
@@ -1,52 +1,11 @@
-.. _`pip search`:
+:orphan:
 
-==========
-pip search
-==========
+.. meta::
 
+  :http-equiv=refresh: 3; url=../../cli/pip_search/
 
+This page has moved
+===================
 
-Usage
-=====
-
-.. tab:: Unix/macOS
-
-   .. pip-command-usage:: search "python -m pip"
-
-.. tab:: Windows
-
-   .. pip-command-usage:: search "py -m pip"
-
-
-Description
-===========
-
-.. pip-command-description:: search
-
-
-Options
-=======
-
-.. pip-command-options:: search
-
-
-Examples
-========
-
-#. Search for "peppercorn"
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: console
-
-         $ python -m pip search peppercorn
-         pepperedform    - Helpers for using peppercorn with formprocess.
-         peppercorn      - A library for converting a token stream into [...]
-
-   .. tab:: Windows
-
-      .. code-block:: console
-
-         C:\> py -m pip search peppercorn
-         pepperedform    - Helpers for using peppercorn with formprocess.
-         peppercorn      - A library for converting a token stream into [...]
+You should be redirected automatically in 3 seconds. If that didn't
+work, here's a link: :doc:`../cli/pip_search`
diff --git a/docs/html/reference/pip_show.rst b/docs/html/reference/pip_show.rst
index b603f786fd9..b2ce3c7d8c3 100644
--- a/docs/html/reference/pip_show.rst
+++ b/docs/html/reference/pip_show.rst
@@ -1,154 +1,11 @@
-.. _`pip show`:
+:orphan:
 
-========
-pip show
-========
+.. meta::
 
+  :http-equiv=refresh: 3; url=../../cli/pip_show/
 
+This page has moved
+===================
 
-Usage
-=====
-
-.. tab:: Unix/macOS
-
-   .. pip-command-usage:: show "python -m pip"
-
-.. tab:: Windows
-
-   .. pip-command-usage:: show "py -m pip"
-
-
-Description
-===========
-
-.. pip-command-description:: show
-
-
-Options
-=======
-
-.. pip-command-options:: show
-
-
-Examples
-========
-
-#. Show information about a package:
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: console
-
-         $ python -m pip show sphinx
-         Name: Sphinx
-         Version: 1.4.5
-         Summary: Python documentation generator
-         Home-page: http://sphinx-doc.org/
-         Author: Georg Brandl
-         Author-email: georg@python.org
-         License: BSD
-         Location: /my/env/lib/python2.7/site-packages
-         Requires: docutils, snowballstemmer, alabaster, Pygments, imagesize, Jinja2, babel, six
-
-   .. tab:: Windows
-
-      .. code-block:: console
-
-         C:\> py -m pip show sphinx
-         Name: Sphinx
-         Version: 1.4.5
-         Summary: Python documentation generator
-         Home-page: http://sphinx-doc.org/
-         Author: Georg Brandl
-         Author-email: georg@python.org
-         License: BSD
-         Location: /my/env/lib/python2.7/site-packages
-         Requires: docutils, snowballstemmer, alabaster, Pygments, imagesize, Jinja2, babel, six
-
-#. Show all information about a package
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: console
-
-         $ python -m pip show --verbose sphinx
-         Name: Sphinx
-         Version: 1.4.5
-         Summary: Python documentation generator
-         Home-page: http://sphinx-doc.org/
-         Author: Georg Brandl
-         Author-email: georg@python.org
-         License: BSD
-         Location: /my/env/lib/python2.7/site-packages
-         Requires: docutils, snowballstemmer, alabaster, Pygments, imagesize, Jinja2, babel, six
-         Metadata-Version: 2.0
-         Installer:
-         Classifiers:
-            Development Status :: 5 - Production/Stable
-            Environment :: Console
-            Environment :: Web Environment
-            Intended Audience :: Developers
-            Intended Audience :: Education
-            License :: OSI Approved :: BSD License
-            Operating System :: OS Independent
-            Programming Language :: Python
-            Programming Language :: Python :: 2
-            Programming Language :: Python :: 3
-            Framework :: Sphinx
-            Framework :: Sphinx :: Extension
-            Framework :: Sphinx :: Theme
-            Topic :: Documentation
-            Topic :: Documentation :: Sphinx
-            Topic :: Text Processing
-            Topic :: Utilities
-         Entry-points:
-            [console_scripts]
-            sphinx-apidoc = sphinx.apidoc:main
-            sphinx-autogen = sphinx.ext.autosummary.generate:main
-            sphinx-build = sphinx:main
-            sphinx-quickstart = sphinx.quickstart:main
-            [distutils.commands]
-            build_sphinx = sphinx.setup_command:BuildDoc
-
-   .. tab:: Windows
-
-      .. code-block:: console
-
-         C:\> py -m pip show --verbose sphinx
-         Name: Sphinx
-         Version: 1.4.5
-         Summary: Python documentation generator
-         Home-page: http://sphinx-doc.org/
-         Author: Georg Brandl
-         Author-email: georg@python.org
-         License: BSD
-         Location: /my/env/lib/python2.7/site-packages
-         Requires: docutils, snowballstemmer, alabaster, Pygments, imagesize, Jinja2, babel, six
-         Metadata-Version: 2.0
-         Installer:
-         Classifiers:
-            Development Status :: 5 - Production/Stable
-            Environment :: Console
-            Environment :: Web Environment
-            Intended Audience :: Developers
-            Intended Audience :: Education
-            License :: OSI Approved :: BSD License
-            Operating System :: OS Independent
-            Programming Language :: Python
-            Programming Language :: Python :: 2
-            Programming Language :: Python :: 3
-            Framework :: Sphinx
-            Framework :: Sphinx :: Extension
-            Framework :: Sphinx :: Theme
-            Topic :: Documentation
-            Topic :: Documentation :: Sphinx
-            Topic :: Text Processing
-            Topic :: Utilities
-         Entry-points:
-            [console_scripts]
-            sphinx-apidoc = sphinx.apidoc:main
-            sphinx-autogen = sphinx.ext.autosummary.generate:main
-            sphinx-build = sphinx:main
-            sphinx-quickstart = sphinx.quickstart:main
-            [distutils.commands]
-            build_sphinx = sphinx.setup_command:BuildDoc
+You should be redirected automatically in 3 seconds. If that didn't
+work, here's a link: :doc:`../cli/pip_show`
diff --git a/docs/html/reference/pip_uninstall.rst b/docs/html/reference/pip_uninstall.rst
index e6eeb5ebf6a..db84476c859 100644
--- a/docs/html/reference/pip_uninstall.rst
+++ b/docs/html/reference/pip_uninstall.rst
@@ -1,58 +1,11 @@
-.. _`pip uninstall`:
+:orphan:
 
-=============
-pip uninstall
-=============
+.. meta::
 
+  :http-equiv=refresh: 3; url=../../cli/pip_uninstall/
 
+This page has moved
+===================
 
-Usage
-=====
-
-.. tab:: Unix/macOS
-
-   .. pip-command-usage:: uninstall "python -m pip"
-
-.. tab:: Windows
-
-   .. pip-command-usage:: uninstall "py -m pip"
-
-
-Description
-===========
-
-.. pip-command-description:: uninstall
-
-
-Options
-=======
-
-.. pip-command-options:: uninstall
-
-
-Examples
-========
-
-#. Uninstall a package.
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: console
-
-         $ python -m pip uninstall simplejson
-         Uninstalling simplejson:
-            /home/me/env/lib/python3.9/site-packages/simplejson
-            /home/me/env/lib/python3.9/site-packages/simplejson-2.2.1-py3.9.egg-info
-         Proceed (y/n)? y
-            Successfully uninstalled simplejson
-
-   .. tab:: Windows
-
-      .. code-block:: console
-
-         C:\> py -m pip uninstall simplejson
-         Uninstalling simplejson:
-            /home/me/env/lib/python3.9/site-packages/simplejson
-            /home/me/env/lib/python3.9/site-packages/simplejson-2.2.1-py3.9.egg-info
-         Proceed (y/n)? y
-            Successfully uninstalled simplejson
+You should be redirected automatically in 3 seconds. If that didn't
+work, here's a link: :doc:`../cli/pip_uninstall`
diff --git a/docs/html/reference/pip_wheel.rst b/docs/html/reference/pip_wheel.rst
index c2a9543fc99..06861f60763 100644
--- a/docs/html/reference/pip_wheel.rst
+++ b/docs/html/reference/pip_wheel.rst
@@ -1,125 +1,11 @@
+:orphan:
 
-.. _`pip wheel`:
+.. meta::
 
-=========
-pip wheel
-=========
+  :http-equiv=refresh: 3; url=../../cli/pip_wheel/
 
+This page has moved
+===================
 
-
-Usage
-=====
-
-.. tab:: Unix/macOS
-
-   .. pip-command-usage:: wheel "python -m pip"
-
-.. tab:: Windows
-
-   .. pip-command-usage:: wheel "py -m pip"
-
-
-Description
-===========
-
-.. pip-command-description:: wheel
-
-
-Build System Interface
-----------------------
-
-In order for pip to build a wheel, ``setup.py`` must implement the
-``bdist_wheel`` command with the following syntax:
-
-.. tab:: Unix/macOS
-
-   .. code-block:: shell
-
-      python setup.py bdist_wheel -d TARGET
-
-.. tab:: Windows
-
-   .. code-block:: shell
-
-      py setup.py bdist_wheel -d TARGET
-
-
-This command must create a wheel compatible with the invoking Python
-interpreter, and save that wheel in the directory TARGET.
-
-No other build system commands are invoked by the ``pip wheel`` command.
-
-Customising the build
-^^^^^^^^^^^^^^^^^^^^^
-
-It is possible using ``--global-option`` to include additional build commands
-with their arguments in the ``setup.py`` command. This is currently the only
-way to influence the building of C extensions from the command line. For
-example:
-
-.. tab:: Unix/macOS
-
-   .. code-block:: shell
-
-      python -m pip wheel --global-option bdist_ext --global-option -DFOO wheel
-
-.. tab:: Windows
-
-   .. code-block:: shell
-
-      py -m pip wheel --global-option bdist_ext --global-option -DFOO wheel
-
-
-will result in a build command of
-
-::
-
-    setup.py bdist_ext -DFOO bdist_wheel -d TARGET
-
-which passes a preprocessor symbol to the extension build.
-
-Such usage is considered highly build-system specific and more an accident of
-the current implementation than a supported interface.
-
-
-
-Options
-=======
-
-.. pip-command-options:: wheel
-
-.. pip-index-options:: wheel
-
-
-Examples
-========
-
-#. Build wheels for a requirement (and all its dependencies), and then install
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: shell
-
-         python -m pip wheel --wheel-dir=/tmp/wheelhouse SomePackage
-         python -m pip install --no-index --find-links=/tmp/wheelhouse SomePackage
-
-   .. tab:: Windows
-
-      .. code-block:: shell
-
-         py -m pip wheel --wheel-dir=/tmp/wheelhouse SomePackage
-         py -m pip install --no-index --find-links=/tmp/wheelhouse SomePackage
-
-#. Build a wheel for a package from source
-
-   .. tab:: Unix/macOS
-
-      .. code-block:: shell
-
-         python -m pip wheel --no-binary SomePackage SomePackage
-
-   .. tab:: Windows
-
-      .. code-block:: shell
-
-         py -m pip wheel --no-binary SomePackage SomePackage
+You should be redirected automatically in 3 seconds. If that didn't
+work, here's a link: :doc:`../cli/pip_wheel`