Full Code of pypa/pip for AI

main f82e37d6352e cached
950 files
6.6 MB
1.8M tokens
7934 symbols
1 requests
Download .txt
Showing preview only (7,087K chars total). Download the full file or copy to clipboard to get everything.
Repository: pypa/pip
Branch: main
Commit: f82e37d6352e
Files: 950
Total size: 6.6 MB

Directory structure:
gitextract_looz9g1z/

├── .devcontainer/
│   ├── devcontainer.json
│   └── postCreate.sh
├── .git-blame-ignore-revs
├── .gitattributes
├── .github/
│   ├── CONTRIBUTING.md
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug-report.yml
│   │   ├── config.yml
│   │   └── feature-request.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── chronographer.yml
│   ├── dependabot.yml
│   └── workflows/
│       ├── ci.yml
│       ├── lock-threads.yml
│       ├── release.yml
│       └── update-rtd-redirects.yml
├── .gitignore
├── .mailmap
├── .pre-commit-config.yaml
├── .readthedocs-custom-redirects.yml
├── .readthedocs.yml
├── AI_POLICY.md
├── AUTHORS.txt
├── LICENSE.txt
├── NEWS.rst
├── README.rst
├── SECURITY.md
├── build-project/
│   ├── .python-version
│   ├── build-project.py
│   ├── build-requirements.in
│   └── build-requirements.txt
├── docs/
│   ├── html/
│   │   ├── cli/
│   │   │   ├── index.md
│   │   │   ├── pip.rst
│   │   │   ├── pip_cache.rst
│   │   │   ├── pip_check.rst
│   │   │   ├── pip_config.rst
│   │   │   ├── pip_debug.rst
│   │   │   ├── pip_download.rst
│   │   │   ├── pip_freeze.rst
│   │   │   ├── pip_hash.rst
│   │   │   ├── pip_index.rst
│   │   │   ├── pip_inspect.rst
│   │   │   ├── pip_install.rst
│   │   │   ├── pip_list.rst
│   │   │   ├── pip_lock.rst
│   │   │   ├── pip_search.rst
│   │   │   ├── pip_show.rst
│   │   │   ├── pip_uninstall.rst
│   │   │   └── pip_wheel.rst
│   │   ├── conf.py
│   │   ├── copyright.rst
│   │   ├── development/
│   │   │   ├── architecture/
│   │   │   │   ├── anatomy.rst
│   │   │   │   ├── command-line-interface.rst
│   │   │   │   ├── configuration-files.rst
│   │   │   │   ├── index.rst
│   │   │   │   ├── overview.rst
│   │   │   │   ├── package-finding.rst
│   │   │   │   └── upgrade-options.rst
│   │   │   ├── ci.rst
│   │   │   ├── contributing.rst
│   │   │   ├── conventions.rst
│   │   │   ├── getting-started.rst
│   │   │   ├── index.rst
│   │   │   ├── issue-triage.md
│   │   │   ├── release-process.rst
│   │   │   └── vendoring-policy.rst
│   │   ├── getting-started.md
│   │   ├── index.md
│   │   ├── installation.md
│   │   ├── installing.rst
│   │   ├── news.rst
│   │   ├── quickstart.rst
│   │   ├── reference/
│   │   │   ├── build-system.md
│   │   │   ├── index.md
│   │   │   ├── inspect-report.md
│   │   │   ├── installation-report.md
│   │   │   ├── pip.rst
│   │   │   ├── pip_cache.rst
│   │   │   ├── pip_check.rst
│   │   │   ├── pip_config.rst
│   │   │   ├── pip_debug.rst
│   │   │   ├── pip_download.rst
│   │   │   ├── pip_freeze.rst
│   │   │   ├── pip_hash.rst
│   │   │   ├── pip_index.rst
│   │   │   ├── pip_install.rst
│   │   │   ├── pip_list.rst
│   │   │   ├── pip_search.rst
│   │   │   ├── pip_show.rst
│   │   │   ├── pip_uninstall.rst
│   │   │   ├── pip_wheel.rst
│   │   │   ├── requirement-specifiers.md
│   │   │   └── requirements-file-format.md
│   │   ├── topics/
│   │   │   ├── authentication.md
│   │   │   ├── caching.md
│   │   │   ├── configuration.md
│   │   │   ├── dependency-resolution.md
│   │   │   ├── deps.dot
│   │   │   ├── https-certificates.md
│   │   │   ├── index.md
│   │   │   ├── local-project-installs.md
│   │   │   ├── more-dependency-resolution.md
│   │   │   ├── python-option.md
│   │   │   ├── repeatable-installs.md
│   │   │   ├── secure-installs.md
│   │   │   ├── vcs-support.md
│   │   │   └── workflow.md
│   │   ├── user_guide.rst
│   │   └── ux-research-design/
│   │       ├── contribute.md
│   │       ├── guidance.md
│   │       ├── index.md
│   │       ├── research-results/
│   │       │   ├── about-our-users.md
│   │       │   ├── ci-cd.md
│   │       │   ├── improving-pips-documentation.md
│   │       │   ├── index.md
│   │       │   ├── mental-models.md
│   │       │   ├── override-conflicting-dependencies.md
│   │       │   ├── personas.md
│   │       │   ├── pip-force-reinstall.md
│   │       │   ├── pip-search.md
│   │       │   ├── pip-upgrade-conflict.md
│   │       │   ├── prioritizing-features.md
│   │       │   └── users-and-security.md
│   │       └── resolution-impossible-example.md
│   ├── man/
│   │   ├── commands/
│   │   │   ├── cache.rst
│   │   │   ├── check.rst
│   │   │   ├── config.rst
│   │   │   ├── debug.rst
│   │   │   ├── download.rst
│   │   │   ├── freeze.rst
│   │   │   ├── hash.rst
│   │   │   ├── help.rst
│   │   │   ├── index.rst
│   │   │   ├── install.rst
│   │   │   ├── list.rst
│   │   │   ├── lock.rst
│   │   │   ├── search.rst
│   │   │   ├── show.rst
│   │   │   ├── uninstall.rst
│   │   │   └── wheel.rst
│   │   └── index.rst
│   └── pip_sphinxext.py
├── news/
│   ├── .gitignore
│   ├── 13226.bugfix.rst
│   ├── 13826.process.rst
│   └── 13845.trivial.rst
├── noxfile.py
├── pyproject.toml
├── src/
│   └── pip/
│       ├── __init__.py
│       ├── __main__.py
│       ├── __pip-runner__.py
│       ├── _internal/
│       │   ├── __init__.py
│       │   ├── build_env.py
│       │   ├── cache.py
│       │   ├── cli/
│       │   │   ├── __init__.py
│       │   │   ├── autocompletion.py
│       │   │   ├── base_command.py
│       │   │   ├── cmdoptions.py
│       │   │   ├── command_context.py
│       │   │   ├── index_command.py
│       │   │   ├── main.py
│       │   │   ├── main_parser.py
│       │   │   ├── parser.py
│       │   │   ├── progress_bars.py
│       │   │   ├── req_command.py
│       │   │   ├── spinners.py
│       │   │   └── status_codes.py
│       │   ├── commands/
│       │   │   ├── __init__.py
│       │   │   ├── cache.py
│       │   │   ├── check.py
│       │   │   ├── completion.py
│       │   │   ├── configuration.py
│       │   │   ├── debug.py
│       │   │   ├── download.py
│       │   │   ├── freeze.py
│       │   │   ├── hash.py
│       │   │   ├── help.py
│       │   │   ├── index.py
│       │   │   ├── inspect.py
│       │   │   ├── install.py
│       │   │   ├── list.py
│       │   │   ├── lock.py
│       │   │   ├── search.py
│       │   │   ├── show.py
│       │   │   ├── uninstall.py
│       │   │   └── wheel.py
│       │   ├── configuration.py
│       │   ├── distributions/
│       │   │   ├── __init__.py
│       │   │   ├── base.py
│       │   │   ├── installed.py
│       │   │   ├── sdist.py
│       │   │   └── wheel.py
│       │   ├── exceptions.py
│       │   ├── index/
│       │   │   ├── __init__.py
│       │   │   ├── collector.py
│       │   │   ├── package_finder.py
│       │   │   └── sources.py
│       │   ├── locations/
│       │   │   ├── __init__.py
│       │   │   ├── _distutils.py
│       │   │   ├── _sysconfig.py
│       │   │   └── base.py
│       │   ├── main.py
│       │   ├── metadata/
│       │   │   ├── __init__.py
│       │   │   ├── _json.py
│       │   │   ├── base.py
│       │   │   ├── importlib/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── _compat.py
│       │   │   │   ├── _dists.py
│       │   │   │   └── _envs.py
│       │   │   └── pkg_resources.py
│       │   ├── models/
│       │   │   ├── __init__.py
│       │   │   ├── candidate.py
│       │   │   ├── direct_url.py
│       │   │   ├── format_control.py
│       │   │   ├── index.py
│       │   │   ├── installation_report.py
│       │   │   ├── link.py
│       │   │   ├── release_control.py
│       │   │   ├── scheme.py
│       │   │   ├── search_scope.py
│       │   │   ├── selection_prefs.py
│       │   │   ├── target_python.py
│       │   │   └── wheel.py
│       │   ├── network/
│       │   │   ├── __init__.py
│       │   │   ├── auth.py
│       │   │   ├── cache.py
│       │   │   ├── download.py
│       │   │   ├── lazy_wheel.py
│       │   │   ├── session.py
│       │   │   ├── utils.py
│       │   │   └── xmlrpc.py
│       │   ├── operations/
│       │   │   ├── __init__.py
│       │   │   ├── build/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── build_tracker.py
│       │   │   │   ├── metadata.py
│       │   │   │   ├── metadata_editable.py
│       │   │   │   ├── wheel.py
│       │   │   │   └── wheel_editable.py
│       │   │   ├── check.py
│       │   │   ├── freeze.py
│       │   │   ├── install/
│       │   │   │   ├── __init__.py
│       │   │   │   └── wheel.py
│       │   │   └── prepare.py
│       │   ├── pyproject.py
│       │   ├── req/
│       │   │   ├── __init__.py
│       │   │   ├── constructors.py
│       │   │   ├── pep723.py
│       │   │   ├── req_dependency_group.py
│       │   │   ├── req_file.py
│       │   │   ├── req_install.py
│       │   │   ├── req_set.py
│       │   │   └── req_uninstall.py
│       │   ├── resolution/
│       │   │   ├── __init__.py
│       │   │   ├── base.py
│       │   │   ├── legacy/
│       │   │   │   ├── __init__.py
│       │   │   │   └── resolver.py
│       │   │   └── resolvelib/
│       │   │       ├── __init__.py
│       │   │       ├── base.py
│       │   │       ├── candidates.py
│       │   │       ├── factory.py
│       │   │       ├── found_candidates.py
│       │   │       ├── provider.py
│       │   │       ├── reporter.py
│       │   │       ├── requirements.py
│       │   │       └── resolver.py
│       │   ├── self_outdated_check.py
│       │   ├── utils/
│       │   │   ├── __init__.py
│       │   │   ├── _jaraco_text.py
│       │   │   ├── _log.py
│       │   │   ├── appdirs.py
│       │   │   ├── compat.py
│       │   │   ├── compatibility_tags.py
│       │   │   ├── datetime.py
│       │   │   ├── deprecation.py
│       │   │   ├── direct_url_helpers.py
│       │   │   ├── egg_link.py
│       │   │   ├── entrypoints.py
│       │   │   ├── filesystem.py
│       │   │   ├── filetypes.py
│       │   │   ├── glibc.py
│       │   │   ├── hashes.py
│       │   │   ├── logging.py
│       │   │   ├── misc.py
│       │   │   ├── packaging.py
│       │   │   ├── pylock.py
│       │   │   ├── retry.py
│       │   │   ├── subprocess.py
│       │   │   ├── temp_dir.py
│       │   │   ├── unpacking.py
│       │   │   ├── urls.py
│       │   │   ├── virtualenv.py
│       │   │   └── wheel.py
│       │   ├── vcs/
│       │   │   ├── __init__.py
│       │   │   ├── bazaar.py
│       │   │   ├── git.py
│       │   │   ├── mercurial.py
│       │   │   ├── subversion.py
│       │   │   └── versioncontrol.py
│       │   └── wheel_builder.py
│       ├── _vendor/
│       │   ├── README.rst
│       │   ├── __init__.py
│       │   ├── cachecontrol/
│       │   │   ├── LICENSE.txt
│       │   │   ├── __init__.py
│       │   │   ├── _cmd.py
│       │   │   ├── adapter.py
│       │   │   ├── cache.py
│       │   │   ├── caches/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── file_cache.py
│       │   │   │   └── redis_cache.py
│       │   │   ├── controller.py
│       │   │   ├── filewrapper.py
│       │   │   ├── heuristics.py
│       │   │   ├── py.typed
│       │   │   ├── serialize.py
│       │   │   └── wrapper.py
│       │   ├── certifi/
│       │   │   ├── LICENSE
│       │   │   ├── __init__.py
│       │   │   ├── __main__.py
│       │   │   ├── cacert.pem
│       │   │   ├── core.py
│       │   │   └── py.typed
│       │   ├── dependency_groups/
│       │   │   ├── LICENSE.txt
│       │   │   ├── __init__.py
│       │   │   ├── __main__.py
│       │   │   ├── _implementation.py
│       │   │   ├── _lint_dependency_groups.py
│       │   │   ├── _pip_wrapper.py
│       │   │   ├── _toml_compat.py
│       │   │   └── py.typed
│       │   ├── distlib/
│       │   │   ├── LICENSE.txt
│       │   │   ├── __init__.py
│       │   │   ├── compat.py
│       │   │   ├── resources.py
│       │   │   ├── scripts.py
│       │   │   └── util.py
│       │   ├── distlib.pyi
│       │   ├── distro/
│       │   │   ├── LICENSE
│       │   │   ├── __init__.py
│       │   │   ├── __main__.py
│       │   │   ├── distro.py
│       │   │   └── py.typed
│       │   ├── idna/
│       │   │   ├── LICENSE.md
│       │   │   ├── __init__.py
│       │   │   ├── codec.py
│       │   │   ├── compat.py
│       │   │   ├── core.py
│       │   │   ├── idnadata.py
│       │   │   ├── intranges.py
│       │   │   ├── package_data.py
│       │   │   ├── py.typed
│       │   │   └── uts46data.py
│       │   ├── msgpack/
│       │   │   ├── COPYING
│       │   │   ├── __init__.py
│       │   │   ├── exceptions.py
│       │   │   ├── ext.py
│       │   │   └── fallback.py
│       │   ├── msgpack.pyi
│       │   ├── packaging/
│       │   │   ├── LICENSE
│       │   │   ├── LICENSE.APACHE
│       │   │   ├── LICENSE.BSD
│       │   │   ├── __init__.py
│       │   │   ├── _elffile.py
│       │   │   ├── _manylinux.py
│       │   │   ├── _musllinux.py
│       │   │   ├── _parser.py
│       │   │   ├── _structures.py
│       │   │   ├── _tokenizer.py
│       │   │   ├── licenses/
│       │   │   │   ├── __init__.py
│       │   │   │   └── _spdx.py
│       │   │   ├── markers.py
│       │   │   ├── metadata.py
│       │   │   ├── py.typed
│       │   │   ├── pylock.py
│       │   │   ├── requirements.py
│       │   │   ├── specifiers.py
│       │   │   ├── tags.py
│       │   │   ├── utils.py
│       │   │   └── version.py
│       │   ├── pkg_resources/
│       │   │   ├── LICENSE
│       │   │   └── __init__.py
│       │   ├── pkg_resources.pyi
│       │   ├── platformdirs/
│       │   │   ├── LICENSE
│       │   │   ├── __init__.py
│       │   │   ├── __main__.py
│       │   │   ├── android.py
│       │   │   ├── api.py
│       │   │   ├── macos.py
│       │   │   ├── py.typed
│       │   │   ├── unix.py
│       │   │   ├── version.py
│       │   │   └── windows.py
│       │   ├── pygments/
│       │   │   ├── LICENSE
│       │   │   ├── __init__.py
│       │   │   ├── __main__.py
│       │   │   ├── console.py
│       │   │   ├── filter.py
│       │   │   ├── filters/
│       │   │   │   └── __init__.py
│       │   │   ├── formatter.py
│       │   │   ├── formatters/
│       │   │   │   ├── __init__.py
│       │   │   │   └── _mapping.py
│       │   │   ├── lexer.py
│       │   │   ├── lexers/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── _mapping.py
│       │   │   │   └── python.py
│       │   │   ├── modeline.py
│       │   │   ├── plugin.py
│       │   │   ├── regexopt.py
│       │   │   ├── scanner.py
│       │   │   ├── sphinxext.py
│       │   │   ├── style.py
│       │   │   ├── styles/
│       │   │   │   ├── __init__.py
│       │   │   │   └── _mapping.py
│       │   │   ├── token.py
│       │   │   ├── unistring.py
│       │   │   └── util.py
│       │   ├── pygments.pyi
│       │   ├── pyproject_hooks/
│       │   │   ├── LICENSE
│       │   │   ├── __init__.py
│       │   │   ├── _impl.py
│       │   │   ├── _in_process/
│       │   │   │   ├── __init__.py
│       │   │   │   └── _in_process.py
│       │   │   └── py.typed
│       │   ├── requests/
│       │   │   ├── LICENSE
│       │   │   ├── __init__.py
│       │   │   ├── __version__.py
│       │   │   ├── _internal_utils.py
│       │   │   ├── adapters.py
│       │   │   ├── api.py
│       │   │   ├── auth.py
│       │   │   ├── certs.py
│       │   │   ├── compat.py
│       │   │   ├── cookies.py
│       │   │   ├── exceptions.py
│       │   │   ├── help.py
│       │   │   ├── hooks.py
│       │   │   ├── models.py
│       │   │   ├── packages.py
│       │   │   ├── sessions.py
│       │   │   ├── status_codes.py
│       │   │   ├── structures.py
│       │   │   └── utils.py
│       │   ├── requests.pyi
│       │   ├── resolvelib/
│       │   │   ├── LICENSE
│       │   │   ├── __init__.py
│       │   │   ├── providers.py
│       │   │   ├── py.typed
│       │   │   ├── reporters.py
│       │   │   ├── resolvers/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── abstract.py
│       │   │   │   ├── criterion.py
│       │   │   │   ├── exceptions.py
│       │   │   │   └── resolution.py
│       │   │   └── structs.py
│       │   ├── rich/
│       │   │   ├── LICENSE
│       │   │   ├── __init__.py
│       │   │   ├── __main__.py
│       │   │   ├── _cell_widths.py
│       │   │   ├── _emoji_codes.py
│       │   │   ├── _emoji_replace.py
│       │   │   ├── _export_format.py
│       │   │   ├── _extension.py
│       │   │   ├── _fileno.py
│       │   │   ├── _inspect.py
│       │   │   ├── _log_render.py
│       │   │   ├── _loop.py
│       │   │   ├── _null_file.py
│       │   │   ├── _palettes.py
│       │   │   ├── _pick.py
│       │   │   ├── _ratio.py
│       │   │   ├── _spinners.py
│       │   │   ├── _stack.py
│       │   │   ├── _timer.py
│       │   │   ├── _win32_console.py
│       │   │   ├── _windows.py
│       │   │   ├── _windows_renderer.py
│       │   │   ├── _wrap.py
│       │   │   ├── abc.py
│       │   │   ├── align.py
│       │   │   ├── ansi.py
│       │   │   ├── bar.py
│       │   │   ├── box.py
│       │   │   ├── cells.py
│       │   │   ├── color.py
│       │   │   ├── color_triplet.py
│       │   │   ├── columns.py
│       │   │   ├── console.py
│       │   │   ├── constrain.py
│       │   │   ├── containers.py
│       │   │   ├── control.py
│       │   │   ├── default_styles.py
│       │   │   ├── diagnose.py
│       │   │   ├── emoji.py
│       │   │   ├── errors.py
│       │   │   ├── file_proxy.py
│       │   │   ├── filesize.py
│       │   │   ├── highlighter.py
│       │   │   ├── json.py
│       │   │   ├── jupyter.py
│       │   │   ├── layout.py
│       │   │   ├── live.py
│       │   │   ├── live_render.py
│       │   │   ├── logging.py
│       │   │   ├── markup.py
│       │   │   ├── measure.py
│       │   │   ├── padding.py
│       │   │   ├── pager.py
│       │   │   ├── palette.py
│       │   │   ├── panel.py
│       │   │   ├── pretty.py
│       │   │   ├── progress.py
│       │   │   ├── progress_bar.py
│       │   │   ├── prompt.py
│       │   │   ├── protocol.py
│       │   │   ├── py.typed
│       │   │   ├── region.py
│       │   │   ├── repr.py
│       │   │   ├── rule.py
│       │   │   ├── scope.py
│       │   │   ├── screen.py
│       │   │   ├── segment.py
│       │   │   ├── spinner.py
│       │   │   ├── status.py
│       │   │   ├── style.py
│       │   │   ├── styled.py
│       │   │   ├── syntax.py
│       │   │   ├── table.py
│       │   │   ├── terminal_theme.py
│       │   │   ├── text.py
│       │   │   ├── theme.py
│       │   │   ├── themes.py
│       │   │   ├── traceback.py
│       │   │   └── tree.py
│       │   ├── tomli/
│       │   │   ├── LICENSE
│       │   │   ├── __init__.py
│       │   │   ├── _parser.py
│       │   │   ├── _re.py
│       │   │   ├── _types.py
│       │   │   └── py.typed
│       │   ├── tomli_w/
│       │   │   ├── LICENSE
│       │   │   ├── __init__.py
│       │   │   ├── _writer.py
│       │   │   └── py.typed
│       │   ├── truststore/
│       │   │   ├── LICENSE
│       │   │   ├── __init__.py
│       │   │   ├── _api.py
│       │   │   ├── _macos.py
│       │   │   ├── _openssl.py
│       │   │   ├── _ssl_constants.py
│       │   │   ├── _windows.py
│       │   │   └── py.typed
│       │   ├── urllib3/
│       │   │   ├── LICENSE.txt
│       │   │   ├── __init__.py
│       │   │   ├── _collections.py
│       │   │   ├── _version.py
│       │   │   ├── connection.py
│       │   │   ├── connectionpool.py
│       │   │   ├── contrib/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── _appengine_environ.py
│       │   │   │   ├── _securetransport/
│       │   │   │   │   ├── __init__.py
│       │   │   │   │   ├── bindings.py
│       │   │   │   │   └── low_level.py
│       │   │   │   ├── appengine.py
│       │   │   │   ├── ntlmpool.py
│       │   │   │   ├── pyopenssl.py
│       │   │   │   ├── securetransport.py
│       │   │   │   └── socks.py
│       │   │   ├── exceptions.py
│       │   │   ├── fields.py
│       │   │   ├── filepost.py
│       │   │   ├── packages/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── backports/
│       │   │   │   │   ├── __init__.py
│       │   │   │   │   ├── makefile.py
│       │   │   │   │   └── weakref_finalize.py
│       │   │   │   └── six.py
│       │   │   ├── poolmanager.py
│       │   │   ├── request.py
│       │   │   ├── response.py
│       │   │   └── util/
│       │   │       ├── __init__.py
│       │   │       ├── connection.py
│       │   │       ├── proxy.py
│       │   │       ├── queue.py
│       │   │       ├── request.py
│       │   │       ├── response.py
│       │   │       ├── retry.py
│       │   │       ├── ssl_.py
│       │   │       ├── ssl_match_hostname.py
│       │   │       ├── ssltransport.py
│       │   │       ├── timeout.py
│       │   │       ├── url.py
│       │   │       └── wait.py
│       │   ├── urllib3.pyi
│       │   └── vendor.txt
│       └── py.typed
├── tests/
│   ├── __init__.py
│   ├── conftest.py
│   ├── data/
│   │   ├── backends/
│   │   │   ├── dummy_backend-0.1-py2.py3-none-any.whl
│   │   │   └── test_backend-0.1-py2.py3-none-any.whl
│   │   ├── completion_paths/
│   │   │   ├── README.txt
│   │   │   ├── REPLAY/
│   │   │   │   └── video.mpeg
│   │   │   └── requirements.txt
│   │   ├── indexes/
│   │   │   ├── README.txt
│   │   │   ├── datarequire/
│   │   │   │   └── fakepackage/
│   │   │   │       └── index.html
│   │   │   ├── dev/
│   │   │   │   └── bar/
│   │   │   │       └── index.html
│   │   │   ├── empty_with_pkg/
│   │   │   │   └── index.html
│   │   │   ├── in dex/
│   │   │   │   ├── README.txt
│   │   │   │   └── simple/
│   │   │   │       └── index.html
│   │   │   ├── invalid-version/
│   │   │   │   └── invalid-version/
│   │   │   │       └── index.html
│   │   │   ├── pre/
│   │   │   │   └── bar/
│   │   │   │       └── index.html
│   │   │   ├── require-invalid-version/
│   │   │   │   ├── invalid-version/
│   │   │   │   │   └── index.html
│   │   │   │   └── require-invalid-version/
│   │   │   │       └── index.html
│   │   │   ├── simple/
│   │   │   │   └── simple/
│   │   │   │       └── index.html
│   │   │   ├── yanked/
│   │   │   │   └── simple/
│   │   │   │       └── index.html
│   │   │   └── yanked_all/
│   │   │       └── simple/
│   │   │           └── index.html
│   │   ├── packages/
│   │   │   ├── BrokenEmitsUTF8/
│   │   │   │   ├── broken.py
│   │   │   │   └── setup.py
│   │   │   ├── FSPkg/
│   │   │   │   ├── fspkg/
│   │   │   │   │   └── __init__.py
│   │   │   │   └── setup.py
│   │   │   ├── HackedEggInfo/
│   │   │   │   └── setup.py
│   │   │   ├── LineEndings/
│   │   │   │   └── setup.py
│   │   │   ├── LocalEnvironMarker/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── localenvironmarker/
│   │   │   │   │   └── __init__.py
│   │   │   │   └── setup.py
│   │   │   ├── LocalExtras/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── localextras/
│   │   │   │   │   └── __init__.py
│   │   │   │   └── setup.py
│   │   │   ├── LocalExtras-0.0.2/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── localextras/
│   │   │   │   │   └── __init__.py
│   │   │   │   └── setup.py
│   │   │   ├── README.txt
│   │   │   ├── SetupPyLatin1/
│   │   │   │   └── setup.py
│   │   │   ├── SetupPyUTF8/
│   │   │   │   └── setup.py
│   │   │   ├── brokenwheel-1.0-py2.py3-none-any.whl
│   │   │   ├── colander-0.9.9-py2.py3-none-any.whl
│   │   │   ├── compilewheel-1.0-py2.py3-none-any.whl
│   │   │   ├── complex_dist-0.1-py2.py3-none-any.whl
│   │   │   ├── console_scripts_uppercase-1.0-py2.py3-none-any.whl
│   │   │   ├── corruptwheel-1.0-py2.py3-none-any.whl
│   │   │   ├── has.script-1.0-py2.py3-none-any.whl
│   │   │   ├── invalid.whl
│   │   │   ├── invalid_version-1.0-py3-none-any.whl
│   │   │   ├── invalid_version-2010i-py3-none-any.whl
│   │   │   ├── license.dist-0.1-py2.py3-none-any.whl
│   │   │   ├── license.dist-0.2-py2.py3-none-any.whl
│   │   │   ├── meta-1.0-py2.py3-none-any.whl
│   │   │   ├── mypy-0.782-py3-none-any.whl
│   │   │   ├── pep517_setup_and_pyproject/
│   │   │   │   ├── pyproject.toml
│   │   │   │   ├── setup.cfg
│   │   │   │   └── setup.py
│   │   │   ├── pep517_wrapper_buildsys/
│   │   │   │   ├── mybuildsys.py
│   │   │   │   ├── pyproject.toml
│   │   │   │   ├── setup.cfg
│   │   │   │   └── setup.py
│   │   │   ├── priority-1.0-py2.py3-none-any.whl
│   │   │   ├── prjwithdatafile-1.0-py2.py3-none-any.whl
│   │   │   ├── require_invalid_version-0.1-py3-none-any.whl
│   │   │   ├── require_invalid_version-1.0-py3-none-any.whl
│   │   │   ├── requiresPaste/
│   │   │   │   ├── pyproject.toml
│   │   │   │   └── requiresPaste.py
│   │   │   ├── requires_simple_extra-0.1-py2.py3-none-any.whl
│   │   │   ├── requires_source-1.0-py2.py3-none-any.whl
│   │   │   ├── requires_wheelbroken_upper/
│   │   │   │   ├── requires_wheelbroken_upper/
│   │   │   │   │   └── __init__.py
│   │   │   │   └── setup.py
│   │   │   ├── script.wheel1-0.1-py2.py3-none-any.whl
│   │   │   ├── script.wheel1a-0.1-py2.py3-none-any.whl
│   │   │   ├── script.wheel2-0.1-py2.py3-none-any.whl
│   │   │   ├── script.wheel2a-0.1-py2.py3-none-any.whl
│   │   │   ├── script.wheel3-0.1-py2.py3-none-any.whl
│   │   │   ├── setuptools-0.9.8-py2.py3-none-any.whl
│   │   │   ├── simple.dist-0.1-py1-none-invalid.whl
│   │   │   ├── simple.dist-0.1-py2.py3-none-any.whl
│   │   │   ├── simple_namespace-1.0-py2.py3-none-any.whl
│   │   │   ├── simplewheel-1.0-py2.py3-none-any.whl
│   │   │   ├── simplewheel-2.0-1-py2.py3-none-any.whl
│   │   │   ├── simplewheel-2.0-py2.py3-none-any.whl
│   │   │   ├── simplewheel-2.0-py3-fakeabi-fakeplat.whl
│   │   │   ├── singlemodule-0.0.1.tar.lzma
│   │   │   ├── singlemodule-0.0.1.tar.xz
│   │   │   ├── symlinks/
│   │   │   │   ├── doc/
│   │   │   │   │   └── intro
│   │   │   │   ├── docs
│   │   │   │   ├── setup.cfg
│   │   │   │   ├── setup.py
│   │   │   │   └── symlinks/
│   │   │   │       └── __init__.py
│   │   │   └── test_tar.tgz
│   │   ├── packages3/
│   │   │   ├── dinner/
│   │   │   │   └── index.html
│   │   │   ├── index.html
│   │   │   └── requiredinner/
│   │   │       └── index.html
│   │   ├── pypi_packages/
│   │   │   ├── django_devserver-0.8.0-py3-none-any.whl
│   │   │   └── six-1.17.0-py2.py3-none-any.whl
│   │   ├── reqfiles/
│   │   │   ├── README.txt
│   │   │   └── supported_options2.txt
│   │   └── src/
│   │       ├── TopoRequires/
│   │       │   ├── setup.py
│   │       │   └── toporequires/
│   │       │       └── __init__.py
│   │       ├── TopoRequires2/
│   │       │   ├── setup.cfg.pending
│   │       │   ├── setup.py
│   │       │   └── toporequires2/
│   │       │       └── __init__.py
│   │       ├── TopoRequires3/
│   │       │   ├── setup.cfg.pending
│   │       │   ├── setup.py
│   │       │   └── toporequires3/
│   │       │       └── __init__.py
│   │       ├── TopoRequires4/
│   │       │   ├── setup.cfg.pending
│   │       │   ├── setup.py
│   │       │   └── toporequires4/
│   │       │       └── __init__.py
│   │       ├── chattymodule/
│   │       │   ├── backend.py
│   │       │   ├── chattymodule.py
│   │       │   └── pyproject.toml
│   │       ├── compilewheel/
│   │       │   ├── setup.cfg
│   │       │   ├── setup.py
│   │       │   └── simple/
│   │       │       └── __init__.py
│   │       ├── extension/
│   │       │   ├── extension.c
│   │       │   └── setup.py
│   │       ├── pep517_pyproject_only/
│   │       │   └── pyproject.toml
│   │       ├── pep517_setup_and_pyproject/
│   │       │   ├── pyproject.toml
│   │       │   └── setup.py
│   │       ├── pep517_setup_cfg_only/
│   │       │   └── setup.cfg
│   │       ├── pep517_setup_only/
│   │       │   └── setup.py
│   │       ├── pep518-3.0/
│   │       │   ├── MANIFEST.in
│   │       │   ├── pep518.py
│   │       │   ├── pyproject.toml
│   │       │   ├── setup.cfg
│   │       │   └── setup.py
│   │       ├── pep518_conflicting_requires/
│   │       │   ├── MANIFEST.in
│   │       │   ├── pep518.py
│   │       │   ├── pyproject.toml
│   │       │   └── setup.py
│   │       ├── pep518_forkbomb-235/
│   │       │   ├── MANIFEST.in
│   │       │   ├── pep518_forkbomb.py
│   │       │   ├── pyproject.toml
│   │       │   ├── setup.cfg
│   │       │   └── setup.py
│   │       ├── pep518_invalid_build_system/
│   │       │   ├── MANIFEST.in
│   │       │   ├── pep518.py
│   │       │   ├── pyproject.toml
│   │       │   └── setup.py
│   │       ├── pep518_invalid_requires/
│   │       │   ├── MANIFEST.in
│   │       │   ├── pep518.py
│   │       │   ├── pyproject.toml
│   │       │   └── setup.py
│   │       ├── pep518_missing_requires/
│   │       │   ├── MANIFEST.in
│   │       │   ├── pep518.py
│   │       │   ├── pyproject.toml
│   │       │   └── setup.py
│   │       ├── pep518_twin_forkbombs_first-234/
│   │       │   ├── MANIFEST.in
│   │       │   ├── pep518_twin_forkbombs_first.py
│   │       │   ├── pyproject.toml
│   │       │   ├── setup.cfg
│   │       │   └── setup.py
│   │       ├── pep518_twin_forkbombs_second-238/
│   │       │   ├── MANIFEST.in
│   │       │   ├── pep518_twin_forkbombs_second.py
│   │       │   ├── pyproject.toml
│   │       │   ├── setup.cfg
│   │       │   └── setup.py
│   │       ├── pep518_with_extra_and_markers-1.0/
│   │       │   ├── MANIFEST.in
│   │       │   ├── pep518_with_extra_and_markers.py
│   │       │   ├── pyproject.toml
│   │       │   ├── setup.cfg
│   │       │   └── setup.py
│   │       ├── pep518_with_namespace_package-1.0/
│   │       │   ├── pep518_with_namespace_package.py
│   │       │   ├── pyproject.toml
│   │       │   ├── setup.cfg
│   │       │   └── setup.py
│   │       ├── prjwithdatafile/
│   │       │   ├── prjwithdatafile/
│   │       │   │   ├── README.txt
│   │       │   │   └── somemodule.py
│   │       │   └── setup.py
│   │       ├── requires_capitalized/
│   │       │   └── setup.py
│   │       ├── requires_requires_capitalized/
│   │       │   └── setup.py
│   │       ├── requires_simple/
│   │       │   ├── requires_simple/
│   │       │   │   └── __init__.py
│   │       │   └── setup.py
│   │       ├── requires_simple_extra/
│   │       │   ├── requires_simple_extra.py
│   │       │   ├── setup.cfg
│   │       │   └── setup.py
│   │       ├── setup_error/
│   │       │   └── setup.py
│   │       ├── simple_namespace/
│   │       │   ├── setup.cfg
│   │       │   ├── setup.py
│   │       │   └── simple_namespace/
│   │       │       ├── __init__.py
│   │       │       └── module/
│   │       │           └── __init__.py
│   │       ├── simplewheel-1.0/
│   │       │   ├── setup.cfg
│   │       │   ├── setup.py
│   │       │   └── simplewheel/
│   │       │       └── __init__.py
│   │       ├── simplewheel-2.0/
│   │       │   ├── setup.cfg
│   │       │   ├── setup.py
│   │       │   └── simplewheel/
│   │       │       └── __init__.py
│   │       ├── singlemodule/
│   │       │   ├── setup.cfg
│   │       │   ├── setup.py
│   │       │   └── singlemodule.py
│   │       └── withpyproject/
│   │           ├── pyproject.toml
│   │           └── setup.py
│   ├── functional/
│   │   ├── __init__.py
│   │   ├── test_bad_url.py
│   │   ├── test_broken_stdout.py
│   │   ├── test_build_constraints.py
│   │   ├── test_build_env.py
│   │   ├── test_cache.py
│   │   ├── test_check.py
│   │   ├── test_cli.py
│   │   ├── test_completion.py
│   │   ├── test_config_settings.py
│   │   ├── test_configuration.py
│   │   ├── test_debug.py
│   │   ├── test_download.py
│   │   ├── test_fast_deps.py
│   │   ├── test_freeze.py
│   │   ├── test_hash.py
│   │   ├── test_help.py
│   │   ├── test_index.py
│   │   ├── test_index_invalid_wheels.py
│   │   ├── test_inspect.py
│   │   ├── test_install.py
│   │   ├── test_install_check.py
│   │   ├── test_install_cleanup.py
│   │   ├── test_install_compat.py
│   │   ├── test_install_config.py
│   │   ├── test_install_direct_url.py
│   │   ├── test_install_extras.py
│   │   ├── test_install_force_reinstall.py
│   │   ├── test_install_format_control.py
│   │   ├── test_install_index.py
│   │   ├── test_install_release_control.py
│   │   ├── test_install_report.py
│   │   ├── test_install_reqs.py
│   │   ├── test_install_requested.py
│   │   ├── test_install_script.py
│   │   ├── test_install_upgrade.py
│   │   ├── test_install_user.py
│   │   ├── test_install_vcs_git.py
│   │   ├── test_install_wheel.py
│   │   ├── test_invalid_versions_and_specifiers.py
│   │   ├── test_list.py
│   │   ├── test_lock.py
│   │   ├── test_new_resolver.py
│   │   ├── test_new_resolver_errors.py
│   │   ├── test_new_resolver_hashes.py
│   │   ├── test_new_resolver_target.py
│   │   ├── test_new_resolver_user.py
│   │   ├── test_no_color.py
│   │   ├── test_pep517.py
│   │   ├── test_pep660.py
│   │   ├── test_pep668.py
│   │   ├── test_pip_runner_script.py
│   │   ├── test_proxy.py
│   │   ├── test_python_option.py
│   │   ├── test_search.py
│   │   ├── test_self_update.py
│   │   ├── test_show.py
│   │   ├── test_truststore.py
│   │   ├── test_uninstall.py
│   │   ├── test_uninstall_user.py
│   │   ├── test_uploaded_prior_to.py
│   │   ├── test_vcs_bazaar.py
│   │   ├── test_vcs_git.py
│   │   ├── test_vcs_mercurial.py
│   │   ├── test_vcs_subversion.py
│   │   ├── test_warning.py
│   │   └── test_wheel.py
│   ├── lib/
│   │   ├── __init__.py
│   │   ├── certs.py
│   │   ├── compat.py
│   │   ├── configuration_helpers.py
│   │   ├── filesystem.py
│   │   ├── git_submodule_helpers.py
│   │   ├── index.py
│   │   ├── local_repos.py
│   │   ├── options_helpers.py
│   │   ├── requests_mocks.py
│   │   ├── server.py
│   │   ├── test_lib.py
│   │   ├── test_wheel.py
│   │   ├── venv.py
│   │   └── wheel.py
│   ├── ruff.toml
│   └── unit/
│       ├── __init__.py
│       ├── metadata/
│       │   ├── test_metadata.py
│       │   └── test_metadata_pkg_resources.py
│       ├── resolution_resolvelib/
│       │   ├── __init__.py
│       │   ├── conftest.py
│       │   ├── test_provider.py
│       │   ├── test_requirement.py
│       │   └── test_resolver.py
│       ├── test_appdirs.py
│       ├── test_base_command.py
│       ├── test_build_constraints.py
│       ├── test_cache.py
│       ├── test_cli_colors.py
│       ├── test_cli_spinners.py
│       ├── test_cmdoptions.py
│       ├── test_collector.py
│       ├── test_command_install.py
│       ├── test_commands.py
│       ├── test_compat.py
│       ├── test_configuration.py
│       ├── test_direct_url.py
│       ├── test_direct_url_helpers.py
│       ├── test_exceptions.py
│       ├── test_finder.py
│       ├── test_format_control.py
│       ├── test_index.py
│       ├── test_link.py
│       ├── test_locations.py
│       ├── test_logging.py
│       ├── test_models.py
│       ├── test_models_wheel.py
│       ├── test_network_auth.py
│       ├── test_network_cache.py
│       ├── test_network_download.py
│       ├── test_network_lazy_wheel.py
│       ├── test_network_session.py
│       ├── test_network_utils.py
│       ├── test_operations_prepare.py
│       ├── test_options.py
│       ├── test_packaging.py
│       ├── test_pep517.py
│       ├── test_pyproject_config.py
│       ├── test_release_control.py
│       ├── test_req.py
│       ├── test_req_dependency_group.py
│       ├── test_req_file.py
│       ├── test_req_install.py
│       ├── test_req_uninstall.py
│       ├── test_resolution_legacy_resolver.py
│       ├── test_search_scope.py
│       ├── test_self_check_outdated.py
│       ├── test_target_python.py
│       ├── test_urls.py
│       ├── test_utils.py
│       ├── test_utils_compatibility_tags.py
│       ├── test_utils_datetime.py
│       ├── test_utils_filesystem.py
│       ├── test_utils_retry.py
│       ├── test_utils_subprocess.py
│       ├── test_utils_temp_dir.py
│       ├── test_utils_unpacking.py
│       ├── test_utils_virtualenv.py
│       ├── test_utils_wheel.py
│       ├── test_vcs.py
│       ├── test_vcs_mercurial.py
│       ├── test_wheel.py
│       └── test_wheel_builder.py
└── tools/
    ├── __init__.py
    ├── codespell-ignore.txt
    ├── news/
    │   └── template.rst
    ├── protected_pip.py
    ├── release/
    │   ├── __init__.py
    │   └── check_version.py
    ├── update-rtd-redirects.py
    └── vendoring/
        └── patches/
            ├── cachecontrol.patch
            ├── certifi.patch
            ├── pkg_resources.patch
            ├── pygments.patch
            ├── requests.patch
            ├── truststore.patch
            ├── urllib3-disable-brotli.patch
            └── urllib3.patch

================================================
FILE CONTENTS
================================================

================================================
FILE: .devcontainer/devcontainer.json
================================================
{
	"name": "pip",
	"image": "mcr.microsoft.com/devcontainers/python:3",
	"remoteUser": "vscode",
	"remoteEnv": {
		"PATH": "/home/vscode/.local/bin:${containerEnv:PATH}"
	},
	"features": {
		"ghcr.io/rocker-org/devcontainer-features/apt-packages:1": {
			"packages": "mercurial,subversion,bzr,python3-venv"
		}
	},
	"postCreateCommand": "bash ${containerWorkspaceFolder}/.devcontainer/postCreate.sh",
	"customizations": {
		"vscode": {
			"extensions": [
				"ms-python.python",
				"ms-python.black-formatter",
				"charliermarsh.ruff"
			],
			"settings": {
				"python.testing.pytestEnabled": true,
				"python.testing.pytestArgs": [
					"-n",
					"auto"
				]
			}
		}
	}
}


================================================
FILE: .devcontainer/postCreate.sh
================================================
#!/bin/bash
set -Eeuo pipefail

# Get the workspace directory
WORKSPACE_DIR="${WORKSPACE_DIR:-/workspaces/pip}"
cd "$WORKSPACE_DIR"

# Upgrade pip and install development dependencies
python -m pip install --upgrade pip
python -m pip install nox --group test
python -m nox -s common-wheels
python -m pip install -e .


================================================
FILE: .git-blame-ignore-revs
================================================
917b41d6d73535c090fc312668dff353cdaef906  # Blacken docs/html/conf.py
ed383dd8afa8fe0250dcf9b8962927ada0e21c89  # Blacken docs/pip_sphinxext.py
228405e62451abe8a66233573035007df4be575f  # Blacken noxfile.py
f477a9f490e978177b71c9dbaa5465c51ea21129  # Blacken setup.py
e59ba23468390217479465019f8d78e724a23550  # Blacken src/pip/__main__.py
d7013db084e9a52242354ee5754dc5d19ccf062e  # Blacken src/pip/_internal/build_env.py
30e9ffacae75378fc3e3df48f754dabad037edb9  # Blacken src/pip/_internal/cache.py
8341d56b46776a805286218ac5fb0e7850fd9341  # Blacken src/pip/_internal/cli/autocompletion.py
3d3461ed65208656358b3595e25d8c31c5c89470  # Blacken src/pip/_internal/cli/base_command.py
d489b0f1b104bc936b0fb17e6c33633664ebdc0e  # Blacken src/pip/_internal/cli/cmdoptions.py
591fe4841aefe9befa0530f2a54f820c4ecbb392  # Blacken src/pip/_internal/cli/command_context.py
9265b28ef7248ae1847a80384dbeeb8119c3e2f5  # Blacken src/pip/_internal/cli/main.py
847a369364878c38d210c90beed2737bb6fb3a85  # Blacken src/pip/_internal/cli/main_parser.py
ec97119067041ae58b963935ff5f0e5d9fead80c  # Blacken src/pip/_internal/cli/parser.py
6e3b8de22fa39fa3073599ecf9db61367f4b3b32  # Blacken src/pip/_internal/cli/progress_bars.py
55405227de983c5bd5bf0858ea12dbe537d3e490  # Blacken src/pip/_internal/cli/req_command.py
d5ca5c850cae9a0c64882a8f49d3a318699a7e2e  # Blacken src/pip/_internal/cli/spinners.py
9747cb48f8430a7a91b36fe697dd18dbddb319f0  # Blacken src/pip/_internal/commands/__init__.py
1c09fd6f124df08ca36bed68085ad68e89bb1957  # Blacken src/pip/_internal/commands/cache.py
315e93d7eb87cd476afcc4eaf0f01a7b56a5037f  # Blacken src/pip/_internal/commands/check.py
8ae3b96ed7d24fd24024ccce4840da0dcf635f26  # Blacken src/pip/_internal/commands/completion.py
42ca4792202f26a293ee48380718743a80bbee37  # Blacken src/pip/_internal/commands/configuration.py
790ad78fcd43d41a5bef9dca34a3c128d05eb02c  # Blacken src/pip/_internal/commands/debug.py
a6fcc8f045afe257ce321f4012fc8fcb4be01eb3  # Blacken src/pip/_internal/commands/download.py
920e735dfc60109351fbe2f4c483c2f6ede9e52d  # Blacken src/pip/_internal/commands/freeze.py
053004e0fcf0851238b1064fbce13aea87b24e9c  # Blacken src/pip/_internal/commands/hash.py
a6b6ae487e52c2242045b64cb8962e0a992cfd76  # Blacken src/pip/_internal/commands/help.py
2495cf95a6c7eb61ccf1f9f0e8b8d736af914e53  # Blacken __main__.py
c7ee560e00b85f7486b452c14ff49e4737996eda  # Blacken tools/
8e2e1964a4f0a060f7299a96a911c9e116b2283d  # Blacken src/pip/_internal/commands/
1bc0eef05679e87f45540ab0a294667cb3c6a88e  # Blacken src/pip/_internal/network/
069b01932a7d64a81c708c6254cc93e1f89e6783  # Blacken src/pip/_internal/req
1897784d59e0d5fcda2dd75fea54ddd8be3d502a  # Blacken src/pip/_internal/index
94999255d5ede440c37137d210666fdf64302e75  # Reformat the codebase, with black
585037a80a1177f1fa92e159a7079855782e543e  # Cleanup implicit string concatenation
8a6f6ac19b80a6dc35900a47016c851d9fcd2ee2  # Blacken src/pip/_internal/resolution directory
acfcae8941bb12ecfc372a05c875a7b414992604  # Reformat with Black's 2025 code style


================================================
FILE: .gitattributes
================================================
# Patches must have Unix-style line endings, even on Windows
tools/vendoring/patches/* eol=lf
# The CA Bundle should always use Unix-style line endings, even on Windows
src/pip/_vendor/certifi/*.pem eol=lf


================================================
FILE: .github/CONTRIBUTING.md
================================================
# Contributing to pip

Thank you for your interest in contributing to pip! There are many ways to
contribute, and we appreciate all of them.

As a reminder, all contributors are expected to follow our [Code of Conduct][coc].

Contributors wishing to use LLM tools should be aware of, and follow, our [AI Policy][ai].

[coc]: https://www.pypa.io/en/latest/code-of-conduct/
[ai]: https://github.com/pypa/pip/blob/main/AI_POLICY.md

## Development Documentation

Our [development documentation](https://pip.pypa.io/en/latest/development/) contains details on how to get started with contributing to pip, and details of our development processes.


================================================
FILE: .github/FUNDING.yml
================================================
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: "https://pypi.org/sponsor/" # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']


================================================
FILE: .github/ISSUE_TEMPLATE/bug-report.yml
================================================
name: Bug report
description: Something is not working correctly.
labels: "S: needs triage, type: bug"

body:
  - type: markdown
    attributes:
      value: >-
        Hi there!

        We'd appreciate it if you could search on pip's existing issues prior to filing
        a bug report.

        We get a lot of duplicate tickets and have limited maintainer capacity to triage
        them. Thanks!

  - type: textarea
    attributes:
      label: Description
      description: >-
        A clear and concise description of what the bug is.
    validations:
      required: true

  - type: textarea
    attributes:
      label: Expected behavior
      description: >-
        A clear and concise description of what you expected to happen.

  - type: input
    attributes:
      label: pip version
    validations:
      required: true
  - type: input
    attributes:
      label: Python version
    validations:
      required: true
  - type: input
    attributes:
      label: OS
    validations:
      required: true

  - type: textarea
    attributes:
      label: How to Reproduce
      description: Please provide steps to reproduce this bug.
      placeholder: |
        1. Get package from '...'
        2. Then run '...'
        3. An error occurs.
    validations:
      required: true

  - type: textarea
    attributes:
      label: Output
      description: >-
        Provide the output of the steps above, including the commands
        themselves and pip's output/traceback etc.

        If you want to present output from multiple commands, please prefix
        the line containing the command with `$ `. Please also ensure that
        the "How to reproduce" section contains matching instructions for
        reproducing this.

  - type: checkboxes
    attributes:
      label: Code of Conduct
      options:
        - label: >-
            I agree to follow the [PSF Code of Conduct](https://www.python.org/psf/conduct/).
          required: true


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
# Documentation for this file can be found at:
# https://help.github.com/en/github/building-a-strong-community/configuring-issue-templates-for-your-repository

blank_issues_enabled: true
# contact_links:
#   - name: "(maintainers only) Blank issue"
#     url: https://github.com/pypa/pip/issues/new
#     about: For maintainers only.


================================================
FILE: .github/ISSUE_TEMPLATE/feature-request.yml
================================================
name: Feature request
description: Suggest an idea for this project
labels: "S: needs triage, type: feature request"

body:
  - type: markdown
    attributes:
      value: >-
        Hi there!

        We'd appreciate it if you could search on pip's existing issues prior to filing
        a feature request.

        We get a lot of duplicate tickets and have limited maintainer capacity to triage
        them. Thanks!

  - type: textarea
    attributes:
      label: What's the problem this feature will solve?
      description: >-
        What are you trying to do, that you are unable to achieve with pip as it
        currently stands?
    validations:
      required: true

  - type: textarea
    attributes:
      label: Describe the solution you'd like
      description: >-
        Clear and concise description of what you want to happen. Please use examples
        of real world use cases that this would help with, and how it solves the
        problem described above.
    validations:
      required: true

  - type: textarea
    attributes:
      label: Alternative Solutions
      description: >-
        Have you tried to workaround the problem using pip or other tools? Or a
        different approach to solving this issue? Please elaborate here.
    validations:
      required: true

  - type: textarea
    attributes:
      label: Additional context
      description: >-
        Add any other context, links, etc. relevant to the feature request.
    validations:
      required: true

  - type: checkboxes
    attributes:
      label: Code of Conduct
      options:
        - label: >-
            I agree to follow the [PSF Code of Conduct](https://www.python.org/psf/conduct/).
          required: true


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!---
Thank you for your soon to be pull request. Before you submit this, please
double check to make sure that you've added a news file fragment. In pip we
generate our NEWS.rst from multiple news fragment files, and all pull requests
require either a news file fragment or a marker to indicate they don't require
one.

To read more about adding a news file fragment for your PR, please check out
our documentation at: https://pip.pypa.io/en/latest/development/contributing/#news-entries
-->


================================================
FILE: .github/chronographer.yml
================================================
branch-protection-check-name: Changelog entry
action-hints:
  check-title-prefix: "Chronographer: "
  external-docs-url: https://pip.pypa.io/dev/news-entry-failure
  inline-markdown: >
    See https://pip.pypa.io/dev/news-entry-failure for details.
enforce-name:
  suffix: .rst
labels:
  skip-changelog: skip news


================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"
    groups:
      github-actions:
        patterns:
          - "*"
  - package-ecosystem: "pip"
    directory: "/build-project"
    schedule:
      interval: "weekly"


================================================
FILE: .github/workflows/ci.yml
================================================
name: CI

on:
  push:
    branches: [main]
    tags:
      # Tags for all potential release numbers till 2030.
      - "2[0-9].[0-3]" # 20.0 -> 29.3
      - "2[0-9].[0-3].[0-9]+" # 20.0.0 -> 29.3.[0-9]+
  pull_request:
  schedule:
    - cron: 0 0 * * MON # Run every Monday at 00:00 UTC
  workflow_dispatch:
    # allow manual runs on branches without a PR

env:
  # The "FORCE_COLOR" variable, when set to 1,
  # tells Nox to colorize itself.
  FORCE_COLOR: "1"

concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
  cancel-in-progress: true

jobs:
  docs:
    name: docs
    runs-on: ubuntu-22.04

    steps:
      - uses: actions/checkout@v6.0.2
      - uses: actions/setup-python@v6
        with:
          python-version: "3.x"
      - run: pip install nox
      - run: nox -s docs

  determine-changes:
    runs-on: ubuntu-22.04
    outputs:
      tests: ${{ steps.filter.outputs.tests }}
      vendoring: ${{ steps.filter.outputs.vendoring }}
    steps:
      # For pull requests it's not necessary to checkout the code
      - uses: dorny/paths-filter@v3
        id: filter
        with:
          filters: |
            vendoring:
              # Anything that's touching "vendored code"
              - "src/pip/_vendor/**"
              - "pyproject.toml"
              - "noxfile.py"
            tests:
              # Anything that's touching code-related stuff
              - ".github/workflows/ci.yml"
              - "src/**"
              - "tests/**"
              - "noxfile.py"
              # The test suite should also run when cutting a release
              # (which is the only time this file is modified).
              - "NEWS.rst"
        if: github.event_name == 'pull_request'

  packaging:
    name: packaging / ${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-22.04, windows-latest]

    steps:
      - uses: actions/checkout@v6.0.2
      - uses: actions/setup-python@v6
        with:
          python-version: "3.x"
      - name: Set up git credentials
        run: |
          git config --global user.email "pypa-dev@googlegroups.com"
          git config --global user.name "pip"

      - run: pip install nox
      - run: nox -s prepare-release -- 99.9
      - run: nox -s build-release -- 99.9
      - run: pipx run check-sdist

  vendoring:
    name: vendoring
    runs-on: ubuntu-22.04

    needs: [determine-changes]
    if: >-
      needs.determine-changes.outputs.vendoring == 'true' ||
      github.event_name != 'pull_request'

    steps:
      - uses: actions/checkout@v6.0.2
      - uses: actions/setup-python@v6
        with:
          python-version: "3.x"

      - run: pip install nox
      - run: nox -s vendoring
      - run: git diff --exit-code

  tests-unix:
    name: tests / ${{ matrix.python.key || matrix.python }} / ${{ matrix.os }}
    runs-on: ${{ matrix.os }}

    needs: [determine-changes]
    if: >-
      needs.determine-changes.outputs.tests == 'true' ||
      github.event_name != 'pull_request'

    strategy:
      fail-fast: true
      matrix:
        os: [ubuntu-22.04, macos-latest]
        python:
          - "3.9"
          - "3.10"
          - "3.11"
          - "3.12"
          - "3.13"
          - "3.14"
          - "3.15"

    steps:
      - uses: actions/checkout@v6.0.2
      - uses: actions/setup-python@v6
        with:
          python-version: ${{ matrix.python }}
          allow-prereleases: true

      - name: Install Ubuntu dependencies
        if: matrix.os == 'ubuntu-22.04'
        run: |
          sudo apt-get update
          sudo apt-get install bzr

      - name: Install MacOS dependencies
        if: runner.os == 'macOS'
        run: |
          DEPS=breezy
          if ! which svn; then
            DEPS="${DEPS} subversion"
          fi
          brew install ${DEPS}

      - run: pip install nox

      # Main check
      - name: Run unit tests
        run: >-
          nox -s test-${{ matrix.python.key || matrix.python }} --
          tests/unit
          --verbose --numprocesses auto --showlocals
      - name: Run integration tests
        run: >-
          nox -s test-${{ matrix.python.key || matrix.python }} --no-install --
          tests/functional
          --verbose --numprocesses auto --showlocals
          --durations=15

  tests-windows:
    name: tests / ${{ matrix.python }} / ${{ matrix.os }} / ${{ matrix.group.number }}
    runs-on: ${{ matrix.os }}-latest

    needs: [determine-changes]
    if: >-
      needs.determine-changes.outputs.tests == 'true' ||
      github.event_name != 'pull_request'

    strategy:
      fail-fast: true
      matrix:
        os: [Windows]
        python:
          - "3.9"
          # Commented out, since Windows tests are expensively slow,
          # only test the oldest and newest Python supported by pip
          # - "3.10"
          # - "3.11"
          # - "3.12"
          # - "3.13"
          - "3.14"
          - "3.15"
        group:
          - { number: 1, pytest-filter: "not test_install" }
          - { number: 2, pytest-filter: "test_install" }

    steps:
      # The D: drive is significantly faster than the system C: drive.
      # https://github.com/actions/runner-images/issues/8755
      - name: Set TEMP to D:/Temp
        run: |
          mkdir "D:\\Temp"
          echo "TEMP=D:\\Temp" >> $env:GITHUB_ENV

      - uses: actions/checkout@v6.0.2
      - uses: actions/setup-python@v6
        with:
          python-version: ${{ matrix.python }}
          allow-prereleases: true

      - name: Install Subversion
        shell: pwsh
        run: |
          winget install --accept-source-agreements --accept-package-agreements -e --id Slik.Subversion
          echo "C:\Program Files\SlikSvn\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append

      - run: pip install nox

      # Main check
      - name: Run unit tests (group 1)
        if: matrix.group.number == 1
        run: >-
          nox -s test-${{ matrix.python }} --
          tests/unit
          --verbose --numprocesses auto --showlocals

      - name: Run integration tests (group ${{ matrix.group.number }})
        run: >-
          nox -s test-${{ matrix.python }} --no-install --
          tests/functional -k "${{ matrix.group.pytest-filter }}"
          --verbose --numprocesses auto --showlocals --durations=15

  tests-zipapp:
    name: tests / zipapp
    # The macos-latest (M1) runners are the fastest available on GHA, even
    # beating out the ubuntu-latest runners. The zipapp tests are slow by
    # nature, and we don't care where they run, so we pick the fastest one.
    runs-on: macos-latest

    needs: [packaging, determine-changes]
    if: >-
      needs.determine-changes.outputs.tests == 'true' ||
      github.event_name != 'pull_request'

    steps:
      - uses: actions/checkout@v6.0.2
      - uses: actions/setup-python@v6
        with:
          python-version: "3.10"

      - name: Install MacOS dependencies
        run: brew install breezy subversion

      - run: pip install nox

      # Main check
      - name: Run integration tests
        run: >-
          nox -s test-3.10 --
          tests/functional
          --verbose --numprocesses auto --showlocals
          --durations=15
          --use-zipapp

  check:  # This job does nothing and is only used for the branch protection
    if: always()

    needs:
      - determine-changes
      - docs
      - packaging
      - tests-unix
      - tests-windows
      - tests-zipapp
      - vendoring

    runs-on: ubuntu-22.04

    steps:
      - name: Decide whether the needed jobs succeeded or failed
        uses: re-actors/alls-green@release/v1
        with:
          allowed-skips: >-
            ${{
              (
                needs.determine-changes.outputs.vendoring != 'true'
                && github.event_name == 'pull_request'
              )
              && 'vendoring'
              || ''
            }}
            ,
            ${{
              (
                needs.determine-changes.outputs.tests != 'true'
                && github.event_name == 'pull_request'
              )
              && '
                tests-unix,
                tests-windows,
                tests-zipapp,
                tests-importlib-metadata,
              '
              || ''
            }}
          jobs: ${{ toJSON(needs) }}


================================================
FILE: .github/workflows/lock-threads.yml
================================================
name: 'Lock Closed Threads'

on:
  schedule:
    - cron: '0 7 * * *'  # 7am UTC, daily
  workflow_dispatch:

permissions:
  issues: write
  pull-requests: write

concurrency:
  group: lock

jobs:
  action:
    if: github.repository_owner == 'pypa'
    runs-on: ubuntu-latest
    steps:
      - uses: dessant/lock-threads@v6
        with:
          issue-inactive-days: '30'
          pr-inactive-days: '15'


================================================
FILE: .github/workflows/release.yml
================================================
name: Publish Python 🐍 distribution 📦 to PyPI

on:
  push:
    tags:
      - "*"

jobs:
  build:
    name: Build distribution 📦
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@0c366fd6a839edf440554fa01a7085ccba70ac98 # v6.0.2
        with:
          persist-credentials: false
      - name: Build a binary wheel and a source tarball
        run: ./build-project/build-project.py
      - name: Store the distribution packages
        uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
        with:
          name: python-package-distributions
          path: dist/

  publish-to-pypi:
    name: >-
      Publish Python 🐍 distribution 📦 to PyPI
    needs:
      - build
    runs-on: ubuntu-latest
    environment:
      name: pypi
      url: https://pypi.org/project/pip/${{ github.ref_name }}
    permissions:
      id-token: write  # IMPORTANT: mandatory for trusted publishing

    steps:
      - name: Download all the dists
        uses: actions/download-artifact@70fc10c6e5e1ce46ad2ea6f2b72d43f7d47b13c3 # v8.0.0
        with:
          name: python-package-distributions
          path: dist/
      - name: Publish distribution 📦 to PyPI
        uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0


================================================
FILE: .github/workflows/update-rtd-redirects.yml
================================================
name: Update documentation redirects

on:
  push:
    branches: [main]
    paths:
      - ".readthedocs-custom-redirects.yml"
      - ".readthedocs.yml"
  schedule:
    - cron: 0 0 * * MON # Run every Monday at 00:00 UTC

env:
  FORCE_COLOR: "1"

concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }}
  cancel-in-progress: true

jobs:
  update-rtd-redirects:
    runs-on: ubuntu-latest
    environment: RTD Deploys
    steps:
      - uses: actions/checkout@v6.0.2
      - uses: actions/setup-python@v6
        with:
          python-version: "3.11"
      - run: pipx run tools/update-rtd-redirects.py
        env:
          RTD_API_TOKEN: ${{ secrets.RTD_API_TOKEN }}


================================================
FILE: .gitignore
================================================
# Byte-compiled files
__pycache__/
*$py.class

# Distribution / packaging
/build/
/dist/
*.egg
*.eggs
*.egg-info/
MANIFEST

# Documentation
docs/build/

# mypy
.mypy_cache/

# Unit test / coverage reports
.[nt]ox/
htmlcov/
.coverage
.coverage.*
.*cache
nosetests.xml
coverage.xml
*.cover
tests/data/common_wheels/

# Misc
*~
.*.sw?
.env/
.venv/

# For IntelliJ IDEs (basically PyCharm)
.idea/

# For Visual Studio Code
.vscode/

# For Sublime Text
*.sublime-workspace
*.sublime-project

# Scratch Pad for experiments
.scratch/

# Mac
.DS_Store

# Profiling related artifacts
*.prof


================================================
FILE: .mailmap
================================================
Adam Wentz                                                  <awentz@theonion.com>
Alethea Flowers     <magicalgirl@google.com>       <jjramone13@gmail.com>
Alethea Flowers     <magicalgirl@google.com>       Thea Flowers <theaflowers@google.com>
Alex Grönholm                                               <alex.gronholm@nextday.fi>
Alex Grönholm       <alex.gronholm@nextday.fi>              <alex.gronholm+git@nextday.fi>
Anatoly Techtonik                                           <techtonik@gmail.com>
Andrey Bulgakov                                             <mail@andreiko.ru>
                    <mail@andreiko.ru>                      <bulgakov@tranio.ru>
Andrei Geacar       <andrei.geacar@gmail.com>      unknown  <hakaton@Anam-mbl.(none)>
Anish Tambe         <anish.tambe@yahoo.in>                  <anish.tambe@yahoo.co.in>
Bartek Ogryczak     <b.ogryczak@gmail.com>                  <bartek@eventbrite.com>
Ben Rosser                                                  <rosser.bjr@gmail.com>
                    <bradley.ayers@gmail.com>               <bradley.ayers@enigmainteractive.com>
                    <carl@oddbird.net>                      <carl@dirtcircle.com>
Daniel Holth                                                <dholth@fastmail.fm>
David Black                                                 <db@d1b.org>
                    <donald@stufft.io>                      <donald.stufft@gmail.com>
Dongweiming         <dongweiming@admaster.com.cn>           <ciici1234@hotmail.com>
Dustin Ingram       <di@di.codes>                           <di@users.noreply.github.com>
Endoh Takanao                                               <djmchl@gmail.com>
Erik M. Bray                                                <embray@stsci.edu>
Ee Durbin                                                   <ewdurbin@gmail.com>
Gabriel de Perthuis                                         <g2p.code@gmail.com>
Hsiaoming Yang                                              <lepture@me.com>
Hugo van Kemenade   <hugovk@users.noreply.github.com>   Hugo <hugovk@users.noreply.github.com>
Hugo van Kemenade   <hugovk@users.noreply.github.com>   hugovk <hugovk@users.noreply.github.com>
Igor Kuzmitshov     <kuzmiigo@gmail.com>                    <igor@qubit.com>
Ilya Baryshev                                               <baryshev@gmail.com>
Jakub Stasiak                                               <kuba.stasiak@gmail.com>
Jean Abou Samra                                             <jean@abou-samra.fr>
John-Scott Atlakson                                         <john.scott.atlakson@gmail.com>
Jorge Niedbalski                                            <niedbalski@gmail.com>
                    <niedbalski@gmail.com>                  <jorge@nimbic.com>
Ludovic Gasc        <gmludo@gmail.com>                      <git@gmludo.eu>
Markus Hametner                                             <fin+github@xbhd.org>
Masklinn                                                    <bitbucket.org@masklinn.net>
Matthew Iversen     <teh.ivo@gmail.com>                     <teh.ivo@gmail.com>
Ofek Lev                                                    <ofekmeister@gmail.com>
Pi Delport                                                  <pjdelport@gmail.com>
                    <pnasrat@gmail.com>                     <pnasrat@googlemail.com>
Pradyun Gedam       <pradyunsg@gmail.com>                   <pradyunsg@users.noreply.github.com>
Pradyun Gedam       <pradyunsg@gmail.com>
Preston Holmes                                              <preston@ptone.com>
Przemek Wrzos                                               <hetmankp@none>
                    <hodgestar@gmail.com>                   <hodgestar+hg@gmail.com>
Romuald Brunet      <romuald@chivil.com>                    <romuald@gandi.net>
Thomas Johansson    <devnull@localhost>            prencher <devnull@localhost>
Thomas Kluyver      <thomas@kluyver.me.uk>                  <takowl@gmail.com>
Stephan Erb         <github@stephanerb.eu>                  <stephan@dev.static-void.de>
Victor Stinner      <victor.stinner@gmail.com>              <vstinner@redhat.com>
Yoval P                                                     <yoval@gmx.com>
Zhiping Deng                                                <kofreestyler@gmail.com>
dkjsone              <221672629+dkjsone@users.noreply.github.com>   user <empty>
Meet Vasita          <meetvasita85@gmail.com>               meet-vasita <meetvasita85@gmail.com>
Meet Vasita          <meetvasita85@gmail.com>               Meet_Vasita <84974738+meet-vasita@users.noreply.github.com>


================================================
FILE: .pre-commit-config.yaml
================================================
exclude: 'src/pip/_vendor/'

repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
  rev: v6.0.0
  hooks:
  - id: check-builtin-literals
  - id: check-added-large-files
  - id: check-case-conflict
  - id: check-toml
  - id: check-yaml
  - id: debug-statements
  - id: end-of-file-fixer
    exclude: WHEEL
  - id: forbid-new-submodules
  - id: trailing-whitespace
    exclude: .patch

- repo: https://github.com/psf/black-pre-commit-mirror
  rev: 25.12.0
  hooks:
  - id: black

- repo: https://github.com/astral-sh/ruff-pre-commit
  rev: v0.14.10
  hooks:
    - id: ruff-check
      args: [--fix]

- repo: https://github.com/pre-commit/mirrors-mypy
  rev: v1.19.1
  hooks:
  - id: mypy
    exclude: tests/data
    args:
      - "--pretty"
      - "--show-error-codes"
      # Since this is only a partial mypy run, we can get false-positives
      # for unused ignores.
      - "--no-warn-unused-ignores"
    additional_dependencies: [
        'keyring==24.2.0',
        'nox==2024.03.02',
        'pytest',
        'types-docutils==0.20.0.3',
        'types-setuptools==68.2.0.0',
        'types-freezegun==1.1.10',
        'types-pyyaml==6.0.12.12',
        'typing-extensions',
    ]

- repo: https://github.com/pre-commit/pygrep-hooks
  rev: v1.10.0
  hooks:
  - id: python-no-log-warn
  - id: python-no-eval
  - id: rst-backticks
    files: .*\.rst$
    types: [file]
    exclude: NEWS.rst  # The errors flagged in NEWS.rst are old.

- repo: https://github.com/codespell-project/codespell
  rev: v2.4.1
  hooks:
    - id: codespell
      exclude: AUTHORS.txt|tests/data
      args: ["--ignore-words", tools/codespell-ignore.txt]

- repo: local
  hooks:
  - id: news-fragment-filenames
    name: NEWS fragment
    language: fail
    entry: NEWS fragment files must be named *.(process|removal|feature|bugfix|vendor|doc|trivial).rst
    exclude: ^news/(.gitignore|.*\.(process|removal|feature|bugfix|vendor|doc|trivial).rst)
    files: ^news/

ci:
  autofix_prs: false
  autoupdate_commit_msg: 'pre-commit autoupdate'
  autoupdate_schedule: monthly


================================================
FILE: .readthedocs-custom-redirects.yml
================================================
# This file is read by tools/update-rtd-redirects.py.
# It is related to Read the Docs, but is not a file processed by the platform.

/dev/news-entry-failure: >-
  https://pip.pypa.io/en/latest/development/contributing/#news-entries
/errors/resolution-impossible: >-
  https://pip.pypa.io/en/stable/topics/dependency-resolution/#dealing-with-dependency-conflicts
/surveys/backtracking: >-
  https://forms.gle/LkZP95S4CfqBAU1N6
/warnings/backtracking: >-
  https://pip.pypa.io/en/stable/topics/dependency-resolution/#possible-ways-to-reduce-backtracking
/warnings/enable-long-paths: >-
  https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=cmd#enable-long-paths-in-windows-10-version-1607-and-later
/warnings/venv: >-
  https://docs.python.org/3/tutorial/venv.html
/reference/build-system/pyproject-toml: >-
  https://pip.pypa.io/en/stable/reference/build-system/
/reference/build-system/setup-py: >-
  https://pip.pypa.io/en/stable/reference/build-system/


================================================
FILE: .readthedocs.yml
================================================
version: 2

build:
  os: ubuntu-22.04
  tools:
    python: "3.11"
  jobs:
    install:
      - pip install .
      - pip install --group docs

sphinx:
  builder: dirhtml
  configuration: docs/html/conf.py


================================================
FILE: AI_POLICY.md
================================================
# Generative AI / LLM Policy

We appreciate that we can't realistically police how you author your pull requests, which includes whether you employ large-language model (LLM)-based development tools.
So, we don't.

However, due to both legal and human reasons, we have to establish boundaries.

## Overview

- We take the responsibility for this project very seriously and we expect you to take your responsibility for your contributions seriously, too.
  This used to be a given, but it changed now that a pull request is just one prompt away.

- Every contribution has to be backed by a human who unequivocally owns the copyright for all changes.
  No LLM bots in `Co-authored-by:`s.

- Repeated slop contributions are unacceptable, and will be closed without review.
  We reserve the right to exclude contributors who continue to submit such material.

- Absolutely no unsupervised agentic tools like OpenClaw.

---

By submitting a pull request, you certify that:

- You are the author of the contribution or have the legal right to submit it.
- You either hold the copyright to the changes or have explicit legal authorization to contribute them under this project's license.
- You understand the code.
- You accept full responsibility for it.


## Legal

There is ongoing legal uncertainty regarding the copyright status of LLM-generated works and their provenance.
Because of this, allowing contributions by LLMs has unpredictable consequences for the copyright status of this project – even when leaving aside possible copyright violations due to plagiarism.


## Human

As the makers of software that is used by millions of people worldwide and with a reputation for high-quality maintenance, we take our responsibility to our users very seriously.
No matter what LLM vendors or boosters on LinkedIn tell you, we have to manually review every change before merging, because it's our responsibility to keep the project stable.

Please understand that by opening low-quality pull requests you're not helping anyone.
Worse, you're [poisoning the open source ecosystem](https://lwn.net/Articles/1058266/) that was precarious even before the arrival of LLM tools.
Having to wade through plausible-looking-but-low-quality pull requests and trying to determine which ones are legit is extremely demoralizing and has already burned out many good maintainers.

In particular, note that [code reviews are a social process](https://blog.glyph.im/2026/03/what-is-code-review-for.html) and are *not* intended
to catch bugs in PRs created by an LLM. If you submit a pull request, we expect you to engage with reviewers and learn from the review, not
simply update the prompt that generated the PR and regenerate the code.

Put bluntly, we have no time or interest to become part of your vibe coding loop where you drop LLM slop at our door, we spend time and energy to review it, and you just feed it back into the LLM for another iteration.

This dynamic is especially pernicious because it poisons the well for mentoring new contributors which we are committed to.


## Summary

In practice, this means:

- Pull requests that have an LLM product listed as co-author can't be merged and will be closed without further discussion.
  We cannot risk the copyright status of this project.

  If you used LLM tools during development, you may still submit – but you must remove any LLM co-author tags and take full ownership of every line.

- By submitting a pull request, you take full technical and legal responsibility for the contents of the pull request and promise that you hold the copyright for the changes submitted.

  "An LLM wrote it" is *not* an acceptable response to questions or critique.
  If you cannot explain and defend the changes you submit, do not submit them and open a high-quality bug report or feature request instead.

- Accounts that exercise bot-like behavior – like automated mass pull requests – will be permanently banned, whether they belong to a human or not.

- LLM-generated comments must be concise and accurate, and you must be prepared to stand by them.
  Do not post summaries unless you are certain that they add value to the discussion.
  Remember that all LLM output *looks* plausible.
  When using these tools, it's your responsibility to ensure that the output is correct, and useful.

- Remember that LLM generated content is generally easier for you to produce, but *harder* for others to read, review or interpret.
  Prioritising your time over that of others is contrary to the project's code of conduct.
  Verbose, repetitive, or off topic comments may be marked as spam.

## Thanks

This policy was based on the policy of the `attrs` project. Many thanks to them for developing it.


================================================
FILE: AUTHORS.txt
================================================
@Switch01
A_Rog
Aakanksha Agrawal
Aarni Koskela
Abhinav Sagar
ABHYUDAY PRATAP SINGH
abs51295
AceGentile
Adam Chainz
Adam Tse
Adam Turner
Adam Wentz
admin
Adolfo Ochagavía
Adrien Morison
Agus
ahayrapetyan
Ahilya
AinsworthK
Akash Srivastava
Alan Yee
Albert Tugushev
Albert-Guan
albertg
Alberto Sottile
Aleks Bunin
Ales Erjavec
Alessandro Molina
Alethea Flowers
Alex Gaynor
Alex Grönholm
Alex Hedges
Alex Loosley
Alex Morega
Alex Stachowiak
Alexander Regueiro
Alexander Shtyrov
Alexandre Conrad
Alexey Popravka
Aleš Erjavec
Alli
Aman
Ami Fischman
Ananya Maiti
Anatoly Techtonik
Anders Kaseorg
Andre Aguiar
Andreas Lutro
Andrei Geacar
Andrew Gaul
Andrew Shymanel
Andrey Bienkowski
Andrey Bulgakov
Andrés Delfino
Andy Freeland
Andy Kluger
Ani Hayrapetyan
Aniruddha Basak
Anish Tambe
Anrs Hu
Anthony Sottile
Antoine Lambert
Antoine Musso
Anton Ovchinnikov
Anton Patrushev
Anton Zelenov
Antonio Alvarado Hernandez
Antony Lee
Antti Kaihola
Anubhav Patel
Anudit Nagar
Anuj Godase
AQNOUCH Mohammed
AraHaan
arena
arenasys
Arindam Choudhury
Armin Ronacher
Arnon Yaari
Artem
Arun Babu Neelicattu
Ashley Manton
Ashwin Ramaswami
atse
Atsushi Odagiri
Avinash Karhana
Avner Cohen
Awit (Ah-Wit) Ghirmai
Baptiste Mispelon
Barney Gale
barneygale
Bartek Ogryczak
Bastian Venthur
Ben Bodenmiller
Ben Darnell
Ben Hoyt
Ben Mares
Ben Rosser
Bence Nagy
Benjamin Peterson
Benjamin VanEvery
Benoit Pierre
Berker Peksag
Bernard
Bernard Tyers
Bernardo B. Marques
Bernhard M. Wiedemann
Bertil Hatt
Bhavam Vidyarthi
Blazej Michalik
Bogdan Opanchuk
BorisZZZ
Brad Erickson
Bradley Ayers
Bradley Reynolds
Branch Vincent
Brandon L. Reiss
Brandt Bucher
Brannon Dorsey
Brett Randall
Brett Rosen
Brian Cristante
Brian Rosner
briantracy
BrownTruck
Bruno Oliveira
Bruno Renié
Bruno S
Bstrdsmkr
Buck Golemon
burrows
Bussonnier Matthias
bwoodsend
c22
Caleb Brown
Caleb Martinez
Calvin Smith
Carl Meyer
Carlos Liam
Carol Willing
Carter Thayer
Cass
Chandrasekhar Atina
Charlie Marsh
charwick
Chih-Hsuan Yen
Chris Brinker
Chris Hunt
Chris Jerdonek
Chris Kuehl
Chris Markiewicz
Chris McDonough
Chris Pawley
Chris Pryer
Chris Wolfe
Christian Clauss
Christian Heimes
Christian Oudard
Christoph Reiter
Christopher Hunt
Christopher Snyder
chrysle
cjc7373
Clark Boylan
Claudio Jolowicz
Clay McClure
Cody
Cody Soyland
Colin Watson
Collin Anderson
Connor Osborn
Cooper Lees
Cooper Ry Lees
Cory Benfield
Cory Wright
Craig Kerstiens
Cristian Sorinel
Cristina
Cristina Muñoz
ctg123
Curtis Doty
cytolentino
Daan De Meyer
Dale
Damian
Damian Quiroga
Damian Shaw
Dan Black
Dan Savilonis
Dan Sully
Dane Hillard
daniel
Daniel Collins
Daniel Hahler
Daniel Hollas
Daniel Holth
Daniel Jost
Daniel Katz
Daniel Shaulov
Daniele Esposti
Daniele Nicolodi
Daniele Procida
Daniil Konovalenko
Danny Hermes
Danny McClanahan
Darren Kavanagh
Dav Clark
Dave Abrahams
Dave Jones
David Aguilar
David Black
David Bordeynik
David Caro
David D Lowe
David Evans
David Hewitt
David Linke
David Poggi
David Poznik
David Pursehouse
David Runge
David Tucker
David Wales
Davidovich
ddelange
Deepak Sharma
Deepyaman Datta
Denis Roussel (ACSONE)
Denise Yu
dependabot[bot]
derwolfe
Desetude
developer
Devesh Kumar
Devesh Kumar Singh
devsagul
Diego Caraballo
Diego Ramirez
DiegoCaraballo
Dimitri Merejkowsky
Dimitri Papadopoulos
Dimitri Papadopoulos Orfanos
Dirk Stolle
dkjsone
Dmitry Gladkov
Dmitry Volodin
Domen Kožar
Dominic Davis-Foster
Donald Stufft
Dongweiming
doron zarhi
Dos Moonen
Douglas Thor
DrFeathers
Dustin Ingram
Dustin Rodrigues
Dwayne Bailey
Ed Morley
Edgar Ramírez
Edgar Ramírez Mondragón
Ee Durbin
Efflam Lemaillet
efflamlemaillet
Eitan Adler
ekristina
elainechan
Eli Schwartz
Elisha Hollander
Ellen Marie Dash
Emil Burzo
Emil Styrke
Emmanuel Arias
Endoh Takanao
enoch
Erdinc Mutlu
Eric Cousineau
Eric Gillingham
Eric Hanchrow
Eric Hopper
Erik M. Bray
Erik Rose
Erwin Janssen
Eugene Vereshchagin
everdimension
Federico
Felipe Peter
Felix Yan
fiber-space
Filip Kokosiński
Filipe Laíns
Finn Womack
finnagin
Flavio Amurrio
Florian Briand
Florian Rathgeber
Francesco
Francesco Montesano
Fredrik Orderud
Fredrik Roubert
Frost Ming
Gabriel Curio
Gabriel de Perthuis
Garry Polley
gavin
gdanielson
Gene Wood
Geoffrey Sneddon
George Margaritis
George Song
Georgi Valkov
Georgy Pchelkin
ghost
Giftlin Rajaiah
gizmoguy1
gkdoc
Godefroid Chapelle
Gopinath M
GOTO Hayato
gousaiyang
gpiks
Greg Roodt
Greg Ward
Guido Diepen
Guilherme Espada
Guillaume Seguin
gutsytechster
Guy Rozendorn
Guy Tuval
gzpan123
Hanjun Kim
Hari Charan
Harsh Vardhan
Harsha Sai
harupy
Harutaka Kawamura
Hasan-8326
hauntsaninja
Henrich Hartzer
Henry Schreiner
Herbert Pfennig
Holly Stotelmyer
Honnix
Hsiaoming Yang
Hugo Lopes Tavares
Hugo van Kemenade
Hugues Bruant
Hynek Schlawack
iamsrp-deshaw
Ian Bicking
Ian Cordasco
Ian Lee
Ian Stapleton Cordasco
Ian Wienand
Igor Kuzmitshov
Igor Sobreira
Ikko Ashimine
Ilan Schnell
Illia Volochii
Ilya Abdolmanafi
Ilya Baryshev
Inada Naoki
Ionel Cristian Mărieș
Ionel Maries Cristian
Itamar Turner-Trauring
iTrooz
Ivan Pozdeev
J. Nick Koston
Jacob Kim
Jacob Walls
Jaime Sanz
Jake Lishman
jakirkham
Jakub Kuczys
Jakub Stasiak
Jakub Vysoky
Jakub Wilk
James
James Cleveland
James Curtin
James Firth
James Gerity
James Polley
Jan Pokorný
Jannis Leidel
Jarek Potiuk
jarondl
Jason Curtis
Jason R. Coombs
JasonMo
JasonMo1
Jay Graves
Jean Abou Samra
Jean-Christophe Fillion-Robin
Jeff Barber
Jeff Dairiki
Jeff Widman
Jelmer Vernooij
jenix21
Jeremy Fleischman
Jeremy Stanley
Jeremy Zafran
Jesse Rittner
Jiashuo Li
Jim Fisher
Jim Garrison
Jinzhe Zeng
Jiun Bae
Jivan Amara
Joa
Joe Bylund
Joe Michelini
Johannes Altmanninger
John Paton
John Sirois
John T. Wodder II
John-Scott Atlakson
johnthagen
Jon Banafato
Jon Dufresne
Jon Parise
Jonas Nockert
Jonathan Herbert
Joonatan Partanen
Joost Molenaar
Jorge Niedbalski
Joseph Bylund
Joseph Long
Josh Bronson
Josh Cannon
Josh Hansen
Josh Schneier
Joshua
JoshuaPerdue
Jost Migenda
Juan Luis Cano Rodríguez
Juanjo Bazán
Judah Rand
Julian Berman
Julian Gethmann
Julien Demoor
Julien Stephan
July Tikhonov
Jussi Kukkonen
Justin van Heek
jwg4
Jyrki Pulliainen
Kai Chen
Kai Mueller
Kamal Bin Mustafa
Karolina Surma
kasium
kaustav haldar
Kaz Nishimura
keanemind
Keith Maxwell
Kelsey Hightower
Kenneth Belitzky
Kenneth Reitz
Kevin Burke
Kevin Carter
Kevin Frommelt
Kevin R Patterson
Kexuan Sun
Kit Randel
Klaas van Schelven
KOLANICH
konstin
kpinc
Krishan Bhasin
Krishna Oza
Kumar McMillan
Kuntal Majumder
Kurt McKee
Kyle Persohn
lakshmanaram
Laszlo Kiss-Kollar
Laurent Bristiel
Laurent LAPORTE
Laurie O
Laurie Opperman
layday
Leon Sasson
Lev Givon
Lincoln de Sousa
Lipis
lorddavidiii
Loren Carvalho
Lucas Cimon
Ludovic Gasc
Luis Medel
Lukas Geiger
Lukas Juhrich
Luke Macken
Luo Jiebin
luojiebin
luz.paz
László Kiss Kollár
M00nL1ght
MajorTanya
Malcolm Smith
Marc Abramowitz
Marc Tamlyn
Marcus Smith
Mariatta
Mark Kohler
Mark McLoughlin
Mark Williams
Markus Hametner
Martey Dodoo
Martin Fischer
Martin Häcker
Martin Pavlasek
Masaki
Masklinn
Matej Stuchlik
Mateusz Sokół
Mathew Jennings
Mathieu Bridon
Mathieu Kniewallner
Matt Bacchi
Matt Good
Matt Maker
Matt Robenolt
Matt Wozniski
matthew
Matthew Einhorn
Matthew Feickert
Matthew Gilliard
Matthew Hughes
Matthew Iversen
Matthew Treinish
Matthew Trumbell
Matthew Willson
Matthias Bussonnier
mattip
Maurits van Rees
Max W Chase
Maxim Kurnikov
Maxime Rouyrre
mayeut
mbaluna
Md Sujauddin Sekh
mdebi
Meet Vasita
memoselyk
meowmeowcat
Michael
Michael Aquilina
Michael E. Karpeles
Michael Klich
Michael Mintz
Michael Williamson
michaelpacer
Michał Górny
Mickaël Schoentgen
Miguel Araujo Perez
Mihir Singh
Mike
Mike Hendricks
Min RK
MinRK
Miro Hrončok
Monica Baluna
montefra
Monty Taylor
morotti
mrKazzila
Muha Ajjan
MUTHUSRIHEMADHARSHINI S A
Nadav Wexler
Nahuel Ambrosini
Nate Coraor
Nate Prewitt
Nathan Houghton
Nathaniel J. Smith
Nehal J Wani
Neil Botelho
Nguyễn Gia Phong
Nicholas Serra
Nick Coghlan
Nick Stenning
Nick Timkovich
Nicolas Bock
Nicole Harris
Nikhil Benesch
Nikhil Ladha
Nikita Chepanov
Nikolay Korolev
Nipunn Koorapati
Nitesh Sharma
Niyas Sait
Noah
Noah Gorny
Nothing-991
Nowell Strite
NtaleGrey
nucccc
nvdv
OBITORASU
Ofek Lev
ofrinevo
Oleg Burnaev
Oliver Freund
Oliver Jeeves
Oliver Mannion
Oliver Tonnhofer
Olivier Girardot
Olivier Grisel
Ollie Rutherfurd
OMOTO Kenji
Omry Yadan
onlinejudge95
Oren Held
Oscar Benjamin
oxygen dioxide
Oz N Tiram
Pachwenko
Paresh Joshi
Patrick Dubroy
Patrick Jenkins
Patrick Lawson
patricktokeeffe
Patrik Kopkan
Paul Ganssle
Paul Kehrer
Paul Moore
Paul Nasrat
Paul Oswald
Paul van der Linden
Paulus Schoutsen
Pavel Safronov
Pavithra Eswaramoorthy
Pawel Jasinski
Paweł Szramowski
Pekka Klärck
Peter Gessler
Peter Lisák
Peter Shen
Peter Waller
Petr Viktorin
petr-tik
Phaneendra Chiruvella
Phil Elson
Phil Freo
Phil Pennock
Phil Whelan
Philip Jägenstedt
Philip Molloy
Philippe Ombredanne
Pi Delport
Pierre-Yves Rofes
Pieter Degroote
pip
Prabakaran Kumaresshan
Prabhjyotsing Surjit Singh Sodhi
Prabhu Marappan
Pradyun Gedam
Prashant Sharma
Pratik Mallya
pre-commit-ci[bot]
Preet Thakkar
Preston Holmes
Przemek Wrzos
Pulkit Goyal
q0w
Qiangning Hong
Qiming Xu
qraqras
Quentin Lee
Quentin Pradet
R. David Murray
Rafael Caricio
Ralf Schmitt
Ran Benita
Randy Döring
Razzi Abuissa
rdb
Reece Dunham
Remi Rampin
Rene Dudfield
Riccardo Magliocchetti
Riccardo Schirone
Richard Jones
Richard Si
Ricky Ng-Adam
Rishi
rmorotti
RobberPhex
Robert Collins
Robert McGibbon
Robert Pollak
Robert T. McGibbon
robin elisha robinson
Rodney, Tiara
Roey Berman
Rohan Jain
Roman Bogorodskiy
Roman Donchenko
Romuald Brunet
ronaudinho
Ronny Pfannschmidt
Rory McCann
Ross Brattain
Roy Wellington Ⅳ
Ruairidh MacLeod
Russell Keith-Magee
Ryan Shepherd
Ryan Wooden
ryneeverett
Ryuma Asai
S. Guliaev
Sachi King
Salvatore Rinchiera
sandeepkiran-js
Sander Van Balen
Savio Jomton
schlamar
Scott Kitterman
Sean
seanj
Sebastian Jordan
Sebastian Schaetz
Segev Finer
SeongSoo Cho
Sepehr Rasouli
sepehrrasooli
Sergey Vasilyev
Seth Michael Larson
Seth Woodworth
Shahar Epstein
Shantanu
shenxianpeng
shireenrao
Shivansh-007
Shixian Sheng
Shlomi Fish
Shovan Maity
Shubham Nagure
Simeon Visser
Simon Cross
Simon Pichugin
sinoroc
sinscary
snook92
socketubs
Sorin Sbarnea
Srinivas Nyayapati
Srishti Hegde
Stavros Korokithakis
Stefan Scherfke
Stefano Rivera
Stephan Erb
Stephane Chazelas
Stephen Payne
Stephen Rosen
stepshal
Steve (Gadget) Barnes
Steve Barnes
Steve Dower
Steve Kowalik
Steven Myint
Steven Silvester
stonebig
studioj
Stéphane Bidoul
Stéphane Bidoul (ACSONE)
Stéphane Klein
Sumana Harihareswara
Surbhi Sharma
Sviatoslav Sydorenko
Sviatoslav Sydorenko (Святослав Сидоренко)
Swat009
Sylvain
Takayuki SHIMIZUKAWA
Taneli Hukkinen
tbeswick
Terrance
Thiago
Thijs Triemstra
Thomas Fenzl
Thomas Grainger
Thomas Guettler
Thomas Johansson
Thomas Kluyver
Thomas Smith
Thomas VINCENT
Tim D. Smith
Tim Gates
Tim Harder
Tim Heap
tim smith
tinruufu
Tobias Hermann
Tom Forbes
Tom Freudenheim
Tom V
Tomas Hrnciar
Tomas Orsava
Tomer Chachamu
Tommi Enenkel | AnB
Tomáš Hrnčiar
Tony Beswick
Tony Narlock
Tony Zhaocheng Tan
TonyBeswick
toonarmycaptain
Toshio Kuratomi
toxinu
Travis Swicegood
Tushar Sadhwani
Tzu-ping Chung
Valentin Haenel
Victor Stinner
victorvpaulo
Vikram - Google
Viktor Szépe
Ville Skyttä
Vinay Sajip
Vincent Philippon
Vinicyus Macedo
Vipul Kumar
Vitaly Babiy
Vladimir Fokow
Vladimir Rutsky
W. Trevor King
Weida Hong
Wil Tan
Wilfred Hughes
William Edwards
William ML Leslie
William T Olson
William Woodruff
Wilson Mo
wim glenn
Winson Luk
Wolfgang Maier
Wu Zhenyu
XAMES3
Xavier Fernandez
Xianpeng Shen
xoviat
xtreak
YAMAMOTO Takashi
Yash
Yashraj
Yen Chi Hsuan
Yeray Diaz Diaz
Yoval P
Yu Jian
Yuan Jing Vincent Yan
Yuki Kobayashi
Yusuke Hayashi
zackzack38
Zearin
Zhiping Deng
ziebam
Zvezdan Petkovic
Łukasz Langa
Роман Донченко
Семён Марьясин


================================================
FILE: LICENSE.txt
================================================
Copyright (c) 2008-present The pip developers (see AUTHORS.txt file)

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


================================================
FILE: NEWS.rst
================================================
.. note

    You should *NOT* be adding new change log entries to this file, this
    file is managed by towncrier. You *may* edit previous change logs to
    fix problems like typo corrections or such.

    To add a new change log entry, please see
        https://pip.pypa.io/en/latest/development/contributing/#news-entries

.. towncrier release notes start

26.0.1 (2026-02-04)
===================

Bug Fixes
---------

- Fix ``--pre`` not being respected from the command line when a requirement file
  includes an option e.g. ``-extra-index-url``. (`#13788 <https://github.com/pypa/pip/issues/13788>`_)

26.0 (2026-01-30)
=================

Deprecations and Removals
-------------------------

- Remove support for non-bare project names in egg fragments. Affected users should use
  the `Direct URL requirement syntax <https://packaging.python.org/en/latest/specifications/version-specifiers/#direct-references>`_. (`#13157 <https://github.com/pypa/pip/issues/13157>`_)

Features
--------

- Display pip's command-line help in colour, if possible. (`#12134 <https://github.com/pypa/pip/issues/12134>`_)
- Support installing dependencies declared with inline script metadata
  (:pep:`723`) with ``--requirements-from-script``. (`#12891 <https://github.com/pypa/pip/issues/12891>`_)
- Add ``--all-releases`` and ``--only-final`` options to control pre-release
  and final release selection during package installation. (`#13221 <https://github.com/pypa/pip/issues/13221>`_)
- Add ``--uploaded-prior-to`` option to only consider packages uploaded prior to
  a given datetime when the ``upload-time`` field is available from a remote index. (`#13625 <https://github.com/pypa/pip/issues/13625>`_)
- Add ``--use-feature inprocess-build-deps`` to request that build dependencies are installed
  within the same pip install process. This new mechanism is faster, supports ``--no-clean``
  and ``--no-cache-dir`` reliably, and supports prompting for authentication.

  Enabling this feature will also enable ``--use-feature build-constraints``. This feature will
  become the default in a future pip version. (`#9081 <https://github.com/pypa/pip/issues/9081>`_)
- ``pip cache purge`` and ``pip cache remove`` now clean up empty directories
  and legacy files left by older pip versions. (`#9058 <https://github.com/pypa/pip/issues/9058>`_)

Bug Fixes
---------

- Fix selecting pre-release versions when only pre-releases match.
  For example, ``package>1.0`` with versions ``1.0, 2.0rc1`` now installs
  ``2.0rc1`` instead of failing. (`#13746 <https://github.com/pypa/pip/issues/13746>`_)
- Revisions in version control URLs now must be percent-encoded.
  For example, use ``git+https://example.com/repo.git@issue%231`` to specify the branch ``issue#1``.
  If you previously used a branch name containing a ``%`` character in a version control URL, you now need to replace it with ``%25`` to ensure correct percent-encoding. (`#13407 <https://github.com/pypa/pip/issues/13407>`_)
- Preserve original casing when a path is displayed. (`#6823 <https://github.com/pypa/pip/issues/6823>`_)
- Fix bash completion when the ``$IFS`` variable has been modified from its default. (`#13555 <https://github.com/pypa/pip/issues/13555>`_)
- Precompute Python requirements on each candidate, reducing time of long resolutions. (`#13656 <https://github.com/pypa/pip/issues/13656>`_)
- Skip redundant work converting version objects to strings when using the
  ``importlib.metadata`` backend. (`#13660 <https://github.com/pypa/pip/issues/13660>`_)
- Fix ``pip index versions`` to honor only-binary/no-binary options. (`#13682 <https://github.com/pypa/pip/issues/13682>`_)
- Fix fallthrough logic for options, allowing overriding global options with
  defaults from user config. (`#13703 <https://github.com/pypa/pip/issues/13703>`_)
- Use a path-segment prefix comparison, not char-by-char. (`#13777 <https://github.com/pypa/pip/issues/13777>`_)

Vendored Libraries
------------------

- Upgrade CacheControl to 0.14.4
- Upgrade certifi to 2026.1.4
- Upgrade idna to 3.11
- Upgrade packaging to 26.0
- Upgrade platformdirs to 4.5.1

25.3 (2025-10-24)
=================

Deprecations and Removals
-------------------------

- Remove support for the legacy ``setup.py develop`` editable method in setuptools
  editable installs; setuptools >= 64 is now required. (`#11457 <https://github.com/pypa/pip/issues/11457>`_)
- Remove the deprecated ``--global-option`` and ``--build-option``.
  ``--config-setting`` is now the only way to pass options to the build backend. (`#11859 <https://github.com/pypa/pip/issues/11859>`_)
- Deprecate the ``PIP_CONSTRAINT`` environment variable for specifying build
  constraints.

  Use the ``--build-constraint`` option or the ``PIP_BUILD_CONSTRAINT`` environment variable
  instead. When build constraints are used, ``PIP_CONSTRAINT`` no longer affects isolated build
  environments. To enable this behavior without specifying any build constraints, use
  ``--use-feature=build-constraint``. (`#13534 <https://github.com/pypa/pip/issues/13534>`_)
- Remove support for non-standard legacy wheel filenames. (`#13581 <https://github.com/pypa/pip/issues/13581>`_)
- Remove support for the deprecated ``setup.py bdist_wheel`` mechanism. Consequently,
  ``--use-pep517`` is now always on, and ``--no-use-pep517`` has been removed. (`#6334 <https://github.com/pypa/pip/issues/6334>`_)

Features
--------

- When :pep:`658` metadata is available, full distribution files are no longer downloaded when using ``pip lock`` or ``pip install --dry-run``. (`#12603 <https://github.com/pypa/pip/issues/12603>`_)
- Add support for installing an editable requirement written as a Direct URL (``PackageName @ URL``). (`#13495 <https://github.com/pypa/pip/issues/13495>`_)
- Add support for build constraints via the ``--build-constraint`` option. This
  allows constraining the versions of packages used during the build process
  (e.g., setuptools) without affecting the final installation. (`#13534 <https://github.com/pypa/pip/issues/13534>`_)
- On ``ResolutionImpossible`` errors, include a note about causes with no candidates. (`#13588 <https://github.com/pypa/pip/issues/13588>`_)
- Building pip itself from source now uses flit-core instead of setuptools.
  This does not affect how pip installs or builds packages you use. (`#13473 <https://github.com/pypa/pip/issues/13473>`_)

Bug Fixes
---------

- Handle malformed ``Version`` metadata entries and
  show a sensible error message instead of crashing. (`#13443 <https://github.com/pypa/pip/issues/13443>`_)
- Permit spaces between a filepath and extras in an install requirement. (`#13523 <https://github.com/pypa/pip/issues/13523>`_)
- Ensure the self-check files in the cache have the same permissions as the rest of the cache. (`#13528 <https://github.com/pypa/pip/issues/13528>`_)
- Avoid concurrency issues and improve performance when caching locally built wheels,
  especially when the temporary build directory is on a different filesystem than the cache.
  The wheel directory passed to the build backend is now a temporary subdirectory inside
  the cache directory. (`#13540 <https://github.com/pypa/pip/issues/13540>`_)
- Include relevant user-supplied constraints in logs when reporting dependency conflicts. (`#13545 <https://github.com/pypa/pip/issues/13545>`_)
- Fix a regression in configuration parsing that was turning a single value
  into a list and thus leading to a validation error. (`#13548 <https://github.com/pypa/pip/issues/13548>`_)
- For Python versions that do not support :pep:`706`, pip will now raise an installation error for a
  source distribution when it includes a symlink that points outside the source distribution archive. (`#13550 <https://github.com/pypa/pip/issues/13550>`_)
- Prevent ``--user`` installs if ``site.ENABLE_USER_SITE`` is set to ``False``. (`#8794 <https://github.com/pypa/pip/issues/8794>`_)


Vendored Libraries
------------------

- Upgrade certifi to 2025.10.5
- Upgrade msgpack to 1.1.2
- Upgrade platformdirs to 4.5.0
- Upgrade requests to 2.32.5
- Upgrade resolvelib to 1.2.1
- Upgrade rich to 14.2.0
- Upgrade tomli to 2.3.0
- Upgrade truststore to 0.10.4

25.2 (2025-07-30)
=================

Features
--------

- Declare support for Python 3.14 (`#13506 <https://github.com/pypa/pip/issues/13506>`_)
- Automatic download resumption and retrying is enabled by default. (`#13464 <https://github.com/pypa/pip/issues/13464>`_)
- Requires-Python error message displays version clauses in numerical order. (`#13367 <https://github.com/pypa/pip/issues/13367>`_)
- Minor performance improvement getting the order to install a very large number of interdependent packages. (`#13424 <https://github.com/pypa/pip/issues/13424>`_)
- Show time taken instead of ``eta 0:00:00`` at download completion. (`#13483 <https://github.com/pypa/pip/issues/13483>`_)
- Speed up small CLI tools by removing ``import re`` from the console
  script executable template. (`#13165 <https://github.com/pypa/pip/issues/13165>`_)
- Remove warning when cloning from a Git reference that does not look like a commit hash. (`#12283 <https://github.com/pypa/pip/issues/12283>`_)

Bug Fixes
---------

- ``pip config debug`` now correctly separates options as set by the different files
  at the same level. (`#12099 <https://github.com/pypa/pip/issues/12099>`_)
- Ensure truststore feature remains active even when a proxy is also in use. (`#13343 <https://github.com/pypa/pip/issues/13343>`_)
- Include sub-commands in tab completion. (`#13140 <https://github.com/pypa/pip/issues/13140>`_)
- ``pip list`` with the ``json`` or ``freeze`` format enabled will no longer
  crash when encountering a package with an invalid version. (`#13345 <https://github.com/pypa/pip/issues/13345>`_)
- Provide a hint if a system error is raised involving long filenames or path segments on Windows. (`#13346 <https://github.com/pypa/pip/issues/13346>`_)
- Resumed downloads are saved to the HTTP cache like any other normal download. (`#13441 <https://github.com/pypa/pip/issues/13441>`_)
- Configured verbosity is consistently forwarded while calling Git during
  VCS operations. (`#13329 <https://github.com/pypa/pip/issues/13329>`_)
- Suppress the progress bar, when running with ``--log`` and ``--quiet``.

  Consequently, a new ``auto`` mode for ``--progress-bar`` has been added.
  ``auto`` will enable progress bars unless suppressed by ``--quiet``,
  while ``on`` will always enable progress bars. (`#10915 <https://github.com/pypa/pip/issues/10915>`_)
- Fix normalization of local URLs with non-``file`` schemes. (`#13509 <https://github.com/pypa/pip/issues/13509>`_)
- Fix normalization of local file URLs on Windows in newer Python versions. (`#13510 <https://github.com/pypa/pip/issues/13510>`_)
- Fix remaining test failures in Python 3.14 by adjusting ``path_to_url`` and similar functions. (`#13423 <https://github.com/pypa/pip/issues/13423>`_)
- Fix missing ``network`` test markings, making the suite pass in offline
  environments again. (`#13378 <https://github.com/pypa/pip/issues/13378>`_)

Vendored Libraries
------------------

- Upgrade CacheControl to 0.14.3
- Upgrade certifi to 2025.7.14
- Upgrade distlib to 0.4.0
- Upgrade msgpack to 1.1.1
- Upgrade platformdirs to 4.3.8
- Upgrade pygments to 2.19.2
- Upgrade requests to 2.32.4
- Upgrade resolvelib to 1.2.0
- Upgrade rich to 14.1.0
- Remove vendored typing-extensions.

Process
-------

- pip's own licensing metadata now follows :pep:`639`.
  In addition, the licenses of pip's vendored dependencies are now included
  in the ``License-File`` metadata field and in the wheel.

25.1.1 (2025-05-02)
===================

Bug Fixes
---------

- Fix ``req.source_dir`` AssertionError when using the legacy resolver. (`#13353 <https://github.com/pypa/pip/issues/13353>`_)
- Fix crash on Python 3.9.6 and lower when pip failed to compile a Python module
  during installation. (`#13364 <https://github.com/pypa/pip/issues/13364>`_)
- Names in dependency group includes are now normalized before lookup, which
  fixes incorrect ``Dependency group '...' not found`` errors. (`#13372 <https://github.com/pypa/pip/issues/13372>`_)

Vendored Libraries
------------------

- Fix issues with using tomllib from the stdlib if available, rather than tomli
- Upgrade dependency-groups to 1.3.1


25.1 (2025-04-26)
=================

Deprecations and Removals
-------------------------

- Drop support for Python 3.8. (`#12989 <https://github.com/pypa/pip/issues/12989>`_)
- On python 3.14+, the ``pkg_resources`` metadata backend cannot be used anymore. (`#13010 <https://github.com/pypa/pip/issues/13010>`_)
- Hide ``--no-python-version-warning`` from CLI help and documentation
  as it's useless since Python 2 support was removed. Despite being
  formerly slated for removal, the flag will remain as a no-op to
  avoid breakage. (`#13303 <https://github.com/pypa/pip/issues/13303>`_)
- A warning is emitted when the deprecated ``pkg_resources`` library is used to
  inspect and discover installed packages. This warning should only be visible to
  users who set an undocumented environment variable to disable the default
  ``importlib.metadata`` backend. (`#13318 <https://github.com/pypa/pip/issues/13318>`_)
- Deprecate the legacy ``setup.py bdist_wheel`` mechanism. To silence the warning,
  and future-proof their setup, users should enable ``--use-pep517`` or add a
  ``pyproject.toml`` file to the projects they control. (`#13319 <https://github.com/pypa/pip/issues/13319>`_)

Features
--------

- Suggest checking "pip config debug" in case of an InvalidProxyURL error. (`#12649 <https://github.com/pypa/pip/issues/12649>`_)
- Using ``--debug`` also enables verbose logging. (`#12710 <https://github.com/pypa/pip/issues/12710>`_)
- Display a transient progress bar during package installation. (`#12712 <https://github.com/pypa/pip/issues/12712>`_)
- Minor performance improvement when installing packages with a large number
  of dependencies by increasing the requirement string cache size. (`#12873 <https://github.com/pypa/pip/issues/12873>`_)
- Add a ``--group`` option which allows installation from :pep:`735` Dependency
  Groups. ``--group`` accepts arguments of the form ``group`` or
  ``path:group``, where the default path is ``pyproject.toml``, and installs
  the named Dependency Group from the provided ``pyproject.toml`` file. (`#12963 <https://github.com/pypa/pip/issues/12963>`_)
- Add support to enable resuming incomplete downloads.

  Control the number of retry attempts using the ``--resume-retries`` flag. (`#12991 <https://github.com/pypa/pip/issues/12991>`_)
- Use :pep:`753` "Well-known Project URLs in Metadata" normalization rules when
  identifying an equivalent project URL to replace a missing ``Home-Page`` field
  in ``pip show``. (`#13135 <https://github.com/pypa/pip/issues/13135>`_)
- Remove ``experimental`` warning from ``pip index versions`` command. (`#13188 <https://github.com/pypa/pip/issues/13188>`_)
- Add a structured ``--json`` output to ``pip index versions`` (`#13194 <https://github.com/pypa/pip/issues/13194>`_)
- Add a new, *experimental*, ``pip lock`` command, implementing :pep:`751`. (`#13213 <https://github.com/pypa/pip/issues/13213>`_)
- Speed up resolution by first only considering the preference of
  candidates that must be required to complete the resolution. (`#13253 <https://github.com/pypa/pip/issues/13253>`_)
- Improved heuristics for determining the order of dependency resolution. (`#13273 <https://github.com/pypa/pip/issues/13273>`_)
- Provide hint, documentation, and link to the documentation when
  resolution too deep error occurs. (`#13282 <https://github.com/pypa/pip/issues/13282>`_)
- Include traceback on failure to import ``setuptools`` when ``setup.py`` is being invoked directly. (`#13290 <https://github.com/pypa/pip/issues/13290>`_)
- Support for :pep:`738` Android wheels. (`#13299 <https://github.com/pypa/pip/issues/13299>`_)
- Display wheel build tag in ``pip list`` columns output if set. (`#5210 <https://github.com/pypa/pip/issues/5210>`_)
- Build environment dependencies are no longer compiled to bytecode during
  installation for a minor performance improvement. (`#7294 <https://github.com/pypa/pip/issues/7294>`_)

Bug Fixes
---------

- When using the ``importlib.metadata`` backend (the default on Python 3.11+),
  ``pip list`` does not show installed egg distributions more than once anymore.
  Additionally, egg distributions whose parent directory was in ``sys.path`` but
  the egg themselves were not in ``sys.path`` are not detected anymore. (`#12308 <https://github.com/pypa/pip/issues/12308>`_)
- Disable Git and SSH prompts when ``--no-input`` is passed. (`#12718 <https://github.com/pypa/pip/issues/12718>`_)
- Gracefully handle Windows registry access errors while guessing the MIME type of a file. (`#12769 <https://github.com/pypa/pip/issues/12769>`_)
- Support multiple global configuration paths returned by ``platformdirs`` on MacOS. (`#12903 <https://github.com/pypa/pip/issues/12903>`_)
- Resolvelib 1.1.0 fixes a known issue where pip would report a
  ResolutionImpossible error even though there is a valid solution.
  However, some very complex dependency resolutions that previously
  resolved may resolve slower or fail with an ResolutionTooDeep error. (`#13001 <https://github.com/pypa/pip/issues/13001>`_)
- Show the correct path to the interpreter also when it's a symlink in a venv in the pip upgrade prompt. (`#13156 <https://github.com/pypa/pip/issues/13156>`_)
- Parse wheel filenames according to `binary distribution format specification
  <https://packaging.python.org/en/latest/specifications/binary-distribution-format/#file-format>`_.
  When a filename doesn't match the spec a deprecation warning is emitted and the
  filename is parsed using the old method. (`#13229 <https://github.com/pypa/pip/issues/13229>`_)
- While resolving dependencies prefer if any of the known requirements are
  "direct", e.g. points to an explicit URL. (`#13244 <https://github.com/pypa/pip/issues/13244>`_)
- When choosing a preferred requirement for resolving dependencies
  do not consider a specifier with a * in it, e.g. "==1.*", to be a
  pinned specifier. (`#13252 <https://github.com/pypa/pip/issues/13252>`_)
- Fix a regression that causes dependencies to be checked *before* ``Requires-Python``
  project metadata is checked, leading to wasted cycles when the Python version is
  unsupported. (`#13270 <https://github.com/pypa/pip/issues/13270>`_)
- Don't require the ``wheel`` library to be installed to use ``--no-use-pep517``, any more. (`#13330 <https://github.com/pypa/pip/issues/13330>`_)
- Fix regression that suppressed errors indicating which packages were ignored
  due to incompatible ``requires-python`` metadata. (`#13333 <https://github.com/pypa/pip/issues/13333>`_)
- Fix fish shell completion when commandline contains multiple commands. (`#9727 <https://github.com/pypa/pip/issues/9727>`_)

Vendored Libraries
------------------

- Upgrade CacheControl to 0.14.2
- Upgrade certifi to 2025.1.31
- Upgrade packaging to 25.0
- Upgrade platformdirs to 4.3.7
- Upgrade pygments to 2.19.1
- Upgrade resolvelib to 1.1.0.
- Upgrade rich to 14.0.0
- Vendor tomli-w 1.2.0
- Upgrade truststore to 0.10.1
- Upgrade typing_extensions to 4.13.2

Improved Documentation
----------------------

- Added support for building only the man pages with minimal dependencies using
  the sphinx-build ``--tag man`` option. This enables distributors to generate man
  pages without requiring HTML documentation dependencies. (`#13168 <https://github.com/pypa/pip/issues/13168>`_)


25.0.1 (2025-02-09)
===================

Bug Fixes
---------

- Fix an unsupported type annotation on Python 3.10 and earlier. (`#13181 <https://github.com/pypa/pip/issues/13181>`_)
- Fix a regression where truststore would never be used while installing build dependencies. (`#13186 <https://github.com/pypa/pip/issues/13186>`_)

25.0 (2025-01-26)
=================

Deprecations and Removals
-------------------------

- Deprecate the ``no-python-version-warning`` flag as it has long done nothing
  since Python 2 support was removed in pip 21.0. (`#13154 <https://github.com/pypa/pip/issues/13154>`_)

Features
--------

- Prefer to display :pep:`639` ``License-Expression`` in ``pip show`` if metadata version is at least 2.4. (`#13112 <https://github.com/pypa/pip/issues/13112>`_)
- Support :pep:`639` ``License-Expression`` and ``License-File`` metadata fields in JSON
  output. ``pip inspect`` and ``pip install --report`` now emit
  ``license_expression`` and ``license_file`` fields in the ``metadata`` object,
  if the corresponding fields are present in the installed ``METADATA`` file. (`#13134 <https://github.com/pypa/pip/issues/13134>`_)
- Files in the network cache will inherit the read/write permissions of pip's cache
  directory (in addition to the current user retaining read/write access). This
  enables a single cache to be shared among multiple users. (`#11012 <https://github.com/pypa/pip/issues/11012>`_)
- Return the size, along with the number, of files cleared on ``pip cache purge`` and ``pip cache remove`` (`#12176 <https://github.com/pypa/pip/issues/12176>`_)
- Cache ``python-requires`` checks while filtering potential installation candidates. (`#13128 <https://github.com/pypa/pip/issues/13128>`_)
- Optimize package collection by avoiding unnecessary URL parsing and other processing. (`#13132 <https://github.com/pypa/pip/issues/13132>`_)

Bug Fixes
---------

- Reorder the encoding detection when decoding a requirements file, relying on
  UTF-8 over the locale encoding by default, matching the documented behaviour.
  (`#12771 <https://github.com/pypa/pip/issues/12771>`_)
- The pip version self check is disabled on ``EXTERNALLY-MANAGED`` environments. (`#11820 <https://github.com/pypa/pip/issues/11820>`_)
- Fix a security bug allowing a specially crafted wheel to execute code during
  installation. (`#13079 <https://github.com/pypa/pip/issues/13079>`_)
- The inclusion of ``packaging`` 24.2 changes how pre-release specifiers with ``<`` and ``>``
  behave. Including a pre-release version with these specifiers now implies
  accepting pre-releases (e.g., ``<2.0dev`` can include ``1.0rc1``). To avoid
  implying pre-releases, avoid specifying them (e.g., use ``<2.0``).
  The exception is ``!=``, which never implies pre-releases. (`#13163 <https://github.com/pypa/pip/issues/13163>`_)
- The ``--cert`` and ``--client-cert`` command-line options are now respected while
  installing build dependencies. Consequently, the private ``_PIP_STANDALONE_CERT``
  environment variable is no longer used. (`#5502 <https://github.com/pypa/pip/issues/5502>`_)
- The ``--proxy`` command-line option is now respected while installing build dependencies. (`#6018 <https://github.com/pypa/pip/issues/6018>`_)

Vendored Libraries
------------------

- Upgrade CacheControl to 0.14.1
- Upgrade idna to 3.10
- Upgrade msgpack to 1.1.0
- Upgrade packaging to 24.2
- Upgrade platformdirs to 4.3.6
- Upgrade pyproject-hooks to 1.2.0
- Upgrade rich to 13.9.4
- Upgrade tomli to 2.2.1

Improved Documentation
----------------------

- Removed section about non-existing ``--force-keyring`` flag. (`#12455 <https://github.com/pypa/pip/issues/12455>`_)

Process
-------

- Started releasing to PyPI from a GitHub Actions CI/CD workflow that implements trusted publishing and bundles :pep:`740` digital attestations.

24.3.1 (2024-10-27)
===================

Bug Fixes
---------

- Allow multiple nested inclusions of the same requirements file again. (`#13046 <https://github.com/pypa/pip/issues/13046>`_)

24.3 (2024-10-27)
=================

Deprecations and Removals
-------------------------

- Deprecate wheel filenames that are not compliant with :pep:`440`. (`#12918 <https://github.com/pypa/pip/issues/12918>`_)

Features
--------

- Detect recursively referencing requirements files and help users identify
  the source. (`#12653 <https://github.com/pypa/pip/issues/12653>`_)
- Support for :pep:`730` iOS wheels. (`#12961 <https://github.com/pypa/pip/issues/12961>`_)

Bug Fixes
---------

- Display a better error message when an already installed package has an invalid requirement. (`#12953 <https://github.com/pypa/pip/issues/12953>`_)
- Ignore ``PIP_TARGET`` and ``pip.conf`` ``global.target`` when preparing a build environment. (`#8438 <https://github.com/pypa/pip/issues/8438>`_)
- Restore support for macOS 10.12 and older (via truststore). (`#12901 <https://github.com/pypa/pip/issues/12901>`_)
- Allow installing pip in editable mode in a virtual environment on Windows. (`#12666 <https://github.com/pypa/pip/issues/12666>`_)

Vendored Libraries
------------------

- Upgrade certifi to 2024.8.30
- Upgrade distlib to 0.3.9
- Upgrade truststore to 0.10.0
- Upgrade urllib3 to 1.26.20

24.2 (2024-07-28)
=================

Deprecations and Removals
-------------------------

- Deprecate ``pip install --editable`` falling back to ``setup.py develop``
  when using a setuptools version that does not support :pep:`660`
  (setuptools v63 and older). (`#11457 <https://github.com/pypa/pip/issues/11457>`_)

Features
--------

- Check unsupported packages for the current platform. (`#11054 <https://github.com/pypa/pip/issues/11054>`_)
- Use system certificates *and* certifi certificates to verify HTTPS connections on Python 3.10+.
  Python 3.9 and earlier only use certifi.

  To revert to previous behaviour, pass the flag ``--use-deprecated=legacy-certs``. (`#11647 <https://github.com/pypa/pip/issues/11647>`_)
- Improve discovery performance of installed packages when the ``importlib.metadata``
  backend is used to load distribution metadata (used by default under Python 3.11+). (`#12656 <https://github.com/pypa/pip/issues/12656>`_)
- Improve performance when the same requirement string appears many times during
  resolution, by consistently caching the parsed requirement string. (`#12663 <https://github.com/pypa/pip/issues/12663>`_)
- Minor performance improvement of finding applicable package candidates by not
  repeatedly calculating their versions (`#12664 <https://github.com/pypa/pip/issues/12664>`_)
- Disable pip's self version check when invoking a pip subprocess to install
  PEP 517 build requirements. (`#12683 <https://github.com/pypa/pip/issues/12683>`_)
- Improve dependency resolution performance by caching platform compatibility
  tags during wheel cache lookup. (`#12712 <https://github.com/pypa/pip/issues/12712>`_)
- ``wheel`` is no longer explicitly listed as a build dependency of ``pip``.
  ``setuptools`` injects this dependency in the ``get_requires_for_build_wheel()``
  hook and no longer needs it on newer versions. (`#12728 <https://github.com/pypa/pip/issues/12728>`_)
- Ignore ``--require-virtualenv`` for ``pip check`` and ``pip freeze`` (`#12842 <https://github.com/pypa/pip/issues/12842>`_)
- Improve package download and install performance.

  Increase chunk sizes when downloading (256 kB, up from 10 kB) and reading files (1 MB, up from 8 kB).
  This reduces the frequency of updates to pip's progress bar. (`#12810 <https://github.com/pypa/pip/issues/12810>`_)
- Improve pip install performance.

  Files are now extracted in 1MB blocks, or in one block matching the file size for
  smaller files. A decompressor is no longer instantiated when extracting 0 bytes files,
  it is not necessary because there is no data to decompress. (`#12803 <https://github.com/pypa/pip/issues/12803>`_)

Bug Fixes
---------

- Set ``no_color`` to global ``rich.Console`` instance. (`#11045 <https://github.com/pypa/pip/issues/11045>`_)
- Fix resolution to respect ``--python-version`` when checking ``Requires-Python``. (`#12216 <https://github.com/pypa/pip/issues/12216>`_)
- Perform hash comparisons in a case-insensitive manner. (`#12680 <https://github.com/pypa/pip/issues/12680>`_)
- Avoid ``dlopen`` failure for glibc detection in musl builds (`#12716 <https://github.com/pypa/pip/issues/12716>`_)
- Avoid keyring logging crashes when pip is run in verbose mode. (`#12751 <https://github.com/pypa/pip/issues/12751>`_)
- Fix finding hardlink targets in tar files with an ignored top-level directory. (`#12781 <https://github.com/pypa/pip/issues/12781>`_)
- Improve pip install performance by only creating required parent
  directories once, instead of before extracting every file in the wheel. (`#12782 <https://github.com/pypa/pip/issues/12782>`_)
- Improve pip install performance by calculating installed packages printout
  in linear time instead of quadratic time. (`#12791 <https://github.com/pypa/pip/issues/12791>`_)

Vendored Libraries
------------------

- Remove vendored tenacity.
- Update the preload list for the ``DEBUNDLED`` case, to replace ``pep517`` that has been renamed to ``pyproject_hooks``.
- Use tomllib from the stdlib if available, rather than tomli
- Upgrade certifi to 2024.7.4
- Upgrade platformdirs to 4.2.2
- Upgrade pygments to 2.18.0
- Upgrade setuptools to 70.3.0
- Upgrade typing_extensions to 4.12.2

Improved Documentation
----------------------

- Correct ``—-ignore-conflicts`` (including an em dash) to ``--ignore-conflicts``. (`#12851 <https://github.com/pypa/pip/issues/12851>`_)

24.1.2 (2024-07-07)
===================

Bug Fixes
---------

- Fix finding hardlink targets in tar files with an ignored top-level directory. (`#12781 <https://github.com/pypa/pip/issues/12781>`_)

24.1.1 (2024-06-26)
===================

Bug Fixes
---------

- Actually use system trust stores when the truststore feature is enabled.

Vendored Libraries
------------------

- Upgrade requests to 2.32.3


24.1 (2024-06-20)
=================

Vendored Libraries
------------------

- Upgrade truststore to 0.9.1.


24.1b2 (2024-06-12)
===================

Features
--------

- Report informative messages about invalid requirements. (`#12713 <https://github.com/pypa/pip/issues/12713>`_)

Bug Fixes
---------

- Eagerly import the self version check logic to avoid crashes while upgrading or downgrading pip at the same time. (`#12675 <https://github.com/pypa/pip/issues/12675>`_)
- Accommodate for mismatches between different sources of truth for extra names, for packages generated by ``setuptools``. (`#12688 <https://github.com/pypa/pip/issues/12688>`_)
- Accommodate for development versions of CPython ending in ``+`` in the version string. (`#12691 <https://github.com/pypa/pip/issues/12691>`_)

Vendored Libraries
------------------

- Upgrade packaging to 24.1
- Upgrade requests to 2.32.0
- Remove vendored colorama
- Remove vendored six
- Remove vendored webencodings
- Remove vendored charset_normalizer

  ``requests`` provides optional character detection support on some APIs when processing ambiguous bytes. This isn't relevant for pip to function and we're able to remove it due to recent upstream changes.

24.1b1 (2024-05-06)
===================

Deprecations and Removals
-------------------------

- Drop support for EOL Python 3.7. (`#11934 <https://github.com/pypa/pip/issues/11934>`_)
- Remove support for legacy versions and dependency specifiers.

  Packages with non standard-compliant versions or dependency specifiers are now ignored by the resolver.
  Already installed packages with non standard-compliant versions or dependency specifiers
  must be uninstalled before upgrading them. (`#12063 <https://github.com/pypa/pip/issues/12063>`_)

Features
--------

- Improve performance of resolution of large dependency trees, with more caching. (`#12453 <https://github.com/pypa/pip/issues/12453>`_)
- Further improve resolution performance of large dependency trees, by caching hash calculations. (`#12657 <https://github.com/pypa/pip/issues/12657>`_)
- Reduce startup time of commands (e.g. show, freeze) that do not access the network by 15-30%. (`#4768 <https://github.com/pypa/pip/issues/4768>`_)
- Reword and improve presentation of uninstallation errors. (`#10421 <https://github.com/pypa/pip/issues/10421>`_)
- Add a 'raw' progress_bar type for simple and parsable download progress reports (`#11508 <https://github.com/pypa/pip/issues/11508>`_)
- ``pip list`` no longer performs the pip version check unless ``--outdated`` or ``--uptodate`` is given. (`#11677 <https://github.com/pypa/pip/issues/11677>`_)
- Use the ``data_filter`` when extracting tarballs, if it's available. (`#12111 <https://github.com/pypa/pip/issues/12111>`_)
- Display the Project-URL value under key "Home-page" in ``pip show`` when the Home-Page metadata field is not set.

  The Project-URL key detection is case-insensitive, and ignores any dashes and underscores. (`#11221 <https://github.com/pypa/pip/issues/11221>`_)

Bug Fixes
---------

- Ensure ``-vv`` gets passed to any ``pip install`` build environment subprocesses. (`#12577 <https://github.com/pypa/pip/issues/12577>`_)
- Deduplicate entries in the ``Requires`` field of ``pip show``. (`#12165 <https://github.com/pypa/pip/issues/12165>`_)
- Fix error on checkout for subversion and bazaar with verbose mode on. (`#11050 <https://github.com/pypa/pip/issues/11050>`_)
- Fix exception with completions when COMP_CWORD is not set (`#12401 <https://github.com/pypa/pip/issues/12401>`_)
- Fix intermittent "cannot locate t64.exe" errors when upgrading pip. (`#12666 <https://github.com/pypa/pip/issues/12666>`_)
- Remove duplication in invalid wheel error message (`#12579 <https://github.com/pypa/pip/issues/12579>`_)
- Remove the incorrect pip3.x console entrypoint from the pip wheel. This console
  script continues to be generated by pip when it installs itself. (`#12536 <https://github.com/pypa/pip/issues/12536>`_)
- Gracefully skip VCS detection in pip freeze when PATH points to a non-directory path. (`#12567 <https://github.com/pypa/pip/issues/12567>`_)
- Make the ``--proxy`` parameter take precedence over environment variables. (`#10685 <https://github.com/pypa/pip/issues/10685>`_)

Vendored Libraries
------------------

- Add charset-normalizer 3.3.2
- Remove chardet
- Remove pyparsing
- Upgrade CacheControl to 0.14.0
- Upgrade certifi to 2024.2.2
- Upgrade distro to 1.9.0
- Upgrade idna to 3.7
- Upgrade msgpack to 1.0.8
- Upgrade packaging to 24.0
- Upgrade platformdirs to 4.2.1
- Upgrade pygments to 2.17.2
- Upgrade rich to 13.7.1
- Upgrade setuptools to 69.5.1
- Upgrade tenacity to 8.2.3
- Upgrade typing_extensions to 4.11.0
- Upgrade urllib3 to 1.26.18

Improved Documentation
----------------------

- Document UX research done on pip. (`#10745 <https://github.com/pypa/pip/issues/10745>`_)
- Fix the direct usage of zipapp showing up as ``python -m pip.pyz`` rather than ``./pip.pyz`` / ``.\pip.pyz`` (`#12043 <https://github.com/pypa/pip/issues/12043>`_)
- Add a warning explaining that the snippet in "Fallback behavior" is not a valid
  ``pyproject.toml`` snippet for projects, and link to setuptools documentation
  instead. (`#12122 <https://github.com/pypa/pip/issues/12122>`_)
- The Python Support Policy has been updated. (`#12529 <https://github.com/pypa/pip/issues/12529>`_)
- Document the environment variables that correspond with CLI options. (`#12576 <https://github.com/pypa/pip/issues/12576>`_)
- Update architecture documentation for command line interface. (`#6831 <https://github.com/pypa/pip/issues/6831>`_)

Process
-------

- Remove ``setup.py`` since all the pip project metadata is now declared in
  ``pyproject.toml``.
- Move remaining pip development tools configurations to ``pyproject.toml``.

24.0 (2024-02-03)
=================

Features
--------

- Retry on HTTP status code 502 (`#11843 <https://github.com/pypa/pip/issues/11843>`_)
- Automatically use the setuptools PEP 517 build backend when ``--config-settings`` is
  used for projects without ``pyproject.toml``. (`#11915 <https://github.com/pypa/pip/issues/11915>`_)
- Make pip freeze and pip uninstall of legacy editable installs of packages whose name
  contains ``_`` compatible with ``setuptools>=69.0.3``. (`#12477 <https://github.com/pypa/pip/issues/12477>`_)
- Support per requirement ``--config-settings`` for editable installs. (`#12480 <https://github.com/pypa/pip/issues/12480>`_)

Bug Fixes
---------

- Optimized usage of ``--find-links=<path-to-dir>``, by only scanning the relevant directory once, only considering file names that are valid wheel or sdist names, and only considering files in the directory that are related to the install. (`#12327 <https://github.com/pypa/pip/issues/12327>`_)
- Removed ``wheel`` from the ``[build-system].requires`` list fallback
  that is used when ``pyproject.toml`` is absent. (`#12449 <https://github.com/pypa/pip/issues/12449>`_)

Vendored Libraries
------------------

- Upgrade distlib to 0.3.8

Improved Documentation
----------------------

- Fix explanation of how PIP_CONFIG_FILE works (`#11815 <https://github.com/pypa/pip/issues/11815>`_)
- Fix outdated pip install argument description in documentation. (`#12417 <https://github.com/pypa/pip/issues/12417>`_)
- Replace some links to PEPs with links to the canonical specifications on the :doc:`pypug:index` (`#12434 <https://github.com/pypa/pip/issues/12434>`_)
- Updated the ``pyproject.toml`` document to stop suggesting
  to depend on ``wheel`` as a build dependency directly. (`#12449 <https://github.com/pypa/pip/issues/12449>`_)
- Update supported interpreters in development docs (`#12475 <https://github.com/pypa/pip/issues/12475>`_)

Process
-------

- Most project metadata is now defined statically via pip's ``pyproject.toml`` file.

23.3.2 (2023-12-17)
===================

Bug Fixes
---------

- Fix a bug in extras handling for link requirements (`#12372 <https://github.com/pypa/pip/issues/12372>`_)
- Fix mercurial revision "parse error": use ``--rev={ref}`` instead of ``-r={ref}`` (`#12373 <https://github.com/pypa/pip/issues/12373>`_)


23.3.1 (2023-10-21)
===================

Bug Fixes
---------

- Handle a timezone indicator of Z when parsing dates in the self check. (`#12338 <https://github.com/pypa/pip/issues/12338>`_)
- Fix bug where installing the same package at the same time with multiple pip processes could fail. (`#12361 <https://github.com/pypa/pip/issues/12361>`_)


23.3 (2023-10-15)
=================

Process
-------

- Added reference to `vulnerability reporting guidelines <https://www.python.org/dev/security/>`_ to pip's security policy.

Deprecations and Removals
-------------------------

- Drop a fallback to using SecureTransport on macOS. It was useful when pip detected OpenSSL older than 1.0.1, but the current pip does not support any Python version supporting such old OpenSSL versions. (`#12175 <https://github.com/pypa/pip/issues/12175>`_)

Features
--------

- Improve extras resolution for multiple constraints on same base package. (`#11924 <https://github.com/pypa/pip/issues/11924>`_)
- Improve use of datastructures to make candidate selection 1.6x faster. (`#12204 <https://github.com/pypa/pip/issues/12204>`_)
- Allow ``pip install --dry-run`` to use platform and ABI overriding options. (`#12215 <https://github.com/pypa/pip/issues/12215>`_)
- Add ``is_yanked`` boolean entry to the installation report (``--report``) to indicate whether the requirement was yanked from the index, but was still selected by pip conform to :pep:`592`. (`#12224 <https://github.com/pypa/pip/issues/12224>`_)

Bug Fixes
---------

- Ignore errors in temporary directory cleanup (show a warning instead). (`#11394 <https://github.com/pypa/pip/issues/11394>`_)
- Normalize extras according to :pep:`685` from package metadata in the resolver
  for comparison. This ensures extras are correctly compared and merged as long
  as the package providing the extra(s) is built with values normalized according
  to the standard. Note, however, that this *does not* solve cases where the
  package itself contains unnormalized extra values in the metadata. (`#11649 <https://github.com/pypa/pip/issues/11649>`_)
- Prevent downloading sdists twice when :pep:`658` metadata is present. (`#11847 <https://github.com/pypa/pip/issues/11847>`_)
- Include all requested extras in the install report (``--report``). (`#11924 <https://github.com/pypa/pip/issues/11924>`_)
- Removed uses of ``datetime.datetime.utcnow`` from non-vendored code. (`#12005 <https://github.com/pypa/pip/issues/12005>`_)
- Consistently report whether a dependency comes from an extra. (`#12095 <https://github.com/pypa/pip/issues/12095>`_)
- Fix completion script for zsh (`#12166 <https://github.com/pypa/pip/issues/12166>`_)
- Fix improper handling of the new onexc argument of ``shutil.rmtree()`` in Python 3.12. (`#12187 <https://github.com/pypa/pip/issues/12187>`_)
- Filter out yanked links from the available versions error message: "(from versions: 1.0, 2.0, 3.0)" will not contain yanked versions conform PEP 592. The yanked versions (if any) will be mentioned in a separate error message. (`#12225 <https://github.com/pypa/pip/issues/12225>`_)
- Fix crash when the git version number contains something else than digits and dots. (`#12280 <https://github.com/pypa/pip/issues/12280>`_)
- Use ``-r=...`` instead of ``-r ...`` to specify references with Mercurial. (`#12306 <https://github.com/pypa/pip/issues/12306>`_)
- Redact password from URLs in some additional places. (`#12350 <https://github.com/pypa/pip/issues/12350>`_)
- pip uses less memory when caching large packages. As a result, there is a new on-disk cache format stored in a new directory ($PIP_CACHE_DIR/http-v2). (`#2984 <https://github.com/pypa/pip/issues/2984>`_)

Vendored Libraries
------------------

- Upgrade certifi to 2023.7.22
- Add truststore 0.8.0
- Upgrade urllib3 to 1.26.17

Improved Documentation
----------------------

- Document that ``pip search`` support has been removed from PyPI (`#12059 <https://github.com/pypa/pip/issues/12059>`_)
- Clarify --prefer-binary in CLI and docs (`#12122 <https://github.com/pypa/pip/issues/12122>`_)
- Document that using OS-provided Python can cause pip's test suite to report false failures. (`#12334 <https://github.com/pypa/pip/issues/12334>`_)


23.2.1 (2023-07-22)
===================

Bug Fixes
---------

- Disable :pep:`658` metadata fetching with the legacy resolver. (`#12156 <https://github.com/pypa/pip/issues/12156>`_)


23.2 (2023-07-15)
=================

Process
-------

- Deprecate support for eggs for Python 3.11 or later, when the new ``importlib.metadata`` backend is used to load distribution metadata. This only affects the egg *distribution format* (with the ``.egg`` extension); distributions using the ``.egg-info`` *metadata format* (but are not actually eggs) are not affected. For more information about eggs, see `relevant section in the setuptools documentation <https://setuptools.pypa.io/en/stable/deprecated/python_eggs.html>`__.

Deprecations and Removals
-------------------------

- Deprecate legacy version and version specifiers that don't conform to the
  :ref:`specification <pypug:version-specifiers>`.
  (`#12063 <https://github.com/pypa/pip/issues/12063>`_)
- ``freeze`` no longer excludes the ``setuptools``, ``distribute``, and ``wheel``
  from the output when running on Python 3.12 or later, where they are not
  included in a virtual environment by default. Use ``--exclude`` if you wish to
  exclude any of these packages. (`#4256 <https://github.com/pypa/pip/issues/4256>`_)

Features
--------

- make rejection messages slightly different between 1 and 8, so the user can make the difference. (`#12040 <https://github.com/pypa/pip/issues/12040>`_)

Bug Fixes
---------

- Fix ``pip completion --zsh``. (`#11417 <https://github.com/pypa/pip/issues/11417>`_)
- Prevent downloading files twice when :pep:`658` metadata is present (`#11847 <https://github.com/pypa/pip/issues/11847>`_)
- Add permission check before configuration (`#11920 <https://github.com/pypa/pip/issues/11920>`_)
- Fix deprecation warnings in Python 3.12 for usage of shutil.rmtree (`#11957 <https://github.com/pypa/pip/issues/11957>`_)
- Ignore invalid or unreadable ``origin.json`` files in the cache of locally built wheels. (`#11985 <https://github.com/pypa/pip/issues/11985>`_)
- Fix installation of packages with :pep:`658` metadata using non-canonicalized names (`#12038 <https://github.com/pypa/pip/issues/12038>`_)
- Correctly parse ``dist-info-metadata`` values from JSON-format index data. (`#12042 <https://github.com/pypa/pip/issues/12042>`_)
- Fail with an error if the ``--python`` option is specified after the subcommand name. (`#12067 <https://github.com/pypa/pip/issues/12067>`_)
- Fix slowness when using ``importlib.metadata`` (the default way for pip to read metadata in Python 3.11+) and there is a large overlap between already installed and to-be-installed packages. (`#12079 <https://github.com/pypa/pip/issues/12079>`_)
- Pass the ``-r`` flag to mercurial to be explicit that a revision is passed and protect
  against ``hg`` options injection as part of VCS URLs. Users that do not have control on
  VCS URLs passed to pip are advised to upgrade. (`#12119 <https://github.com/pypa/pip/issues/12119>`_)

Vendored Libraries
------------------

- Upgrade certifi to 2023.5.7
- Upgrade platformdirs to 3.8.1
- Upgrade pygments to 2.15.1
- Upgrade pyparsing to 3.1.0
- Upgrade Requests to 2.31.0
- Upgrade rich to 13.4.2
- Upgrade setuptools to 68.0.0
- Updated typing_extensions to 4.6.0
- Upgrade typing_extensions to 4.7.1
- Upgrade urllib3 to 1.26.16


23.1.2 (2023-04-26)
===================

Vendored Libraries
------------------

- Upgrade setuptools to 67.7.2


23.1.1 (2023-04-22)
===================

Bug Fixes
---------

- Revert `#11487 <https://github.com/pypa/pip/pull/11487>`_, as it causes issues with virtualenvs created by the Windows Store distribution of Python. (`#11987 <https://github.com/pypa/pip/issues/11987>`_)

Vendored Libraries
------------------

- Revert pkg_resources (via setuptools) back to 65.6.3

Improved Documentation
----------------------

- Update documentation to reflect the new behavior of using the cache of locally
  built wheels in hash-checking mode. (`#11967 <https://github.com/pypa/pip/issues/11967>`_)


23.1 (2023-04-15)
=================

Deprecations and Removals
-------------------------

- Remove support for the deprecated ``--install-options``. (`#11358 <https://github.com/pypa/pip/issues/11358>`_)
- ``--no-binary`` does not imply ``setup.py install`` anymore. Instead a wheel will be
  built locally and installed. (`#11451 <https://github.com/pypa/pip/issues/11451>`_)
- ``--no-binary`` does not disable the cache of locally built wheels anymore. It only
  means "don't download wheels". (`#11453 <https://github.com/pypa/pip/issues/11453>`_)
- Deprecate ``--build-option`` and ``--global-option``. Users are invited to switch to
  ``--config-settings``. (`#11859 <https://github.com/pypa/pip/issues/11859>`_)
- Using ``--config-settings`` with projects that don't have a ``pyproject.toml`` now prints
  a deprecation warning. In the future the presence of config settings will automatically
  enable the default build backend for legacy projects and pass the settings to it. (`#11915 <https://github.com/pypa/pip/issues/11915>`_)
- Remove ``setup.py install`` fallback when building a wheel failed for projects without
  ``pyproject.toml``. (`#8368 <https://github.com/pypa/pip/issues/8368>`_)
- When the ``wheel`` package is not installed, pip now uses the default build backend
  instead of ``setup.py install`` and ``setup.py develop`` for project without
  ``pyproject.toml``. (`#8559 <https://github.com/pypa/pip/issues/8559>`_)

Features
--------

- Specify egg-link location in assertion message when it does not match installed location to provide better error message for debugging. (`#10476 <https://github.com/pypa/pip/issues/10476>`_)
- Present conflict information during installation after each choice that is rejected (pass ``-vv`` to ``pip install`` to show it) (`#10937 <https://github.com/pypa/pip/issues/10937>`_)
- Display dependency chain on each Collecting/Processing log line. (`#11169 <https://github.com/pypa/pip/issues/11169>`_)
- Support a per-requirement ``--config-settings`` option in requirements files. (`#11325 <https://github.com/pypa/pip/issues/11325>`_)
- The ``--config-settings``/``-C`` option now supports using the same key multiple
  times. When the same key is specified multiple times, all values are passed to
  the build backend as a list, as opposed to the previous behavior, where pip would
  only pass the last value if the same key was used multiple times. (`#11681 <https://github.com/pypa/pip/issues/11681>`_)
- Add ``-C`` as a short version of the ``--config-settings`` option. (`#11786 <https://github.com/pypa/pip/issues/11786>`_)
- Reduce the number of resolver rounds, since backjumping makes the resolver more efficient in finding solutions. This also makes pathological cases fail quicker. (`#11908 <https://github.com/pypa/pip/issues/11908>`_)
- Warn if ``--hash`` is used on a line without requirement in a requirements file. (`#11935 <https://github.com/pypa/pip/issues/11935>`_)
- Stop propagating CLI ``--config-settings`` to the build dependencies. They already did
  not propagate to requirements provided in requirement files. To pass the same config
  settings to several requirements, users should provide the requirements as CLI
  arguments. (`#11941 <https://github.com/pypa/pip/issues/11941>`_)
- Support wheel cache when using ``--require-hashes``. (`#5037 <https://github.com/pypa/pip/issues/5037>`_)
- Add ``--keyring-provider`` flag. See the Authentication page in the documentation for more info. (`#8719 <https://github.com/pypa/pip/issues/8719>`_)
- In the case of virtual environments, configuration files are now also included from the base installation. (`#9752 <https://github.com/pypa/pip/issues/9752>`_)

Bug Fixes
---------

- Fix grammar by changing "A new release of pip available:" to "A new release of pip is available:" in the notice used for indicating that. (`#11529 <https://github.com/pypa/pip/issues/11529>`_)
- Normalize paths before checking if installed scripts are on PATH. (`#11719 <https://github.com/pypa/pip/issues/11719>`_)
- Correct the way to decide if keyring is available. (`#11774 <https://github.com/pypa/pip/issues/11774>`_)
- More consistent resolution backtracking by removing legacy hack related to setuptools resolution (`#11837 <https://github.com/pypa/pip/issues/11837>`_)
- Include ``AUTHORS.txt`` in pip's wheels. (`#11882 <https://github.com/pypa/pip/issues/11882>`_)
- The ``uninstall`` and ``install --force-reinstall`` commands no longer call
  ``normalize_path()`` repeatedly on the same paths. Instead, these results are
  cached for the duration of an uninstall operation, resulting in improved
  performance, particularly on Windows. (`#11889 <https://github.com/pypa/pip/issues/11889>`_)
- Fix and improve the parsing of hashes embedded in URL fragments. (`#11936 <https://github.com/pypa/pip/issues/11936>`_)
- When package A depends on package B provided as a direct URL dependency including a hash
  embedded in the link, the ``--require-hashes`` option did not warn when user supplied hashes
  were missing for package B. (`#11938 <https://github.com/pypa/pip/issues/11938>`_)
- Correctly report ``requested_extras`` in the installation report when extras are
  specified for a local directory installation. (`#11946 <https://github.com/pypa/pip/issues/11946>`_)
- When installing an archive from a direct URL or local file, populate
  ``download_info.info.hashes`` in the installation report, in addition to the legacy
  ``download_info.info.hash`` key. (`#11948 <https://github.com/pypa/pip/issues/11948>`_)

Vendored Libraries
------------------

- Upgrade msgpack to 1.0.5
- Patch pkg_resources to remove dependency on ``jaraco.text``.
- Upgrade platformdirs to 3.2.0
- Upgrade pygments to 2.14.0
- Upgrade resolvelib to 1.0.1
- Upgrade rich to 13.3.3
- Upgrade setuptools to 67.6.1
- Upgrade tenacity to 8.2.2
- Upgrade typing_extensions to 4.5.0
- Upgrade urllib3 to 1.26.15

Improved Documentation
----------------------

- Cross-reference the ``--python`` flag from the ``--prefix`` flag,
  and mention limitations of ``--prefix`` regarding script installation. (`#11775 <https://github.com/pypa/pip/issues/11775>`_)
- Add SECURITY.md to make the policy official. (`#11809 <https://github.com/pypa/pip/issues/11809>`_)
- Add username to Git over SSH example. (`#11838 <https://github.com/pypa/pip/issues/11838>`_)
- Quote extras in the pip install docs to guard shells with default glob
  qualifiers, like zsh. (`#11842 <https://github.com/pypa/pip/issues/11842>`_)
- Make it clear that requirements/constraints file can be a URL (`#11954 <https://github.com/pypa/pip/issues/11954>`_)


23.0.1 (2023-02-17)
===================

Features
--------

- Ignore PIP_REQUIRE_VIRTUALENV for ``pip index`` (`#11671 <https://github.com/pypa/pip/issues/11671>`_)
- Implement ``--break-system-packages`` to permit installing packages into
  ``EXTERNALLY-MANAGED`` Python installations. (`#11780 <https://github.com/pypa/pip/issues/11780>`_)

Bug Fixes
---------

- Improve handling of isolated build environments on platforms that
  customize the Python's installation schemes, such as Debian and
  Homebrew. (`#11740 <https://github.com/pypa/pip/issues/11740>`_)
- Do not crash in presence of misformatted hash field in ``direct_url.json``. (`#11773 <https://github.com/pypa/pip/issues/11773>`_)


23.0 (2023-01-30)
=================

Features
--------

- Change the hashes in the installation report to be a mapping. Emit the
  ``archive_info.hashes`` dictionary in ``direct_url.json``. (`#11312 <https://github.com/pypa/pip/issues/11312>`_)
- Implement logic to read the ``EXTERNALLY-MANAGED`` file as specified in :pep:`668`.
  This allows a downstream Python distributor to prevent users from using pip to
  modify the externally managed environment. (`#11381 <https://github.com/pypa/pip/issues/11381>`_)
- Enable the use of ``keyring`` found on ``PATH``. This allows ``keyring``
  installed using ``pipx`` to be used by ``pip``. (`#11589 <https://github.com/pypa/pip/issues/11589>`_)
- The inspect and installation report formats are now declared stable, and their version
  has been bumped from ``0`` to ``1``. (`#11757 <https://github.com/pypa/pip/issues/11757>`_)

Bug Fixes
---------

- Wheel cache behavior is restored to match previous versions, allowing the
  cache to find existing entries. (`#11527 <https://github.com/pypa/pip/issues/11527>`_)
- Use the "venv" scheme if available to obtain prefixed lib paths. (`#11598 <https://github.com/pypa/pip/issues/11598>`_)
- Deprecated a historical ambiguity in how ``egg`` fragments in URL-style
  requirements are formatted and handled. ``egg`` fragments that do not look
  like :pep:`508` names now produce a deprecation warning. (`#11617 <https://github.com/pypa/pip/issues/11617>`_)
- Fix scripts path in isolated build environment on Debian. (`#11623 <https://github.com/pypa/pip/issues/11623>`_)
- Make ``pip show`` show the editable location if package is editable (`#11638 <https://github.com/pypa/pip/issues/11638>`_)
- Stop checking that ``wheel`` is present when ``build-system.requires``
  is provided without ``build-system.build-backend`` as ``setuptools``
  (which we still check for) will inject it anyway. (`#11673 <https://github.com/pypa/pip/issues/11673>`_)
- Fix an issue when an already existing in-memory distribution would cause
  exceptions in ``pip install`` (`#11704 <https://github.com/pypa/pip/issues/11704>`_)

Vendored Libraries
------------------

- Upgrade certifi to 2022.12.7
- Upgrade chardet to 5.1.0
- Upgrade colorama to 0.4.6
- Upgrade distro to 1.8.0
- Remove pep517 from vendored packages
- Upgrade platformdirs to 2.6.2
- Add pyproject-hooks 1.0.0
- Upgrade requests to 2.28.2
- Upgrade rich to 12.6.0
- Upgrade urllib3 to 1.26.14

Improved Documentation
----------------------

- Fixed the description of the option "--install-options" in the documentation (`#10265 <https://github.com/pypa/pip/issues/10265>`_)
- Remove mention that editable installs are necessary for pip freeze to report the VCS
  URL. (`#11675 <https://github.com/pypa/pip/issues/11675>`_)
- Clarify that the egg URL fragment is only necessary for editable VCS installs, and
  otherwise not necessary anymore. (`#11676 <https://github.com/pypa/pip/issues/11676>`_)


22.3.1 (2022-11-05)
===================

Bug Fixes
---------

- Fix entry point generation of ``pip.X``, ``pipX.Y``, and ``easy_install-X.Y``
  to correctly account for multi-digit Python version segments (e.g. the "11"
  part of 3.11). (`#11547 <https://github.com/pypa/pip/issues/11547>`_)


22.3 (2022-10-15)
=================

Deprecations and Removals
-------------------------

- Deprecate ``--install-options`` which forces pip to use the deprecated ``install``
  command of ``setuptools``. (`#11358 <https://github.com/pypa/pip/issues/11358>`_)
- Deprecate installation with 'setup.py install' when no-binary is enabled for
  source distributions without 'pyproject.toml'. (`#11452 <https://github.com/pypa/pip/issues/11452>`_)
- Deprecate ```--no-binary`` disabling the wheel cache. (`#11454 <https://github.com/pypa/pip/issues/11454>`_)
- Remove ``--use-feature=2020-resolver`` opt-in flag. This was supposed to be removed in 21.0, but missed during that release cycle. (`#11493 <https://github.com/pypa/pip/issues/11493>`_)
- Deprecate installation with 'setup.py install' when the 'wheel' package is absent for
  source distributions without 'pyproject.toml'. (`#8559 <https://github.com/pypa/pip/issues/8559>`_)
- Remove the ability to use ``pip list --outdated`` in combination with ``--format=freeze``. (`#9789 <https://github.com/pypa/pip/issues/9789>`_)

Features
--------

- Use ``shell=True`` for opening the editor with ``pip config edit``. (`#10716 <https://github.com/pypa/pip/issues/10716>`_)
- Use the ``data-dist-info-metadata`` attribute from :pep:`658` to resolve distribution metadata without downloading the dist yet. (`#11111 <https://github.com/pypa/pip/issues/11111>`_)
- Add an option to run the test suite with pip built as a zipapp. (`#11250 <https://github.com/pypa/pip/issues/11250>`_)
- Add a ``--python`` option to allow pip to manage Python environments other
  than the one pip is installed in. (`#11320 <https://github.com/pypa/pip/issues/11320>`_)
- Document the new (experimental) zipapp distribution of pip. (`#11459 <https://github.com/pypa/pip/issues/11459>`_)
- Use the much faster 'bzr co --lightweight' to obtain a copy of a Bazaar tree. (`#5444 <https://github.com/pypa/pip/issues/5444>`_)

Bug Fixes
---------

- Fix ``--no-index`` when ``--index-url`` or ``--extra-index-url`` is specified
  inside a requirements file. (`#11276 <https://github.com/pypa/pip/issues/11276>`_)
- Ensure that the candidate ``pip`` executable exists, when checking for a new version of pip. (`#11309 <https://github.com/pypa/pip/issues/11309>`_)
- Ignore distributions with invalid ``Name`` in metadata instead of crashing, when
  using the ``importlib.metadata`` backend. (`#11352 <https://github.com/pypa/pip/issues/11352>`_)
- Raise RequirementsFileParseError when parsing malformed requirements options that can't be successfully parsed by shlex. (`#11491 <https://github.com/pypa/pip/issues/11491>`_)
- Fix build environment isolation on some system Pythons. (`#6264 <https://github.com/pypa/pip/issues/6264>`_)

Vendored Libraries
------------------

- Upgrade certifi to 2022.9.24
- Upgrade distlib to 0.3.6
- Upgrade idna to 3.4
- Upgrade pep517 to 0.13.0
- Upgrade pygments to 2.13.0
- Upgrade tenacity to 8.1.0
- Upgrade typing_extensions to 4.4.0
- Upgrade urllib3 to 1.26.12

Improved Documentation
----------------------

- Mention that --quiet must be used when writing the installation report to stdout. (`#11357 <https://github.com/pypa/pip/issues/11357>`_)


22.2.2 (2022-08-03)
===================

Bug Fixes
---------

- Avoid  ``AttributeError`` when removing the setuptools-provided ``_distutils_hack`` and it is missing its implementation. (`#11314 <https://github.com/pypa/pip/issues/11314>`_)
- Fix import error when reinstalling pip in user site. (`#11319 <https://github.com/pypa/pip/issues/11319>`_)
- Show pip deprecation warnings by default. (`#11330 <https://github.com/pypa/pip/issues/11330>`_)


22.2.1 (2022-07-27)
===================

Bug Fixes
---------

- Send the pip upgrade prompt to stderr. (`#11282 <https://github.com/pypa/pip/issues/11282>`_)
- Ensure that things work correctly in environments where setuptools-injected
  ``distutils`` is available by default. This is done by cooperating with
  setuptools' injection logic to ensure that pip uses the ``distutils`` from the
  Python standard library instead. (`#11298 <https://github.com/pypa/pip/issues/11298>`_)
- Clarify that ``pip cache``'s wheels-related output is about locally built wheels only. (`#11300 <https://github.com/pypa/pip/issues/11300>`_)


22.2 (2022-07-21)
=================

Deprecations and Removals
-------------------------

- Remove the ``html5lib`` deprecated feature flag. (`#10825 <https://github.com/pypa/pip/issues/10825>`_)
- Remove ``--use-deprecated=backtrack-on-build-failures``. (`#11241 <https://github.com/pypa/pip/issues/11241>`_)

Features
--------

- Add support to use `truststore <https://pypi.org/project/truststore/>`_ as an
  alternative SSL certificate verification backend. The backend can be enabled on Python
  3.10 and later by installing ``truststore`` into the environment, and adding the
  ``--use-feature=truststore`` flag to various pip commands.

  ``truststore`` differs from the current default verification backend (provided by
  ``certifi``) in it uses the operating system’s trust store, which can be better
  controlled and augmented to better support non-standard certificates. Depending on
  feedback, pip may switch to this as the default certificate verification backend in
  the future. (`#11082 <https://github.com/pypa/pip/issues/11082>`_)
- Add ``--dry-run`` option to ``pip install``, to let it print what it would install but
  not actually change anything in the target environment. (`#11096 <https://github.com/pypa/pip/issues/11096>`_)
- Record in wheel cache entries the URL of the original artifact that was downloaded
  to build the cached wheels. The record is named ``origin.json`` and uses the PEP 610
  Direct URL format. (`#11137 <https://github.com/pypa/pip/issues/11137>`_)
- Support `PEP 691 <https://peps.python.org/pep-0691/>`_. (`#11158 <https://github.com/pypa/pip/issues/11158>`_)
- pip's deprecation warnings now subclass the built-in ``DeprecationWarning``, and
  can be suppressed by running the Python interpreter with
  ``-W ignore::DeprecationWarning``. (`#11225 <https://github.com/pypa/pip/issues/11225>`_)
- Add ``pip inspect`` command to obtain the list of installed distributions and other
  information about the Python environment, in JSON format. (`#11245 <https://github.com/pypa/pip/issues/11245>`_)
- Significantly speed up isolated environment creation, by using the same
  sources for pip instead of creating a standalone installation for each
  environment. (`#11257 <https://github.com/pypa/pip/issues/11257>`_)
- Add an experimental ``--report`` option to the install command to generate a JSON report
  of what was installed. In combination with ``--dry-run`` and ``--ignore-installed`` it
  can be used to resolve the requirements. (`#53 <https://github.com/pypa/pip/issues/53>`_)

Bug Fixes
---------

- Fix ``pip install --pre`` for packages with pre-release build dependencies defined
  both in ``pyproject.toml``'s ``build-system.requires`` and ``setup.py``'s
  ``setup_requires``. (`#10222 <https://github.com/pypa/pip/issues/10222>`_)
- When pip rewrites the shebang line in a script during wheel installation,
  update the hash and size in the corresponding ``RECORD`` file entry. (`#10744 <https://github.com/pypa/pip/issues/10744>`_)
- Do not consider a ``.dist-info`` directory found inside a wheel-like zip file
  as metadata for an installed distribution. A package in a wheel is (by
  definition) not installed, and is not guaranteed to work due to how a wheel is
  structured. (`#11217 <https://github.com/pypa/pip/issues/11217>`_)
- Use ``importlib.resources`` to read the ``vendor.txt`` file in ``pip debug``.
  This makes the command safe for use from a zipapp. (`#11248 <https://github.com/pypa/pip/issues/11248>`_)
- Make the ``--use-pep517`` option of the ``download`` command apply not just
  to the requirements specified on the command line, but to their dependencies,
  as well. (`#9523 <https://github.com/pypa/pip/issues/9523>`_)

Process
-------

- Remove reliance on the stdlib cgi module, which is deprecated in Python 3.11.

Vendored Libraries
------------------

- Remove html5lib.
- Upgrade certifi to 2022.6.15
- Upgrade chardet to 5.0.0
- Upgrade colorama to 0.4.5
- Upgrade distlib to 0.3.5
- Upgrade msgpack to 1.0.4
- Upgrade pygments to 2.12.0
- Upgrade pyparsing to 3.0.9
- Upgrade requests to 2.28.1
- Upgrade rich to 12.5.1
- Upgrade typing_extensions to 4.3.0
- Upgrade urllib3 to 1.26.10


22.1.2 (2022-05-31)
===================

Bug Fixes
---------

- Revert `#10979 <https://github.com/pypa/pip/issues/10979>`_ since it introduced a regression in certain edge cases. (`#10979 <https://github.com/pypa/pip/issues/10979>`_)
- Fix an incorrect assertion in the logging logic, that prevented the upgrade prompt from being presented. (`#11136 <https://github.com/pypa/pip/issues/11136>`_)


22.1.1 (2022-05-20)
===================

Bug Fixes
---------

- Properly filter out optional dependencies (i.e. extras) when checking build environment distributions. (`#11112 <https://github.com/pypa/pip/issues/11112>`_)
- Change the build environment dependency checking to be opt-in. (`#11116 <https://github.com/pypa/pip/issues/11116>`_)
- Allow using a pre-release version to satisfy a build requirement. This helps
  manually populated build environments to more accurately detect build-time
  requirement conflicts. (`#11123 <https://github.com/pypa/pip/issues/11123>`_)


22.1 (2022-05-11)
=================

Process
-------

- Enable the ``importlib.metadata`` metadata implementation by default on
  Python 3.11 (or later). The environment variable ``_PIP_USE_IMPORTLIB_METADATA``
  can still be used to enable the implementation on 3.10 and earlier, or disable
  it on 3.11 (by setting it to ``0`` or ``false``).

Bug Fixes
---------

- Revert `#9243 <https://github.com/pypa/pip/issues/9243>`_ since it introduced a regression in certain edge cases. (`#10962 <https://github.com/pypa/pip/issues/10962>`_)
- Fix missing ``REQUESTED`` metadata when using URL constraints. (`#11079 <https://github.com/pypa/pip/issues/11079>`_)
- ``pip config`` now normalizes names by converting underscores into dashes. (`#9330 <https://github.com/pypa/pip/issues/9330>`_)


22.1b1 (2022-04-30)
===================

Process
-------

- Start migration of distribution metadata implementation from ``pkg_resources``
  to ``importlib.metadata``. The new implementation is currently not exposed in
  any user-facing way, but included in the code base for easier development.

Deprecations and Removals
-------------------------

- Drop ``--use-deprecated=out-of-tree-build``, according to deprecation message. (`#11001 <https://github.com/pypa/pip/issues/11001>`_)

Features
--------

- Add option to install and uninstall commands to opt-out from running-as-root warning. (`#10556 <https://github.com/pypa/pip/issues/10556>`_)
- Include Project-URLs in ``pip show`` output. (`#10799 <https://github.com/pypa/pip/issues/10799>`_)
- Improve error message when ``pip config edit`` is provided an editor that
  doesn't exist. (`#10812 <https://github.com/pypa/pip/issues/10812>`_)
- Add a user interface for supplying config settings to build backends. (`#11059 <https://github.com/pypa/pip/issues/11059>`_)
- Add support for Powershell autocompletion. (`#9024 <https://github.com/pypa/pip/issues/9024>`_)
- Explains why specified version cannot be retrieved when *Requires-Python* is not satisfied. (`#9615 <https://github.com/pypa/pip/issues/9615>`_)
- Validate build dependencies when using ``--no-build-isolation``. (`#9794 <https://github.com/pypa/pip/issues/9794>`_)

Bug Fixes
---------

- Fix conditional checks to prevent ``pip.exe`` from trying to modify itself, on Windows. (`#10560 <https://github.com/pypa/pip/issues/10560>`_)
- Fix uninstall editable from Windows junction link. (`#10696 <https://github.com/pypa/pip/issues/10696>`_)
- Fallback to pyproject.toml-based builds if ``setup.py`` is present in a project, but ``setuptools`` cannot be imported. (`#10717 <https://github.com/pypa/pip/issues/10717>`_)
- When checking for conflicts in the build environment, correctly skip requirements
  containing markers that do not match the current environment. (`#10883 <https://github.com/pypa/pip/issues/10883>`_)
- Disable brotli import in vendored urllib3 so brotli could be uninstalled/upgraded by pip. (`#10950 <https://github.com/pypa/pip/issues/10950>`_)
- Prioritize URL credentials over netrc. (`#10979 <https://github.com/pypa/pip/issues/10979>`_)
- Filter available distributions using hash declarations from constraints files. (`#9243 <https://github.com/pypa/pip/issues/9243>`_)
- Fix an error when trying to uninstall packages installed as editable from a network drive. (`#9452 <https://github.com/pypa/pip/issues/9452>`_)
- Fix pip install issues using a proxy due to an inconsistency in how Requests is currently handling variable precedence in session. (`#9691 <https://github.com/pypa/pip/issues/9691>`_)

Vendored Libraries
------------------

- Upgrade CacheControl to 0.12.11
- Upgrade distro to 1.7.0
- Upgrade platformdirs to 2.5.2
- Remove ``progress`` from vendored dependencies.
- Upgrade ``pyparsing`` to 3.0.8 for startup performance improvements.
- Upgrade rich to 12.2.0
- Upgrade tomli to 2.0.1
- Upgrade typing_extensions to 4.2.0

Improved Documentation
----------------------

- Add more dedicated topic and reference pages to the documentation. (`#10899 <https://github.com/pypa/pip/issues/10899>`_)
- Capitalise Y as the default for "Proceed (y/n)?" when uninstalling. (`#10936 <https://github.com/pypa/pip/issues/10936>`_)
- Add ``scheme://`` requirement to ``--proxy`` option's description (`#10951 <https://github.com/pypa/pip/issues/10951>`_)
- The wheel command now references the build interface section instead of stating the legacy
  setuptools behavior as the default. (`#10972 <https://github.com/pypa/pip/issues/10972>`_)
- Improved usefulness of ``pip config --help`` output. (`#11074 <https://github.com/pypa/pip/issues/11074>`_)


22.0.4 (2022-03-06)
===================

Deprecations and Removals
-------------------------

- Drop the doctype check, that presented a warning for index pages that use non-compliant HTML 5. (`#10903 <https://github.com/pypa/pip/issues/10903>`_)

Vendored Libraries
------------------

- Downgrade distlib to 0.3.3.


22.0.3 (2022-02-03)
===================

Features
--------

- Print the exception via ``rich.traceback``, when running with ``--debug``. (`#10791 <https://github.com/pypa/pip/issues/10791>`_)

Bug Fixes
---------

- Only calculate topological installation order, for packages that are going to be installed/upgraded.

  This fixes an `AssertionError` that occurred when determining installation order, for a very specific combination of upgrading-already-installed-package + change of dependencies + fetching some packages from a package index. This combination was especially common in Read the Docs' builds. (`#10851 <https://github.com/pypa/pip/issues/10851>`_)
- Use ``html.parser`` by default, instead of falling back to ``html5lib`` when ``--use-deprecated=html5lib`` is not passed. (`#10869 <https://github.com/pypa/pip/issues/10869>`_)

Improved Documentation
----------------------

- Clarify that using per-requirement overrides disables the usage of wheels. (`#9674 <https://github.com/pypa/pip/issues/9674>`_)


22.0.2 (2022-01-30)
===================

Deprecations and Removals
-------------------------

- Instead of failing on index pages that use non-compliant HTML 5, print a deprecation warning and fall back to ``html5lib``-based parsing for now. This simplifies the migration for non-compliant index pages, by letting such indexes function with a warning. (`#10847 <https://github.com/pypa/pip/issues/10847>`_)


22.0.1 (2022-01-30)
===================

Bug Fixes
---------

- Accept lowercase ``<!doctype html>`` on index pages. (`#10844 <https://github.com/pypa/pip/issues/10844>`_)
- Properly handle links parsed by html5lib, when using ``--use-deprecated=html5lib``. (`#10846 <https://github.com/pypa/pip/issues/10846>`_)


22.0 (2022-01-29)
=================

Process
-------

- Completely replace :pypi:`tox` in our development workflow, with :pypi:`nox`.

Deprecations and Removals
-------------------------

- Deprecate alternative progress bar styles, leaving only ``on`` and ``off`` as available choices. (`#10462 <https://github.com/pypa/pip/issues/10462>`_)
- Drop support for Python 3.6. (`#10641 <https://github.com/pypa/pip/issues/10641>`_)
- Disable location mismatch warnings on Python versions prior to 3.10.

  These warnings were helping identify potential issues as part of the sysconfig -> distutils transition, and we no longer need to rely on reports from older Python versions for information on the transition. (`#10840 <https://github.com/pypa/pip/issues/10840>`_)

Features
--------

- Changed ``PackageFinder`` to parse HTML documents using the stdlib :class:`html.parser.HTMLParser` class instead of the ``html5lib`` package.

  For now, the deprecated ``html5lib`` code remains and can be used with the ``--use-deprecated=html5lib`` command line option. However, it will be removed in a future pip release. (`#10291 <https://github.com/pypa/pip/issues/10291>`_)
- Utilise ``rich`` for presenting pip's default download progress bar. (`#10462 <https://github.com/pypa/pip/issues/10462>`_)
- Present a better error message when an invalid wheel file is encountered, providing more context where the invalid wheel file is. (`#10535 <https://github.com/pypa/pip/issues/10535>`_)
- Documents the ``--require-virtualenv`` flag for ``pip install``. (`#10588 <https://github.com/pypa/pip/issues/10588>`_)
- ``pip install <tab>`` autocompletes paths. (`#10646 <https://github.com/pypa/pip/issues/10646>`_)
- Allow Python distributors to opt-out from or opt-in to the ``sysconfig`` installation scheme backend by setting ``sysconfig._PIP_USE_SYSCONFIG`` to ``True`` or ``False``. (`#10647 <https://github.com/pypa/pip/issues/10647>`_)
- Make it possible to deselect tests requiring cryptography package on systems where it cannot be installed. (`#10686 <https://github.com/pypa/pip/issues/10686>`_)
- Start using Rich for presenting error messages in a consistent format. (`#10703 <https://github.com/pypa/pip/issues/10703>`_)
- Improve presentation of errors from subprocesses. (`#10705 <https://github.com/pypa/pip/issues/10705>`_)
- Forward pip's verbosity configuration to VCS tools to control their output accordingly. (`#8819 <https://github.com/pypa/pip/issues/8819>`_)

Bug Fixes
---------

- Optimize installation order calculation to improve performance when installing requirements that form a complex dependency graph with a large amount of edges. (`#10557 <https://github.com/pypa/pip/issues/10557>`_)
- When a package is requested by the user for upgrade, correctly identify that the extra-ed variant of that same package depended by another user-requested package is requesting the same package, and upgrade it accordingly. (`#10613 <https://github.com/pypa/pip/issues/10613>`_)
- Prevent pip from installing yanked releases unless explicitly pinned via the ``==`` or ``===`` operators. (`#10617 <https://github.com/pypa/pip/issues/10617>`_)
- Stop backtracking on build failures, by instead surfacing them to the user and aborting immediately. This behaviour provides more immediate feedback when a package cannot be built due to missing build dependencies or platform incompatibility. (`#10655 <https://github.com/pypa/pip/issues/10655>`_)
- Silence ``Value for <location> does not match`` warning caused by an erroneous patch in Slackware-distributed Python 3.9. (`#10668 <https://github.com/pypa/pip/issues/10668>`_)
- Fix an issue where pip did not consider dependencies with and without extras to be equal (`#9644 <https://github.com/pypa/pip/issues/9644>`_)

Vendored Libraries
------------------

- Upgrade CacheControl to 0.12.10
- Upgrade certifi to 2021.10.8
- Upgrade distlib to 0.3.4
- Upgrade idna to 3.3
- Upgrade msgpack to 1.0.3
- Upgrade packaging to 21.3
- Upgrade platformdirs to 2.4.1
- Add pygments 2.11.2 as a vendored dependency.
- Tree-trim unused portions of vendored pygments, to reduce the distribution size.
- Upgrade pyparsing to 3.0.7
- Upgrade Requests to 2.27.1
- Upgrade resolvelib to 0.8.1
- Add rich 11.0.0 as a vendored dependency.
- Tree-trim unused portions of vendored rich, to reduce the distribution size.
- Add typing_extensions 4.0.1 as a vendored dependency.
- Upgrade urllib3 to 1.26.8


21.3.1 (2021-10-22)
===================


Bug Fixes
---------


- Always refuse installing or building projects that have no ``pyproject.toml`` nor
  ``setup.py``. (`#10531 <https://github.com/pypa/pip/issues/10531>`_)
- Tweak running-as-root detection, to check ``os.getuid`` if it exists, on Unix-y and non-Linux/non-MacOS machines. (`#10565 <https://github.com/pypa/pip/issues/10565>`_)
- When installing projects with a ``pyproject.toml`` in editable mode, and the build
  backend does not support :pep:`660`, prepare metadata using
  ``prepare_metadata_for_build_wheel`` instead of ``setup.py egg_info``. Also, refuse
  installing projects that only have a ``setup.cfg`` and no ``setup.py`` nor
  ``pyproject.toml``. These restore the pre-21.3 behaviour. (`#10573 <https://github.com/pypa/pip/issues/10573>`_)
- Restore compatibility of where configuration files are loaded from on MacOS (back to ``Library/Application Support/pip``, instead of ``Preferences/pip``). (`#10585 <https://github.com/pypa/pip/issues/10585>`_)

Vendored Libraries
------------------


- Upgrade pep517 to 0.12.0


21.3 (2021-10-11)
=================

Deprecations and Removals
-------------------------

- Improve deprecation warning regarding the copying of source trees when installing from a local directory. (`#10128 <https://github.com/pypa/pip/issues/10128>`_)
- Suppress location mismatch warnings when pip is invoked from a Python source
  tree, so ``ensurepip`` does not emit warnings on CPython ``make install``. (`#10270 <https://github.com/pypa/pip/issues/10270>`_)
- On Python 3.10 or later, the installation scheme backend has been changed to use
  ``sysconfig``. This is to anticipate the deprecation of ``distutils`` in Python
  3.10, and its scheduled removal in 3.12. For compatibility considerations, pip
  installations running on Python 3.9 or lower will continue to use ``distutils``. (`#10358 <https://github.com/pypa/pip/issues/10358>`_)
- Remove the ``--build-dir`` option and aliases, one last time. (`#10485 <https://github.com/pypa/pip/issues/10485>`_)
- In-tree builds are now the default. ``--use-feature=in-tree-build`` is now
  ignored. ``--use-deprecated=out-of-tree-build`` may be used temporarily to ease
  the transition. (`#10495 <https://github.com/pypa/pip/issues/10495>`_)
- Un-deprecate source distribution re-installation behaviour. (`#8711 <https://github.com/pypa/pip/issues/8711>`_)

Features
--------

- Replace vendored appdirs with platformdirs. (`#10202 <https://github.com/pypa/pip/issues/10202>`_)
- Support `PEP 610 <https://www.python.org/dev/peps/pep-0610/>`_ to detect
  editable installs in ``pip freeze`` and  ``pip list``. The ``pip list`` column output
  has a new ``Editable project location`` column, and the JSON output has a new
  ``editable_project_location`` field. (`#10249 <https://github.com/pypa/pip/issues/10249>`_)
- ``pip freeze`` will now always fallback to reporting the editable project
  location when it encounters a VCS error while analyzing an editable
  requirement. Before, it sometimes reported the requirement as non-editable. (`#10410 <https://github.com/pypa/pip/issues/10410>`_)
- ``pip show`` now sorts ``Requires`` and ``Required-By`` alphabetically. (`#10422 <https://github.com/pypa/pip/issues/10422>`_)
- Do not raise error when there are no files to remove with ``pip cache purge/remove``.
  Instead log a warning and continue (to log that we removed 0 files). (`#10459 <https://github.com/pypa/pip/issues/10459>`_)
- When backtracking during dependency resolution, prefer the dependencies which are involved in the most recent conflict. This can significantly reduce the amount of backtracking required. (`#10479 <https://github.com/pypa/pip/issues/10479>`_)
- Cache requirement objects, to improve performance reducing reparses of requirement strings. (`#10550 <https://github.com/pypa/pip/issues/10550>`_)
- Support editable installs for projects that have a ``pyproject.toml`` and use a
  build backend that supports :pep:`660`. (`#8212 <https://github.com/pypa/pip/issues/8212>`_)
- When a revision is specified in a Git URL, use git's partial clone feature to speed up source retrieval. (`#9086 <https://github.com/pypa/pip/issues/9086>`_)
- Add a ``--debug`` flag, to enable a mode that doesn't log errors and propagates them to the top level instead. This is primarily to aid with debugging pip's crashes. (`#9349 <https://github.com/pypa/pip/issues/9349>`_)
- If a host is explicitly specified as trusted by the user (via the --trusted-host option), cache HTTP responses from it in addition to HTTPS ones. (`#9498 <https://github.com/pypa/pip/issues/9498>`_)

Bug Fixes
---------

- Present a better error message, when a ``file:`` URL is not found. (`#10263 <https://github.com/pypa/pip/issues/10263>`_)
- Fix the auth credential cache to allow for the case in which
  the index url contains the username, but the password comes
  from an external source, such as keyring. (`#10269 <https://github.com/pypa/pip/issues/10269>`_)
- Fix double unescape of HTML ``data-requires-python`` and ``data-yanked`` attributes. (`#10378 <https://github.com/pypa/pip/issues/10378>`_)
- New resolver: Fixes depth ordering of packages during resolution, e.g. a dependency 2 levels deep will be ordered before a dependency 3 levels deep. (`#10482 <https://github.com/pypa/pip/issues/10482>`_)
- Correctly indent metadata preparation messages in pip output. (`#10524 <https://github.com/pypa/pip/issues/10524>`_)

Vendored Libraries
------------------

- Remove appdirs as a vendored dependency.
- Upgrade distlib to 0.3.3
- Upgrade distro to 1.6.0
- Patch pkg_resources to use platformdirs rather than appdirs.
- Add platformdirs as a vendored dependency.
- Upgrade progress to 1.6
- Upgrade resolvelib to 0.8.0
- Upgrade urllib3 to 1.26.7

Improved Documentation
----------------------

- Update links of setuptools as setuptools moved these documents. The Simple Repository link now points to PyPUG as that is the canonical place of packaging specification, and setuptools's ``easy_install`` is deprecated. (`#10430 <https://github.com/pypa/pip/issues/10430>`_)
- Create a "Build System Interface" reference section, for documenting how pip interacts with build systems. (`#10497 <https://github.com/pypa/pip/issues/10497>`_)


21.2.4 (2021-08-12)
===================

Bug Fixes
---------

- Fix 3.6.0 compatibility in link comparison logic. (`#10280 <https://github.com/pypa/pip/issues/10280>`_)


21.2.3 (2021-08-06)
===================

Bug Fixes
---------

- Modify the ``sysconfig.get_preferred_scheme`` function check to be
  compatible with CPython 3.10’s alphareleases. (`#10252 <https://github.com/pypa/pip/issues/10252>`_)


21.2.2 (2021-07-31)
===================

Bug Fixes
---------

- New resolver: When a package is specified with extras in constraints, and with
  extras in non-constraint requirements, the resolver now correctly identifies the
  constraint's existence and avoids backtracking. (`#10233 <https://github.com/pypa/pip/issues/10233>`_)


21.2.1 (2021-07-25)
===================

Process
-------

- The source distribution re-installation feature removal has been delayed to 21.3.


21.2 (2021-07-24)
=================

Process
-------

- ``pip freeze``, ``pip list``, and ``pip show`` no longer normalize underscore
  (``_``) in distribution names to dash (``-``). This is a side effect of the
  migration to ``importlib.metadata``, since the underscore-dash normalization
  behavior is non-standard and specific to setuptools. This should not affect
  other parts of pip (for example, when feeding the ``pip freeze`` result back
  into ``pip install``) since pip internally performs standard PEP 503
  normalization independently to setuptools.

Deprecations and Removals
-------------------------

- Git version parsing is now done with regular expression to prepare for the
  pending upstream removal of non-PEP-440 version parsing logic. (`#10117 <https://github.com/pypa/pip/issues/10117>`_)
- Re-enable the "Value for ... does not match" location warnings to field a new
  round of feedback for the ``distutils``-``sysconfig`` transition. (`#10151 <https://github.com/pypa/pip/issues/10151>`_)
- Remove deprecated ``--find-links`` option in ``pip freeze`` (`#9069 <https://github.com/pypa/pip/issues/9069>`_)

Features
--------

- New resolver: Loosen URL comparison logic when checking for direct URL reference
  equivalency. The logic includes the following notable characteristics:

  * The authentication part of the URL is explicitly ignored.
  * Most of the fragment part, including ``egg=``, is explicitly ignored. Only
    ``subdirectory=`` and hash values (e.g. ``sha256=``) are kept.
  * The query part of the URL is parsed to allow ordering differences. (`#10002 <https://github.com/pypa/pip/issues/10002>`_)
- Support TOML v1.0.0 syntax in ``pyproject.toml``. (`#10034 <https://github.com/pypa/pip/issues/10034>`_)
- Added a warning message for errors caused due to Long Paths being disabled on Windows. (`#10045 <https://github.com/pypa/pip/issues/10045>`_)
- Change the encoding of log file from default text encoding to UTF-8. (`#10071 <https://github.com/pypa/pip/issues/10071>`_)
- Log the resolved commit SHA when installing a package from a Git repository. (`#10149 <https://github.com/pypa/pip/issues/10149>`_)
- Add a warning when passing an invalid requirement to ``pip uninstall``. (`#4958 <https://github.com/pypa/pip/issues/4958>`_)
- Add new subcommand ``pip index`` used to interact with indexes, and implement
  ``pip index version`` to list available versions of a package. (`#7975 <https://github.com/pypa/pip/issues/7975>`_)
- When pip is asked to uninstall a project without the dist-info/RECORD file
  it will no longer traceback with FileNotFoundError,
  but it will provide a better error message instead, such as::

      ERROR: Cannot uninstall foobar 0.1, RECORD file not found. You might be able to recover from this via: 'pip install --force-reinstall --no-deps foobar==0.1'.

  When dist-info/INSTALLER is present and contains some useful information, the info is included in the error message instead::

      ERROR: Cannot uninstall foobar 0.1, RECORD file not found. Hint: The package was installed by rpm.

  (`#8954 <https://github.com/pypa/pip/issues/8954>`_)
- Add an additional level of verbosity. ``--verbose`` (and the shorthand ``-v``) now
  contains significantly less output, and users that need complete full debug-level output
  should pass it twice (``--verbose --verbose`` or ``-vv``). (`#9450 <https://github.com/pypa/pip/issues/9450>`_)
- New resolver: The order of dependencies resolution has been tweaked to traverse
  the dependency graph in a more breadth-first approach. (`#9455 <https://github.com/pypa/pip/issues/9455>`_)
- Make "yes" the default choice in ``pip uninstall``'s prompt. (`#9686 <https://github.com/pypa/pip/issues/9686>`_)
- Add a special error message when users forget the ``-r`` flag when installing. (`#9915 <https://github.com/pypa/pip/issues/9915>`_)
- New resolver: A distribution's ``Requires-Python`` metadata is now checked
  before its Python dependencies. This makes the resolver fail quicker when
  there's an interpreter version conflict. (`#9925 <https://github.com/pypa/pip/issues/9925>`_)
- Suppress "not on PATH" warning when ``--prefix`` is given. (`#9931 <https://github.com/pypa/pip/issues/9931>`_)
- Include ``rustc`` version in pip's ``User-Agent``, when the system has ``rustc``. (`#9987 <https://github.com/pypa/pip/issues/9987>`_)

Bug Fixes
---------

- Update vendored six to 1.16.0 and urllib3 to 1.26.5 (`#10043 <https://github.com/pypa/pip/issues/10043>`_)
- Correctly allow PEP 517 projects to be detected without warnings in ``pip freeze``. (`#10080 <https://github.com/pypa/pip/issues/10080>`_)
- Strip leading slash from a ``file://`` URL built from an path with the Windows
  drive notation. This fixes bugs where the ``file://`` URL cannot be correctly
  used as requirement, constraint, or index URLs on Windows. (`#10115 <https://github.com/pypa/pip/issues/10115>`_)
- New resolver: URL comparison logic now treats ``file://localhost/`` and
  ``file:///`` as equivalent to conform to RFC 8089. (`#10162 <https://github.com/pypa/pip/issues/10162>`_)
- Prefer credentials from the URL over the previously-obtained credentials from URLs of the same domain, so it is possible to use different credentials on the same index server for different ``--extra-index-url`` options. (`#3931 <https://github.com/pypa/pip/issues/3931>`_)
- Fix extraction of files with utf-8 encoded paths from tars. (`#7667 <https://github.com/pypa/pip/issues/7667>`_)
- Skip distutils configuration parsing on encoding errors. (`#8931 <https://github.com/pypa/pip/issues/8931>`_)
- New resolver: Detect an unnamed requirement is user-specified (by building its
  metadata for the project name) so it can be correctly ordered in the resolver. (`#9204 <https://github.com/pypa/pip/issues/9204>`_)
- Fix :ref:`pip freeze` to output packages :ref:`installed from git <vcs support>`
  in the correct ``git+protocol://git.example.com/MyProject#egg=MyProject`` format
  rather than the old and no longer supported ``git+git@`` format. (`#9822 <https://github.com/pypa/pip/issues/9822>`_)
- Fix warnings about install scheme selection for Python framework builds
  distributed by Apple's Command Line Tools. (`#9844 <https://github.com/pypa/pip/issues/9844>`_)
- Relax interpreter detection to quelch a location mismatch warning where PyPy
  is deliberately breaking backwards compatibility. (`#9845 <https://github.com/pypa/pip/issues/9845>`_)

Vendored Libraries
------------------

- Upgrade certifi to 2021.05.30.
- Upgrade idna to 3.2.
- Upgrade packaging to 21.0
- Upgrade requests to 2.26.0.
- Upgrade resolvelib to 0.7.1.
- Upgrade urllib3 to 1.26.6.


21.1.3 (2021-06-26)
===================

Bug Fixes
---------

- Remove unused optional ``tornado`` import in vendored ``tenacity`` to prevent old versions of Tornado from breaking pip. (`#10020 <https://github.com/pypa/pip/issues/10020>`_)
- Require ``setup.cfg``-only projects to be built via PEP 517, by requiring an explicit dependency on setuptools declared in pyproject.toml. (`#10031 <https://github.com/pypa/pip/issues/10031>`_)


21.1.2 (2021-05-23)
===================

Bug Fixes
---------

- New resolver: Correctly exclude an already installed package if its version is
  known to be incompatible to stop the dependency resolution process with a clear
  error message. (`#9841 <https://github.com/pypa/pip/issues/9841>`_)
- Allow ZIP to archive files with timestamps earlier than 1980. (`#9910 <https://github.com/pypa/pip/issues/9910>`_)
- Emit clearer error message when a project root does not contain either
  ``pyproject.toml``, ``setup.py`` or ``setup.cfg``. (`#9944 <https://github.com/pypa/pip/issues/9944>`_)
- Fix detection of existing standalone pip instance for PEP 517 builds. (`#9953 <https://github.com/pypa/pip/issues/9953>`_)


21.1.1 (2021-04-30)
===================

Deprecations and Removals
-------------------------

- Temporarily set the new "Value for ... does not match" location warnings level
  to *DEBUG*, to hide them from casual users. This prepares pip 21.1 for CPython
  inclusion, while pip maintainers digest the first intake of location mismatch
  issues for the ``distutils``-``sysconfig`` transition. (`#9912 <https://github.com/pypa/pip/issues/9912>`_)

Bug Fixes
---------

- This change fixes a bug on Python <=3.6.1 with a Typing feature added in 3.6.2 (`#9831 <https://github.com/pypa/pip/issues/9831>`_)
- Fix compatibility between distutils and sysconfig when the project name is unknown outside of a virtual environment. (`#9838 <https://github.com/pypa/pip/issues/9838>`_)
- Fix Python 3.6 compatibility when a PEP 517 build requirement itself needs to be
  built in an isolated environment. (`#9878 <https://github.com/pypa/pip/issues/9878>`_)


21.1 (2021-04-24)
=================

Process
-------

- Start installation scheme migration from ``distutils`` to ``sysconfig``. A
  warning is implemented to detect differences between the two implementations to
  encourage user reports, so we can avoid breakages before they happen.

Features
--------

- Add the ability for the new resolver to process URL constraints. (`#8253 <https://github.com/pypa/pip/issues/8253>`_)
- Add a feature ``--use-feature=in-tree-build`` to build local projects in-place
  when installing. This is expected to become the default behavior in pip 21.3;
  see `Installing from local packages <https://pip.pypa.io/en/stable/user_guide/#installing-from-local-packages>`_
  for more information. (`#9091 <https://github.com/pypa/pip/issues/9091>`_)
- Bring back the "(from versions: ...)" message, that was shown on resolution failures. (`#9139 <https://github.com/pypa/pip/issues/9139>`_)
- Add support for editable installs for project with only setup.cfg files. (`#9547 <https://github.com/pypa/pip/issues/9547>`_)
- Improve performance when picking the best file from indexes during ``pip install``. (`#9748 <https://github.com/pypa/pip/issues/9748>`_)
- Warn instead of erroring out when doing a PEP 517 build in presence of
  ``--build-option``. Warn when doing a PEP 517 build in presence of
  ``--global-option``. (`#9774 <https://github.com/pypa/pip/issues/9774>`_)

Bug Fixes
---------

- Fixed ``--target`` to work with ``--editable`` installs. (`#4390 <https://github.com/pypa/pip/issues/4390>`_)
- Add a warning, discouraging the usage of pip as root, outside a virtual environment. (`#6409 <https://github.com/pypa/pip/issues/6409>`_)
- Ignore ``.dist-info`` directories if the stem is not a valid Python distribution
  name, so they don't show up in e.g. ``pip freeze``. (`#7269 <https://github.com/pypa/pip/issues/7269>`_)
- Only query the keyring for URLs that actually trigger error 401.
  This prevents an unnecessary keyring unlock prompt on every pip install
  invocation (even with default index URL which is not password protected). (`#8090 <https://github.com/pypa/pip/issues/8090>`_)
- Prevent packages already-installed alongside with pip to be injected into an
  isolated build environment during build-time dependency population. (`#8214 <https://github.com/pypa/pip/issues/8214>`_)
- Fix ``pip freeze`` permission denied error in order to display an understandable error message and offer solutions. (`#8418 <https://github.com/pypa/pip/issues/8418>`_)
- Correctly uninstall script files (from setuptools' ``scripts`` argument), when installed with ``--user``. (`#8733 <https://github.com/pypa/pip/issues/8733>`_)
- New resolver: When a requirement is requested both via a direct URL
  (``req @ URL``) and via version specifier with extras (``req[extra]``), the
  resolver will now be able to use the URL to correctly resolve the requirement
  with extras. (`#8785 <https://github.com/pypa/pip/issues/8785>`_)
- New resolver: Show relevant entries from user-supplied constraint files in the
  error message to improve debuggability. (`#9300 <https://github.com/pypa/pip/issues/9300>`_)
- Avoid parsing version to make the version check more robust against lousily
  debundled downstream distributions. (`#9348 <https://github.com/pypa/pip/issues/9348>`_)
- ``--user`` is no longer suggested incorrectly when pip fails with a permission
  error in a virtual environment. (`#9409 <https://github.com/pypa/pip/issues/9409>`_)
- Fix incorrect reporting on ``Requires-Python`` conflicts. (`#9541 <https://github.com/pypa/pip/issues/9541>`_)
- Make wheel compatibility tag preferences more important than the build tag (`#9565 <https://github.com/pypa/pip/issues/9565>`_)
- Fix pip to work with warnings converted to errors. (`#9779 <https://github.com/pypa/pip/issues/9779>`_)
- **SECURITY**: Stop splitting on unicode separators in git references,
  which could be maliciously used to install a different revision on the
  repository. (`#9827 <https://github.com/pypa/pip/issues/9827>`_)

Vendored Libraries
------------------

- Update urllib3 to 1.26.4 to fix CVE-2021-28363
- Remove contextlib2.
- Upgrade idna to 3.1
- Upgrade pep517 to 0.10.0
- Upgrade vendored resolvelib to 0.7.0.
- Upgrade tenacity to 7.0.0

Improved Documentation
----------------------

- Update "setuptools extras" link to match upstream. (`#4822829F-6A45-4202-87BA-A80482DF6D4E <https://github.com/pypa/pip/issues/4822829F-6A45-4202-87BA-A80482DF6D4E>`_)
- Improve SSL Certificate Verification docs and ``--cert`` help text. (`#6720 <https://github.com/pypa/pip/issues/6720>`_)
- Add a section in the documentation to suggest solutions to the ``pip freeze`` permission denied issue. (`#8418 <https://github.com/pypa/pip/issues/8418>`_)
- Add warning about ``--extra-index-url`` and dependency confusion (`#9647 <https://github.com/pypa/pip/issues/9647>`_)
- Describe ``--upgrade-strategy`` and direct requirements explicitly; add a brief
  example. (`#9692 <https://github.com/pypa/pip/issues/9692>`_)


21.0.1 (2021-01-30)
===================

Bug Fixes
---------

- commands: debug: Use packaging.version.parse to compare between versions. (`#9461 <https://github.com/pypa/pip/issues/9461>`_)
- New resolver: Download and prepare a distribution only at the last possible
  moment to avoid unnecessary network access when the same version is already
  installed locally. (`#9516 <https://github.com/pypa/pip/issues/9516>`_)

Vendored Libraries
------------------

- Upgrade packaging to 20.9


21.0 (2021-01-23)
=================

Deprecations and Removals
-------------------------

- Drop support for Python 2. (`#6148 <https://github.com/pypa/pip/issues/6148>`_)
- Remove support for legacy wheel cache entries that were created with pip
  versions older than 20.0. (`#7502 <https://github.com/pypa/pip/issues/7502>`_)
- Remove support for VCS pseudo URLs editable requirements. It was emitting
  deprecation warning since version 20.0. (`#7554 <https://github.com/pypa/pip/issues/7554>`_)
- Modernise the codebase after Python 2. (`#8802 <https://github.com/pypa/pip/issues/8802>`_)
- Drop support for Python 3.5. (`#9189 <https://github.com/pypa/pip/issues/9189>`_)
- Remove the VCS export feature that was used only with editable VCS
  requirements and had correctness issues. (`#9338 <https://github.com/pypa/pip/issues/9338>`_)

Features
--------

- Add ``--ignore-requires-python`` support to pip download. (`#1884 <https://github.com/pypa/pip/issues/1884>`_)
- New resolver: Error message shown when a wheel contains inconsistent metadata
  is made more helpful by including both values from the file name and internal
  metadata. (`#9186 <https://github.com/pypa/pip/issues/9186>`_)

Bug Fixes
---------

- Fix a regression that made ``pip wheel`` do a VCS export instead of a VCS clone
  for editable requirements. This broke VCS requirements that need the VCS
  information to build correctly. (`#9273 <https://github.com/pypa/pip/issues/9273>`_)
- Fix ``pip download`` of editable VCS requirements that need VCS information
  to build correctly. (`#9337 <https://github.com/pypa/pip/issues/9337>`_)

Vendored Libraries
------------------

- Upgrade msgpack to 1.0.2.
- Upgrade requests to 2.25.1.

Improved Documentation
----------------------

- Render the unreleased pip version change notes on the news page in docs. (`#9172 <https://github.com/pypa/pip/issues/9172>`_)
- Fix broken email link in docs feedback banners. (`#9343 <https://github.com/pypa/pip/issues/9343>`_)


20.3.4 (2021-01-23)
===================

Features
--------

- ``pip wheel`` now verifies the built wheel contains valid metadata, and can be
  installed by a subsequent ``pip install``. This can be disabled with
  ``--no-verify``. (`#9206 <https://github.com/pypa/pip/issues/9206>`_)
- Improve presentation of XMLRPC errors in pip search. (`#9315 <https://github.com/pypa/pip/issues/9315>`_)

Bug Fixes
---------

- Fixed hanging VCS subprocess calls when the VCS outputs a large amount of data
  on stderr. Restored logging of VCS errors that was inadvertently removed in pip
  20.2. (`#8876 <https://github.com/pypa/pip/issues/8876>`_)
- Fix error when an existing incompatibility is unable to be applied to a backtracked state. (`#9180 <https://github.com/pypa/pip/issues/9180>`_)
- New resolver: Discard a faulty distribution, instead of quitting outright.
  This implementation is taken from 20.2.2, with a fix that always makes the
  resolver iterate through candidates from indexes lazily, to avoid downloading
  candidates we do not need. (`#9203 <https://github.com/pypa/pip/issues/9203>`_)
- New resolver: Discard a source distribution if it fails to generate metadata,
  instead of quitting outright. This implementation is taken from 20.2.2, with a
  fix that always makes the resolver iterate through candidates from indexes
  lazily, to avoid downloading candidates we do not need. (`#9246 <https://github.com/pypa/pip/issues/9246>`_)

Vendored Libraries
------------------

- Upgrade resolvelib to 0.5.4.


20.3.3 (2020-12-15)
===================

Bug Fixes
---------

- Revert "Skip candidate not providing valid metadata", as that caused pip to be overeager about downloading from the package index. (`#9264 <https://github.com/pypa/pip/issues/9264>`_)


20.3.2 (2020-12-15)
===================

Features
--------

- New resolver: Resolve direct and pinned (``==`` or ``===``) requirements first
  to improve resolver performance. (`#9185 <https://github.com/pypa/pip/issues/9185>`_)
- Add a mechanism to delay resolving certain packages, and use it for setuptools. (`#9249 <https://github.com/pypa/pip/issues/9249>`_)

Bug Fixes
---------

- New resolver: The "Requirement already satisfied" log is not printed only once
  for each package during resolution. (`#9117 <https://github.com/pypa/pip/issues/9117>`_)
- Fix crash when logic for redacting authentication information from URLs
  in ``--help`` is given a list of strings, instead of a single string. (`#9191 <https://github.com/pypa/pip/issues/9191>`_)
- New resolver: Correctly implement PEP 592. Do not return yanked versions from
  an index, unless the version range can only be satisfied by yanked candidates. (`#9203 <https://github.com/pypa/pip/issues/9203>`_)
- New resolver: Make constraints also apply to package variants with extras, so
  the resolver correctly avoids backtracking on them. (`#9232 <https://github.com/pypa/pip/issues/9232>`_)
- New resolver: Discard a candidate if it fails to provide metadata from source,
  or if the provided metadata is inconsistent, instead of quitting outright. (`#9246 <https://github.com/pypa/pip/issues/9246>`_)

Vendored Libraries
------------------

- Update vendoring to 20.8

Improved Documentation
----------------------

- Update documentation to reflect that pip still uses legacy resolver by default in Python 2 environments. (`#9269 <https://github.com/pypa/pip/issues/9269>`_)


20.3.1 (2020-12-03)
===================

Deprecations and Removals
-------------------------

- The --build-dir option has been restored as a no-op, to soften the transition
  for tools that still used it. (`#9193 <https://github.com/pypa/pip/issues/9193>`_)


20.3 (2020-11-30)
=================

Deprecations and Removals
-------------------------

- Remove --unstable-feature flag as it has been deprecated. (`#9133 <https://github.com/pypa/pip/issues/9133>`_)

Features
--------

- Add support for :pep:`600`: Future 'manylinux' Platform Tags for Portable Linux Built Distributions. (`#9077 <https://github.com/pypa/pip/issues/9077>`_)
- The new resolver now resolves packages in a deterministic order. (`#9100 <https://github.com/pypa/pip/issues/9100>`_)
- Add support for MacOS Big Sur compatibility tags. (`#9138 <https://github.com/pypa/pip/issues/9138>`_)

Bug Fixes
---------

- New Resolver: Rework backtracking and state management, to avoid getting stuck in an infinite loop. (`#9011 <https://github.com/pypa/pip/issues/9011>`_)
- New resolver: Check version equality with ``packaging.version`` to avoid edge
  cases if a wheel used different version normalization logic in its filename
  and metadata. (`#9083 <https://github.com/pypa/pip/issues/9083>`_)
- New resolver: Show each requirement in the conflict error message only once to reduce cluttering. (`#9101 <https://github.com/pypa/pip/issues/9101>`_)
- Fix a regression that made ``pip wheel`` generate zip files of editable
  requirements in the wheel directory. (`#9122 <https://github.com/pypa/pip/issues/9122>`_)
- Fix ResourceWarning in VCS subprocesses (`#9156 <https://github.com/pypa/pip/issues/9156>`_)
- Redact auth from URL in help message. (`#9160 <https://github.com/pypa/pip/issues/9160>`_)
- New Resolver: editable installations are done, regardless of whether
  the already-installed distribution is editable. (`#9169 <https://github.com/pypa/pip/issues/9169>`_)

Vendored Libraries
------------------

- Upgrade certifi to 2020.11.8
- Upgrade colorama to 0.4.4
- Upgrade packaging to 20.7
- Upgrade pep517 to 0.9.1
- Upgrade requests to 2.25.0
- Upgrade resolvelib to 0.5.3
- Upgrade toml to 0.10.2
- Upgrade urllib3 to 1.26.2

Improved Documentation
----------------------

- Add a section to the User Guide to cover backtracking during dependency resolution. (`#9039 <https://github.com/pypa/pip/issues/9039>`_)
- Reorder and revise installation instructions to make them easier to follow. (`#9131 <https://github.com/pypa/pip/issues/9131>`_)


20.3b1 (2020-10-31)
===================

Deprecations and Removals
-------------------------

- ``pip freeze`` will stop filtering the ``pip``, ``setuptools``, ``distribute`` and ``wheel`` packages from ``pip freeze`` output in a future version.
  To keep the previous behavior, users should use the new ``--exclude`` option. (`#4256 <https://github.com/pypa/pip/issues/4256>`_)
- Deprecate support for Python 3.5 (`#8181 <https://github.com/pypa/pip/issues/8181>`_)
- Document that certain removals can be fast tracked. (`#8417 <https://github.com/pypa/pip/issues/8417>`_)
- Document that Python versions are generally supported until PyPI usage falls below 5%. (`#8927 <https://github.com/pypa/pip/issues/8927>`_)
- Deprecate ``--find-links`` option in ``pip freeze`` (`#9069 <https://github.com/pypa/pip/issues/9069>`_)

Features
--------

- Add ``--exclude`` option to ``pip freeze`` and ``pip list`` commands to explicitly exclude packages from the output. (`#4256 <https://github.com/pypa/pip/issues/4256>`_)
- Allow multiple values for --abi and --platform. (`#6121 <https://github.com/pypa/pip/issues/6121>`_)
- Add option ``--format`` to subcommand ``list`` of ``pip  cache``, with ``abspath`` choice to output the full path of a wheel file. (`#8355 <https://github.com/pypa/pip/issues/8355>`_)
- Improve error message friendliness when an environment has packages with
  corrupted metadata. (`#8676 <https://github.com/pypa/pip/issues/8676>`_)
- Make the ``setup.py install`` deprecation warning less noisy. We warn only
  when ``setup.py install`` succeeded and ``setup.py bdist_wheel`` failed, as
  situations where both fails are most probably irrelevant to this deprecation. (`#8752 <https://github.com/pypa/pip/issues/8752>`_)
- Check the download directory for existing wheels to possibly avoid
  fetching metadata when the ``fast-deps`` feature is used with
  ``pip wheel`` and ``pip download``. (`#8804 <https://github.com/pypa/pip/issues/8804>`_)
- When installing a git URL that refers to a commit that is not available locally
  after git clone, attempt to fetch it from the remote. (`#8815 <https://github.com/pypa/pip/issues/8815>`_)
- Include http subdirectory in ``pip cache info`` and ``pip cache purge`` commands. (`#8892 <https://github.com/pypa/pip/issues/8892>`_)
- Cache package listings on index packages so they are guaranteed to stay stable
  during a pip command session. This also improves performance when a index page
  is accessed multiple times during the command session. (`#8905 <https://github.com/pypa/pip/issues/8905>`_)
- New resolver: Tweak resolution logic to improve user experience when
  user-supplied requirements conflict. (`#8924 <https://github.com/pypa/pip/issues/8924>`_)
- Support Python 3.9. (`#8971 <https://github.com/pypa/pip/issues/8971>`_)
- Log an informational message when backtracking takes multiple rounds on a specific package. (`#8975 <https://github.com/pypa/pip/issues/8975>`_)
- Switch to the new dependency resolver by default. (`#9019 <https://github.com/pypa/pip/issues/9019>`_)
- Remove the ``--build-dir`` option, as per the deprecation. (`#9049 <https://github.com/pypa/pip/issues/9049>`_)

Bug Fixes
---------

- Propagate ``--extra-index-url`` from requirements file properly to session auth,
  so that keyring auth will work as expected. (`#8103 <https://github.com/pypa/pip/issues/8103>`_)
- Allow specifying verbosity and quiet level via configuration files
  and environment variables. Previously these options were treated as
  boolean values when read from there while through CLI the level can be
  specified. (`#8578 <https://github.com/pypa/pip/issues/8578>`_)
- Only converts Windows path to unicode on Python 2 to avoid regressions when a
  POSIX environment does not configure the file system encoding correctly. (`#8658 <https://github.com/pypa/pip/issues/8658>`_)
- List downloaded distributions before exiting ``pip download``
  when using the new resolver to make the behavior the same as
  that on the legacy resolver. (`#8696 <https://github.com/pypa/pip/issues/8696>`_)
- New resolver: Pick up hash declarations in constraints files and use them to
  filter available distributions. (`#8792 <https://github.com/pypa/pip/issues/8792>`_)
- Avoid polluting the destination directory by resolution artifacts
  when the new resolver is used for ``pip download`` or ``pip wheel``. (`#8827 <https://github.com/pypa/pip/issues/8827>`_)
- New resolver: If a package appears multiple times in user specification with
  different ``--hash`` options, only hashes that present in all specifications
  should be allowed. (`#8839 <https://github.com/pypa/pip/issues/8839>`_)
- Tweak the output during dependency resolution in the new resolver. (`#8861 <https://github.com/pypa/pip/issues/8861>`_)
- Correctly search for installed distributions in new resolver logic in order
  to not miss packages (virtualenv packages from system-wide-packages for example) (`#8963 <https://github.com/pypa/pip/issues/8963>`_)
- Do not fail in pip freeze when encountering a ``direct_url.json`` metadata file
  with editable=True. Render it as a non-editable ``file://`` URL until modern
  editable installs are standardized and supported. (`#8996 <https://github.com/pypa/pip/issues/8996>`_)

Vendored Libraries
------------------

- Fix devendoring instructions to explicitly state that ``vendor.txt`` should not be removed.
  It is mandatory for ``pip debug`` command.

Improved Documentation
----------------------

- Add documentation for '.netrc' support. (`#7231 <https://github.com/pypa/pip/issues/7231>`_)
- Add OS tabs for OS-specific commands. (`#7311 <https://github.com/pypa/pip/issues/7311>`_)
- Add note and example on keyring support for index basic-auth (`#8636 <https://github.com/pypa/pip/issues/8636>`_)
- Added initial UX feedback widgets to docs. (`#8783 <https://github.com/pypa/pip/issues/8783>`_, `#8848 <https://github.com/pypa/pip/issues/8848>`_)
- Add ux documentation (`#8807 <https://github.com/pypa/pip/issues/8807>`_)
- Update user docs to reflect new resolver as default in 20.3. (`#9044 <https://github.com/pypa/pip/issues/9044>`_)
- Improve migration guide to reflect changes in new resolver behavior. (`#9056 <https://github.com/pypa/pip/issues/9056>`_)


20.2.4 (2020-10-16)
===================

Deprecations and Removals
-------------------------

- Document that certain removals can be fast tracked. (`#8417 <https://github.com/pypa/pip/issues/8417>`_)
- Document that Python versions are generally supported until PyPI usage falls below 5%. (`#8927 <https://github.com/pypa/pip/issues/8927>`_)

Features
--------

- New resolver: Avoid accessing indexes when the installed candidate is preferred
  and considered good enough. (`#8023 <https://github.com/pypa/pip/issues/8023>`_)
- Improve error message friendliness when an environment has packages with
  corrupted metadata. (`#8676 <https://github.com/pypa/pip/issues/8676>`_)
- Cache package listings on index packages so they are guaranteed to stay stable
  during a pip command session. This also improves performance when a index page
  is accessed multiple times during the command session. (`#8905 <https://github.com/pypa/pip/issues/8905>`_)
- New resolver: Tweak resolution logic to improve user experience when
  user-supplied requirements conflict. (`#8924 <https://github.com/pypa/pip/issues/8924>`_)

Bug Fixes
---------

- New resolver: Correctly respect ``Requires-Python`` metadata to reject
  incompatible packages in ``--no-deps`` mode. (`#8758 <https://github.com/pypa/pip/issues/8758>`_)
- New resolver: Pick up hash declarations in constraints files and use them to
  filter available distributions. (`#8792 <https://github.com/pypa/pip/issues/8792>`_)
- New resolver: If a package appears multiple times in user specification with
  different ``--hash`` options, only hashes that present in all specifications
  should be allowed. (`#8839 <https://github.com/pypa/pip/issues/8839>`_)

Improved Documentation
----------------------

- Add ux documentation (`#8807 <https://github.com/pypa/pip/issues/8807>`_)


20.2.3 (2020-09-08)
===================

Deprecations and Removals
-------------------------

- Deprecate support for Python 3.5 (`#8181 <https://github.com/pypa/pip/issues/8181>`_)

Features
--------

- Make the ``setup.py install`` deprecation warning less noisy. We warn only
  when ``setup.py install`` succeeded and ``setup.py bdist_wheel`` failed, as
  situations where both fails are most probably irrelevant to this deprecation. (`#8752 <https://github.com/pypa/pip/issues/8752>`_)


20.2.2 (2020-08-11)
===================

Bug Fixes
---------

- Only attempt to use the keyring once and if it fails, don't try again.
  This prevents spamming users with several keyring unlock prompts when they
  cannot unlock or don't want to do so. (`#8090 <https://github.com/pypa/pip/issues/8090>`_)
- Fix regression that distributions in system site-packages are not correctly
  found when a virtual environment is configured with ``system-site-packages``
  on. (`#8695 <https://github.com/pypa/pip/issues/8695>`_)
- Disable caching for range requests, which causes corrupted wheels
  when pip tries to obtain metadata using the feature ``fast-deps``. (`#8701 <https://github.com/pypa/pip/issues/8701>`_, `#8716 <https://github.com/pypa/pip/issues/8716>`_)
- Always use UTF-8 to read ``pyvenv.cfg`` to match the built-in ``venv``. (`#8717 <https://github.com/pypa/pip/issues/8717>`_)
- 2020 Resolver: Correctly handle marker evaluation in constraints and exclude
  them if their markers do not match the current environment. (`#8724 <https://github.com/pypa/pip/issues/8724>`_)


20.2.1 (2020-08-04)
===================

Features
--------

- Ignore require-virtualenv in ``pip list`` (`#8603 <https://github.com/pypa/pip/issues/8603>`_)

Bug Fixes
---------

- Correctly find already-installed distributions with dot (``.``) in the name
  and uninstall them when needed. (`#8645 <https://github.com/pypa/pip/issues/8645>`_)
- Trace a better error message on installation failure due to invalid ``.data``
  files in wheels. (`#8654 <https://github.com/pypa/pip/issues/8654>`_)
- Fix SVN version detection for alternative SVN distributions. (`#8665 <https://github.com/pypa/pip/issues/8665>`_)
- New resolver: Correctly include the base package when specified with extras
  in ``--no-deps`` mode. (`#8677 <https://github.com/pypa/pip/issues/8677>`_)
- Use UTF-8 to handle ZIP archive entries on Python 2 according to PEP 427, so
  non-ASCII paths can be resolved as expected. (`#8684 <https://github.com/pypa/pip/issues/8684>`_)

Improved Documentation
----------------------

- Add details on old resolver deprecation and removal to migration documentation. (`#8371 <https://github.com/pypa/pip/issues/8371>`_)
- Fix feature flag name in docs. (`#8660 <https://github.com/pypa/pip/issues/8660>`_)


20.2 (2020-07-29)
=================

Deprecations and Removals
-------------------------

- Deprecate setup.py-based builds that do not generate an ``.egg-info`` directory. (`#6998 <https://github.com/pypa/pip/issues/6998>`_, `#8617 <https://github.com/pypa/pip/issues/8617>`_)
- Disallow passing install-location-related arguments in ``--install-options``. (`#7309 <https://github.com/pypa/pip/issues/7309>`_)
- Add deprecation warning for invalid requirements format "base>=1.0[extra]" (`#8288 <https://github.com/pypa/pip/issues/8288>`_)
- Deprecate legacy setup.py install when building a wheel failed for source
  distributions without pyproject.toml (`#8368 <https://github.com/pypa/pip/issues/8368>`_)
- Deprecate -b/--build/--build-dir/--build-directory. Its current behaviour is confusing
  and breaks in case different versions of the same distribution need to be built during
  the resolution process. Using the TMPDIR/TEMP/TMP environment variable, possibly
  combined with --no-clean covers known use cases. (`#8372 <https://github.com/pypa/pip/issues/8372>`_)
- Remove undocumented and deprecated option ``--always-unzip`` (`#8408 <https://github.com/pypa/pip/issues/8408>`_)

Features
--------

- Log debugging information about pip, in ``pip install --verbose``. (`#3166 <https://github.com/pypa/pip/issues/3166>`_)
- Refine error messages to avoid showing Python tracebacks when an HTTP error occurs. (`#5380 <https://github.com/pypa/pip/issues/5380>`_)
- Install wheel files directly instead of extracting them to a temp directory. (`#6030 <https://github.com/pypa/pip/issues/6030>`_)
- Add a beta version of pip's next-generation dependency resolver.

  Move pip's new resolver into beta, remove the
  ``--unstable-feature=resolver`` flag, and enable the
  ``--use-feature=2020-resolver`` flag. The new resolver is
  significantly stricter and more consistent when it receives
  incompatible instructions, and reduces support for certain kinds of
  :ref:`Constraints Files`, so some workarounds and workflows may
  break. More details about how to test and migrate, and how to report
  issues, at :ref:`Resolver changes 2020` . Maintainers are preparing to
  release pip 20.3, with the new resolver on by default, in October. (`#6536 <https://github.com/pypa/pip/issues/6536>`_)
- Introduce a new ResolutionImpossible error, raised when pip encounters un-satisfiable dependency conflicts (`#8546 <https://github.com/pypa/pip/issues/8546>`_, `#8377 <https://github.com/pypa/pip/issues/8377>`_)
- Add a subcommand ``debug`` to ``pip config`` to list available configuration sources and the key-value pairs defined in them. (`#6741 <https://github.com/pypa/pip/issues/6741>`_)
- Warn if index pages have unexpected content-type (`#6754 <https://github.com/pypa/pip/issues/6754>`_)
- Allow specifying ``--prefer-binary`` option in a requirements file (`#7693 <https://github.com/pypa/pip/issues/7693>`_)
- Generate PEP 376 REQUESTED metadata for user supplied requirements installed
  by pip. (`#7811 <https://github.com/pypa/pip/issues/7811>`_)
- Warn if package url is a vcs or an archive url with invalid scheme (`#8128 <https://github.com/pypa/pip/issues/8128>`_)
- Parallelize network operations in ``pip list``. (`#8504 <https://github.com/pypa/pip/issues/8504>`_)
- Allow the new resolver to obtain dependency information through wheels
  lazily downloaded using HTTP range requests.  To enable this feature,
  invoke ``pip`` with ``--use-feature=fast-deps``. (`#8588 <https://github.com/pypa/pip/issues/8588>`_)
- Support ``--use-feature`` in requirements files (`#8601 <https://github.com/pypa/pip/issues/8601>`_)

Bug Fixes
---------

- Use canonical package names while looking up already installed packages. (`#5021 <https://github.com/pypa/pip/issues/5021>`_)
- Fix normalizing path on Windows when installing package on another logical disk. (`#7625 <https://github.com/pypa/pip/issues/7625>`_)
- The VCS commands run by pip as subprocesses don't merge stdout and stderr anymore, improving the output parsing by subsequent commands. (`#7968 <https://github.com/pypa/pip/issues/7968>`_)
- Correctly treat non-ASCII entry point declarations in wheels so they can be
  installed on Windows. (`#8342 <https://github.com/pypa/pip/issues/8342>`_)
- Update author email in config and tests to reflect decommissioning of pypa-dev list. (`#8454 <https://github.com/pypa/pip/issues/8454>`_)
- Headers provided by wheels in .data directories are now correctly installed
  into the user-provided locations, such as ``--prefix``, instead of the virtual
  environment pip is running in. (`#8521 <https://github.com/pypa/pip/issues/8521>`_)

Vendored Libraries
------------------

- Vendored htmlib5 no longer imports deprecated xml.etree.cElementTree on Python 3.
- Upgrade appdirs to 1.4.4
- Upgrade certifi to 2020.6.20
- Upgrade distlib to 0.3.1
- Upgrade html5lib to 1.1
- Upgrade idna to 2.10
- Upgrade packaging to 20.4
- Upgrade requests to 2.24.0
- Upgrade six to 1.15.0
- Upgrade toml to 0.10.1
- Upgrade urllib3 to 1.25.9

Improved Documentation
----------------------

- Add ``--no-input`` option to pip docs (`#7688 <https://github.com/pypa/pip/issues/7688>`_)
- List of options supported in requirements file are extracted from source of truth,
  instead of being maintained manually. (`#7908 <https://github.com/pypa/pip/issues/7908>`_)
- Fix pip config docstring so that the subcommands render correctly in the docs (`#8072 <https://github.com/pypa/pip/issues/8072>`_)
- replace links to the old pypa-dev mailing list with https://mail.python.org/mailman3/lists/distutils-sig.python.org/ (`#8353 <https://github.com/pypa/pip/issues/8353>`_)
- Fix example for defining multiple values for options which support them (`#8373 <https://github.com/pypa/pip/issues/8373>`_)
- Add documentation for the ResolutionImpossible error that helps the user fix dependency conflicts (`#8459 <https://github.com/pypa/pip/issues/8459>`_)
- Add feature flags to docs (`#8512 <https://github.com/pypa/pip/issues/8512>`_)
- Document how to install package extras from git branch and source distributions. (`#8576 <https://github.com/pypa/pip/issues/8576>`_)


20.2b1 (2020-05-21)
===================

Bug Fixes
---------

- Correctly treat wheels containing non-ASCII file contents so they can be
  installed on Windows. (`#5712 <https://github.com/pypa/pip/issues/5712>`_)
- Prompt the user for password if the keyring backend doesn't return one (`#7998 <https://github.com/pypa/pip/issues/7998>`_)

Improved Documentation
----------------------

- Add GitHub issue template for reporting when the dependency resolver fails (`#8207 <https://github.com/pypa/pip/issues/8207>`_)

20.1.1 (2020-05-19)
===================

Deprecations and Removals
-------------------------

- Revert building of local directories in place, restoring the pre-20.1
  behaviour of copying to a temporary directory. (`#7555 <https://github.com/pypa/pip/issues/7555>`_)
- Drop parallelization from ``pip list --outdated``. (`#8167 <https://github.com/pypa/pip/issues/8167>`_)

Bug Fixes
---------

- Fix metadata permission issues when umask has the executable bit set. (`#8164 <https://github.com/pypa/pip/issues/8164>`_)
- Avoid unnecessary message about the wheel package not being installed
  when a wheel would not have been built. Additionally, clarify the message. (`#8178 <https://github.com/pypa/pip/issues/8178>`_)


20.1 (2020-04-28)
=================

Process
-------

- Document that pip 21.0 will drop support for Python 2.7.

Features
--------

- Add ``pip cache dir`` to show the cache directory. (`#7350 <https://github.com/pypa/pip/issues/7350>`_)

Bug Fixes
---------

- Abort pip cache commands early when cache is disabled. (`#8124 <https://github.com/pypa/pip/issues/8124>`_)
- Correctly set permissions on metadata files during wheel installation,
  to permit non-privileged users to read from system site-packages. (`#8139 <https://github.com/pypa/pip/issues/8139>`_)


20.1b1 (2020-04-21)
===================

Deprecations and Removals
-------------------------

- Remove emails from AUTHORS.txt to prevent usage for spamming, and only populate names in AUTHORS.txt at time of release (`#5979 <https://github.com/pypa/pip/issues/5979>`_)
- Remove deprecated ``--skip-requirements-regex`` option. (`#7297 <https://github.com/pypa/pip/issues/7297>`_)
- Building of local directories is now done in place, instead of a temporary
  location containing a copy of the directory tree. (`#7555 <https://github.com/pypa/pip/issues/7555>`_)
- Remove unused ``tests/scripts/test_all_pip.py`` test script and the ``tests/scripts`` folder. (`#7680 <https://github.com/pypa/pip/issues/7680>`_)

Features
--------

- pip now implements PEP 610, so ``pip freeze`` has better fidelity
  in presence of distributions installed from Direct URL requirements. (`#609 <https://github.com/pypa/pip/issues/609>`_)
- Add ``pip cache`` command for inspecting/managing pip's wheel cache. (`#6391 <https://github.com/pypa/pip/issues/6391>`_)
- Raise error if ``--user`` and ``--target`` are used together in ``pip install`` (`#7249 <https://github.com/pypa/pip/issues/7249>`_)
- Significantly improve performance when ``--find-links`` points to a very large HTML page. (`#7729 <https://github.com/pypa/pip/issues/7729>`_)
- Indicate when wheel building is skipped, due to lack of the ``wheel`` package. (`#7768 <https://github.com/pypa/pip/issues/7768>`_)
- Change default behaviour to always cache responses from trusted-host source. (`#7847 <https://github.com/pypa/pip/issues/7847>`_)
- An alpha version of a new resolver is available via ``--unstable-feature=resolver``. (`#988 <https://github.com/pypa/pip/issues/988>`_)

Bug Fixes
---------

- Correctly freeze a VCS editable package when it is nested inside another VCS repository. (`#3988 <https://github.com/pypa/pip/issues/3988>`_)
- Correctly handle ``%2F`` in URL parameters to avoid accidentally unescape them
  into ``/``. (`#6446 <https://github.com/pypa/pip/issues/6446>`_)
- Reject VCS URLs with an empty revision. (`#7402 <https://github.com/pypa/pip/issues/7402>`_)
- Warn when an invalid URL is passed with ``--index-url`` (`#7430 <https://github.com/pypa/pip/issues/7430>`_)
- Use better mechanism for handling temporary files, when recording metadata
  about installed files (RECORD) and the installer (INSTALLER). (`#7699 <https://github.com/pypa/pip/issues/7699>`_)
- Correctly detect global site-packages availability of virtual environments
  created by PyPA’s virtualenv>=20.0. (`#7718 <https://github.com/pypa/pip/issues/7718>`_)
- Remove current directory from ``sys.path`` when invoked as ``python -m pip <command>`` (`#7731 <https://github.com/pypa/pip/issues/7731>`_)
- Stop failing uninstallation, when trying to remove non-existent files. (`#7856 <https://github.com/pypa/pip/issues/7856>`_)
- Prevent an infinite recursion with ``pip wheel`` when ``$TMPDIR`` is within the source directory. (`#7872 <https://github.com/pypa/pip/issues/7872>`_)
- Significantly speedup ``pip list --outdated`` by parallelizing index interaction. (`#7962 <https://github.com/pypa/pip/issues/7962>`_)
- Improve Windows compatibility when detecting writability in folder. (`#8013 <https://github.com/pypa/pip/issues/8013>`_)

Vendored Libraries
------------------

- Update semi-supported debundling script to reflect that appdirs is vendored.
- Add ResolveLib as a vendored dependency.
- Upgrade certifi to 2020.04.05.1
- Upgrade contextlib2 to 0.6.0.post1
- Upgrade distro to 1.5.0.
- Upgrade idna to 2.9.
- Upgrade msgpack to 1.0.0.
- Upgrade packaging to 20.3.
- Upgrade pep517 to 0.8.2.
- Upgrade pyparsing to 2.4.7.
- Remove pytoml as a vendored dependency.
- Upgrade requests to 2.23.0.
- Add toml as a vendored dependency.
- Upgrade urllib3 to 1.25.8.

Improved Documentation
----------------------

- Emphasize that VCS URLs using git, git+git and git+http are insecure due to
  lack of authentication and encryption (`#1983 <https://github.com/pypa/pip/issues/1983>`_)
- Clarify the usage of --no-binary command. (`#3191 <https://github.com/pypa/pip/issues/3191>`_)
- Clarify the usage of freeze command in the example of Using pip in your program (`#7008 <https://github.com/pypa/pip/issues/7008>`_)
- Add a "Copyright" page. (`#7767 <https://github.com/pypa/pip/issues/7767>`_)
- Added example of defining multiple values for options which support them (`#7803 <https://github.com/pypa/pip/issues/7803>`_)


20.0.2 (2020-01-24)
===================

Bug Fixes
---------

- Fix a regression in generation of compatibility tags. (`#7626 <https://github.com/pypa/pip/issues/7626>`_)

Vendored Libraries
------------------

- Upgrade packaging to 20.1


20.0.1 (2020-01-21)
===================

Bug Fixes
---------

- Rename an internal module, to avoid ImportErrors due to improper uninstallation. (`#7621 <https://github.com/pypa/pip/issues/7621>`_)


20.0 (2020-01-21)
=================

Process
-------

- Switch to a dedicated CLI tool for vendoring dependencies.

Deprecations and Removals
-------------------------

- Remove wheel tag calculation from pip and use ``packaging.tags``. This
  should provide more tags ordered better than in prior releases. (`#6908 <https://github.com/pypa/pip/issues/6908>`_)
- Deprecate setup.py-based builds that do not generate an ``.egg-info`` directory. (`#6998 <https://github.com/pypa/pip/issues/6998>`_)
- The pip>=20 wheel cache is not retro-compatible with previous versions. Until
  pip 21.0, pip will continue to take advantage of existing legacy cache
  entries. (`#7296 <https://github.com/pypa/pip/issues/7296>`_)
- Deprecate undocumented ``--skip-requirements-regex`` option. (`#7297 <https://github.com/pypa/pip/issues/7297>`_)
- Deprecate passing install-location-related options via ``--install-option``. (`#7309 <https://github.com/pypa/pip/issues/7309>`_)
- Use literal "abi3" for wheel tag on CPython 3.x, to align with PEP 384
  which only defines it for this platform. (`#7327 <https://github.com/pypa/pip/issues/7327>`_)
- Remove interpreter-specific major version tag e.g. ``cp3-none-any``
  from consideration. This behavior was not documented strictly, and this
  tag in particular is `not useful <https://snarky.ca/the-challenges-in-designing-a-library-for-pep-425/>`_.
  Anyone with a use case can create an issue with pypa/packaging. (`#7355 <https://github.com/pypa/pip/issues/7355>`_)
- Wheel processing no longer permits wheels containing more than one top-level
  .dist-info directory. (`#7487 <https://github.com/pypa/pip/issues/7487>`_)
- Support for the ``git+git@`` form of VCS requirement is being deprecated and
  will be removed in pip 21.0. Switch to ``git+https://`` or
  ``git+ssh://``. ``git+git://`` also works but its use is discouraged as it is
  insecure. (`#7543 <https://github.com/pypa/pip/issues/7543>`_)

Features
--------

- Default to doing a user install (as if ``--user`` was passed) when the main
  site-packages directory is not writeable and user site-packages are enabled. (`#1668 <https://github.com/pypa/pip/issues/1668>`_)
- Warn if a path in PATH starts with tilde during ``pip install``. (`#6414 <https://github.com/pypa/pip/issues/6414>`_)
- Cache wheels built from Git requirements that are considered immutable,
  because they point to a commit hash. (`#6640 <https://github.com/pypa/pip/issues/6640>`_)
- Add option ``--no-python-version-warning`` to silence warnings
  related to deprecation of Python versions. (`#6673 <https://github.com/pypa/pip/issues/6673>`_)
- Cache wheels that ``pip wheel`` built locally, matching what
  ``pip install`` does. This particularly helps performance in workflows where
  ``pip wheel`` is used for `building before installing
  <https://pip.pypa.io/en/stable/user_guide/#installing-from-local-packages>`_.
  Users desiring the original behavior can use ``pip wheel --no-cache-dir``. (`#6852 <https://github.com/pypa/pip/issues/6852>`_)
- Display CA information in ``pip debug``. (`#7146 <https://github.com/pypa/pip/issues/7146>`_)
- Show only the filename (instead of full URL), when downloading from PyPI. (`#7225 <https://github.com/pypa/pip/issues/7225>`_)
- Suggest a more robust command to upgrade pip itself to avoid confusion when the
  current pip command is not available as ``pip``. (`#7376 <https://github.com/pypa/pip/issues/7376>`_)
- Define all old pip console script entrypoints to prevent import issues in
  stale wrapper scripts. (`#7498 <https://github.com/pypa/pip/issues/7498>`_)
- The build step of ``pip wheel`` now builds all wheels to a cache first,
  then copies them to the wheel directory all at once.
  Before, it built them to a temporary directory and moved
  them to the wheel directory one by one. (`#7517 <https://github.com/pypa/pip/issues/7517>`_)
- Expand ``~`` prefix to user directory in path options, configs, and
  environment variables. Values that may be either URL or path are not
  currently supported, to avoid ambiguity:

  * ``--find-links``
  * ``--constraint``, ``-c``
  * ``--requirement``, ``-r``
  * ``--editable``, ``-e`` (`#980 <https://github.com/pypa/pip/issues/980>`_)

Bug Fixes
---------

- Correctly handle system site-packages, in virtual environments created with venv (PEP 405). (`#5702 <https://github.com/pypa/pip/issues/5702>`_, `#7155 <https://github.com/pypa/pip/issues/7155>`_)
- Fix case sensitive comparison of pip freeze when used with -r option. (`#5716 <https://github.com/pypa/pip/issues/5716>`_)
- Enforce PEP 508 requirement format in ``pyproject.toml``
  ``build-system.requires``. (`#6410 <https://github.com/pypa/pip/issues/6410>`_)
- Make ``ensure_dir()`` also ignore ``ENOTEMPTY`` as seen on Windows. (`#6426 <https://github.com/pypa/pip/issues/6426>`_)
- Fix building packages which specify ``backend-path`` in pyproject.toml. (`#6599 <https://github.com/pypa/pip/issues/6599>`_)
- Do not attempt to run ``setup.py clean`` after a ``pep517`` build error,
  since a ``setup.py`` may not exist in that case. (`#6642 <https://github.com/pypa/pip/issues/6642>`_)
- Fix passwords being visible in the index-url in
  "Downloading <url>" message. (`#6783 <https://github.com/pypa/pip/issues/6783>`_)
- Change method from shutil.remove to shutil.rmtree in noxfile.py. (`#7191 <https://github.com/pypa/pip/issues/7191>`_)
- Skip running tests which require subversion, when svn isn't installed (`#7193 <https://github.com/pypa/pip/issues/7193>`_)
- Fix not sending client certificates when using ``--trusted-host``. (`#7207 <https://github.com/pypa/pip/issues/7207>`_)
- Make sure ``pip wheel`` never outputs pure python wheels with a
  python implementation tag. Better fix/workaround for
  `#3025 <https://github.com/pypa/pip/issues/3025>`_ by
  using a per-implementation wheel cache instead of caching pure python
  wheels with an implementation tag in their name. (`#7296 <https://github.com/pypa/pip/issues/7296>`_)
- Include ``subdirectory`` URL fragments in cache keys. (`#7333 <https://github.com/pypa/pip/issues/7333>`_)
- Fix typo in warning message when any of ``--build-option``, ``--global-option``
  and ``--install-option`` is used in requirements.txt (`#7340 <https://github.com/pypa/pip/issues/7340>`_)
- Fix the logging of cached HTTP response shown as downloading. (`#7393 <https://github.com/pypa/pip/issues/7393>`_)
- Effectively disable the wheel cache when it is not writable, as is the
  case with the http cache. (`#7488 <https://github.com/pypa/pip/issues/7488>`_)
- Correctly handle relative cache directory provided via --cache-dir. (`#7541 <https://github.com/pypa/pip/issues/7541>`_)

Vendored Libraries
------------------

- Upgrade CacheControl to 0.12.5
- Upgrade certifi to 2019.9.11
- Upgrade colorama to 0.4.1
- Upgrade distlib to 0.2.9.post0
- Upgrade ipaddress to 1.0.22
- Update packaging to 20.0.
- Upgrade pkg_resources (via setuptools) to 44.0.0
- Upgrade pyparsing to 2.4.2
- Upgrade six to 1.12.0
- Upgrade urllib3 to 1.25.6

Improved Documentation
----------------------

- Document that "coding: utf-8" is supported in requirements.txt (`#7182 <https://github.com/pypa/pip/issues/7182>`_)
- Explain how to get pip's source code in `Getting Started <https://pip.pypa.io/en/stable/development/getting-started/>`_ (`#7197 <https://github.com/pypa/pip/issues/7197>`_)
- Describe how basic authentication credentials in URLs work. (`#7201 <https://github.com/pypa/pip/issues/7201>`_)
- Add more clear installation instructions (`#7222 <https://github.com/pypa/pip/issues/7222>`_)
- Fix documentation links for index options (`#7347 <https://github.com/pypa/pip/issues/7347>`_)
- Better document the requirements file format (`#7385 <https://github.com/pypa/pip/issues/7385>`_)


19.3.1 (2019-10-17)
===================

Features
--------

- Document Python 3.8 support. (`#7219 <https://github.com/pypa/pip/issues/7219>`_)

Bug Fixes
---------

- Fix bug that prevented installation of PEP 517 packages without ``setup.py``. (`#6606 <https://github.com/pypa/pip/issues/6606>`_)


19.3 (2019-10-14)
=================

Deprecations and Removals
-------------------------

- Remove undocumented support for un-prefixed URL requirements pointing
  to SVN repositories. Users relying on this can get the original behavior
  by prefixing their URL with ``svn+`` (which is backwards-compatible). (`#7037 <https://github.com/pypa/pip/issues/7037>`_)
- Remove the deprecated ``--venv`` option from ``pip config``. (`#7163 <https://github.com/pypa/pip/issues/7163>`_)

Features
--------

- Print a better error message when ``--no-binary`` or ``--only-binary`` is given
  an argument starting with ``-``. (`#3191 <https://github.com/pypa/pip/issues/3191>`_)
- Make ``pip show`` warn about packages not found. (`#6858 <https://github.com/pypa/pip/issues/6858>`_)
- Support including a port number in ``--trusted-host`` for both HTTP and HTTPS. (`#6886 <https://github.com/pypa/pip/issues/6886>`_)
- Redact single-part login credentials from URLs in log messages. (`#6891 <https://github.com/pypa/pip/issues/6891>`_)
- Implement manylinux2014 platform tag support.  manylinux2014 is the successor
  to manylinux2010.  It allows carefully compiled binary wheels to be installed
  on compatible Linux platforms.  The manylinux2014 platform tag definition can
  be found in `PEP599 <https://www.python.org/dev/peps/pep-0599/>`_. (`#7102 <https://github.com/pypa/pip/issues/7102>`_)

Bug Fixes
---------

- Abort installation if any archive contains a file which would be placed
  outside the extraction location. (`#3907 <https://github.com/pypa/pip/issues/3907>`_)
- pip's CLI completion code no longer prints a Traceback if it is interrupted. (`#3942 <https://github.com/pypa/pip/issues/3942>`_)
- Correct inconsistency related to the ``hg+file`` scheme. (`#4358 <https://github.com/pypa/pip/issues/4358>`_)
- Fix ``rmtree_errorhandler`` to skip non-existing directories. (`#4910 <https://github.com/pypa/pip/issues/4910>`_)
- Ignore errors copying socket files for local source installs (in Python 3). (`#5306 <https://github.com/pypa/pip/issues/5306>`_)
- Fix requirement line parser to correctly handle PEP 440 requirements with a URL
  pointing to an archive file. (`#6202 <https://github.com/pypa/pip/issues/6202>`_)
- The ``pip-wheel-metadata`` directory does not need to persist between invocations of pip, use a temporary directory instead of the current ``setup.py`` directory. (`#6213 <https://github.com/pypa/pip/issues/6213>`_)
- Fix ``--trusted-host`` processing under HTTPS to trust any port number used
  with the host. (`#6705 <https://github.com/pypa/pip/issues/6705>`_)
- Switch to new ``distlib`` wheel script template. This should be functionally
  equivalent for end users. (`#6763 <https://github.com/pypa/pip/issues/6763>`_)
- Skip copying .tox and .nox directories to temporary build directories (`#6770 <https://github.com/pypa/pip/issues/6770>`_)
- Fix handling of tokens (single part credentials) in URLs. (`#6795 <https://github.com/pypa/pip/issues/6795>`_)
- Fix a regression that caused ``~`` expansion not to occur in ``--find-links``
  paths. (`#6804 <https://github.com/pypa/pip/issues/6804>`_)
- Fix bypassed pip upgrade warning on Windows. (`#6841 <https://github.com/pypa/pip/issues/6841>`_)
- Fix 'm' flag erroneously being appended to ABI tag in Python 3.8 on platforms that do not provide SOABI (`#6885 <https://github.com/pypa/pip/issues/6885>`_)
- Hide security-sensitive strings like passwords in log messages related to
  version control system (aka VCS) command invocations. (`#6890 <https://github.com/pypa/pip/issues/6890>`_)
- Correctly uninstall symlinks that were installed in a virtualenv,
  by tools such as ``flit install --symlink``. (`#6892 <https://github.com/pypa/pip/issues/6892>`_)
- Don't fail installation using pip.exe on Windows when pip wouldn't be upgraded. (`#6924 <https://github.com/pypa/pip/issues/6924>`_)
- Use canonical distribution names when computing ``Required-By`` in ``pip show``. (`#6947 <https://github.com/pypa/pip/issues/6947>`_)
- Don't use hardlinks for locking selfcheck state file. (`#6954 <https://github.com/pypa/pip/issues/6954>`_)
- Ignore "require_virtualenv" in ``pip config`` (`#6991 <https://github.com/pypa/pip/issues/6991>`_)
- Fix ``pip freeze`` not showing correct entry for mercurial packages that use subdirectories. (`#7071 <https://github.com/pypa/pip/issues/7071>`_)
- Fix a crash when ``sys.stdin`` is set to ``None``, such as on AWS Lambda. (`#7118 <https://github.com/pypa/pip/issues/7118>`_, `#7119 <https://github.com/pypa/pip/issues/7119>`_)

Vendored Libraries
------------------

- Upgrade certifi to 2019.9.11
- Add contextlib2 0.6.0 as a vendored dependency.
- Remove Lockfile as a vendored dependency.
- Upgrade msgpack to 0.6.2
- Upgrade packaging to 19.2
- Upgrade pep517 to 0.7.0
- Upgrade pyparsing to 2.4.2
- Upgrade pytoml to 0.1.21
- Upgrade setuptools to 41.4.0
- Upgrade urllib3 to 1.25.6

Improved Documentation
----------------------

- Document caveats for UNC paths in uninstall and add .pth unit tests. (`#6516 <https://github.com/pypa/pip/issues/6516>`_)
- Add architectural overview documentation. (`#6637 <https://github.com/pypa/pip/issues/6637>`_)
- Document that ``--ignore-installed`` is dangerous. (`#6794 <https://github.com/pypa/pip/issues/6794>`_)


19.2.3 (2019-08-25)
===================

Bug Fixes
---------

- Fix 'm' flag erroneously being appended to ABI tag in Python 3.8 on platforms that do not provide SOABI (`#6885 <https://github.com/pypa/pip/issues/6885>`_)


19.2.2 (2019-08-11)
===================

Bug Fixes
---------

- Fix handling of tokens (single part credentials) in URLs. (`#6795 <https://github.com/pypa/pip/issues/6795>`_)
- Fix a regression that caused ``~`` expansion not to occur in ``--find-links``
  paths. (`#6804 <https://github.com/pypa/pip/issues/6804>`_)


19.2.1 (2019-07-23)
===================

Bug Fixes
---------

- Fix a ``NoneType`` ``AttributeError`` when evaluating hashes and no hashes
  are provided. (`#6772 <https://github.com/pypa/pip/issues/6772>`_)


19.2 (2019-07-22)
=================

Deprecations and Removals
-------------------------

- Drop support for EOL Python 3.4. (`#6685 <https://github.com/pypa/pip/issues/6685>`_)
- Improve deprecation messages to include the version in which the functionality will be removed. (`#6549 <https://github.com/pypa/pip/issues/6549>`_)

Features
--------

- Credentials will now be loaded using `keyring` when installed. (`#5948 <https://github.com/pypa/pip/issues/5948>`_)
- Fully support using ``--trusted-host`` inside requirements files. (`#3799 <https://github.com/pypa/pip/issues/3799>`_)
- Update timestamps in pip's ``--log`` file to include milliseconds. (`#6587 <https://github.com/pypa/pip/issues/6587>`_)
- Respect whether a file has been marked as "yanked" from a simple repository
  (see `PEP 592 <https://www.python.org/dev/peps/pep-0592/>`__ for details). (`#6633 <https://github.com/pypa/pip/issues/6633>`_)
- When choosing candidates to install, prefer candidates with a hash matching
  one of the user-provided hashes. (`#5874 <https://github.com/pypa/pip/issues/5874>`_)
- Improve the error message when ``METADATA`` or ``PKG-INFO`` is None when
  accessing metadata. (`#5082 <https://github.com/pypa/pip/issues/5082>`_)
- Add a new command ``pip debug`` that can display e.g. the list of compatible
  tags for the current Python. (`#6638 <https://github.com/pypa/pip/issues/6638>`_)
- Display hint on installing with --pre when search results include pre-release versions. (`#5169 <https://github.com/pypa/pip/issues/5169>`_)
- Report to Warehouse that pip is running under CI if the ``PIP_IS_CI`` environment variable is set. (`#5499 <https://github.com/pypa/pip/issues/5499>`_)
- Allow ``--python-version`` to be passed as a dotted version string (e.g.
  ``3.7`` or ``3.7.3``). (`#6585 <https://github.com/pypa/pip/issues/6585>`_)
- Log the final filename and SHA256 of a ``.whl`` file when done building a
  wheel. (`#5908 <https://github.com/pypa/pip/issues/5908>`_)
- Include the wheel's tags in the log message explanation when a candidate
  wheel link is found incompatible. (`#6121 <https://github.com/pypa/pip/issues/6121>`_)
- Add a ``--path`` argument to ``pip freeze`` to support ``--target``
  installations. (`#6404 <https://github.com/pypa/pip/issues/6404>`_)
- Add a ``--path`` argument to ``pip list`` to support ``--target``
  installations. (`#6551 <https://github.com/pypa/pip/issues/6551>`_)

Bug Fixes
---------

- Set ``sys.argv[0]`` to the underlying ``setup.py`` when invoking ``setup.py``
  via the setuptools shim so setuptools doesn't think the path is ``-c``. (`#1890 <https://github.com/pypa/pip/issues/1890>`_)
- Update ``pip download`` to respect the given ``--python-version`` when checking
  ``"Requires-Python"``. (`#5369 <https://github.com/pypa/pip/issues/5369>`_)
- Respect ``--global-option`` and ``--install-option`` when installing from
  a version control url (e.g. ``git``). (`#5518 <https://github.com/pypa/pip/issues/5518>`_)
- Make the "ascii" progress bar really be "ascii" and not Unicode. (`#5671 <https://github.com/pypa/pip/issues/5671>`_)
- Fail elegantly when trying to set an incorrectly formatted key in config. (`#5963 <https://github.com/pypa/pip/issues/5963>`_)
- Prevent DistutilsOptionError when prefix is indicated in the global environment and `--target` is used. (`#6008 <https://github.com/pypa/pip/issues/6008>`_)
- Fix ``pip install`` to respect ``--ignore-requires-python`` when evaluating
  links. (`#6371 <https://github.com/pypa/pip/issues/6371>`_)
- Fix a debug log message when freezing an editable, non-version controlled
  requirement. (`#6383 <https://github.com/pypa/pip/issues/6383>`_)
- Extend to Subversion 1.8+ the behavior of calling Subversion in
  interactive mode when pip is run interactively. (`#6386 <https://github.com/pypa/pip/issues/6386>`_)
- Prevent ``pip install <url>`` from permitting directory traversal if e.g.
  a malicious server sends a ``Content-Disposition`` header with a filename
  containing ``../`` or ``..\\``. (`#6413 <https://github.com/pypa/pip/issues/6413>`_)
- Hide passwords in output when using ``--find-links``. (`#6489 <https://github.com/pypa/pip/issues/6489>`_)
- Include more details in the log message if ``pip freeze`` can't generate a
  requirement string for a particular distribution. (`#6513 <https://github.com/pypa/pip/issues/6513>`_)
- Add the line number and file location to the error message when reading an
  invalid requirements file in certain situations. (`#6527 <https://github.com/pypa/pip/issues/6527>`_)
- Prefer ``os.confstr`` to ``ctypes`` when extracting glibc version info. (`#6543 <https://github.com/pypa/pip/issues/65
Download .txt
gitextract_looz9g1z/

├── .devcontainer/
│   ├── devcontainer.json
│   └── postCreate.sh
├── .git-blame-ignore-revs
├── .gitattributes
├── .github/
│   ├── CONTRIBUTING.md
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug-report.yml
│   │   ├── config.yml
│   │   └── feature-request.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── chronographer.yml
│   ├── dependabot.yml
│   └── workflows/
│       ├── ci.yml
│       ├── lock-threads.yml
│       ├── release.yml
│       └── update-rtd-redirects.yml
├── .gitignore
├── .mailmap
├── .pre-commit-config.yaml
├── .readthedocs-custom-redirects.yml
├── .readthedocs.yml
├── AI_POLICY.md
├── AUTHORS.txt
├── LICENSE.txt
├── NEWS.rst
├── README.rst
├── SECURITY.md
├── build-project/
│   ├── .python-version
│   ├── build-project.py
│   ├── build-requirements.in
│   └── build-requirements.txt
├── docs/
│   ├── html/
│   │   ├── cli/
│   │   │   ├── index.md
│   │   │   ├── pip.rst
│   │   │   ├── pip_cache.rst
│   │   │   ├── pip_check.rst
│   │   │   ├── pip_config.rst
│   │   │   ├── pip_debug.rst
│   │   │   ├── pip_download.rst
│   │   │   ├── pip_freeze.rst
│   │   │   ├── pip_hash.rst
│   │   │   ├── pip_index.rst
│   │   │   ├── pip_inspect.rst
│   │   │   ├── pip_install.rst
│   │   │   ├── pip_list.rst
│   │   │   ├── pip_lock.rst
│   │   │   ├── pip_search.rst
│   │   │   ├── pip_show.rst
│   │   │   ├── pip_uninstall.rst
│   │   │   └── pip_wheel.rst
│   │   ├── conf.py
│   │   ├── copyright.rst
│   │   ├── development/
│   │   │   ├── architecture/
│   │   │   │   ├── anatomy.rst
│   │   │   │   ├── command-line-interface.rst
│   │   │   │   ├── configuration-files.rst
│   │   │   │   ├── index.rst
│   │   │   │   ├── overview.rst
│   │   │   │   ├── package-finding.rst
│   │   │   │   └── upgrade-options.rst
│   │   │   ├── ci.rst
│   │   │   ├── contributing.rst
│   │   │   ├── conventions.rst
│   │   │   ├── getting-started.rst
│   │   │   ├── index.rst
│   │   │   ├── issue-triage.md
│   │   │   ├── release-process.rst
│   │   │   └── vendoring-policy.rst
│   │   ├── getting-started.md
│   │   ├── index.md
│   │   ├── installation.md
│   │   ├── installing.rst
│   │   ├── news.rst
│   │   ├── quickstart.rst
│   │   ├── reference/
│   │   │   ├── build-system.md
│   │   │   ├── index.md
│   │   │   ├── inspect-report.md
│   │   │   ├── installation-report.md
│   │   │   ├── pip.rst
│   │   │   ├── pip_cache.rst
│   │   │   ├── pip_check.rst
│   │   │   ├── pip_config.rst
│   │   │   ├── pip_debug.rst
│   │   │   ├── pip_download.rst
│   │   │   ├── pip_freeze.rst
│   │   │   ├── pip_hash.rst
│   │   │   ├── pip_index.rst
│   │   │   ├── pip_install.rst
│   │   │   ├── pip_list.rst
│   │   │   ├── pip_search.rst
│   │   │   ├── pip_show.rst
│   │   │   ├── pip_uninstall.rst
│   │   │   ├── pip_wheel.rst
│   │   │   ├── requirement-specifiers.md
│   │   │   └── requirements-file-format.md
│   │   ├── topics/
│   │   │   ├── authentication.md
│   │   │   ├── caching.md
│   │   │   ├── configuration.md
│   │   │   ├── dependency-resolution.md
│   │   │   ├── deps.dot
│   │   │   ├── https-certificates.md
│   │   │   ├── index.md
│   │   │   ├── local-project-installs.md
│   │   │   ├── more-dependency-resolution.md
│   │   │   ├── python-option.md
│   │   │   ├── repeatable-installs.md
│   │   │   ├── secure-installs.md
│   │   │   ├── vcs-support.md
│   │   │   └── workflow.md
│   │   ├── user_guide.rst
│   │   └── ux-research-design/
│   │       ├── contribute.md
│   │       ├── guidance.md
│   │       ├── index.md
│   │       ├── research-results/
│   │       │   ├── about-our-users.md
│   │       │   ├── ci-cd.md
│   │       │   ├── improving-pips-documentation.md
│   │       │   ├── index.md
│   │       │   ├── mental-models.md
│   │       │   ├── override-conflicting-dependencies.md
│   │       │   ├── personas.md
│   │       │   ├── pip-force-reinstall.md
│   │       │   ├── pip-search.md
│   │       │   ├── pip-upgrade-conflict.md
│   │       │   ├── prioritizing-features.md
│   │       │   └── users-and-security.md
│   │       └── resolution-impossible-example.md
│   ├── man/
│   │   ├── commands/
│   │   │   ├── cache.rst
│   │   │   ├── check.rst
│   │   │   ├── config.rst
│   │   │   ├── debug.rst
│   │   │   ├── download.rst
│   │   │   ├── freeze.rst
│   │   │   ├── hash.rst
│   │   │   ├── help.rst
│   │   │   ├── index.rst
│   │   │   ├── install.rst
│   │   │   ├── list.rst
│   │   │   ├── lock.rst
│   │   │   ├── search.rst
│   │   │   ├── show.rst
│   │   │   ├── uninstall.rst
│   │   │   └── wheel.rst
│   │   └── index.rst
│   └── pip_sphinxext.py
├── news/
│   ├── .gitignore
│   ├── 13226.bugfix.rst
│   ├── 13826.process.rst
│   └── 13845.trivial.rst
├── noxfile.py
├── pyproject.toml
├── src/
│   └── pip/
│       ├── __init__.py
│       ├── __main__.py
│       ├── __pip-runner__.py
│       ├── _internal/
│       │   ├── __init__.py
│       │   ├── build_env.py
│       │   ├── cache.py
│       │   ├── cli/
│       │   │   ├── __init__.py
│       │   │   ├── autocompletion.py
│       │   │   ├── base_command.py
│       │   │   ├── cmdoptions.py
│       │   │   ├── command_context.py
│       │   │   ├── index_command.py
│       │   │   ├── main.py
│       │   │   ├── main_parser.py
│       │   │   ├── parser.py
│       │   │   ├── progress_bars.py
│       │   │   ├── req_command.py
│       │   │   ├── spinners.py
│       │   │   └── status_codes.py
│       │   ├── commands/
│       │   │   ├── __init__.py
│       │   │   ├── cache.py
│       │   │   ├── check.py
│       │   │   ├── completion.py
│       │   │   ├── configuration.py
│       │   │   ├── debug.py
│       │   │   ├── download.py
│       │   │   ├── freeze.py
│       │   │   ├── hash.py
│       │   │   ├── help.py
│       │   │   ├── index.py
│       │   │   ├── inspect.py
│       │   │   ├── install.py
│       │   │   ├── list.py
│       │   │   ├── lock.py
│       │   │   ├── search.py
│       │   │   ├── show.py
│       │   │   ├── uninstall.py
│       │   │   └── wheel.py
│       │   ├── configuration.py
│       │   ├── distributions/
│       │   │   ├── __init__.py
│       │   │   ├── base.py
│       │   │   ├── installed.py
│       │   │   ├── sdist.py
│       │   │   └── wheel.py
│       │   ├── exceptions.py
│       │   ├── index/
│       │   │   ├── __init__.py
│       │   │   ├── collector.py
│       │   │   ├── package_finder.py
│       │   │   └── sources.py
│       │   ├── locations/
│       │   │   ├── __init__.py
│       │   │   ├── _distutils.py
│       │   │   ├── _sysconfig.py
│       │   │   └── base.py
│       │   ├── main.py
│       │   ├── metadata/
│       │   │   ├── __init__.py
│       │   │   ├── _json.py
│       │   │   ├── base.py
│       │   │   ├── importlib/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── _compat.py
│       │   │   │   ├── _dists.py
│       │   │   │   └── _envs.py
│       │   │   └── pkg_resources.py
│       │   ├── models/
│       │   │   ├── __init__.py
│       │   │   ├── candidate.py
│       │   │   ├── direct_url.py
│       │   │   ├── format_control.py
│       │   │   ├── index.py
│       │   │   ├── installation_report.py
│       │   │   ├── link.py
│       │   │   ├── release_control.py
│       │   │   ├── scheme.py
│       │   │   ├── search_scope.py
│       │   │   ├── selection_prefs.py
│       │   │   ├── target_python.py
│       │   │   └── wheel.py
│       │   ├── network/
│       │   │   ├── __init__.py
│       │   │   ├── auth.py
│       │   │   ├── cache.py
│       │   │   ├── download.py
│       │   │   ├── lazy_wheel.py
│       │   │   ├── session.py
│       │   │   ├── utils.py
│       │   │   └── xmlrpc.py
│       │   ├── operations/
│       │   │   ├── __init__.py
│       │   │   ├── build/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── build_tracker.py
│       │   │   │   ├── metadata.py
│       │   │   │   ├── metadata_editable.py
│       │   │   │   ├── wheel.py
│       │   │   │   └── wheel_editable.py
│       │   │   ├── check.py
│       │   │   ├── freeze.py
│       │   │   ├── install/
│       │   │   │   ├── __init__.py
│       │   │   │   └── wheel.py
│       │   │   └── prepare.py
│       │   ├── pyproject.py
│       │   ├── req/
│       │   │   ├── __init__.py
│       │   │   ├── constructors.py
│       │   │   ├── pep723.py
│       │   │   ├── req_dependency_group.py
│       │   │   ├── req_file.py
│       │   │   ├── req_install.py
│       │   │   ├── req_set.py
│       │   │   └── req_uninstall.py
│       │   ├── resolution/
│       │   │   ├── __init__.py
│       │   │   ├── base.py
│       │   │   ├── legacy/
│       │   │   │   ├── __init__.py
│       │   │   │   └── resolver.py
│       │   │   └── resolvelib/
│       │   │       ├── __init__.py
│       │   │       ├── base.py
│       │   │       ├── candidates.py
│       │   │       ├── factory.py
│       │   │       ├── found_candidates.py
│       │   │       ├── provider.py
│       │   │       ├── reporter.py
│       │   │       ├── requirements.py
│       │   │       └── resolver.py
│       │   ├── self_outdated_check.py
│       │   ├── utils/
│       │   │   ├── __init__.py
│       │   │   ├── _jaraco_text.py
│       │   │   ├── _log.py
│       │   │   ├── appdirs.py
│       │   │   ├── compat.py
│       │   │   ├── compatibility_tags.py
│       │   │   ├── datetime.py
│       │   │   ├── deprecation.py
│       │   │   ├── direct_url_helpers.py
│       │   │   ├── egg_link.py
│       │   │   ├── entrypoints.py
│       │   │   ├── filesystem.py
│       │   │   ├── filetypes.py
│       │   │   ├── glibc.py
│       │   │   ├── hashes.py
│       │   │   ├── logging.py
│       │   │   ├── misc.py
│       │   │   ├── packaging.py
│       │   │   ├── pylock.py
│       │   │   ├── retry.py
│       │   │   ├── subprocess.py
│       │   │   ├── temp_dir.py
│       │   │   ├── unpacking.py
│       │   │   ├── urls.py
│       │   │   ├── virtualenv.py
│       │   │   └── wheel.py
│       │   ├── vcs/
│       │   │   ├── __init__.py
│       │   │   ├── bazaar.py
│       │   │   ├── git.py
│       │   │   ├── mercurial.py
│       │   │   ├── subversion.py
│       │   │   └── versioncontrol.py
│       │   └── wheel_builder.py
│       ├── _vendor/
│       │   ├── README.rst
│       │   ├── __init__.py
│       │   ├── cachecontrol/
│       │   │   ├── LICENSE.txt
│       │   │   ├── __init__.py
│       │   │   ├── _cmd.py
│       │   │   ├── adapter.py
│       │   │   ├── cache.py
│       │   │   ├── caches/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── file_cache.py
│       │   │   │   └── redis_cache.py
│       │   │   ├── controller.py
│       │   │   ├── filewrapper.py
│       │   │   ├── heuristics.py
│       │   │   ├── py.typed
│       │   │   ├── serialize.py
│       │   │   └── wrapper.py
│       │   ├── certifi/
│       │   │   ├── LICENSE
│       │   │   ├── __init__.py
│       │   │   ├── __main__.py
│       │   │   ├── cacert.pem
│       │   │   ├── core.py
│       │   │   └── py.typed
│       │   ├── dependency_groups/
│       │   │   ├── LICENSE.txt
│       │   │   ├── __init__.py
│       │   │   ├── __main__.py
│       │   │   ├── _implementation.py
│       │   │   ├── _lint_dependency_groups.py
│       │   │   ├── _pip_wrapper.py
│       │   │   ├── _toml_compat.py
│       │   │   └── py.typed
│       │   ├── distlib/
│       │   │   ├── LICENSE.txt
│       │   │   ├── __init__.py
│       │   │   ├── compat.py
│       │   │   ├── resources.py
│       │   │   ├── scripts.py
│       │   │   └── util.py
│       │   ├── distlib.pyi
│       │   ├── distro/
│       │   │   ├── LICENSE
│       │   │   ├── __init__.py
│       │   │   ├── __main__.py
│       │   │   ├── distro.py
│       │   │   └── py.typed
│       │   ├── idna/
│       │   │   ├── LICENSE.md
│       │   │   ├── __init__.py
│       │   │   ├── codec.py
│       │   │   ├── compat.py
│       │   │   ├── core.py
│       │   │   ├── idnadata.py
│       │   │   ├── intranges.py
│       │   │   ├── package_data.py
│       │   │   ├── py.typed
│       │   │   └── uts46data.py
│       │   ├── msgpack/
│       │   │   ├── COPYING
│       │   │   ├── __init__.py
│       │   │   ├── exceptions.py
│       │   │   ├── ext.py
│       │   │   └── fallback.py
│       │   ├── msgpack.pyi
│       │   ├── packaging/
│       │   │   ├── LICENSE
│       │   │   ├── LICENSE.APACHE
│       │   │   ├── LICENSE.BSD
│       │   │   ├── __init__.py
│       │   │   ├── _elffile.py
│       │   │   ├── _manylinux.py
│       │   │   ├── _musllinux.py
│       │   │   ├── _parser.py
│       │   │   ├── _structures.py
│       │   │   ├── _tokenizer.py
│       │   │   ├── licenses/
│       │   │   │   ├── __init__.py
│       │   │   │   └── _spdx.py
│       │   │   ├── markers.py
│       │   │   ├── metadata.py
│       │   │   ├── py.typed
│       │   │   ├── pylock.py
│       │   │   ├── requirements.py
│       │   │   ├── specifiers.py
│       │   │   ├── tags.py
│       │   │   ├── utils.py
│       │   │   └── version.py
│       │   ├── pkg_resources/
│       │   │   ├── LICENSE
│       │   │   └── __init__.py
│       │   ├── pkg_resources.pyi
│       │   ├── platformdirs/
│       │   │   ├── LICENSE
│       │   │   ├── __init__.py
│       │   │   ├── __main__.py
│       │   │   ├── android.py
│       │   │   ├── api.py
│       │   │   ├── macos.py
│       │   │   ├── py.typed
│       │   │   ├── unix.py
│       │   │   ├── version.py
│       │   │   └── windows.py
│       │   ├── pygments/
│       │   │   ├── LICENSE
│       │   │   ├── __init__.py
│       │   │   ├── __main__.py
│       │   │   ├── console.py
│       │   │   ├── filter.py
│       │   │   ├── filters/
│       │   │   │   └── __init__.py
│       │   │   ├── formatter.py
│       │   │   ├── formatters/
│       │   │   │   ├── __init__.py
│       │   │   │   └── _mapping.py
│       │   │   ├── lexer.py
│       │   │   ├── lexers/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── _mapping.py
│       │   │   │   └── python.py
│       │   │   ├── modeline.py
│       │   │   ├── plugin.py
│       │   │   ├── regexopt.py
│       │   │   ├── scanner.py
│       │   │   ├── sphinxext.py
│       │   │   ├── style.py
│       │   │   ├── styles/
│       │   │   │   ├── __init__.py
│       │   │   │   └── _mapping.py
│       │   │   ├── token.py
│       │   │   ├── unistring.py
│       │   │   └── util.py
│       │   ├── pygments.pyi
│       │   ├── pyproject_hooks/
│       │   │   ├── LICENSE
│       │   │   ├── __init__.py
│       │   │   ├── _impl.py
│       │   │   ├── _in_process/
│       │   │   │   ├── __init__.py
│       │   │   │   └── _in_process.py
│       │   │   └── py.typed
│       │   ├── requests/
│       │   │   ├── LICENSE
│       │   │   ├── __init__.py
│       │   │   ├── __version__.py
│       │   │   ├── _internal_utils.py
│       │   │   ├── adapters.py
│       │   │   ├── api.py
│       │   │   ├── auth.py
│       │   │   ├── certs.py
│       │   │   ├── compat.py
│       │   │   ├── cookies.py
│       │   │   ├── exceptions.py
│       │   │   ├── help.py
│       │   │   ├── hooks.py
│       │   │   ├── models.py
│       │   │   ├── packages.py
│       │   │   ├── sessions.py
│       │   │   ├── status_codes.py
│       │   │   ├── structures.py
│       │   │   └── utils.py
│       │   ├── requests.pyi
│       │   ├── resolvelib/
│       │   │   ├── LICENSE
│       │   │   ├── __init__.py
│       │   │   ├── providers.py
│       │   │   ├── py.typed
│       │   │   ├── reporters.py
│       │   │   ├── resolvers/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── abstract.py
│       │   │   │   ├── criterion.py
│       │   │   │   ├── exceptions.py
│       │   │   │   └── resolution.py
│       │   │   └── structs.py
│       │   ├── rich/
│       │   │   ├── LICENSE
│       │   │   ├── __init__.py
│       │   │   ├── __main__.py
│       │   │   ├── _cell_widths.py
│       │   │   ├── _emoji_codes.py
│       │   │   ├── _emoji_replace.py
│       │   │   ├── _export_format.py
│       │   │   ├── _extension.py
│       │   │   ├── _fileno.py
│       │   │   ├── _inspect.py
│       │   │   ├── _log_render.py
│       │   │   ├── _loop.py
│       │   │   ├── _null_file.py
│       │   │   ├── _palettes.py
│       │   │   ├── _pick.py
│       │   │   ├── _ratio.py
│       │   │   ├── _spinners.py
│       │   │   ├── _stack.py
│       │   │   ├── _timer.py
│       │   │   ├── _win32_console.py
│       │   │   ├── _windows.py
│       │   │   ├── _windows_renderer.py
│       │   │   ├── _wrap.py
│       │   │   ├── abc.py
│       │   │   ├── align.py
│       │   │   ├── ansi.py
│       │   │   ├── bar.py
│       │   │   ├── box.py
│       │   │   ├── cells.py
│       │   │   ├── color.py
│       │   │   ├── color_triplet.py
│       │   │   ├── columns.py
│       │   │   ├── console.py
│       │   │   ├── constrain.py
│       │   │   ├── containers.py
│       │   │   ├── control.py
│       │   │   ├── default_styles.py
│       │   │   ├── diagnose.py
│       │   │   ├── emoji.py
│       │   │   ├── errors.py
│       │   │   ├── file_proxy.py
│       │   │   ├── filesize.py
│       │   │   ├── highlighter.py
│       │   │   ├── json.py
│       │   │   ├── jupyter.py
│       │   │   ├── layout.py
│       │   │   ├── live.py
│       │   │   ├── live_render.py
│       │   │   ├── logging.py
│       │   │   ├── markup.py
│       │   │   ├── measure.py
│       │   │   ├── padding.py
│       │   │   ├── pager.py
│       │   │   ├── palette.py
│       │   │   ├── panel.py
│       │   │   ├── pretty.py
│       │   │   ├── progress.py
│       │   │   ├── progress_bar.py
│       │   │   ├── prompt.py
│       │   │   ├── protocol.py
│       │   │   ├── py.typed
│       │   │   ├── region.py
│       │   │   ├── repr.py
│       │   │   ├── rule.py
│       │   │   ├── scope.py
│       │   │   ├── screen.py
│       │   │   ├── segment.py
│       │   │   ├── spinner.py
│       │   │   ├── status.py
│       │   │   ├── style.py
│       │   │   ├── styled.py
│       │   │   ├── syntax.py
│       │   │   ├── table.py
│       │   │   ├── terminal_theme.py
│       │   │   ├── text.py
│       │   │   ├── theme.py
│       │   │   ├── themes.py
│       │   │   ├── traceback.py
│       │   │   └── tree.py
│       │   ├── tomli/
│       │   │   ├── LICENSE
│       │   │   ├── __init__.py
│       │   │   ├── _parser.py
│       │   │   ├── _re.py
│       │   │   ├── _types.py
│       │   │   └── py.typed
│       │   ├── tomli_w/
│       │   │   ├── LICENSE
│       │   │   ├── __init__.py
│       │   │   ├── _writer.py
│       │   │   └── py.typed
│       │   ├── truststore/
│       │   │   ├── LICENSE
│       │   │   ├── __init__.py
│       │   │   ├── _api.py
│       │   │   ├── _macos.py
│       │   │   ├── _openssl.py
│       │   │   ├── _ssl_constants.py
│       │   │   ├── _windows.py
│       │   │   └── py.typed
│       │   ├── urllib3/
│       │   │   ├── LICENSE.txt
│       │   │   ├── __init__.py
│       │   │   ├── _collections.py
│       │   │   ├── _version.py
│       │   │   ├── connection.py
│       │   │   ├── connectionpool.py
│       │   │   ├── contrib/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── _appengine_environ.py
│       │   │   │   ├── _securetransport/
│       │   │   │   │   ├── __init__.py
│       │   │   │   │   ├── bindings.py
│       │   │   │   │   └── low_level.py
│       │   │   │   ├── appengine.py
│       │   │   │   ├── ntlmpool.py
│       │   │   │   ├── pyopenssl.py
│       │   │   │   ├── securetransport.py
│       │   │   │   └── socks.py
│       │   │   ├── exceptions.py
│       │   │   ├── fields.py
│       │   │   ├── filepost.py
│       │   │   ├── packages/
│       │   │   │   ├── __init__.py
│       │   │   │   ├── backports/
│       │   │   │   │   ├── __init__.py
│       │   │   │   │   ├── makefile.py
│       │   │   │   │   └── weakref_finalize.py
│       │   │   │   └── six.py
│       │   │   ├── poolmanager.py
│       │   │   ├── request.py
│       │   │   ├── response.py
│       │   │   └── util/
│       │   │       ├── __init__.py
│       │   │       ├── connection.py
│       │   │       ├── proxy.py
│       │   │       ├── queue.py
│       │   │       ├── request.py
│       │   │       ├── response.py
│       │   │       ├── retry.py
│       │   │       ├── ssl_.py
│       │   │       ├── ssl_match_hostname.py
│       │   │       ├── ssltransport.py
│       │   │       ├── timeout.py
│       │   │       ├── url.py
│       │   │       └── wait.py
│       │   ├── urllib3.pyi
│       │   └── vendor.txt
│       └── py.typed
├── tests/
│   ├── __init__.py
│   ├── conftest.py
│   ├── data/
│   │   ├── backends/
│   │   │   ├── dummy_backend-0.1-py2.py3-none-any.whl
│   │   │   └── test_backend-0.1-py2.py3-none-any.whl
│   │   ├── completion_paths/
│   │   │   ├── README.txt
│   │   │   ├── REPLAY/
│   │   │   │   └── video.mpeg
│   │   │   └── requirements.txt
│   │   ├── indexes/
│   │   │   ├── README.txt
│   │   │   ├── datarequire/
│   │   │   │   └── fakepackage/
│   │   │   │       └── index.html
│   │   │   ├── dev/
│   │   │   │   └── bar/
│   │   │   │       └── index.html
│   │   │   ├── empty_with_pkg/
│   │   │   │   └── index.html
│   │   │   ├── in dex/
│   │   │   │   ├── README.txt
│   │   │   │   └── simple/
│   │   │   │       └── index.html
│   │   │   ├── invalid-version/
│   │   │   │   └── invalid-version/
│   │   │   │       └── index.html
│   │   │   ├── pre/
│   │   │   │   └── bar/
│   │   │   │       └── index.html
│   │   │   ├── require-invalid-version/
│   │   │   │   ├── invalid-version/
│   │   │   │   │   └── index.html
│   │   │   │   └── require-invalid-version/
│   │   │   │       └── index.html
│   │   │   ├── simple/
│   │   │   │   └── simple/
│   │   │   │       └── index.html
│   │   │   ├── yanked/
│   │   │   │   └── simple/
│   │   │   │       └── index.html
│   │   │   └── yanked_all/
│   │   │       └── simple/
│   │   │           └── index.html
│   │   ├── packages/
│   │   │   ├── BrokenEmitsUTF8/
│   │   │   │   ├── broken.py
│   │   │   │   └── setup.py
│   │   │   ├── FSPkg/
│   │   │   │   ├── fspkg/
│   │   │   │   │   └── __init__.py
│   │   │   │   └── setup.py
│   │   │   ├── HackedEggInfo/
│   │   │   │   └── setup.py
│   │   │   ├── LineEndings/
│   │   │   │   └── setup.py
│   │   │   ├── LocalEnvironMarker/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── localenvironmarker/
│   │   │   │   │   └── __init__.py
│   │   │   │   └── setup.py
│   │   │   ├── LocalExtras/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── localextras/
│   │   │   │   │   └── __init__.py
│   │   │   │   └── setup.py
│   │   │   ├── LocalExtras-0.0.2/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── localextras/
│   │   │   │   │   └── __init__.py
│   │   │   │   └── setup.py
│   │   │   ├── README.txt
│   │   │   ├── SetupPyLatin1/
│   │   │   │   └── setup.py
│   │   │   ├── SetupPyUTF8/
│   │   │   │   └── setup.py
│   │   │   ├── brokenwheel-1.0-py2.py3-none-any.whl
│   │   │   ├── colander-0.9.9-py2.py3-none-any.whl
│   │   │   ├── compilewheel-1.0-py2.py3-none-any.whl
│   │   │   ├── complex_dist-0.1-py2.py3-none-any.whl
│   │   │   ├── console_scripts_uppercase-1.0-py2.py3-none-any.whl
│   │   │   ├── corruptwheel-1.0-py2.py3-none-any.whl
│   │   │   ├── has.script-1.0-py2.py3-none-any.whl
│   │   │   ├── invalid.whl
│   │   │   ├── invalid_version-1.0-py3-none-any.whl
│   │   │   ├── invalid_version-2010i-py3-none-any.whl
│   │   │   ├── license.dist-0.1-py2.py3-none-any.whl
│   │   │   ├── license.dist-0.2-py2.py3-none-any.whl
│   │   │   ├── meta-1.0-py2.py3-none-any.whl
│   │   │   ├── mypy-0.782-py3-none-any.whl
│   │   │   ├── pep517_setup_and_pyproject/
│   │   │   │   ├── pyproject.toml
│   │   │   │   ├── setup.cfg
│   │   │   │   └── setup.py
│   │   │   ├── pep517_wrapper_buildsys/
│   │   │   │   ├── mybuildsys.py
│   │   │   │   ├── pyproject.toml
│   │   │   │   ├── setup.cfg
│   │   │   │   └── setup.py
│   │   │   ├── priority-1.0-py2.py3-none-any.whl
│   │   │   ├── prjwithdatafile-1.0-py2.py3-none-any.whl
│   │   │   ├── require_invalid_version-0.1-py3-none-any.whl
│   │   │   ├── require_invalid_version-1.0-py3-none-any.whl
│   │   │   ├── requiresPaste/
│   │   │   │   ├── pyproject.toml
│   │   │   │   └── requiresPaste.py
│   │   │   ├── requires_simple_extra-0.1-py2.py3-none-any.whl
│   │   │   ├── requires_source-1.0-py2.py3-none-any.whl
│   │   │   ├── requires_wheelbroken_upper/
│   │   │   │   ├── requires_wheelbroken_upper/
│   │   │   │   │   └── __init__.py
│   │   │   │   └── setup.py
│   │   │   ├── script.wheel1-0.1-py2.py3-none-any.whl
│   │   │   ├── script.wheel1a-0.1-py2.py3-none-any.whl
│   │   │   ├── script.wheel2-0.1-py2.py3-none-any.whl
│   │   │   ├── script.wheel2a-0.1-py2.py3-none-any.whl
│   │   │   ├── script.wheel3-0.1-py2.py3-none-any.whl
│   │   │   ├── setuptools-0.9.8-py2.py3-none-any.whl
│   │   │   ├── simple.dist-0.1-py1-none-invalid.whl
│   │   │   ├── simple.dist-0.1-py2.py3-none-any.whl
│   │   │   ├── simple_namespace-1.0-py2.py3-none-any.whl
│   │   │   ├── simplewheel-1.0-py2.py3-none-any.whl
│   │   │   ├── simplewheel-2.0-1-py2.py3-none-any.whl
│   │   │   ├── simplewheel-2.0-py2.py3-none-any.whl
│   │   │   ├── simplewheel-2.0-py3-fakeabi-fakeplat.whl
│   │   │   ├── singlemodule-0.0.1.tar.lzma
│   │   │   ├── singlemodule-0.0.1.tar.xz
│   │   │   ├── symlinks/
│   │   │   │   ├── doc/
│   │   │   │   │   └── intro
│   │   │   │   ├── docs
│   │   │   │   ├── setup.cfg
│   │   │   │   ├── setup.py
│   │   │   │   └── symlinks/
│   │   │   │       └── __init__.py
│   │   │   └── test_tar.tgz
│   │   ├── packages3/
│   │   │   ├── dinner/
│   │   │   │   └── index.html
│   │   │   ├── index.html
│   │   │   └── requiredinner/
│   │   │       └── index.html
│   │   ├── pypi_packages/
│   │   │   ├── django_devserver-0.8.0-py3-none-any.whl
│   │   │   └── six-1.17.0-py2.py3-none-any.whl
│   │   ├── reqfiles/
│   │   │   ├── README.txt
│   │   │   └── supported_options2.txt
│   │   └── src/
│   │       ├── TopoRequires/
│   │       │   ├── setup.py
│   │       │   └── toporequires/
│   │       │       └── __init__.py
│   │       ├── TopoRequires2/
│   │       │   ├── setup.cfg.pending
│   │       │   ├── setup.py
│   │       │   └── toporequires2/
│   │       │       └── __init__.py
│   │       ├── TopoRequires3/
│   │       │   ├── setup.cfg.pending
│   │       │   ├── setup.py
│   │       │   └── toporequires3/
│   │       │       └── __init__.py
│   │       ├── TopoRequires4/
│   │       │   ├── setup.cfg.pending
│   │       │   ├── setup.py
│   │       │   └── toporequires4/
│   │       │       └── __init__.py
│   │       ├── chattymodule/
│   │       │   ├── backend.py
│   │       │   ├── chattymodule.py
│   │       │   └── pyproject.toml
│   │       ├── compilewheel/
│   │       │   ├── setup.cfg
│   │       │   ├── setup.py
│   │       │   └── simple/
│   │       │       └── __init__.py
│   │       ├── extension/
│   │       │   ├── extension.c
│   │       │   └── setup.py
│   │       ├── pep517_pyproject_only/
│   │       │   └── pyproject.toml
│   │       ├── pep517_setup_and_pyproject/
│   │       │   ├── pyproject.toml
│   │       │   └── setup.py
│   │       ├── pep517_setup_cfg_only/
│   │       │   └── setup.cfg
│   │       ├── pep517_setup_only/
│   │       │   └── setup.py
│   │       ├── pep518-3.0/
│   │       │   ├── MANIFEST.in
│   │       │   ├── pep518.py
│   │       │   ├── pyproject.toml
│   │       │   ├── setup.cfg
│   │       │   └── setup.py
│   │       ├── pep518_conflicting_requires/
│   │       │   ├── MANIFEST.in
│   │       │   ├── pep518.py
│   │       │   ├── pyproject.toml
│   │       │   └── setup.py
│   │       ├── pep518_forkbomb-235/
│   │       │   ├── MANIFEST.in
│   │       │   ├── pep518_forkbomb.py
│   │       │   ├── pyproject.toml
│   │       │   ├── setup.cfg
│   │       │   └── setup.py
│   │       ├── pep518_invalid_build_system/
│   │       │   ├── MANIFEST.in
│   │       │   ├── pep518.py
│   │       │   ├── pyproject.toml
│   │       │   └── setup.py
│   │       ├── pep518_invalid_requires/
│   │       │   ├── MANIFEST.in
│   │       │   ├── pep518.py
│   │       │   ├── pyproject.toml
│   │       │   └── setup.py
│   │       ├── pep518_missing_requires/
│   │       │   ├── MANIFEST.in
│   │       │   ├── pep518.py
│   │       │   ├── pyproject.toml
│   │       │   └── setup.py
│   │       ├── pep518_twin_forkbombs_first-234/
│   │       │   ├── MANIFEST.in
│   │       │   ├── pep518_twin_forkbombs_first.py
│   │       │   ├── pyproject.toml
│   │       │   ├── setup.cfg
│   │       │   └── setup.py
│   │       ├── pep518_twin_forkbombs_second-238/
│   │       │   ├── MANIFEST.in
│   │       │   ├── pep518_twin_forkbombs_second.py
│   │       │   ├── pyproject.toml
│   │       │   ├── setup.cfg
│   │       │   └── setup.py
│   │       ├── pep518_with_extra_and_markers-1.0/
│   │       │   ├── MANIFEST.in
│   │       │   ├── pep518_with_extra_and_markers.py
│   │       │   ├── pyproject.toml
│   │       │   ├── setup.cfg
│   │       │   └── setup.py
│   │       ├── pep518_with_namespace_package-1.0/
│   │       │   ├── pep518_with_namespace_package.py
│   │       │   ├── pyproject.toml
│   │       │   ├── setup.cfg
│   │       │   └── setup.py
│   │       ├── prjwithdatafile/
│   │       │   ├── prjwithdatafile/
│   │       │   │   ├── README.txt
│   │       │   │   └── somemodule.py
│   │       │   └── setup.py
│   │       ├── requires_capitalized/
│   │       │   └── setup.py
│   │       ├── requires_requires_capitalized/
│   │       │   └── setup.py
│   │       ├── requires_simple/
│   │       │   ├── requires_simple/
│   │       │   │   └── __init__.py
│   │       │   └── setup.py
│   │       ├── requires_simple_extra/
│   │       │   ├── requires_simple_extra.py
│   │       │   ├── setup.cfg
│   │       │   └── setup.py
│   │       ├── setup_error/
│   │       │   └── setup.py
│   │       ├── simple_namespace/
│   │       │   ├── setup.cfg
│   │       │   ├── setup.py
│   │       │   └── simple_namespace/
│   │       │       ├── __init__.py
│   │       │       └── module/
│   │       │           └── __init__.py
│   │       ├── simplewheel-1.0/
│   │       │   ├── setup.cfg
│   │       │   ├── setup.py
│   │       │   └── simplewheel/
│   │       │       └── __init__.py
│   │       ├── simplewheel-2.0/
│   │       │   ├── setup.cfg
│   │       │   ├── setup.py
│   │       │   └── simplewheel/
│   │       │       └── __init__.py
│   │       ├── singlemodule/
│   │       │   ├── setup.cfg
│   │       │   ├── setup.py
│   │       │   └── singlemodule.py
│   │       └── withpyproject/
│   │           ├── pyproject.toml
│   │           └── setup.py
│   ├── functional/
│   │   ├── __init__.py
│   │   ├── test_bad_url.py
│   │   ├── test_broken_stdout.py
│   │   ├── test_build_constraints.py
│   │   ├── test_build_env.py
│   │   ├── test_cache.py
│   │   ├── test_check.py
│   │   ├── test_cli.py
│   │   ├── test_completion.py
│   │   ├── test_config_settings.py
│   │   ├── test_configuration.py
│   │   ├── test_debug.py
│   │   ├── test_download.py
│   │   ├── test_fast_deps.py
│   │   ├── test_freeze.py
│   │   ├── test_hash.py
│   │   ├── test_help.py
│   │   ├── test_index.py
│   │   ├── test_index_invalid_wheels.py
│   │   ├── test_inspect.py
│   │   ├── test_install.py
│   │   ├── test_install_check.py
│   │   ├── test_install_cleanup.py
│   │   ├── test_install_compat.py
│   │   ├── test_install_config.py
│   │   ├── test_install_direct_url.py
│   │   ├── test_install_extras.py
│   │   ├── test_install_force_reinstall.py
│   │   ├── test_install_format_control.py
│   │   ├── test_install_index.py
│   │   ├── test_install_release_control.py
│   │   ├── test_install_report.py
│   │   ├── test_install_reqs.py
│   │   ├── test_install_requested.py
│   │   ├── test_install_script.py
│   │   ├── test_install_upgrade.py
│   │   ├── test_install_user.py
│   │   ├── test_install_vcs_git.py
│   │   ├── test_install_wheel.py
│   │   ├── test_invalid_versions_and_specifiers.py
│   │   ├── test_list.py
│   │   ├── test_lock.py
│   │   ├── test_new_resolver.py
│   │   ├── test_new_resolver_errors.py
│   │   ├── test_new_resolver_hashes.py
│   │   ├── test_new_resolver_target.py
│   │   ├── test_new_resolver_user.py
│   │   ├── test_no_color.py
│   │   ├── test_pep517.py
│   │   ├── test_pep660.py
│   │   ├── test_pep668.py
│   │   ├── test_pip_runner_script.py
│   │   ├── test_proxy.py
│   │   ├── test_python_option.py
│   │   ├── test_search.py
│   │   ├── test_self_update.py
│   │   ├── test_show.py
│   │   ├── test_truststore.py
│   │   ├── test_uninstall.py
│   │   ├── test_uninstall_user.py
│   │   ├── test_uploaded_prior_to.py
│   │   ├── test_vcs_bazaar.py
│   │   ├── test_vcs_git.py
│   │   ├── test_vcs_mercurial.py
│   │   ├── test_vcs_subversion.py
│   │   ├── test_warning.py
│   │   └── test_wheel.py
│   ├── lib/
│   │   ├── __init__.py
│   │   ├── certs.py
│   │   ├── compat.py
│   │   ├── configuration_helpers.py
│   │   ├── filesystem.py
│   │   ├── git_submodule_helpers.py
│   │   ├── index.py
│   │   ├── local_repos.py
│   │   ├── options_helpers.py
│   │   ├── requests_mocks.py
│   │   ├── server.py
│   │   ├── test_lib.py
│   │   ├── test_wheel.py
│   │   ├── venv.py
│   │   └── wheel.py
│   ├── ruff.toml
│   └── unit/
│       ├── __init__.py
│       ├── metadata/
│       │   ├── test_metadata.py
│       │   └── test_metadata_pkg_resources.py
│       ├── resolution_resolvelib/
│       │   ├── __init__.py
│       │   ├── conftest.py
│       │   ├── test_provider.py
│       │   ├── test_requirement.py
│       │   └── test_resolver.py
│       ├── test_appdirs.py
│       ├── test_base_command.py
│       ├── test_build_constraints.py
│       ├── test_cache.py
│       ├── test_cli_colors.py
│       ├── test_cli_spinners.py
│       ├── test_cmdoptions.py
│       ├── test_collector.py
│       ├── test_command_install.py
│       ├── test_commands.py
│       ├── test_compat.py
│       ├── test_configuration.py
│       ├── test_direct_url.py
│       ├── test_direct_url_helpers.py
│       ├── test_exceptions.py
│       ├── test_finder.py
│       ├── test_format_control.py
│       ├── test_index.py
│       ├── test_link.py
│       ├── test_locations.py
│       ├── test_logging.py
│       ├── test_models.py
│       ├── test_models_wheel.py
│       ├── test_network_auth.py
│       ├── test_network_cache.py
│       ├── test_network_download.py
│       ├── test_network_lazy_wheel.py
│       ├── test_network_session.py
│       ├── test_network_utils.py
│       ├── test_operations_prepare.py
│       ├── test_options.py
│       ├── test_packaging.py
│       ├── test_pep517.py
│       ├── test_pyproject_config.py
│       ├── test_release_control.py
│       ├── test_req.py
│       ├── test_req_dependency_group.py
│       ├── test_req_file.py
│       ├── test_req_install.py
│       ├── test_req_uninstall.py
│       ├── test_resolution_legacy_resolver.py
│       ├── test_search_scope.py
│       ├── test_self_check_outdated.py
│       ├── test_target_python.py
│       ├── test_urls.py
│       ├── test_utils.py
│       ├── test_utils_compatibility_tags.py
│       ├── test_utils_datetime.py
│       ├── test_utils_filesystem.py
│       ├── test_utils_retry.py
│       ├── test_utils_subprocess.py
│       ├── test_utils_temp_dir.py
│       ├── test_utils_unpacking.py
│       ├── test_utils_virtualenv.py
│       ├── test_utils_wheel.py
│       ├── test_vcs.py
│       ├── test_vcs_mercurial.py
│       ├── test_wheel.py
│       └── test_wheel_builder.py
└── tools/
    ├── __init__.py
    ├── codespell-ignore.txt
    ├── news/
    │   └── template.rst
    ├── protected_pip.py
    ├── release/
    │   ├── __init__.py
    │   └── check_version.py
    ├── update-rtd-redirects.py
    └── vendoring/
        └── patches/
            ├── cachecontrol.patch
            ├── certifi.patch
            ├── pkg_resources.patch
            ├── pygments.patch
            ├── requests.patch
            ├── truststore.patch
            ├── urllib3-disable-brotli.patch
            └── urllib3.patch
Download .txt
Showing preview only (689K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (7934 symbols across 511 files)

FILE: build-project/build-project.py
  class EnvBuilder (line 13) | class EnvBuilder(venv.EnvBuilder):
    method ensure_directories (line 16) | def ensure_directories(
  function get_git_head_timestamp (line 24) | def get_git_head_timestamp() -> str:
  function main (line 37) | def main() -> None:

FILE: docs/html/conf.py
  function determine_man_pages (line 103) | def determine_man_pages() -> list[tuple[str, str, str, str, int]]:

FILE: docs/pip_sphinxext.py
  function convert_cli_option_to_envvar (line 23) | def convert_cli_option_to_envvar(opt_name: str) -> str:
  function convert_cli_opt_names_to_envvars (line 29) | def convert_cli_opt_names_to_envvars(original_cli_opt_names: list[str]) ...
  class PipNewsInclude (line 35) | class PipNewsInclude(rst.Directive):
    method _is_version_section_title_underline (line 38) | def _is_version_section_title_underline(self, prev: str | None, curr: ...
    method _iter_lines_with_refs (line 48) | def _iter_lines_with_refs(self, lines: Iterable[str]) -> Iterator[str]:
    method run (line 72) | def run(self) -> list[nodes.Node]:
  class PipCommandUsage (line 89) | class PipCommandUsage(rst.Directive):
    method run (line 93) | def run(self) -> list[nodes.Node]:
  class PipCommandDescription (line 105) | class PipCommandDescription(rst.Directive):
    method run (line 108) | def run(self) -> list[nodes.Node]:
  class PipOptions (line 121) | class PipOptions(rst.Directive):
    method _format_option (line 122) | def _format_option(
    method _format_options (line 159) | def _format_options(
    method run (line 168) | def run(self) -> list[nodes.Node]:
  class PipGeneralOptions (line 177) | class PipGeneralOptions(PipOptions):
    method process_options (line 178) | def process_options(self) -> None:
  class PipIndexOptions (line 182) | class PipIndexOptions(PipOptions):
    method process_options (line 185) | def process_options(self) -> None:
  class PipPackageSelectionOptions (line 193) | class PipPackageSelectionOptions(PipOptions):
    method process_options (line 196) | def process_options(self) -> None:
  class PipCommandOptions (line 204) | class PipCommandOptions(PipOptions):
    method process_options (line 207) | def process_options(self) -> None:
  class PipReqFileOptionsReference (line 215) | class PipReqFileOptionsReference(PipOptions):
    method determine_opt_prefix (line 216) | def determine_opt_prefix(self, opt_name: str) -> str:
    method process_options (line 224) | def process_options(self) -> None:
  class PipCLIDirective (line 247) | class PipCLIDirective(rst.Directive):
    method run (line 256) | def run(self) -> list[nodes.Node]:
  function setup (line 324) | def setup(app: Sphinx) -> dict[str, bool | str]:

FILE: noxfile.py
  function run_with_protected_pip (line 32) | def run_with_protected_pip(session: nox.Session, *arguments: str) -> None:
  function should_update_common_wheels (line 47) | def should_update_common_wheels(session: nox.Session) -> bool:
  function get_common_wheels (line 99) | def get_common_wheels(session: nox.Session) -> None:
  function common_wheels (line 119) | def common_wheels(session: nox.Session) -> None:
  function test (line 125) | def test(session: nox.Session) -> None:
  function docs (line 177) | def docs(session: nox.Session) -> None:
  function docs_live (line 207) | def docs_live(session: nox.Session) -> None:
  function lint (line 223) | def lint(session: nox.Session) -> None:
  function vendoring (line 242) | def vendoring(session: nox.Session) -> None:
  function coverage (line 310) | def coverage(session: nox.Session) -> None:
  function prepare_release (line 335) | def prepare_release(session: nox.Session) -> None:
  function build_release (line 373) | def build_release(session: nox.Session) -> None:
  function build_dists (line 404) | def build_dists(session: nox.Session) -> list[str]:
  function upload_release (line 432) | def upload_release(session: nox.Session) -> None:

FILE: src/pip/__init__.py
  function main (line 6) | def main(args: list[str] | None = None) -> int:

FILE: src/pip/__pip-runner__.py
  function version_str (line 15) | def version_str(version):  # type: ignore
  class PipImportRedirectingFinder (line 36) | class PipImportRedirectingFinder:
    method find_spec (line 38) | def find_spec(self, fullname, path=None, target=None):  # type: ignore

FILE: src/pip/_internal/__init__.py
  function main (line 10) | def main(args: list[str] | None = None) -> int:

FILE: src/pip/_internal/build_env.py
  class ExtraEnviron (line 44) | class ExtraEnviron(TypedDict, total=False):
  function _dedup (line 51) | def _dedup(a: str, b: str) -> tuple[str] | tuple[str, str]:
  class _Prefix (line 55) | class _Prefix:
    method __init__ (line 56) | def __init__(self, path: str) -> None:
  function get_runnable_pip (line 64) | def get_runnable_pip() -> str:
  function _get_system_sitepackages (line 80) | def _get_system_sitepackages() -> set[str]:
  class BuildEnvironmentInstaller (line 100) | class BuildEnvironmentInstaller(Protocol):
    method install (line 106) | def install(
  class SubprocessBuildEnvironmentInstaller (line 116) | class SubprocessBuildEnvironmentInstaller:
    method __init__ (line 121) | def __init__(
    method _deprecation_constraint_check (line 131) | def _deprecation_constraint_check(self) -> None:
    method install (line 160) | def install(
  class InprocessBuildEnvironmentInstaller (line 266) | class InprocessBuildEnvironmentInstaller:
    method __init__ (line 280) | def __init__(
    method install (line 320) | def install(
    method _install_impl (line 372) | def _install_impl(self, requirements: Iterable[str], prefix: _Prefix) ...
    method _make_resolver (line 413) | def _make_resolver(self) -> BaseResolver:
  class BuildEnvironment (line 437) | class BuildEnvironment:
    method __init__ (line 440) | def __init__(self, installer: BuildEnvironmentInstaller) -> None:
    method __enter__ (line 495) | def __enter__(self) -> None:
    method __exit__ (line 516) | def __exit__(
    method check_requirements (line 528) | def check_requirements(
    method install_requirements (line 562) | def install_requirements(
  class NoOpBuildEnvironment (line 578) | class NoOpBuildEnvironment(BuildEnvironment):
    method __init__ (line 581) | def __init__(self) -> None:
    method __enter__ (line 584) | def __enter__(self) -> None:
    method __exit__ (line 587) | def __exit__(
    method cleanup (line 595) | def cleanup(self) -> None:
    method install_requirements (line 598) | def install_requirements(

FILE: src/pip/_internal/cache.py
  function _hash_dict (line 27) | def _hash_dict(d: dict[str, str]) -> str:
  class Cache (line 33) | class Cache:
    method __init__ (line 39) | def __init__(self, cache_dir: str) -> None:
    method _get_cache_path_parts (line 44) | def _get_cache_path_parts(self, link: Link) -> list[str]:
    method _get_candidates (line 77) | def _get_candidates(self, link: Link, canonical_package_name: str) -> ...
    method get_path_for_link (line 87) | def get_path_for_link(self, link: Link) -> str:
    method get (line 91) | def get(
  class SimpleWheelCache (line 103) | class SimpleWheelCache(Cache):
    method __init__ (line 106) | def __init__(self, cache_dir: str) -> None:
    method get_path_for_link (line 109) | def get_path_for_link(self, link: Link) -> str:
    method get (line 129) | def get(
  class EphemWheelCache (line 173) | class EphemWheelCache(SimpleWheelCache):
    method __init__ (line 176) | def __init__(self) -> None:
  class CacheEntry (line 185) | class CacheEntry:
    method __init__ (line 186) | def __init__(
  class WheelCache (line 209) | class WheelCache(Cache):
    method __init__ (line 216) | def __init__(self, cache_dir: str) -> None:
    method get_path_for_link (line 221) | def get_path_for_link(self, link: Link) -> str:
    method get_ephem_path_for_link (line 224) | def get_ephem_path_for_link(self, link: Link) -> str:
    method get (line 227) | def get(
    method get_cache_entry (line 238) | def get_cache_entry(
    method record_download_origin (line 267) | def record_download_origin(cache_dir: str, download_info: DirectUrl) -...

FILE: src/pip/_internal/cli/autocompletion.py
  function autocomplete (line 17) | def autocomplete() -> None:
  function get_path_completion_type (line 132) | def get_path_completion_type(
  function auto_complete_paths (line 156) | def auto_complete_paths(current: str, completion_type: str) -> Iterable[...

FILE: src/pip/_internal/cli/base_command.py
  class Command (line 46) | class Command(CommandContextMixIn):
    method __init__ (line 50) | def __init__(self, name: str, summary: str, isolated: bool = False) ->...
    method add_options (line 80) | def add_options(self) -> None:
    method handle_pip_version_check (line 83) | def handle_pip_version_check(self, options: Values) -> None:
    method run (line 92) | def run(self, options: Values, args: list[str]) -> int:
    method _run_wrapper (line 95) | def _run_wrapper(self, level_number: int, options: Values, args: list[...
    method parse_args (line 152) | def parse_args(self, args: list[str]) -> tuple[Values, list[str]]:
    method main (line 156) | def main(self, args: list[str]) -> int:
    method _main (line 163) | def _main(self, args: list[str]) -> int:
    method handler_map (line 251) | def handler_map(self) -> dict[str, Callable[[Values, list[str]], None]]:

FILE: src/pip/_internal/cli/cmdoptions.py
  function raise_option_error (line 39) | def raise_option_error(parser: OptionParser, option: Option, msg: str) -...
  function make_option_group (line 53) | def make_option_group(group: dict[str, Any], parser: ConfigOptionParser)...
  function check_dist_restriction (line 65) | def check_dist_restriction(options: Values, check_target: bool = False) ...
  function check_build_constraints (line 105) | def check_build_constraints(options: Values) -> None:
  function _path_option_check (line 128) | def _path_option_check(option: Option, opt: str, value: str) -> str:
  function _package_name_option_check (line 132) | def _package_name_option_check(option: Option, opt: str, value: str) -> ...
  class PipOption (line 136) | class PipOption(Option):
  function exists_action (line 337) | def exists_action() -> Option:
  function extra_index_url (line 392) | def extra_index_url() -> Option:
  function find_links (line 415) | def find_links() -> Option:
  function _handle_uploaded_prior_to (line 431) | def _handle_uploaded_prior_to(
  function uploaded_prior_to (line 462) | def uploaded_prior_to() -> Option:
  function trusted_host (line 479) | def trusted_host() -> Option:
  function constraints (line 491) | def constraints() -> Option:
  function build_constraints (line 504) | def build_constraints() -> Option:
  function requirements (line 519) | def requirements() -> Option:
  function requirements_from_scripts (line 532) | def requirements_from_scripts() -> Option:
  function editable (line 544) | def editable() -> Option:
  function _handle_src (line 559) | def _handle_src(option: Option, opt_str: str, value: str, parser: Option...
  function _get_format_control (line 582) | def _get_format_control(values: Values, option: Option) -> Any:
  function _handle_no_binary (line 587) | def _handle_no_binary(
  function _handle_only_binary (line 598) | def _handle_only_binary(
  function no_binary (line 609) | def no_binary() -> Option:
  function only_binary (line 627) | def only_binary() -> Option:
  function _get_release_control (line 645) | def _get_release_control(values: Values, option: Option) -> Any:
  function _handle_all_releases (line 650) | def _handle_all_releases(
  function _handle_only_final (line 662) | def _handle_only_final(
  function all_releases (line 674) | def all_releases() -> Option:
  function only_final (line 692) | def only_final() -> Option:
  function check_release_control_exclusive (line 709) | def check_release_control_exclusive(options: Values) -> None:
  function _convert_python_version (line 741) | def _convert_python_version(value: str) -> tuple[tuple[int, ...], str | ...
  function _handle_python_version (line 770) | def _handle_python_version(
  function add_target_python_options (line 839) | def add_target_python_options(cmd_opts: OptionGroup) -> None:
  function make_target_python (line 846) | def make_target_python(options: Values) -> TargetPython:
  function prefer_binary (line 857) | def prefer_binary() -> Option:
  function _handle_no_cache_dir (line 881) | def _handle_no_cache_dir(
  function _handle_dependency_group (line 930) | def _handle_dependency_group(
  function _handle_config_settings (line 1009) | def _handle_config_settings(
  function _handle_merge_hash (line 1087) | def _handle_merge_hash(
  function check_list_path_option (line 1148) | def check_list_path_option(options: Values) -> None:

FILE: src/pip/_internal/cli/command_context.py
  class CommandContextMixIn (line 8) | class CommandContextMixIn:
    method __init__ (line 9) | def __init__(self) -> None:
    method main_context (line 15) | def main_context(self) -> Generator[None, None, None]:
    method enter_context (line 25) | def enter_context(self, context_provider: AbstractContextManager[_T]) ...

FILE: src/pip/_internal/cli/index_command.py
  function _create_truststore_ssl_context (line 34) | def _create_truststore_ssl_context() -> SSLContext | None:
  class SessionCommandMixin (line 56) | class SessionCommandMixin(CommandContextMixIn):
    method __init__ (line 61) | def __init__(self) -> None:
    method _get_index_urls (line 66) | def _get_index_urls(cls, options: Values) -> list[str] | None:
    method get_default_session (line 79) | def get_default_session(self, options: Values) -> PipSession:
    method _build_session (line 89) | def _build_session(
  function _pip_self_version_check (line 142) | def _pip_self_version_check(session: PipSession, options: Values) -> None:
  class IndexGroupCommand (line 148) | class IndexGroupCommand(Command, SessionCommandMixin):
    method should_exclude_prerelease (line 155) | def should_exclude_prerelease(
    method handle_pip_version_check (line 172) | def handle_pip_version_check(self, options: Values) -> None:

FILE: src/pip/_internal/cli/main.py
  function main (line 41) | def main(args: list[str] | None = None) -> int:

FILE: src/pip/_internal/cli/main_parser.py
  function create_main_parser (line 21) | def create_main_parser() -> ConfigOptionParser:
  function identify_python_interpreter (line 52) | def identify_python_interpreter(python: str) -> str | None:
  function parse_command (line 71) | def parse_command(args: list[str]) -> tuple[str, list[str]]:

FILE: src/pip/_internal/cli/parser.py
  class PrettyHelpFormatter (line 27) | class PrettyHelpFormatter(optparse.IndentedHelpFormatter):
    method __init__ (line 41) | def __init__(self, *args: Any, **kwargs: Any) -> None:
    method format_option_strings (line 48) | def format_option_strings(self, option: optparse.Option) -> str:
    method format_option (line 66) | def format_option(self, option: optparse.Option) -> str:
    method format_heading (line 96) | def format_heading(self, heading: str) -> str:
    method format_usage (line 101) | def format_usage(self, usage: str) -> str:
    method format_description (line 110) | def format_description(self, description: str | None) -> str:
    method format_epilog (line 129) | def format_epilog(self, epilog: str | None) -> str:
    method expand_default (line 136) | def expand_default(self, option: optparse.Option) -> str:
    method indent_lines (line 143) | def indent_lines(self, text: str, indent: str) -> str:
  class UpdatingDefaultsHelpFormatter (line 148) | class UpdatingDefaultsHelpFormatter(PrettyHelpFormatter):
    method expand_default (line 157) | def expand_default(self, option: optparse.Option) -> str:
  class CustomOptionParser (line 180) | class CustomOptionParser(optparse.OptionParser):
    method insert_option_group (line 181) | def insert_option_group(
    method option_list_all (line 193) | def option_list_all(self) -> list[optparse.Option]:
  class ConfigOptionParser (line 202) | class ConfigOptionParser(CustomOptionParser):
    method __init__ (line 206) | def __init__(
    method check_default (line 219) | def check_default(self, option: optparse.Option, key: str, val: Any) -...
    method _get_ordered_configuration_items (line 226) | def _get_ordered_configuration_items(
    method _update_defaults (line 257) | def _update_defaults(self, defaults: dict[str, Any]) -> dict[str, Any]:
    method get_default_values (line 321) | def get_default_values(self) -> optparse.Values:
    method error (line 343) | def error(self, msg: str) -> NoReturn:
    method print_help (line 347) | def print_help(self, file: Any = None) -> None:

FILE: src/pip/_internal/cli/progress_bars.py
  function _rich_download_progress_bar (line 33) | def _rich_download_progress_bar(
  function _rich_install_progress_bar (line 75) | def _rich_install_progress_bar(
  function _raw_progress_bar (line 97) | def _raw_progress_bar(
  function get_download_progress_renderer (line 120) | def get_download_progress_renderer(
  function get_install_progress_renderer (line 144) | def get_install_progress_renderer(

FILE: src/pip/_internal/cli/req_command.py
  function should_ignore_regular_constraints (line 59) | def should_ignore_regular_constraints(options: Values) -> bool:
  function with_cleanup (line 79) | def with_cleanup(
  function parse_constraint_files (line 107) | def parse_constraint_files(
  class RequirementCommand (line 132) | class RequirementCommand(IndexGroupCommand):
    method __init__ (line 133) | def __init__(self, *args: Any, **kw: Any) -> None:
    method determine_resolver_variant (line 140) | def determine_resolver_variant(options: Values) -> str:
    method make_requirement_preparer (line 148) | def make_requirement_preparer(
    method make_resolver (line 229) | def make_resolver(
    method get_requirements (line 285) | def get_requirements(
    method trace_basic_info (line 410) | def trace_basic_info(finder: PackageFinder) -> None:
    method _build_package_finder (line 420) | def _build_package_finder(

FILE: src/pip/_internal/cli/spinners.py
  class SpinnerInterface (line 30) | class SpinnerInterface:
    method spin (line 31) | def spin(self) -> None:
    method finish (line 34) | def finish(self, final_status: str) -> None:
  class InteractiveSpinner (line 38) | class InteractiveSpinner(SpinnerInterface):
    method __init__ (line 39) | def __init__(
    method _write (line 59) | def _write(self, status: str) -> None:
    method spin (line 71) | def spin(self) -> None:
    method finish (line 78) | def finish(self, final_status: str) -> None:
  class NonInteractiveSpinner (line 91) | class NonInteractiveSpinner(SpinnerInterface):
    method __init__ (line 92) | def __init__(self, message: str, min_update_interval_seconds: float = ...
    method _update (line 98) | def _update(self, status: str) -> None:
    method spin (line 103) | def spin(self) -> None:
    method finish (line 110) | def finish(self, final_status: str) -> None:
  class RateLimiter (line 117) | class RateLimiter:
    method __init__ (line 118) | def __init__(self, min_update_interval_seconds: float) -> None:
    method ready (line 122) | def ready(self) -> bool:
    method reset (line 127) | def reset(self) -> None:
  function open_spinner (line 132) | def open_spinner(message: str) -> Generator[SpinnerInterface, None, None]:
  class _PipRichSpinner (line 155) | class _PipRichSpinner:
    method __init__ (line 163) | def __init__(self, label: str) -> None:
    method __rich_console__ (line 170) | def __rich_console__(
    method __rich_measure__ (line 175) | def __rich_measure__(
    method render (line 181) | def render(self) -> RenderableType:
    method finish (line 187) | def finish(self, status: str) -> None:
  function open_rich_spinner (line 194) | def open_rich_spinner(label: str, console: Console | None = None) -> Gen...
  function hidden_cursor (line 220) | def hidden_cursor(file: IO[str]) -> Generator[None, None, None]:

FILE: src/pip/_internal/commands/__init__.py
  function create_command (line 116) | def create_command(name: str, **kwargs: Any) -> Command:
  function get_similar_commands (line 128) | def get_similar_commands(name: str) -> str | None:

FILE: src/pip/_internal/commands/cache.py
  class CacheCommand (line 16) | class CacheCommand(Command):
    method add_options (line 40) | def add_options(self) -> None:
    method handler_map (line 52) | def handler_map(self) -> dict[str, Callable[[Values, list[str]], None]]:
    method run (line 61) | def run(self, options: Values, args: list[str]) -> int:
    method get_cache_dir (line 87) | def get_cache_dir(self, options: Values, args: list[str]) -> None:
    method get_cache_info (line 93) | def get_cache_info(self, options: Values, args: list[str]) -> None:
    method list_cache_items (line 135) | def list_cache_items(self, options: Values, args: list[str]) -> None:
    method format_for_human (line 150) | def format_for_human(self, files: list[str]) -> None:
    method format_for_abspath (line 163) | def format_for_abspath(self, files: list[str]) -> None:
    method remove_cache_items (line 167) | def remove_cache_items(self, options: Values, args: list[str]) -> None:
    method purge_cache (line 218) | def purge_cache(self, options: Values, args: list[str]) -> None:
    method _cache_dir (line 224) | def _cache_dir(self, options: Values, subdir: str) -> str:
    method _find_http_files (line 227) | def _find_http_files(self, options: Values) -> list[str]:
    method _find_wheels (line 234) | def _find_wheels(self, options: Values, pattern: str) -> list[str]:

FILE: src/pip/_internal/commands/check.py
  class CheckCommand (line 18) | class CheckCommand(Command):
    method run (line 25) | def run(self, options: Values, args: list[str]) -> int:

FILE: src/pip/_internal/commands/completion.py
  class CompletionCommand (line 81) | class CompletionCommand(Command):
    method add_options (line 86) | def add_options(self) -> None:
    method run (line 122) | def run(self, options: Values, args: list[str]) -> int:

FILE: src/pip/_internal/commands/configuration.py
  class ConfigurationCommand (line 24) | class ConfigurationCommand(Command):
    method add_options (line 60) | def add_options(self) -> None:
    method handler_map (line 98) | def handler_map(self) -> dict[str, Callable[[Values, list[str]], None]]:
    method run (line 108) | def run(self, options: Values, args: list[str]) -> int:
    method _determine_file (line 146) | def _determine_file(self, options: Values, need_value: bool) -> Kind |...
    method list_values (line 176) | def list_values(self, options: Values, args: list[str]) -> None:
    method get_name (line 183) | def get_name(self, options: Values, args: list[str]) -> None:
    method set_name_value (line 189) | def set_name_value(self, options: Values, args: list[str]) -> None:
    method unset_name (line 195) | def unset_name(self, options: Values, args: list[str]) -> None:
    method list_config_values (line 201) | def list_config_values(self, options: Values, args: list[str]) -> None:
    method print_config_file_values (line 217) | def print_config_file_values(self, variant: Kind, fname: str) -> None:
    method print_env_var_values (line 225) | def print_env_var_values(self) -> None:
    method open_in_editor (line 233) | def open_in_editor(self, options: Values, args: list[str]) -> None:
    method _get_n_args (line 255) | def _get_n_args(self, args: list[str], example: str, n: int) -> Any:
    method _save_configuration (line 269) | def _save_configuration(self) -> None:
    method _determine_editor (line 280) | def _determine_editor(self, options: Values) -> str:

FILE: src/pip/_internal/commands/debug.py
  function show_value (line 28) | def show_value(name: str, value: Any) -> None:
  function show_sys_implementation (line 32) | def show_sys_implementation() -> None:
  function create_vendor_txt_map (line 39) | def create_vendor_txt_map() -> dict[str, str]:
  function get_module_from_module_name (line 51) | def get_module_from_module_name(module_name: str) -> ModuleType | None:
  function get_vendor_version_from_module (line 69) | def get_vendor_version_from_module(module_name: str) -> str | None:
  function show_actual_vendor_versions (line 84) | def show_actual_vendor_versions(vendor_txt_versions: dict[str, str]) -> ...
  function show_vendor_versions (line 105) | def show_vendor_versions() -> None:
  function show_tags (line 113) | def show_tags(options: Values) -> None:
  function ca_bundle_info (line 143) | def ca_bundle_info(config: Configuration) -> str:
  class DebugCommand (line 160) | class DebugCommand(Command):
    method add_options (line 169) | def add_options(self) -> None:
    method run (line 174) | def run(self, options: Values, args: list[str]) -> int:

FILE: src/pip/_internal/commands/download.py
  class DownloadCommand (line 16) | class DownloadCommand(RequirementCommand):
    method add_options (line 36) | def add_options(self) -> None:
    method run (line 78) | def run(self, options: Values, args: list[str]) -> int:

FILE: src/pip/_internal/commands/freeze.py
  function _should_suppress_build_backends (line 11) | def _should_suppress_build_backends() -> bool:
  function _dev_pkgs (line 15) | def _dev_pkgs() -> set[str]:
  class FreezeCommand (line 24) | class FreezeCommand(Command):
    method add_options (line 35) | def add_options(self) -> None:
    method run (line 87) | def run(self, options: Values, args: list[str]) -> int:

FILE: src/pip/_internal/commands/hash.py
  class HashCommand (line 14) | class HashCommand(Command):
    method add_options (line 25) | def add_options(self) -> None:
    method run (line 39) | def run(self, options: Values, args: list[str]) -> int:
  function _hash_of_file (line 52) | def _hash_of_file(path: str, algorithm: str) -> str:

FILE: src/pip/_internal/commands/help.py
  class HelpCommand (line 8) | class HelpCommand(Command):
    method run (line 15) | def run(self, options: Values, args: list[str]) -> int:

FILE: src/pip/_internal/commands/index.py
  class IndexCommand (line 30) | class IndexCommand(IndexGroupCommand):
    method add_options (line 40) | def add_options(self) -> None:
    method handler_map (line 60) | def handler_map(self) -> dict[str, Callable[[Values, list[str]], None]]:
    method run (line 65) | def run(self, options: Values, args: list[str]) -> int:
    method _build_package_finder (line 89) | def _build_package_finder(
    method get_available_package_versions (line 116) | def get_available_package_versions(self, options: Values, args: list[A...

FILE: src/pip/_internal/commands/inspect.py
  class InspectCommand (line 19) | class InspectCommand(Command):
    method add_options (line 28) | def add_options(self) -> None:
    method run (line 48) | def run(self, options: Values, args: list[str]) -> int:
    method _dist_to_dict (line 65) | def _dist_to_dict(self, dist: BaseDistribution) -> dict[str, Any]:

FILE: src/pip/_internal/commands/install.py
  class InstallCommand (line 66) | class InstallCommand(RequirementCommand):
    method add_options (line 86) | def add_options(self) -> None:
    method run (line 282) | def run(self, options: Values, args: list[str]) -> int:
    method _handle_target_dir (line 510) | def _handle_target_dir(
    method _determine_conflicts (line 564) | def _determine_conflicts(
    method _warn_about_conflicts (line 576) | def _warn_about_conflicts(
  function installed_packages_summary (line 627) | def installed_packages_summary(
  function get_lib_location_guesses (line 651) | def get_lib_location_guesses(
  function site_packages_writable (line 669) | def site_packages_writable(root: str | None, isolated: bool) -> bool:
  function decide_user_install (line 676) | def decide_user_install(
  function create_os_error_message (line 745) | def create_os_error_message(

FILE: src/pip/_internal/commands/list.py
  class _DistWithLatestInfo (line 26) | class _DistWithLatestInfo(BaseDistribution):
  class ListCommand (line 42) | class ListCommand(IndexGroupCommand):
    method add_options (line 53) | def add_options(self) -> None:
    method handle_pip_version_check (line 138) | def handle_pip_version_check(self, options: Values) -> None:
    method _build_package_finder (line 142) | def _build_package_finder(
    method run (line 165) | def run(self, options: Values, args: list[str]) -> int:
    method get_outdated (line 208) | def get_outdated(
    method get_uptodate (line 217) | def get_uptodate(
    method get_not_required (line 226) | def get_not_required(
    method iter_packages_latest_infos (line 240) | def iter_packages_latest_infos(
    method output_package_listing (line 277) | def output_package_listing(
    method output_package_listing_columns (line 300) | def output_package_listing_columns(
  function format_for_columns (line 317) | def format_for_columns(
  function format_for_json (line 377) | def format_for_json(packages: _ProcessedDists, options: Values) -> str:

FILE: src/pip/_internal/commands/lock.py
  class LockCommand (line 26) | class LockCommand(RequirementCommand):
    method add_options (line 48) | def add_options(self) -> None:
    method run (line 95) | def run(self, options: Values, args: list[str]) -> int:

FILE: src/pip/_internal/commands/search.py
  class TransformedHit (line 26) | class TransformedHit(TypedDict):
  class SearchCommand (line 35) | class SearchCommand(Command, SessionCommandMixin):
    method add_options (line 42) | def add_options(self) -> None:
    method run (line 54) | def run(self, options: Values, args: list[str]) -> int:
    method search (line 70) | def search(self, query: list[str], options: Values) -> list[dict[str, ...
  function transform_hits (line 88) | def transform_hits(hits: list[dict[str, str]]) -> list[TransformedHit]:
  function print_dist_installation_info (line 116) | def print_dist_installation_info(latest: str, dist: BaseDistribution | N...
  function get_installed_distribution (line 133) | def get_installed_distribution(name: str) -> BaseDistribution | None:
  function print_results (line 138) | def print_results(
  function highest_version (line 177) | def highest_version(versions: list[str]) -> str:

FILE: src/pip/_internal/commands/show.py
  function normalize_project_url_label (line 20) | def normalize_project_url_label(label: str) -> str:
  class ShowCommand (line 27) | class ShowCommand(Command):
    method add_options (line 38) | def add_options(self) -> None:
    method run (line 50) | def run(self, options: Values, args: list[str]) -> int:
  class _PackageInfo (line 64) | class _PackageInfo(NamedTuple):
  function search_packages_info (line 85) | def search_packages_info(query: list[str]) -> Generator[_PackageInfo, No...
  function print_results (line 178) | def print_results(

FILE: src/pip/_internal/commands/uninstall.py
  class UninstallCommand (line 25) | class UninstallCommand(Command, SessionCommandMixin):
    method add_options (line 40) | def add_options(self) -> None:
    method run (line 64) | def run(self, options: Values, args: list[str]) -> int:

FILE: src/pip/_internal/commands/wheel.py
  class WheelCommand (line 22) | class WheelCommand(RequirementCommand):
    method add_options (line 42) | def add_options(self) -> None:
    method run (line 94) | def run(self, options: Values, args: list[str]) -> int:

FILE: src/pip/_internal/configuration.py
  function _normalize_name (line 53) | def _normalize_name(name: str) -> str:
  function _disassemble_key (line 60) | def _disassemble_key(name: str) -> list[str]:
  function get_configuration_files (line 70) | def get_configuration_files() -> dict[Kind, list[str]]:
  class Configuration (line 89) | class Configuration:
    method __init__ (line 103) | def __init__(self, isolated: bool, load_only: Kind | None = None) -> N...
    method load (line 124) | def load(self) -> None:
    method get_file_to_edit (line 130) | def get_file_to_edit(self) -> str | None:
    method items (line 139) | def items(self) -> Iterable[tuple[str, Any]]:
    method get_value (line 145) | def get_value(self, key: str) -> Any:
    method set_value (line 160) | def set_value(self, key: str, value: Any) -> None:
    method unset_value (line 180) | def unset_value(self, key: str) -> None:
    method save (line 214) | def save(self) -> None:
    method _ensure_have_load_only (line 238) | def _ensure_have_load_only(self) -> None:
    method _dictionary (line 244) | def _dictionary(self) -> dict[str, dict[str, Any]]:
    method _load_config_files (line 255) | def _load_config_files(self) -> None:
    method _load_file (line 278) | def _load_file(self, variant: Kind, fname: str) -> RawConfigParser:
    method _construct_parser (line 289) | def _construct_parser(self, fname: str) -> RawConfigParser:
    method _load_environment_vars (line 310) | def _load_environment_vars(self) -> None:
    method _normalized_keys (line 317) | def _normalized_keys(
    method get_environ_vars (line 331) | def get_environ_vars(self) -> Iterable[tuple[str, str]]:
    method iter_config_files (line 340) | def iter_config_files(self) -> Iterable[tuple[Kind, list[str]]]:
    method get_values_in_config (line 372) | def get_values_in_config(self, variant: Kind) -> dict[str, Any]:
    method _get_parser_to_modify (line 376) | def _get_parser_to_modify(self) -> tuple[str, RawConfigParser]:
    method _mark_as_modified (line 390) | def _mark_as_modified(self, fname: str, parser: RawConfigParser) -> None:
    method __repr__ (line 395) | def __repr__(self) -> str:

FILE: src/pip/_internal/distributions/__init__.py
  function make_distribution_for_install_requirement (line 7) | def make_distribution_for_install_requirement(

FILE: src/pip/_internal/distributions/base.py
  class AbstractDistribution (line 13) | class AbstractDistribution(metaclass=abc.ABCMeta):
    method __init__ (line 32) | def __init__(self, req: InstallRequirement) -> None:
    method build_tracker_id (line 37) | def build_tracker_id(self) -> str | None:
    method get_metadata_distribution (line 45) | def get_metadata_distribution(self) -> BaseDistribution:
    method prepare_distribution_metadata (line 49) | def prepare_distribution_metadata(

FILE: src/pip/_internal/distributions/installed.py
  class InstalledDistribution (line 12) | class InstalledDistribution(AbstractDistribution):
    method build_tracker_id (line 20) | def build_tracker_id(self) -> str | None:
    method get_metadata_distribution (line 23) | def get_metadata_distribution(self) -> BaseDistribution:
    method prepare_distribution_metadata (line 27) | def prepare_distribution_metadata(

FILE: src/pip/_internal/distributions/sdist.py
  class SourceDistribution (line 19) | class SourceDistribution(AbstractDistribution):
    method build_tracker_id (line 27) | def build_tracker_id(self) -> str | None:
    method get_metadata_distribution (line 32) | def get_metadata_distribution(self) -> BaseDistribution:
    method prepare_distribution_metadata (line 35) | def prepare_distribution_metadata(
    method _prepare_build_backend (line 73) | def _prepare_build_backend(
    method _get_build_requires_wheel (line 101) | def _get_build_requires_wheel(self) -> Iterable[str]:
    method _get_build_requires_editable (line 109) | def _get_build_requires_editable(self) -> Iterable[str]:
    method _install_build_reqs (line 119) | def _install_build_reqs(
    method _raise_conflicts (line 140) | def _raise_conflicts(
    method _raise_missing_reqs (line 157) | def _raise_missing_reqs(self, missing: set[str]) -> None:

FILE: src/pip/_internal/distributions/wheel.py
  class WheelDistribution (line 18) | class WheelDistribution(AbstractDistribution):
    method build_tracker_id (line 25) | def build_tracker_id(self) -> str | None:
    method get_metadata_distribution (line 28) | def get_metadata_distribution(self) -> BaseDistribution:
    method prepare_distribution_metadata (line 38) | def prepare_distribution_metadata(

FILE: src/pip/_internal/exceptions.py
  function _is_kebab_case (line 44) | def _is_kebab_case(s: str) -> bool:
  function _prefix_with_indent (line 48) | def _prefix_with_indent(
  class PipError (line 65) | class PipError(Exception):
  class DiagnosticPipError (line 69) | class DiagnosticPipError(PipError):
    method __init__ (line 82) | def __init__(
    method __repr__ (line 112) | def __repr__(self) -> str:
    method __rich_console__ (line 123) | def __rich_console__(
  class ConfigurationError (line 187) | class ConfigurationError(PipError):
  class InstallationError (line 191) | class InstallationError(PipError):
  class FailedToPrepareCandidate (line 195) | class FailedToPrepareCandidate(InstallationError):
    method __init__ (line 203) | def __init__(
  class MissingPyProjectBuildRequires (line 212) | class MissingPyProjectBuildRequires(DiagnosticPipError):
    method __init__ (line 217) | def __init__(self, *, package: str) -> None:
  class InvalidPyProjectBuildRequires (line 229) | class InvalidPyProjectBuildRequires(DiagnosticPipError):
    method __init__ (line 234) | def __init__(self, *, package: str, reason: str) -> None:
  class NoneMetadataError (line 246) | class NoneMetadataError(PipError):
    method __init__ (line 255) | def __init__(
    method __str__ (line 268) | def __str__(self) -> str:
  class UserInstallationInvalid (line 274) | class UserInstallationInvalid(InstallationError):
    method __str__ (line 277) | def __str__(self) -> str:
  class InvalidSchemeCombination (line 281) | class InvalidSchemeCombination(InstallationError):
    method __str__ (line 282) | def __str__(self) -> str:
  class DistributionNotFound (line 287) | class DistributionNotFound(InstallationError):
  class RequirementsFileParseError (line 291) | class RequirementsFileParseError(InstallationError):
  class BestVersionAlreadyInstalled (line 295) | class BestVersionAlreadyInstalled(PipError):
  class BadCommand (line 300) | class BadCommand(PipError):
  class CommandError (line 304) | class CommandError(PipError):
  class PreviousBuildDirError (line 308) | class PreviousBuildDirError(PipError):
  class NetworkConnectionError (line 312) | class NetworkConnectionError(PipError):
    method __init__ (line 315) | def __init__(
    method __str__ (line 336) | def __str__(self) -> str:
  class InvalidWheelFilename (line 340) | class InvalidWheelFilename(InstallationError):
  class UnsupportedWheel (line 344) | class UnsupportedWheel(InstallationError):
  class InvalidWheel (line 348) | class InvalidWheel(InstallationError):
    method __init__ (line 351) | def __init__(self, location: str, name: str):
    method __str__ (line 355) | def __str__(self) -> str:
  class MetadataInconsistent (line 359) | class MetadataInconsistent(InstallationError):
    method __init__ (line 367) | def __init__(
    method __str__ (line 375) | def __str__(self) -> str:
  class MetadataInvalid (line 382) | class MetadataInvalid(InstallationError):
    method __init__ (line 385) | def __init__(self, ireq: InstallRequirement, error: str) -> None:
    method __str__ (line 389) | def __str__(self) -> str:
  class InstallationSubprocessError (line 393) | class InstallationSubprocessError(DiagnosticPipError, InstallationError):
    method __init__ (line 398) | def __init__(
    method __str__ (line 430) | def __str__(self) -> str:
  class MetadataGenerationFailed (line 434) | class MetadataGenerationFailed(DiagnosticPipError, InstallationError):
    method __init__ (line 437) | def __init__(
    method __str__ (line 449) | def __str__(self) -> str:
  class HashErrors (line 453) | class HashErrors(InstallationError):
    method __init__ (line 456) | def __init__(self) -> None:
    method append (line 459) | def append(self, error: HashError) -> None:
    method __str__ (line 462) | def __str__(self) -> str:
    method __bool__ (line 472) | def __bool__(self) -> bool:
  class HashError (line 476) | class HashError(InstallationError):
    method body (line 497) | def body(self) -> str:
    method __str__ (line 509) | def __str__(self) -> str:
    method _requirement_name (line 512) | def _requirement_name(self) -> str:
  class VcsHashUnsupported (line 522) | class VcsHashUnsupported(HashError):
  class DirectoryUrlHashUnsupported (line 533) | class DirectoryUrlHashUnsupported(HashError):
  class HashMissing (line 544) | class HashMissing(HashError):
    method __init__ (line 558) | def __init__(self, gotten_hash: str) -> None:
    method body (line 565) | def body(self) -> str:
  class HashUnpinned (line 586) | class HashUnpinned(HashError):
  class HashMismatch (line 597) | class HashMismatch(HashError):
    method __init__ (line 615) | def __init__(self, allowed: dict[str, list[str]], gots: dict[str, _Has...
    method body (line 625) | def body(self) -> str:
    method _hash_comparison (line 628) | def _hash_comparison(self) -> str:
  class UnsupportedPythonVersion (line 655) | class UnsupportedPythonVersion(InstallationError):
  class ConfigurationFileCouldNotBeLoaded (line 660) | class ConfigurationFileCouldNotBeLoaded(ConfigurationError):
    method __init__ (line 663) | def __init__(
    method __str__ (line 674) | def __str__(self) -> str:
  class ExternallyManagedEnvironment (line 690) | class ExternallyManagedEnvironment(DiagnosticPipError):
    method __init__ (line 702) | def __init__(self, error: str | None) -> None:
    method _iter_externally_managed_error_keys (line 720) | def _iter_externally_managed_error_keys() -> Iterator[str]:
    method from_config (line 742) | def from_config(
  class UninstallMissingRecord (line 763) | class UninstallMissingRecord(DiagnosticPipError):
    method __init__ (line 766) | def __init__(self, *, distribution: BaseDistribution) -> None:
  class LegacyDistutilsInstall (line 790) | class LegacyDistutilsInstall(DiagnosticPipError):
    method __init__ (line 793) | def __init__(self, *, distribution: BaseDistribution) -> None:
  class InvalidInstalledPackage (line 805) | class InvalidInstalledPackage(DiagnosticPipError):
    method __init__ (line 808) | def __init__(
  class IncompleteDownloadError (line 835) | class IncompleteDownloadError(DiagnosticPipError):
    method __init__ (line 841) | def __init__(self, download: _FileDownload) -> None:
  class ResolutionTooDeepError (line 869) | class ResolutionTooDeepError(DiagnosticPipError):
    method __init__ (line 874) | def __init__(self) -> None:
  class InstallWheelBuildError (line 889) | class InstallWheelBuildError(DiagnosticPipError):
    method __init__ (line 892) | def __init__(self, failed: list[InstallRequirement]) -> None:
  class InvalidEggFragment (line 903) | class InvalidEggFragment(DiagnosticPipError):
    method __init__ (line 906) | def __init__(self, link: Link, fragment: str) -> None:
  class BuildDependencyInstallError (line 926) | class BuildDependencyInstallError(DiagnosticPipError):
    method __init__ (line 931) | def __init__(

FILE: src/pip/_internal/index/collector.py
  function _match_vcs_scheme (line 46) | def _match_vcs_scheme(url: str) -> str | None:
  class _NotAPIContent (line 57) | class _NotAPIContent(Exception):
    method __init__ (line 58) | def __init__(self, content_type: str, request_desc: str) -> None:
  function _ensure_api_header (line 64) | def _ensure_api_header(response: Response) -> None:
  class _NotHTTP (line 86) | class _NotHTTP(Exception):
  function _ensure_api_response (line 90) | def _ensure_api_response(url: str, session: PipSession) -> None:
  function _get_simple_response (line 108) | def _get_simple_response(url: str, session: PipSession) -> Response:
  function _get_encoding_from_headers (line 171) | def _get_encoding_from_headers(headers: ResponseHeaders) -> str | None:
  class CacheablePageContent (line 182) | class CacheablePageContent:
    method __init__ (line 183) | def __init__(self, page: IndexContent) -> None:
    method __eq__ (line 187) | def __eq__(self, other: object) -> bool:
    method __hash__ (line 190) | def __hash__(self) -> int:
  class ParseLinks (line 194) | class ParseLinks(Protocol):
    method __call__ (line 195) | def __call__(self, page: IndexContent) -> Iterable[Link]: ...
  function with_cached_index_content (line 198) | def with_cached_index_content(fn: ParseLinks) -> ParseLinks:
  function parse_links (line 219) | def parse_links(page: IndexContent) -> Iterable[Link]:
  class IndexContent (line 248) | class IndexContent:
    method __str__ (line 264) | def __str__(self) -> str:
  class HTMLLinkParser (line 268) | class HTMLLinkParser(HTMLParser):
    method __init__ (line 274) | def __init__(self, url: str) -> None:
    method handle_starttag (line 281) | def handle_starttag(self, tag: str, attrs: list[tuple[str, str | None]...
    method get_href (line 289) | def get_href(self, attrs: list[tuple[str, str | None]]) -> str | None:
  function _handle_get_simple_fail (line 296) | def _handle_get_simple_fail(
  function _make_index_content (line 306) | def _make_index_content(
  function _get_index_content (line 319) | def _get_index_content(link: Link, *, session: PipSession) -> IndexConte...
  class CollectedSources (line 379) | class CollectedSources(NamedTuple):
  class LinkCollector (line 384) | class LinkCollector:
    method __init__ (line 392) | def __init__(
    method create (line 401) | def create(
    method find_links (line 435) | def find_links(self) -> list[str]:
    method fetch_response (line 438) | def fetch_response(self, location: Link) -> IndexContent | None:
    method collect_sources (line 444) | def collect_sources(

FILE: src/pip/_internal/index/package_finder.py
  function _check_link_requires_python (line 63) | def _check_link_requires_python(
  class LinkType (line 110) | class LinkType(enum.Enum):
  class LinkEvaluator (line 122) | class LinkEvaluator:
    method __init__ (line 133) | def __init__(
    method evaluate_link (line 174) | def evaluate_link(self, link: Link) -> tuple[LinkType, str]:
  function filter_unallowed_hashes (line 302) | def filter_unallowed_hashes(
  class CandidatePreferences (line 377) | class CandidatePreferences:
  class BestCandidateResult (line 388) | class BestCandidateResult:
    method __post_init__ (line 404) | def __post_init__(self) -> None:
  class CandidateEvaluator (line 413) | class CandidateEvaluator:
    method create (line 420) | def create(
    method __init__ (line 455) | def __init__(
    method get_applicable_candidates (line 481) | def get_applicable_candidates(
    method _sort_key (line 526) | def _sort_key(self, candidate: InstallationCandidate) -> CandidateSort...
    method sort_best_candidate (line 591) | def sort_best_candidate(
    method compute_best_candidate (line 604) | def compute_best_candidate(
  class PackageFinder (line 622) | class PackageFinder:
    method __init__ (line 629) | def __init__(
    method create (line 678) | def create(
    method target_python (line 714) | def target_python(self) -> TargetPython:
    method search_scope (line 718) | def search_scope(self) -> SearchScope:
    method search_scope (line 722) | def search_scope(self, search_scope: SearchScope) -> None:
    method find_links (line 726) | def find_links(self) -> list[str]:
    method index_urls (line 730) | def index_urls(self) -> list[str]:
    method proxy (line 734) | def proxy(self) -> str | None:
    method trusted_hosts (line 738) | def trusted_hosts(self) -> Iterable[str]:
    method custom_cert (line 743) | def custom_cert(self) -> str | None:
    method client_cert (line 751) | def client_cert(self) -> str | None:
    method release_control (line 757) | def release_control(self) -> ReleaseControl | None:
    method set_release_control (line 760) | def set_release_control(self, release_control: ReleaseControl) -> None:
    method prefer_binary (line 764) | def prefer_binary(self) -> bool:
    method set_prefer_binary (line 767) | def set_prefer_binary(self) -> None:
    method uploaded_prior_to (line 771) | def uploaded_prior_to(self) -> datetime.datetime | None:
    method requires_python_skipped_reasons (line 774) | def requires_python_skipped_reasons(self) -> list[str]:
    method make_link_evaluator (line 782) | def make_link_evaluator(self, project_name: str) -> LinkEvaluator:
    method _sort_links (line 796) | def _sort_links(self, links: Iterable[Link]) -> list[Link]:
    method _log_skipped_link (line 812) | def _log_skipped_link(self, link: Link, result: LinkType, detail: str)...
    method get_install_candidate (line 820) | def get_install_candidate(
    method evaluate_links (line 845) | def evaluate_links(
    method process_project_url (line 859) | def process_project_url(
    method find_all_candidates (line 880) | def find_all_candidates(self, project_name: str) -> list[InstallationC...
    method make_candidate_evaluator (line 937) | def make_candidate_evaluator(
    method find_best_candidate (line 954) | def find_best_candidate(
    method find_requirement (line 983) | def find_requirement(
  function _find_name_version_sep (line 1084) | def _find_name_version_sep(fragment: str, canonical_name: str) -> int:
  function _extract_version_from_fragment (line 1110) | def _extract_version_from_fragment(fragment: str, canonical_name: str) -...

FILE: src/pip/_internal/index/sources.py
  class LinkSource (line 31) | class LinkSource:
    method link (line 33) | def link(self) -> Link | None:
    method page_candidates (line 37) | def page_candidates(self) -> FoundCandidates:
    method file_links (line 41) | def file_links(self) -> FoundLinks:
  function _is_html_file (line 46) | def _is_html_file(file_url: str) -> bool:
  class _FlatDirectoryToUrls (line 50) | class _FlatDirectoryToUrls:
    method __init__ (line 53) | def __init__(self, path: str) -> None:
    method _scan_directory (line 59) | def _scan_directory(self) -> None:
    method page_candidates (line 83) | def page_candidates(self) -> list[str]:
    method project_name_to_urls (line 90) | def project_name_to_urls(self) -> dict[str, list[str]]:
  class _FlatDirectorySource (line 97) | class _FlatDirectorySource(LinkSource):
    method __init__ (line 108) | def __init__(
    method link (line 125) | def link(self) -> Link | None:
    method page_candidates (line 128) | def page_candidates(self) -> FoundCandidates:
    method file_links (line 132) | def file_links(self) -> FoundLinks:
  class _LocalFileSource (line 137) | class _LocalFileSource(LinkSource):
    method __init__ (line 147) | def __init__(
    method link (line 156) | def link(self) -> Link | None:
    method page_candidates (line 159) | def page_candidates(self) -> FoundCandidates:
    method file_links (line 164) | def file_links(self) -> FoundLinks:
  class _RemoteFileSource (line 170) | class _RemoteFileSource(LinkSource):
    method __init__ (line 179) | def __init__(
    method link (line 190) | def link(self) -> Link | None:
    method page_candidates (line 193) | def page_candidates(self) -> FoundCandidates:
    method file_links (line 198) | def file_links(self) -> FoundLinks:
  class _IndexDirectorySource (line 202) | class _IndexDirectorySource(LinkSource):
    method __init__ (line 209) | def __init__(
    method link (line 218) | def link(self) -> Link | None:
    method page_candidates (line 221) | def page_candidates(self) -> FoundCandidates:
    method file_links (line 224) | def file_links(self) -> FoundLinks:
  function build_source (line 228) | def build_source(

FILE: src/pip/_internal/locations/__init__.py
  function _should_use_sysconfig (line 47) | def _should_use_sysconfig() -> bool:
  function _looks_like_bpo_44860 (line 77) | def _looks_like_bpo_44860() -> bool:
  function _looks_like_red_hat_patched_platlib_purelib (line 91) | def _looks_like_red_hat_patched_platlib_purelib(scheme: dict[str, str]) ...
  function _looks_like_red_hat_lib (line 102) | def _looks_like_red_hat_lib() -> bool:
  function _looks_like_debian_scheme (line 117) | def _looks_like_debian_scheme() -> bool:
  function _looks_like_red_hat_scheme (line 125) | def _looks_like_red_hat_scheme() -> bool:
  function _looks_like_slackware_scheme (line 145) | def _looks_like_slackware_scheme() -> bool:
  function _looks_like_msys2_mingw_scheme (line 161) | def _looks_like_msys2_mingw_scheme() -> bool:
  function _warn_mismatched (line 179) | def _warn_mismatched(old: pathlib.Path, new: pathlib.Path, *, key: str) ...
  function _warn_if_mismatch (line 189) | def _warn_if_mismatch(old: pathlib.Path, new: pathlib.Path, *, key: str)...
  function _log_context (line 197) | def _log_context(
  function get_scheme (line 215) | def get_scheme(
  function get_bin_prefix (line 381) | def get_bin_prefix() -> str:
  function get_bin_user (line 392) | def get_bin_user() -> str:
  function _looks_like_deb_system_dist_packages (line 396) | def _looks_like_deb_system_dist_packages(value: str) -> bool:
  function get_purelib (line 413) | def get_purelib() -> str:
  function get_platlib (line 427) | def get_platlib() -> str:

FILE: src/pip/_internal/locations/_distutils.py
  function distutils_scheme (line 36) | def distutils_scheme(
  function get_scheme (line 116) | def get_scheme(
  function get_bin_prefix (line 151) | def get_bin_prefix() -> str:
  function get_purelib (line 168) | def get_purelib() -> str:
  function get_platlib (line 172) | def get_platlib() -> str:

FILE: src/pip/_internal/locations/_sysconfig.py
  function _should_use_osx_framework_prefix (line 33) | def _should_use_osx_framework_prefix() -> bool:
  function _infer_prefix (line 59) | def _infer_prefix() -> str:
  function _infer_user (line 90) | def _infer_user() -> str:
  function _infer_home (line 105) | def _infer_home() -> str:
  function get_scheme (line 128) | def get_scheme(
  function get_bin_prefix (line 206) | def get_bin_prefix() -> str:
  function get_purelib (line 213) | def get_purelib() -> str:
  function get_platlib (line 217) | def get_platlib() -> str:

FILE: src/pip/_internal/locations/base.py
  function get_major_minor_version (line 20) | def get_major_minor_version() -> str:
  function change_root (line 28) | def change_root(new_root: str, pathname: str) -> str:
  function get_src_prefix (line 56) | def get_src_prefix() -> str:
  function is_osx_framework (line 81) | def is_osx_framework() -> bool:

FILE: src/pip/_internal/main.py
  function main (line 4) | def main(args: list[str] | None = None) -> int:

FILE: src/pip/_internal/metadata/__init__.py
  function _should_use_importlib_metadata (line 30) | def _should_use_importlib_metadata() -> bool:
  function _emit_pkg_resources_deprecation_if_needed (line 63) | def _emit_pkg_resources_deprecation_if_needed() -> None:
  class Backend (line 88) | class Backend(Protocol):
  function select_backend (line 95) | def select_backend() -> Backend:
  function get_default_environment (line 108) | def get_default_environment() -> BaseEnvironment:
  function get_environment (line 118) | def get_environment(paths: list[str] | None) -> BaseEnvironment:
  function get_directory_distribution (line 128) | def get_directory_distribution(directory: str) -> BaseDistribution:
  function get_wheel_distribution (line 137) | def get_wheel_distribution(
  function get_metadata_distribution (line 150) | def get_metadata_distribution(

FILE: src/pip/_internal/metadata/_json.py
  function json_name (line 40) | def json_name(field: str) -> str:
  function msg_to_json (line 44) | def msg_to_json(msg: Message) -> dict[str, Any]:

FILE: src/pip/_internal/metadata/base.py
  class BaseEntryPoint (line 44) | class BaseEntryPoint(Protocol):
    method name (line 46) | def name(self) -> str:
    method value (line 50) | def value(self) -> str:
    method group (line 54) | def group(self) -> str:
  function _convert_installed_files_path (line 58) | def _convert_installed_files_path(
  class RequiresEntry (line 88) | class RequiresEntry(NamedTuple):
  class BaseDistribution (line 94) | class BaseDistribution(Protocol):
    method from_directory (line 96) | def from_directory(cls, directory: str) -> BaseDistribution:
    method from_metadata_file_contents (line 104) | def from_metadata_file_contents(
    method from_wheel (line 122) | def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution:
    method __repr__ (line 135) | def __repr__(self) -> str:
    method __str__ (line 138) | def __str__(self) -> str:
    method location (line 142) | def location(self) -> str | None:
    method editable_project_location (line 156) | def editable_project_location(self) -> str | None:
    method installed_location (line 178) | def installed_location(self) -> str | None:
    method info_location (line 191) | def info_location(self) -> str | None:
    method installed_by_distutils (line 207) | def installed_by_distutils(self) -> bool:
    method installed_as_egg (line 220) | def installed_as_egg(self) -> bool:
    method installed_with_setuptools_egg_info (line 234) | def installed_with_setuptools_egg_info(self) -> bool:
    method installed_with_dist_info (line 252) | def installed_with_dist_info(self) -> bool:
    method canonical_name (line 268) | def canonical_name(self) -> NormalizedName:
    method version (line 272) | def version(self) -> Version:
    method raw_version (line 276) | def raw_version(self) -> str:
    method setuptools_filename (line 280) | def setuptools_filename(self) -> str:
    method direct_url (line 288) | def direct_url(self) -> DirectUrl | None:
    method installer (line 314) | def installer(self) -> str:
    method requested (line 326) | def requested(self) -> bool:
    method editable (line 330) | def editable(self) -> bool:
    method local (line 334) | def local(self) -> bool:
    method in_usersite (line 344) | def in_usersite(self) -> bool:
    method in_site_packages (line 350) | def in_site_packages(self) -> bool:
    method is_file (line 355) | def is_file(self, path: InfoPath) -> bool:
    method iter_distutils_script_names (line 359) | def iter_distutils_script_names(self) -> Iterator[str]:
    method read_text (line 367) | def read_text(self, path: InfoPath) -> str:
    method iter_entry_points (line 376) | def iter_entry_points(self) -> Iterable[BaseEntryPoint]:
    method _metadata_impl (line 379) | def _metadata_impl(self) -> email.message.Message:
    method metadata (line 383) | def metadata(self) -> email.message.Message:
    method metadata_dict (line 396) | def metadata_dict(self) -> dict[str, Any]:
    method metadata_version (line 407) | def metadata_version(self) -> str | None:
    method raw_name (line 412) | def raw_name(self) -> str:
    method requires_python (line 419) | def requires_python(self) -> SpecifierSet:
    method iter_dependencies (line 437) | def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[...
    method iter_raw_dependencies (line 445) | def iter_raw_dependencies(self) -> Iterable[str]:
    method iter_provided_extras (line 449) | def iter_provided_extras(self) -> Iterable[NormalizedName]:
    method _iter_declared_entries_from_record (line 461) | def _iter_declared_entries_from_record(self) -> Iterator[str] | None:
    method _iter_declared_entries_from_legacy (line 469) | def _iter_declared_entries_from_legacy(self) -> Iterator[str] | None:
    method iter_declared_entries (line 490) | def iter_declared_entries(self) -> Iterator[str] | None:
    method _iter_requires_txt_entries (line 506) | def _iter_requires_txt_entries(self) -> Iterator[RequiresEntry]:
    method _iter_egg_info_extras (line 531) | def _iter_egg_info_extras(self) -> Iterable[str]:
    method _iter_egg_info_dependencies (line 541) | def _iter_egg_info_dependencies(self) -> Iterable[str]:
    method _add_egg_info_requires (line 569) | def _add_egg_info_requires(self, metadata: email.message.Message) -> N...
  class BaseEnvironment (line 579) | class BaseEnvironment:
    method default (line 583) | def default(cls) -> BaseEnvironment:
    method from_paths (line 587) | def from_paths(cls, paths: list[str] | None) -> BaseEnvironment:
    method get_distribution (line 590) | def get_distribution(self, name: str) -> BaseDistribution | None:
    method _iter_distributions (line 598) | def _iter_distributions(self) -> Iterator[BaseDistribution]:
    method iter_all_distributions (line 607) | def iter_all_distributions(self) -> Iterator[BaseDistribution]:
    method iter_installed_distributions (line 628) | def iter_installed_distributions(
  class Wheel (line 664) | class Wheel(Protocol):
    method as_zipfile (line 667) | def as_zipfile(self) -> zipfile.ZipFile:
  class FilesystemWheel (line 671) | class FilesystemWheel(Wheel):
    method __init__ (line 672) | def __init__(self, location: str) -> None:
    method as_zipfile (line 675) | def as_zipfile(self) -> zipfile.ZipFile:
  class MemoryWheel (line 679) | class MemoryWheel(Wheel):
    method __init__ (line 680) | def __init__(self, location: str, stream: IO[bytes]) -> None:
    method as_zipfile (line 684) | def as_zipfile(self) -> zipfile.ZipFile:

FILE: src/pip/_internal/metadata/importlib/_compat.py
  class BadMetadata (line 10) | class BadMetadata(ValueError):
    method __init__ (line 11) | def __init__(self, dist: importlib.metadata.Distribution, *, reason: s...
    method __str__ (line 15) | def __str__(self) -> str:
  class BasePath (line 19) | class BasePath(Protocol):
    method name (line 31) | def name(self) -> str:
    method parent (line 35) | def parent(self) -> BasePath:
  function get_info_location (line 39) | def get_info_location(d: importlib.metadata.Distribution) -> BasePath | ...
  function parse_name_and_version_from_info_directory (line 51) | def parse_name_and_version_from_info_directory(
  function get_dist_canonical_name (line 75) | def get_dist_canonical_name(dist: importlib.metadata.Distribution) -> No...

FILE: src/pip/_internal/metadata/importlib/_dists.py
  class WheelDistribution (line 38) | class WheelDistribution(importlib.metadata.Distribution):
    method __init__ (line 49) | def __init__(
    method from_zipfile (line 58) | def from_zipfile(
    method iterdir (line 77) | def iterdir(self, path: InfoPath) -> Iterator[pathlib.PurePosixPath]:
    method read_text (line 83) | def read_text(self, filename: str) -> str | None:
    method locate_file (line 96) | def locate_file(self, path: str | PathLike[str]) -> pathlib.Path:
  class Distribution (line 102) | class Distribution(BaseDistribution):
    method __init__ (line 103) | def __init__(
    method from_directory (line 114) | def from_directory(cls, directory: str) -> BaseDistribution:
    method from_metadata_file_contents (line 120) | def from_metadata_file_contents(
    method from_wheel (line 137) | def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution:
    method location (line 146) | def location(self) -> str | None:
    method info_location (line 152) | def info_location(self) -> str | None:
    method installed_location (line 158) | def installed_location(self) -> str | None:
    method canonical_name (line 164) | def canonical_name(self) -> NormalizedName:
    method version (line 168) | def version(self) -> Version:
    method raw_version (line 179) | def raw_version(self) -> str:
    method is_file (line 182) | def is_file(self, path: InfoPath) -> bool:
    method iter_distutils_script_names (line 185) | def iter_distutils_script_names(self) -> Iterator[str]:
    method read_text (line 194) | def read_text(self, path: InfoPath) -> str:
    method iter_entry_points (line 200) | def iter_entry_points(self) -> Iterable[BaseEntryPoint]:
    method _metadata_impl (line 204) | def _metadata_impl(self) -> email.message.Message:
    method iter_provided_extras (line 218) | def iter_provided_extras(self) -> Iterable[NormalizedName]:
    method iter_dependencies (line 224) | def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[...

FILE: src/pip/_internal/metadata/importlib/_envs.py
  function _looks_like_wheel (line 28) | def _looks_like_wheel(location: str) -> bool:
  class _DistributionFinder (line 40) | class _DistributionFinder:
    method __init__ (line 55) | def __init__(self) -> None:
    method _find_impl (line 58) | def _find_impl(self, location: str) -> Iterator[FoundResult]:
    method find (line 79) | def find(self, location: str) -> Iterator[BaseDistribution]:
    method find_legacy_editables (line 91) | def find_legacy_editables(self, location: str) -> Iterator[BaseDistrib...
  class Environment (line 116) | class Environment(BaseEnvironment):
    method __init__ (line 117) | def __init__(self, paths: Sequence[str]) -> None:
    method default (line 121) | def default(cls) -> BaseEnvironment:
    method from_paths (line 125) | def from_paths(cls, paths: list[str] | None) -> BaseEnvironment:
    method _iter_distributions (line 130) | def _iter_distributions(self) -> Iterator[BaseDistribution]:
    method get_distribution (line 136) | def get_distribution(self, name: str) -> BaseDistribution | None:

FILE: src/pip/_internal/metadata/pkg_resources.py
  class EntryPoint (line 39) | class EntryPoint(NamedTuple):
  class InMemoryMetadata (line 45) | class InMemoryMetadata:
    method __init__ (line 51) | def __init__(self, metadata: Mapping[str, bytes], wheel_name: str) -> ...
    method has_metadata (line 55) | def has_metadata(self, name: str) -> bool:
    method get_metadata (line 58) | def get_metadata(self, name: str) -> str:
    method get_metadata_lines (line 67) | def get_metadata_lines(self, name: str) -> Iterable[str]:
    method metadata_isdir (line 70) | def metadata_isdir(self, name: str) -> bool:
    method metadata_listdir (line 73) | def metadata_listdir(self, name: str) -> list[str]:
    method run_script (line 76) | def run_script(self, script_name: str, namespace: str) -> None:
  class Distribution (line 80) | class Distribution(BaseDistribution):
    method __init__ (line 81) | def __init__(self, dist: pkg_resources.Distribution) -> None:
    method _extra_mapping (line 88) | def _extra_mapping(self) -> Mapping[NormalizedName, str]:
    method from_directory (line 97) | def from_directory(cls, directory: str) -> BaseDistribution:
    method from_metadata_file_contents (line 117) | def from_metadata_file_contents(
    method from_wheel (line 134) | def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution:
    method location (line 155) | def location(self) -> str | None:
    method installed_location (line 159) | def installed_location(self) -> str | None:
    method info_location (line 170) | def info_location(self) -> str | None:
    method installed_by_distutils (line 174) | def installed_by_distutils(self) -> bool:
    method canonical_name (line 184) | def canonical_name(self) -> NormalizedName:
    method version (line 188) | def version(self) -> Version:
    method raw_version (line 192) | def raw_version(self) -> str:
    method is_file (line 195) | def is_file(self, path: InfoPath) -> bool:
    method iter_distutils_script_names (line 198) | def iter_distutils_script_names(self) -> Iterator[str]:
    method read_text (line 201) | def read_text(self, path: InfoPath) -> str:
    method iter_entry_points (line 210) | def iter_entry_points(self) -> Iterable[BaseEntryPoint]:
    method _metadata_impl (line 216) | def _metadata_impl(self) -> email.message.Message:
    method iter_dependencies (line 238) | def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[...
    method iter_provided_extras (line 246) | def iter_provided_extras(self) -> Iterable[NormalizedName]:
  class Environment (line 250) | class Environment(BaseEnvironment):
    method __init__ (line 251) | def __init__(self, ws: pkg_resources.WorkingSet) -> None:
    method default (line 255) | def default(cls) -> BaseEnvironment:
    method from_paths (line 259) | def from_paths(cls, paths: list[str] | None) -> BaseEnvironment:
    method _iter_distributions (line 262) | def _iter_distributions(self) -> Iterator[BaseDistribution]:
    method _search_distribution (line 266) | def _search_distribution(self, name: str) -> BaseDistribution | None:
    method get_distribution (line 278) | def get_distribution(self, name: str) -> BaseDistribution | None:

FILE: src/pip/_internal/models/candidate.py
  class InstallationCandidate (line 10) | class InstallationCandidate:
    method __init__ (line 19) | def __init__(self, name: str, version: str, link: Link) -> None:
    method __str__ (line 24) | def __str__(self) -> str:

FILE: src/pip/_internal/models/direct_url.py
  class DirectUrlValidationError (line 26) | class DirectUrlValidationError(Exception):
  function _get (line 30) | def _get(
  function _get_required (line 44) | def _get_required(
  function _exactly_one_of (line 53) | def _exactly_one_of(infos: Iterable[InfoType | None]) -> InfoType:
  function _filter_none (line 67) | def _filter_none(**kwargs: Any) -> dict[str, Any]:
  class VcsInfo (line 73) | class VcsInfo:
    method _from_dict (line 81) | def _from_dict(cls, d: dict[str, Any] | None) -> VcsInfo | None:
    method _to_dict (line 90) | def _to_dict(self) -> dict[str, Any]:
  class ArchiveInfo (line 98) | class ArchiveInfo:
    method __init__ (line 101) | def __init__(
    method hash (line 111) | def hash(self) -> str | None:
    method hash (line 115) | def hash(self, value: str | None) -> None:
    method _from_dict (line 133) | def _from_dict(cls, d: dict[str, Any] | None) -> ArchiveInfo | None:
    method _to_dict (line 138) | def _to_dict(self) -> dict[str, Any]:
  class DirInfo (line 143) | class DirInfo:
    method _from_dict (line 149) | def _from_dict(cls, d: dict[str, Any] | None) -> DirInfo | None:
    method _to_dict (line 154) | def _to_dict(self) -> dict[str, Any]:
  class DirectUrl (line 162) | class DirectUrl:
    method _remove_auth_from_netloc (line 167) | def _remove_auth_from_netloc(self, netloc: str) -> str:
    method redacted_url (line 182) | def redacted_url(self) -> str:
    method validate (line 194) | def validate(self) -> None:
    method from_dict (line 198) | def from_dict(cls, d: dict[str, Any]) -> DirectUrl:
    method to_dict (line 211) | def to_dict(self) -> dict[str, Any]:
    method from_json (line 220) | def from_json(cls, s: str) -> DirectUrl:
    method to_json (line 223) | def to_json(self) -> str:
    method is_local_editable (line 226) | def is_local_editable(self) -> bool:

FILE: src/pip/_internal/models/format_control.py
  class FormatControl (line 8) | class FormatControl:
    method __init__ (line 13) | def __init__(
    method __eq__ (line 26) | def __eq__(self, other: object) -> bool:
    method __repr__ (line 35) | def __repr__(self) -> str:
    method handle_mutual_excludes (line 39) | def handle_mutual_excludes(value: str, target: set[str], other: set[st...
    method get_allowed_formats (line 61) | def get_allowed_formats(self, canonical_name: str) -> frozenset[str]:
    method disallow_binaries (line 73) | def disallow_binaries(self) -> None:

FILE: src/pip/_internal/models/index.py
  class PackageIndex (line 4) | class PackageIndex:
    method __init__ (line 9) | def __init__(self, url: str, file_storage_domain: str) -> None:
    method _url_for_path (line 21) | def _url_for_path(self, path: str) -> str:

FILE: src/pip/_internal/models/installation_report.py
  class InstallationReport (line 10) | class InstallationReport:
    method __init__ (line 11) | def __init__(self, install_requirements: Sequence[InstallRequirement]):
    method _install_req_to_dict (line 15) | def _install_req_to_dict(cls, ireq: InstallRequirement) -> dict[str, A...
    method to_dict (line 43) | def to_dict(self) -> dict[str, Any]:

FILE: src/pip/_internal/models/link.py
  class LinkHash (line 40) | class LinkHash:
    method __post_init__ (line 64) | def __post_init__(self) -> None:
    method find_hash_url_fragment (line 69) | def find_hash_url_fragment(cls, url: str) -> LinkHash | None:
    method as_dict (line 77) | def as_dict(self) -> dict[str, str]:
    method as_hashes (line 80) | def as_hashes(self) -> Hashes:
    method is_hash_allowed (line 84) | def is_hash_allowed(self, hashes: Hashes | None) -> bool:
  class MetadataFile (line 94) | class MetadataFile:
    method __post_init__ (line 99) | def __post_init__(self) -> None:
  function supported_hashes (line 104) | def supported_hashes(hashes: dict[str, str] | None) -> dict[str, str] | ...
  function _clean_url_path_part (line 115) | def _clean_url_path_part(part: str) -> str:
  function _clean_file_url_path (line 123) | def _clean_file_url_path(part: str) -> str:
  function _clean_url_path (line 144) | def _clean_url_path(path: str, is_local_path: bool) -> str:
  function _ensure_quoted_url (line 166) | def _ensure_quoted_url(url: str) -> str:
  function _absolute_link_url (line 185) | def _absolute_link_url(base_url: str, url: str) -> str:
  class Link (line 197) | class Link:
    method __init__ (line 214) | def __init__(
    method from_json (line 283) | def from_json(
    method from_element (line 340) | def from_element(
    method __str__ (line 391) | def __str__(self) -> str:
    method __repr__ (line 401) | def __repr__(self) -> str:
    method __hash__ (line 404) | def __hash__(self) -> int:
    method __eq__ (line 407) | def __eq__(self, other: Any) -> bool:
    method __lt__ (line 412) | def __lt__(self, other: Any) -> bool:
    method url (line 418) | def url(self) -> str:
    method redacted_url (line 422) | def redacted_url(self) -> str:
    method filename (line 426) | def filename(self) -> str:
    method file_path (line 440) | def file_path(self) -> str:
    method scheme (line 444) | def scheme(self) -> str:
    method netloc (line 448) | def netloc(self) -> str:
    method path (line 455) | def path(self) -> str:
    method splitext (line 458) | def splitext(self) -> tuple[str, str]:
    method ext (line 462) | def ext(self) -> str:
    method url_without_fragment (line 466) | def url_without_fragment(self) -> str:
    method _egg_fragment (line 477) | def _egg_fragment(self) -> str | None:
    method subdirectory_fragment (line 493) | def subdirectory_fragment(self) -> str | None:
    method metadata_link (line 499) | def metadata_link(self) -> Link | None:
    method as_hashes (line 508) | def as_hashes(self) -> Hashes:
    method hash (line 512) | def hash(self) -> str | None:
    method hash_name (line 516) | def hash_name(self) -> str | None:
    method show_url (line 520) | def show_url(self) -> str:
    method is_file (line 524) | def is_file(self) -> bool:
    method is_existing_dir (line 527) | def is_existing_dir(self) -> bool:
    method is_wheel (line 531) | def is_wheel(self) -> bool:
    method is_vcs (line 535) | def is_vcs(self) -> bool:
    method is_yanked (line 541) | def is_yanked(self) -> bool:
    method has_hash (line 545) | def has_hash(self) -> bool:
    method is_hash_allowed (line 548) | def is_hash_allowed(self, hashes: Hashes | None) -> bool:
  class _CleanResult (line 557) | class _CleanResult(NamedTuple):
  function _clean_link (line 589) | def _clean_link(link: Link) -> _CleanResult:
  function links_equivalent (line 616) | def links_equivalent(link1: Link, link2: Link) -> bool:

FILE: src/pip/_internal/models/release_control.py
  class ReleaseControl (line 12) | class ReleaseControl:
    method handle_mutual_excludes (line 21) | def handle_mutual_excludes(
    method get_ordered_args (line 60) | def get_ordered_args(self) -> list[tuple[str, str]]:
    method allows_prereleases (line 75) | def allows_prereleases(self, canonical_name: NormalizedName) -> bool |...

FILE: src/pip/_internal/models/scheme.py
  class Scheme (line 14) | class Scheme:

FILE: src/pip/_internal/models/search_scope.py
  class SearchScope (line 18) | class SearchScope:
    method create (line 30) | def create(
    method get_formatted_locations (line 71) | def get_formatted_locations(self) -> str:
    method get_index_urls_locations (line 106) | def get_index_urls_locations(self, project_name: str) -> list[str]:

FILE: src/pip/_internal/models/selection_prefs.py
  class SelectionPreferences (line 9) | class SelectionPreferences:
    method __init__ (line 27) | def __init__(

FILE: src/pip/_internal/models/target_python.py
  class TargetPython (line 11) | class TargetPython:
    method __init__ (line 28) | def __init__(
    method format_given (line 69) | def format_given(self) -> str:
    method get_sorted_tags (line 89) | def get_sorted_tags(self) -> list[Tag]:
    method get_unsorted_tags (line 114) | def get_unsorted_tags(self) -> set[Tag]:

FILE: src/pip/_internal/models/wheel.py
  class Wheel (line 18) | class Wheel:
    method __init__ (line 21) | def __init__(self, filename: str) -> None:
    method get_formatted_file_tags (line 32) | def get_formatted_file_tags(self) -> list[str]:
    method support_index_min (line 36) | def support_index_min(self, tags: list[Tag]) -> int:
    method find_most_preferred_tag (line 54) | def find_most_preferred_tag(
    method supported (line 75) | def supported(self, tags: Iterable[Tag]) -> bool:

FILE: src/pip/_internal/network/auth.py
  class Credentials (line 44) | class Credentials(NamedTuple):
  class KeyRingBaseProvider (line 50) | class KeyRingBaseProvider(ABC):
    method get_auth_info (line 56) | def get_auth_info(self, url: str, username: str | None) -> AuthInfo | ...
    method save_auth_info (line 59) | def save_auth_info(self, url: str, username: str, password: str) -> No...
  class KeyRingNullProvider (line 62) | class KeyRingNullProvider(KeyRingBaseProvider):
    method get_auth_info (line 67) | def get_auth_info(self, url: str, username: str | None) -> AuthInfo | ...
    method save_auth_info (line 70) | def save_auth_info(self, url: str, username: str, password: str) -> None:
  class KeyRingPythonProvider (line 74) | class KeyRingPythonProvider(KeyRingBaseProvider):
    method __init__ (line 79) | def __init__(self) -> None:
    method get_auth_info (line 84) | def get_auth_info(self, url: str, username: str | None) -> AuthInfo | ...
    method save_auth_info (line 102) | def save_auth_info(self, url: str, username: str, password: str) -> None:
  class KeyRingCliProvider (line 106) | class KeyRingCliProvider(KeyRingBaseProvider):
    method __init__ (line 117) | def __init__(self, cmd: str) -> None:
    method get_auth_info (line 120) | def get_auth_info(self, url: str, username: str | None) -> AuthInfo | ...
    method save_auth_info (line 129) | def save_auth_info(self, url: str, username: str, password: str) -> None:
    method _get_password (line 132) | def _get_password(self, service_name: str, username: str) -> str | None:
    method _set_password (line 150) | def _set_password(self, service_name: str, username: str, password: st...
  function get_keyring_provider (line 166) | def get_keyring_provider(provider: str) -> KeyRingBaseProvider:
  class MultiDomainBasicAuth (line 227) | class MultiDomainBasicAuth(AuthBase):
    method __init__ (line 228) | def __init__(
    method keyring_provider (line 246) | def keyring_provider(self) -> KeyRingBaseProvider:
    method keyring_provider (line 250) | def keyring_provider(self, provider: str) -> None:
    method use_keyring (line 258) | def use_keyring(self) -> bool:
    method _get_keyring_auth (line 264) | def _get_keyring_auth(
    method _get_index_url (line 290) | def _get_index_url(self, url: str) -> str | None:
    method _get_new_credentials (line 338) | def _get_new_credentials(
    method _get_url_and_credentials (line 395) | def _get_url_and_credentials(
    method __call__ (line 443) | def __call__(self, req: PreparedRequest) -> PreparedRequest:
    method _prompt_for_password (line 461) | def _prompt_for_password(self, netloc: str) -> tuple[str | None, str |...
    method _should_save_password_to_keyring (line 473) | def _should_save_password_to_keyring(self) -> bool:
    method handle_401 (line 482) | def handle_401(self, resp: Response, **kwargs: Any) -> Response:
    method warn_on_401 (line 545) | def warn_on_401(self, resp: Response, **kwargs: Any) -> None:
    method save_credentials (line 553) | def save_credentials(self, resp: Response, **kwargs: Any) -> None:

FILE: src/pip/_internal/network/cache.py
  function is_from_cache (line 24) | def is_from_cache(response: Response) -> bool:
  function suppressed_cache_errors (line 29) | def suppressed_cache_errors() -> Generator[None, None, None]:
  class SafeFileCache (line 39) | class SafeFileCache(SeparateBodyBaseCache):
    method __init__ (line 57) | def __init__(self, directory: str) -> None:
    method _get_cache_path (line 62) | def _get_cache_path(self, name: str) -> str:
    method get (line 70) | def get(self, key: str) -> bytes | None:
    method _write_to_file (line 80) | def _write_to_file(self, path: str, writer_func: Callable[[BinaryIO], ...
    method _write (line 93) | def _write(self, path: str, data: bytes) -> None:
    method _write_from_io (line 96) | def _write_from_io(self, path: str, source_file: BinaryIO) -> None:
    method set (line 99) | def set(
    method delete (line 105) | def delete(self, key: str) -> None:
    method get_body (line 112) | def get_body(self, key: str) -> BinaryIO | None:
    method set_body (line 121) | def set_body(self, key: str, body: bytes) -> None:
    method set_body_from_io (line 125) | def set_body_from_io(self, key: str, body_file: BinaryIO) -> None:

FILE: src/pip/_internal/network/download.py
  function _get_http_response_size (line 32) | def _get_http_response_size(resp: Response) -> int | None:
  function _get_http_response_etag_or_last_modified (line 39) | def _get_http_response_etag_or_last_modified(resp: Response) -> str | None:
  function _log_download (line 47) | def _log_download(
  function sanitize_content_filename (line 98) | def sanitize_content_filename(filename: str) -> str:
  function parse_content_disposition (line 105) | def parse_content_disposition(content_disposition: str, default_filename...
  function _get_http_response_filename (line 120) | def _get_http_response_filename(resp: Response, link: Link) -> str:
  class _FileDownload (line 142) | class _FileDownload:
    method is_incomplete (line 151) | def is_incomplete(self) -> bool:
    method write_chunk (line 154) | def write_chunk(self, data: bytes) -> None:
    method reset_file (line 158) | def reset_file(self) -> None:
  class Downloader (line 165) | class Downloader:
    method __init__ (line 166) | def __init__(
    method batch (line 178) | def batch(
    method __call__ (line 186) | def __call__(self, link: Link, location: str) -> tuple[str, str]:
    method _process_response (line 201) | def _process_response(self, download: _FileDownload, resp: Response) -...
    method _attempt_resumes_or_redownloads (line 220) | def _attempt_resumes_or_redownloads(
    method _cache_resumed_download (line 260) | def _cache_resumed_download(
    method _http_get_resume (line 316) | def _http_get_resume(
    method _http_get (line 330) | def _http_get(self, link: Link, headers: Mapping[str, str] = HEADERS) ...

FILE: src/pip/_internal/network/lazy_wheel.py
  class HTTPRangeRequestUnsupported (line 22) | class HTTPRangeRequestUnsupported(Exception):
  function dist_from_wheel_url (line 26) | def dist_from_wheel_url(
  class LazyZipOverHTTP (line 45) | class LazyZipOverHTTP:
    method __init__ (line 54) | def __init__(
    method mode (line 71) | def mode(self) -> str:
    method name (line 76) | def name(self) -> str:
    method seekable (line 80) | def seekable(self) -> bool:
    method close (line 84) | def close(self) -> None:
    method closed (line 89) | def closed(self) -> bool:
    method read (line 93) | def read(self, size: int = -1) -> bytes:
    method readable (line 107) | def readable(self) -> bool:
    method seek (line 111) | def seek(self, offset: int, whence: int = 0) -> int:
    method tell (line 121) | def tell(self) -> int:
    method truncate (line 125) | def truncate(self, size: int | None = None) -> int:
    method writable (line 135) | def writable(self) -> bool:
    method __enter__ (line 139) | def __enter__(self) -> LazyZipOverHTTP:
    method __exit__ (line 143) | def __exit__(self, *exc: Any) -> None:
    method _stay (line 147) | def _stay(self) -> Generator[None, None, None]:
    method _check_zip (line 158) | def _check_zip(self) -> None:
    method _stream_response (line 173) | def _stream_response(
    method _merge (line 183) | def _merge(
    method _download (line 205) | def _download(self, start: int, end: int) -> None:

FILE: src/pip/_internal/network/session.py
  function looks_like_ci (line 98) | def looks_like_ci() -> bool:
  function user_agent (line 109) | def user_agent() -> str:
  class LocalFSAdapter (line 210) | class LocalFSAdapter(BaseAdapter):
    method send (line 211) | def send(
    method close (line 251) | def close(self) -> None:
  class _SSLContextAdapterMixin (line 255) | class _SSLContextAdapterMixin:
    method __init__ (line 263) | def __init__(
    method init_poolmanager (line 272) | def init_poolmanager(
    method proxy_manager_for (line 288) | def proxy_manager_for(self, proxy: str, **proxy_kwargs: Any) -> ProxyM...
  class HTTPAdapter (line 296) | class HTTPAdapter(_SSLContextAdapterMixin, _BaseHTTPAdapter):
  class CacheControlAdapter (line 300) | class CacheControlAdapter(_SSLContextAdapterMixin, _BaseCacheControlAdap...
  class InsecureHTTPAdapter (line 304) | class InsecureHTTPAdapter(HTTPAdapter):
    method cert_verify (line 305) | def cert_verify(
  class InsecureCacheControlAdapter (line 315) | class InsecureCacheControlAdapter(CacheControlAdapter):
    method cert_verify (line 316) | def cert_verify(
  class PipSession (line 326) | class PipSession(requests.Session):
    method __init__ (line 329) | def __init__(
    method update_index_urls (line 413) | def update_index_urls(self, new_index_urls: list[str]) -> None:
    method add_trusted_host (line 420) | def add_trusted_host(
    method iter_secure_origins (line 453) | def iter_secure_origins(self) -> Generator[SecureOrigin, None, None]:
    method is_secure_origin (line 458) | def is_secure_origin(self, location: Link) -> bool:
    method request (line 525) | def request(self, method: str, url: str, *args: Any, **kwargs: Any) ->...

FILE: src/pip/_internal/network/utils.py
  function raise_for_status (line 31) | def raise_for_status(resp: Response) -> None:
  function response_chunks (line 59) | def response_chunks(

FILE: src/pip/_internal/network/xmlrpc.py
  class PipXmlrpcTransport (line 20) | class PipXmlrpcTransport(xmlrpc.client.Transport):
    method __init__ (line 25) | def __init__(
    method request (line 33) | def request(

FILE: src/pip/_internal/operations/build/build_tracker.py
  function update_env_context_manager (line 17) | def update_env_context_manager(**changes: str) -> Generator[None, None, ...
  function get_build_tracker (line 43) | def get_build_tracker() -> Generator[BuildTracker, None, None]:
  class TrackerId (line 55) | class TrackerId(str):
  class BuildTracker (line 59) | class BuildTracker:
    method __init__ (line 68) | def __init__(self, root: str) -> None:
    method __enter__ (line 73) | def __enter__(self) -> BuildTracker:
    method __exit__ (line 77) | def __exit__(
    method _entry_path (line 85) | def _entry_path(self, key: TrackerId) -> str:
    method add (line 89) | def add(self, req: InstallRequirement, key: TrackerId) -> None:
    method remove (line 116) | def remove(self, req: InstallRequirement, key: TrackerId) -> None:
    method cleanup (line 125) | def cleanup(self) -> None:
    method track (line 132) | def track(self, req: InstallRequirement, key: str) -> Generator[None, ...

FILE: src/pip/_internal/operations/build/metadata.py
  function generate_metadata (line 16) | def generate_metadata(

FILE: src/pip/_internal/operations/build/metadata_editable.py
  function generate_editable_metadata (line 16) | def generate_editable_metadata(

FILE: src/pip/_internal/operations/build/wheel.py
  function build_wheel_pep517 (line 13) | def build_wheel_pep517(

FILE: src/pip/_internal/operations/build/wheel_editable.py
  function build_wheel_editable (line 13) | def build_wheel_editable(

FILE: src/pip/_internal/operations/check.py
  class PackageDetails (line 28) | class PackageDetails(NamedTuple):
  function create_package_set_from_installed (line 44) | def create_package_set_from_installed() -> tuple[PackageSet, bool]:
  function check_package_set (line 61) | def check_package_set(
  function check_install_conflicts (line 106) | def check_install_conflicts(to_install: list[InstallRequirement]) -> Con...
  function check_unsupported (line 126) | def check_unsupported(
  function _simulate_installation_of (line 142) | def _simulate_installation_of(
  function _create_whitelist (line 161) | def _create_whitelist(

FILE: src/pip/_internal/operations/freeze.py
  class _EditableInfo (line 25) | class _EditableInfo(NamedTuple):
  function freeze (line 30) | def freeze(
  function _format_as_name_version (line 151) | def _format_as_name_version(dist: BaseDistribution) -> str:
  function _get_editable_info (line 161) | def _get_editable_info(dist: BaseDistribution) -> _EditableInfo:
  class FrozenRequirement (line 228) | class FrozenRequirement:
    method canonical_name (line 235) | def canonical_name(self) -> NormalizedName:
    method from_dist (line 239) | def from_dist(cls, dist: BaseDistribution) -> FrozenRequirement:
    method __str__ (line 255) | def __str__(self) -> str:

FILE: src/pip/_internal/operations/install/wheel.py
  class File (line 57) | class File(Protocol):
    method save (line 62) | def save(self) -> None:
  function rehash (line 72) | def rehash(path: str, blocksize: int = 1 << 20) -> tuple[str, str]:
  function csv_io_kwargs (line 79) | def csv_io_kwargs(mode: str) -> dict[str, Any]:
  function fix_script (line 86) | def fix_script(path: str) -> bool:
  function wheel_root_is_purelib (line 106) | def wheel_root_is_purelib(metadata: Message) -> bool:
  function get_entrypoints (line 110) | def get_entrypoints(dist: BaseDistribution) -> tuple[dict[str, str], dic...
  function message_about_scripts_not_on_PATH (line 121) | def message_about_scripts_not_on_PATH(scripts: Sequence[str]) -> str | N...
  function _normalized_outrows (line 193) | def _normalized_outrows(
  function _record_to_fs_path (line 219) | def _record_to_fs_path(record_path: RecordPath, lib_dir: str) -> str:
  function _fs_to_record_path (line 223) | def _fs_to_record_path(path: str, lib_dir: str) -> RecordPath:
  function get_csv_rows_for_installed (line 233) | def get_csv_rows_for_installed(
  function get_console_script_specs (line 265) | def get_console_script_specs(console: dict[str, str]) -> list[str]:
  class ZipBackedFile (line 340) | class ZipBackedFile:
    method __init__ (line 341) | def __init__(
    method _getinfo (line 349) | def _getinfo(self) -> ZipInfo:
    method save (line 352) | def save(self) -> None:
  class ScriptFile (line 378) | class ScriptFile:
    method __init__ (line 379) | def __init__(self, file: File) -> None:
    method save (line 385) | def save(self) -> None:
  class MissingCallableSuffix (line 390) | class MissingCallableSuffix(InstallationError):
    method __init__ (line 391) | def __init__(self, entry_point: str) -> None:
  function _raise_for_invalid_entrypoint (line 400) | def _raise_for_invalid_entrypoint(specification: str) -> None:
  class PipScriptMaker (line 406) | class PipScriptMaker(ScriptMaker):
    method make (line 419) | def make(
  function _install_wheel (line 426) | def _install_wheel(  # noqa: C901, PLR0915 function is too long
  function req_error_context (line 716) | def req_error_context(req_description: str) -> Generator[None, None, None]:
  function install_wheel (line 724) | def install_wheel(

FILE: src/pip/_internal/operations/prepare.py
  function _get_prepared_distribution (line 65) | def _get_prepared_distribution(
  function unpack_vcs_link (line 83) | def unpack_vcs_link(link: Link, location: str, verbosity: int) -> None:
  class File (line 90) | class File:
    method __post_init__ (line 94) | def __post_init__(self) -> None:
  function get_http_url (line 104) | def get_http_url(
  function get_file_url (line 128) | def get_file_url(
  function unpack_url (line 152) | def unpack_url(
  function _check_download_dir (line 195) | def _check_download_dir(
  class RequirementPreparer (line 225) | class RequirementPreparer:
    method __init__ (line 228) | def __init__(
    method _log_preparing_link (line 288) | def _log_preparing_link(self, req: InstallRequirement) -> None:
    method _ensure_link_req_src_dir (line 315) | def _ensure_link_req_src_dir(
    method _get_linked_req_hashes (line 338) | def _get_linked_req_hashes(self, req: InstallRequirement) -> Hashes:
    method _fetch_metadata_only (line 370) | def _fetch_metadata_only(
    method _fetch_metadata_using_link_data_attr (line 389) | def _fetch_metadata_using_link_data_attr(
    method _fetch_metadata_using_lazy_wheel (line 430) | def _fetch_metadata_using_lazy_wheel(
    method _complete_partial_requirements (line 459) | def _complete_partial_requirements(
    method prepare_linked_requirement (line 500) | def prepare_linked_requirement(
    method prepare_linked_requirements_more (line 544) | def prepare_linked_requirements_more(
    method _prepare_linked_requirement (line 574) | def _prepare_linked_requirement(
    method save_linked_requirement (line 666) | def save_linked_requirement(self, req: InstallRequirement) -> None:
    method prepare_editable_requirement (line 692) | def prepare_editable_requirement(
    method prepare_installed_requirement (line 725) | def prepare_installed_requirement(

FILE: src/pip/_internal/pyproject.py
  function _is_list_of_str (line 18) | def _is_list_of_str(obj: Any) -> bool:
  function make_pyproject_path (line 22) | def make_pyproject_path(unpacked_source_directory: str) -> str:
  function load_pyproject_toml (line 31) | def load_pyproject_toml(

FILE: src/pip/_internal/req/__init__.py
  class InstallationResult (line 26) | class InstallationResult:
  function _validate_requirements (line 30) | def _validate_requirements(
  function install_given_reqs (line 38) | def install_given_reqs(

FILE: src/pip/_internal/req/constructors.py
  function _strip_extras (line 48) | def _strip_extras(path: str) -> tuple[str, str | None]:
  function convert_extras (line 60) | def convert_extras(extras: str | None) -> set[str]:
  function _set_requirement_extras (line 66) | def _set_requirement_extras(req: Requirement, new_extras: set[str]) -> R...
  function _parse_direct_url_editable (line 91) | def _parse_direct_url_editable(editable_req: str) -> tuple[str | None, s...
  function _parse_pip_syntax_editable (line 109) | def _parse_pip_syntax_editable(editable_req: str) -> tuple[str | None, s...
  function parse_editable (line 138) | def parse_editable(editable_req: str) -> tuple[str | None, str, set[str]]:
  function check_first_requirement_in_file (line 172) | def check_first_requirement_in_file(filename: str) -> None:
  function deduce_helpful_msg (line 200) | def deduce_helpful_msg(req: str) -> str:
  class RequirementParts (line 226) | class RequirementParts:
  function parse_req_from_editable (line 233) | def parse_req_from_editable(editable_req: str) -> RequirementParts:
  function install_req_from_editable (line 252) | def install_req_from_editable(
  function _looks_like_path (line 282) | def _looks_like_path(name: str) -> bool:
  function _get_url_from_path (line 301) | def _get_url_from_path(path: str, name: str) -> str | None:
  function parse_req_from_line (line 335) | def parse_req_from_line(name: str, line_source: str | None) -> Requireme...
  function install_req_from_line (line 414) | def install_req_from_line(
  function install_req_from_req_string (line 447) | def install_req_from_req_string(
  function install_req_from_parsed_requirement (line 483) | def install_req_from_parsed_requirement(
  function install_req_from_link_and_ireq (line 515) | def install_req_from_link_and_ireq(
  function install_req_drop_extras (line 531) | def install_req_drop_extras(ireq: InstallRequirement) -> InstallRequirem...
  function install_req_extend_extras (line 555) | def install_req_extend_extras(

FILE: src/pip/_internal/req/pep723.py
  class PEP723Exception (line 9) | class PEP723Exception(ValueError):
    method __init__ (line 12) | def __init__(self, msg: str) -> None:
  function pep723_metadata (line 16) | def pep723_metadata(scriptfile: str) -> dict[str, Any]:

FILE: src/pip/_internal/req/req_dependency_group.py
  function parse_dependency_groups (line 10) | def parse_dependency_groups(groups: list[tuple[str, str]]) -> list[str]:
  function _resolve_all_groups (line 20) | def _resolve_all_groups(
  function _build_resolvers (line 38) | def _build_resolvers(paths: Iterable[str]) -> dict[str, Any]:
  function _load_pyproject (line 61) | def _load_pyproject(path: str) -> dict[str, Any]:

FILE: src/pip/_internal/req/req_file.py
  class ParsedRequirement (line 105) | class ParsedRequirement:
  class ParsedLine (line 125) | class ParsedLine:
    method is_editable (line 135) | def is_editable(self) -> bool:
    method requirement (line 139) | def requirement(self) -> str | None:
  function parse_requirements (line 148) | def parse_requirements(
  function preprocess (line 175) | def preprocess(content: str) -> ReqFileLines:
  function handle_requirement_line (line 187) | def handle_requirement_line(
  function handle_option_line (line 221) | def handle_option_line(
  function handle_line (line 299) | def handle_line(
  class RequirementsFileParser (line 343) | class RequirementsFileParser:
    method __init__ (line 344) | def __init__(
    method parse (line 352) | def parse(
    method _parse_and_recurse (line 360) | def _parse_and_recurse(
    method _parse_file (line 412) | def _parse_file(
  function get_line_parser (line 436) | def get_line_parser(finder: PackageFinder | None) -> LineParser:
  function break_args_options (line 461) | def break_args_options(line: str) -> tuple[str, str]:
  class OptionParsingError (line 478) | class OptionParsingError(Exception):
    method __init__ (line 479) | def __init__(self, msg: str) -> None:
  function build_parser (line 483) | def build_parser() -> optparse.OptionParser:
  function join_lines (line 506) | def join_lines(lines_enum: ReqFileLines) -> ReqFileLines:
  function ignore_comments (line 537) | def ignore_comments(lines_enum: ReqFileLines) -> ReqFileLines:
  function expand_env_variables (line 548) | def expand_env_variables(lines_enum: ReqFileLines) -> ReqFileLines:
  function get_file_content (line 575) | def get_file_content(
  function _decode_req_file (line 608) | def _decode_req_file(data: bytes, url: str) -> str:

FILE: src/pip/_internal/req/req_install.py
  class InstallRequirement (line 62) | class InstallRequirement:
    method __init__ (line 69) | def __init__(
    method __str__ (line 181) | def __str__(self) -> str:
    method __repr__ (line 205) | def __repr__(self) -> str:
    method format_debug (line 211) | def format_debug(self) -> str:
    method name (line 224) | def name(self) -> str | None:
    method supports_pyproject_editable (line 230) | def supports_pyproject_editable(self) -> bool:
    method specifier (line 240) | def specifier(self) -> SpecifierSet:
    method is_direct (line 245) | def is_direct(self) -> bool:
    method is_pinned (line 250) | def is_pinned(self) -> bool:
    method match_markers (line 259) | def match_markers(self, extras_requested: Iterable[str] | None = None)...
    method has_hash_options (line 272) | def has_hash_options(self) -> bool:
    method hashes (line 281) | def hashes(self, trust_internet: bool = True) -> Hashes:
    method from_path (line 308) | def from_path(self) -> str | None:
    method ensure_build_location (line 323) | def ensure_build_location(
    method _set_requirement (line 366) | def _set_requirement(self) -> None:
    method warn_on_mismatching_name (line 388) | def warn_on_mismatching_name(self) -> None:
    method check_if_exists (line 406) | def check_if_exists(self, use_user_site: bool) -> None:
    method is_wheel (line 445) | def is_wheel(self) -> bool:
    method is_wheel_from_cache (line 451) | def is_wheel_from_cache(self) -> bool:
    method unpacked_source_directory (line 458) | def unpacked_source_directory(self) -> str:
    method setup_py_path (line 465) | def setup_py_path(self) -> str:
    method pyproject_toml_path (line 472) | def pyproject_toml_path(self) -> str:
    method load_pyproject_toml (line 476) | def load_pyproject_toml(self) -> None:
    method editable_sanity_check (line 496) | def editable_sanity_check(self) -> None:
    method prepare_metadata (line 509) | def prepare_metadata(self) -> None:
    method metadata (line 545) | def metadata(self) -> Any:
    method set_dist (line 551) | def set_dist(self, distribution: BaseDistribution) -> None:
    method get_dist (line 554) | def get_dist(self) -> BaseDistribution:
    method assert_source_matches_version (line 570) | def assert_source_matches_version(self) -> None:
    method ensure_has_source_dir (line 588) | def ensure_has_source_dir(
    method needs_unpacked_archive (line 610) | def needs_unpacked_archive(self, archive_source: Path) -> None:
    method ensure_pristine_source_checkout (line 614) | def ensure_pristine_source_checkout(self) -> None:
    method update_editable (line 632) | def update_editable(self) -> None:
    method uninstall (line 652) | def uninstall(
    method _get_archive_name (line 678) | def _get_archive_name(self, path: str, parentdir: str, rootdir: str) -...
    method archive (line 692) | def archive(self, build_dir: str | None) -> None:
    method install (line 759) | def install(
  function check_invalid_constraint_type (line 794) | def check_invalid_constraint_type(req: InstallRequirement) -> str:
  function _has_option (line 822) | def _has_option(options: Values, reqs: list[InstallRequirement], option:...

FILE: src/pip/_internal/req/req_set.py
  class RequirementSet (line 11) | class RequirementSet:
    method __init__ (line 12) | def __init__(self, check_supported_wheels: bool = True) -> None:
    method __str__ (line 20) | def __str__(self) -> str:
    method __repr__ (line 27) | def __repr__(self) -> str:
    method add_unnamed_requirement (line 40) | def add_unnamed_requirement(self, install_req: InstallRequirement) -> ...
    method add_named_requirement (line 44) | def add_named_requirement(self, install_req: InstallRequirement) -> None:
    method has_requirement (line 50) | def has_requirement(self, name: str) -> bool:
    method get_requirement (line 58) | def get_requirement(self, name: str) -> InstallRequirement:
    method all_requirements (line 67) | def all_requirements(self) -> list[InstallRequirement]:
    method requirements_to_install (line 71) | def requirements_to_install(self) -> list[InstallRequirement]:

FILE: src/pip/_internal/req/req_uninstall.py
  function _script_names (line 24) | def _script_names(
  function _unique (line 43) | def _unique(
  function uninstallation_paths (line 58) | def uninstallation_paths(dist: BaseDistribution) -> Generator[str, None,...
  function compact (line 91) | def compact(paths: Iterable[str]) -> set[str]:
  function compress_for_rename (line 110) | def compress_for_rename(paths: Iterable[str]) -> set[str]:
  function compress_for_output_listing (line 144) | def compress_for_output_listing(paths: Iterable[str]) -> tuple[set[str],...
  class StashedUninstallPathSet (line 193) | class StashedUninstallPathSet:
    method __init__ (line 197) | def __init__(self) -> None:
    method _get_directory_stash (line 205) | def _get_directory_stash(self, path: str) -> str:
    method _get_file_stash (line 219) | def _get_file_stash(self, path: str) -> str:
    method stash (line 246) | def stash(self, path: str) -> str:
    method commit (line 267) | def commit(self) -> None:
    method rollback (line 274) | def rollback(self) -> None:
    method can_rollback (line 294) | def can_rollback(self) -> bool:
  class UninstallPathSet (line 298) | class UninstallPathSet:
    method __init__ (line 302) | def __init__(self, dist: BaseDistribution) -> None:
    method _permitted (line 313) | def _permitted(self, path: str) -> bool:
    method add (line 324) | def add(self, path: str) -> None:
    method add_pth (line 343) | def add_pth(self, pth_file: str, entry: str) -> None:
    method remove (line 352) | def remove(self, auto_confirm: bool = False, verbose: bool = False) ->...
    method _allowed_to_proceed (line 381) | def _allowed_to_proceed(self, verbose: bool) -> bool:
    method rollback (line 409) | def rollback(self) -> None:
    method commit (line 422) | def commit(self) -> None:
    method from_dist (line 427) | def from_dist(cls, dist: BaseDistribution) -> UninstallPathSet:
  class UninstallPthEntries (line 584) | class UninstallPthEntries:
    method __init__ (line 585) | def __init__(self, pth_file: str) -> None:
    method add (line 590) | def add(self, entry: str) -> None:
    method remove (line 605) | def remove(self) -> None:
    method rollback (line 632) | def rollback(self) -> bool:

FILE: src/pip/_internal/resolution/base.py
  class BaseResolver (line 11) | class BaseResolver:
    method resolve (line 12) | def resolve(
    method get_installation_order (line 17) | def get_installation_order(

FILE: src/pip/_internal/resolution/legacy/resolver.py
  function _check_dist_requires_python (line 58) | def _check_dist_requires_python(
  class Resolver (line 112) | class Resolver(BaseResolver):
    method __init__ (line 119) | def __init__(
    method resolve (line 157) | def resolve(
    method _add_requirement_to_set (line 194) | def _add_requirement_to_set(
    method _is_upgrade_allowed (line 309) | def _is_upgrade_allowed(self, req: InstallRequirement) -> bool:
    method _set_req_to_reinstall (line 318) | def _set_req_to_reinstall(self, req: InstallRequirement) -> None:
    method _check_skip_installed (line 329) | def _check_skip_installed(self, req_to_install: InstallRequirement) ->...
    method _find_requirement_link (line 381) | def _find_requirement_link(self, req: InstallRequirement) -> Link | None:
    method _populate_link (line 403) | def _populate_link(self, req: InstallRequirement) -> None:
    method _get_dist_for (line 442) | def _get_dist_for(self, req: InstallRequirement) -> BaseDistribution:
    method _resolve_one (line 488) | def _resolve_one(
    method get_installation_order (line 571) | def get_installation_order(

FILE: src/pip/_internal/resolution/resolvelib/base.py
  function format_name (line 18) | def format_name(project: NormalizedName, extras: frozenset[NormalizedNam...
  class Constraint (line 26) | class Constraint:
    method empty (line 32) | def empty(cls) -> Constraint:
    method from_ireq (line 36) | def from_ireq(cls, ireq: InstallRequirement) -> Constraint:
    method __bool__ (line 40) | def __bool__(self) -> bool:
    method __and__ (line 43) | def __and__(self, other: InstallRequirement) -> Constraint:
    method is_satisfied_by (line 53) | def is_satisfied_by(self, candidate: Candidate) -> bool:
  class Requirement (line 63) | class Requirement:
    method project_name (line 65) | def project_name(self) -> NormalizedName:
    method name (line 75) | def name(self) -> str:
    method is_satisfied_by (line 83) | def is_satisfied_by(self, candidate: Candidate) -> bool:
    method get_candidate_lookup (line 86) | def get_candidate_lookup(self) -> CandidateLookup:
    method format_for_error (line 89) | def format_for_error(self) -> str:
  function _match_link (line 93) | def _match_link(link: Link, candidate: Candidate) -> bool:
  class Candidate (line 99) | class Candidate:
    method project_name (line 101) | def project_name(self) -> NormalizedName:
    method name (line 111) | def name(self) -> str:
    method version (line 120) | def version(self) -> Version:
    method is_installed (line 124) | def is_installed(self) -> bool:
    method is_editable (line 128) | def is_editable(self) -> bool:
    method source_link (line 132) | def source_link(self) -> Link | None:
    method iter_dependencies (line 135) | def iter_dependencies(self, with_requires: bool) -> Iterable[Requireme...
    method get_install_requirement (line 138) | def get_install_requirement(self) -> InstallRequirement | None:
    method format_for_error (line 141) | def format_for_error(self) -> str:

FILE: src/pip/_internal/resolution/resolvelib/candidates.py
  function as_base_candidate (line 48) | def as_base_candidate(candidate: Candidate) -> BaseCandidate | None:
  function make_install_req_from_link (line 60) | def make_install_req_from_link(
  function make_install_req_from_editable (line 83) | def make_install_req_from_editable(
  function _make_install_req_from_dist (line 105) | def _make_install_req_from_dist(
  class _InstallRequirementBackedCandidate (line 127) | class _InstallRequirementBackedCandidate(Candidate):
    method __init__ (line 146) | def __init__(
    method __str__ (line 164) | def __str__(self) -> str:
    method __repr__ (line 167) | def __repr__(self) -> str:
    method __hash__ (line 170) | def __hash__(self) -> int:
    method __eq__ (line 177) | def __eq__(self, other: Any) -> bool:
    method source_link (line 183) | def source_link(self) -> Link | None:
    method project_name (line 187) | def project_name(self) -> NormalizedName:
    method name (line 194) | def name(self) -> str:
    method version (line 198) | def version(self) -> Version:
    method format_for_error (line 203) | def format_for_error(self) -> str:
    method _prepare_distribution (line 209) | def _prepare_distribution(self) -> BaseDistribution:
    method _check_metadata_consistency (line 212) | def _check_metadata_consistency(self, dist: BaseDistribution) -> None:
    method _prepare (line 236) | def _prepare(self) -> BaseDistribution:
    method iter_dependencies (line 263) | def iter_dependencies(self, with_requires: bool) -> Iterable[Requireme...
    method get_install_requirement (line 271) | def get_install_requirement(self) -> InstallRequirement | None:
  class LinkCandidate (line 275) | class LinkCandidate(_InstallRequirementBackedCandidate):
    method __init__ (line 278) | def __init__(
    method _prepare_distribution (line 327) | def _prepare_distribution(self) -> BaseDistribution:
  class EditableCandidate (line 332) | class EditableCandidate(_InstallRequirementBackedCandidate):
    method __init__ (line 335) | def __init__(
    method _prepare_distribution (line 352) | def _prepare_distribution(self) -> BaseDistribution:
  class AlreadyInstalledCandidate (line 356) | class AlreadyInstalledCandidate(Candidate):
    method __init__ (line 360) | def __init__(
    method __str__ (line 378) | def __str__(self) -> str:
    method __repr__ (line 381) | def __repr__(self) -> str:
    method __eq__ (line 384) | def __eq__(self, other: object) -> bool:
    method __hash__ (line 389) | def __hash__(self) -> int:
    method project_name (line 393) | def project_name(self) -> NormalizedName:
    method name (line 397) | def name(self) -> str:
    method version (line 401) | def version(self) -> Version:
    method is_editable (line 407) | def is_editable(self) -> bool:
    method format_for_error (line 410) | def format_for_error(self) -> str:
    method iter_dependencies (line 413) | def iter_dependencies(self, with_requires: bool) -> Iterable[Requireme...
    method get_install_requirement (line 423) | def get_install_requirement(self) -> InstallRequirement | None:
  class ExtrasCandidate (line 427) | class ExtrasCandidate(Candidate):
    method __init__ (line 452) | def __init__(
    method __str__ (line 471) | def __str__(self) -> str:
    method __repr__ (line 475) | def __repr__(self) -> str:
    method __hash__ (line 478) | def __hash__(self) -> int:
    method __eq__ (line 481) | def __eq__(self, other: Any) -> bool:
    method project_name (line 487) | def project_name(self) -> NormalizedName:
    method name (line 491) | def name(self) -> str:
    method version (line 496) | def version(self) -> Version:
    method format_for_error (line 499) | def format_for_error(self) -> str:
    method is_installed (line 505) | def is_installed(self) -> bool:
    method is_editable (line 509) | def is_editable(self) -> bool:
    method source_link (line 513) | def source_link(self) -> Link | None:
    method iter_dependencies (line 516) | def iter_dependencies(self, with_requires: bool) -> Iterable[Requireme...
    method get_install_requirement (line 544) | def get_install_requirement(self) -> InstallRequirement | None:
  class RequiresPythonCandidate (line 551) | class RequiresPythonCandidate(Candidate):
    method __init__ (line 555) | def __init__(self, py_version_info: tuple[int, ...] | None) -> None:
    method __str__ (line 566) | def __str__(self) -> str:
    method __repr__ (line 569) | def __repr__(self) -> str:
    method project_name (line 573) | def project_name(self) -> NormalizedName:
    method name (line 577) | def name(self) -> str:
    method version (line 581) | def version(self) -> Version:
    method format_for_error (line 584) | def format_for_error(self) -> str:
    method iter_dependencies (line 587) | def iter_dependencies(self, with_requires: bool) -> Iterable[Requireme...
    method get_install_requirement (line 590) | def get_install_requirement(self) -> InstallRequirement | None:

FILE: src/pip/_internal/resolution/resolvelib/factory.py
  class ConflictCause (line 72) | class ConflictCause(Protocol):
  class CollectedRootRequirements (line 83) | class CollectedRootRequirements(NamedTuple):
  class Factory (line 89) | class Factory:
    method __init__ (line 90) | def __init__(
    method force_reinstall (line 130) | def force_reinstall(self) -> bool:
    method _fail_if_link_is_unsupported_wheel (line 133) | def _fail_if_link_is_unsupported_wheel(self, link: Link) -> None:
    method _make_extras_candidate (line 142) | def _make_extras_candidate(
    method _make_candidate_from_dist (line 157) | def _make_candidate_from_dist(
    method _make_candidate_from_link (line 172) | def _make_candidate_from_link(
    method _make_base_candidate_from_link (line 187) | def _make_base_candidate_from_link(
    method _iter_found_candidates (line 244) | def _iter_found_candidates(
    method _iter_explicit_candidates_from_base (line 346) | def _iter_explicit_candidates_from_base(
    method _iter_candidates_from_constraints (line 368) | def _iter_candidates_from_constraints(
    method find_candidates (line 390) | def find_candidates(
    method _make_requirements_from_install_req (line 466) | def _make_requirements_from_install_req(
    method collect_root_requirements (line 519) | def collect_root_requirements(
    method make_requirement_from_candidate (line 561) | def make_requirement_from_candidate(
    method make_requirements_from_spec (line 566) | def make_requirements_from_spec(
    method make_requires_python_requirement (line 584) | def make_requires_python_requirement(
    method get_wheel_cache_entry (line 595) | def get_wheel_cache_entry(self, link: Link, name: str | None) -> Cache...
    method get_dist_to_uninstall (line 612) | def get_dist_to_uninstall(self, candidate: Candidate) -> BaseDistribut...
    method _report_requires_python_error (line 640) | def _report_requires_python_error(
    method _report_single_requirement_conflict (line 662) | def _report_single_requirement_conflict(
    method _has_any_candidates (line 725) | def _has_any_candidates(self, project_name: str) -> bool:
    method get_installation_error (line 740) | def get_installation_error(

FILE: src/pip/_internal/resolution/resolvelib/found_candidates.py
  function _iter_built (line 28) | def _iter_built(infos: Iterator[IndexCandidateInfo]) -> Iterator[Candida...
  function _iter_built_with_prepended (line 59) | def _iter_built_with_prepended(
  function _iter_built_with_inserted (line 81) | def _iter_built_with_inserted(
  class FoundCandidates (line 113) | class FoundCandidates(Sequence[Candidate]):
    method __init__ (line 122) | def __init__(
    method __getitem__ (line 135) | def __getitem__(self, index: Any) -> Any:
    method __iter__ (line 141) | def __iter__(self) -> Iterator[Candidate]:
    method __len__ (line 151) | def __len__(self) -> int:
    method __bool__ (line 157) | def __bool__(self) -> bool:

FILE: src/pip/_internal/resolution/resolvelib/provider.py
  function _get_with_identifier (line 53) | def _get_with_identifier(
  class PipProvider (line 78) | class PipProvider(_ProviderBase):
    method __init__ (line 89) | def __init__(
    method constraints (line 104) | def constraints(self) -> dict[str, Constraint]:
    method identify (line 112) | def identify(self, requirement_or_candidate: Requirement | Candidate) ...
    method narrow_requirement_selection (line 115) | def narrow_requirement_selection(
    method get_preference (line 158) | def get_preference(
    method find_matches (line 235) | def find_matches(
    method is_satisfied_by (line 279) | def is_satisfied_by(requirement: Requirement, candidate: Candidate) ->...
    method get_dependencies (line 282) | def get_dependencies(self, candidate: Candidate) -> Iterable[Requireme...

FILE: src/pip/_internal/resolution/resolvelib/reporter.py
  class PipReporter (line 15) | class PipReporter(BaseReporter[Requirement, Candidate, str]):
    method __init__ (line 16) | def __init__(self, constraints: Mapping[str, Constraint] | None = None...
    method rejecting_candidate (line 39) | def rejecting_candidate(self, criterion: Any, candidate: Candidate) ->...
  class PipDebuggingReporter (line 73) | class PipDebuggingReporter(BaseReporter[Requirement, Candidate, str]):
    method starting (line 76) | def starting(self) -> None:
    method starting_round (line 79) | def starting_round(self, index: int) -> None:
    method ending_round (line 82) | def ending_round(self, index: int, state: Any) -> None:
    method ending (line 86) | def ending(self, state: Any) -> None:
    method adding_requirement (line 89) | def adding_requirement(
    method rejecting_candidate (line 94) | def rejecting_candidate(self, criterion: Any, candidate: Candidate) ->...
    method pinning (line 97) | def pinning(self, candidate: Candidate) -> None:

FILE: src/pip/_internal/resolution/resolvelib/requirements.py
  class ExplicitRequirement (line 14) | class ExplicitRequirement(Requirement):
    method __init__ (line 15) | def __init__(self, candidate: Candidate) -> None:
    method __str__ (line 18) | def __str__(self) -> str:
    method __repr__ (line 21) | def __repr__(self) -> str:
    method __hash__ (line 24) | def __hash__(self) -> int:
    method __eq__ (line 27) | def __eq__(self, other: Any) -> bool:
    method project_name (line 33) | def project_name(self) -> NormalizedName:
    method name (line 38) | def name(self) -> str:
    method format_for_error (line 42) | def format_for_error(self) -> str:
    method get_candidate_lookup (line 45) | def get_candidate_lookup(self) -> CandidateLookup:
    method is_satisfied_by (line 48) | def is_satisfied_by(self, candidate: Candidate) -> bool:
  class SpecifierRequirement (line 52) | class SpecifierRequirement(Requirement):
    method __init__ (line 53) | def __init__(self, ireq: InstallRequirement) -> None:
    method _equal (line 61) | def _equal(self) -> str:
    method __str__ (line 68) | def __str__(self) -> str:
    method __repr__ (line 71) | def __repr__(self) -> str:
    method __eq__ (line 74) | def __eq__(self, other: object) -> bool:
    method __hash__ (line 79) | def __hash__(self) -> int:
    method project_name (line 87) | def project_name(self) -> NormalizedName:
    method name (line 92) | def name(self) -> str:
    method format_for_error (line 95) | def format_for_error(self) -> str:
    method get_candidate_lookup (line 108) | def get_candidate_lookup(self) -> CandidateLookup:
    method is_satisfied_by (line 111) | def is_satisfied_by(self, candidate: Candidate) -> bool:
  class SpecifierWithoutExtrasRequirement (line 124) | class SpecifierWithoutExtrasRequirement(SpecifierRequirement):
    method __init__ (line 130) | def __init__(self, ireq: InstallRequirement) -> None:
    method _equal (line 138) | def _equal(self) -> str:
    method __eq__ (line 145) | def __eq__(self, other: object) -> bool:
    method __hash__ (line 150) | def __hash__(self) -> int:
  class RequiresPythonRequirement (line 158) | class RequiresPythonRequirement(Requirement):
    method __init__ (line 161) | def __init__(self, specifier: SpecifierSet, match: Candidate) -> None:
    method __str__ (line 173) | def __str__(self) -> str:
    method __repr__ (line 176) | def __repr__(self) -> str:
    method __hash__ (line 179) | def __hash__(self) -> int:
    method __eq__ (line 186) | def __eq__(self, other: Any) -> bool:
    method project_name (line 195) | def project_name(self) -> NormalizedName:
    method name (line 199) | def name(self) -> str:
    method format_for_error (line 202) | def format_for_error(self) -> str:
    method get_candidate_lookup (line 205) | def get_candidate_lookup(self) -> CandidateLookup:
    method is_satisfied_by (line 208) | def is_satisfied_by(self, candidate: Candidate) -> bool:
  class UnsatisfiableRequirement (line 216) | class UnsatisfiableRequirement(Requirement):
    method __init__ (line 219) | def __init__(self, name: NormalizedName) -> None:
    method __str__ (line 222) | def __str__(self) -> str:
    method __repr__ (line 225) | def __repr__(self) -> str:
    method __eq__ (line 228) | def __eq__(self, other: object) -> bool:
    method __hash__ (line 233) | def __hash__(self) -> int:
    method project_name (line 237) | def project_name(self) -> NormalizedName:
    method name (line 241) | def name(self) -> str:
    method format_for_error (line 244) | def format_for_error(self) -> str:
    method get_candidate_lookup (line 247) | def get_candidate_lookup(self) -> CandidateLookup:
    method is_satisfied_by (line 250) | def is_satisfied_by(self, candidate: Candidate) -> bool:

FILE: src/pip/_internal/resolution/resolvelib/resolver.py
  class Resolver (line 41) | class Resolver(BaseResolver):
    method __init__ (line 44) | def __init__(
    method resolve (line 76) | def resolve(
    method get_installation_order (line 186) | def get_installation_order(
  function get_topological_weights (line 218) | def get_topological_weights(
  function _req_set_item_sorter (line 321) | def _req_set_item_sorter(

FILE: src/pip/_internal/self_outdated_check.py
  function _get_statefile_name (line 49) | def _get_statefile_name(key: str) -> str:
  class SelfCheckState (line 55) | class SelfCheckState:
    method __init__ (line 56) | def __init__(self, cache_dir: str) -> None:
    method key (line 74) | def key(self) -> str:
    method get (line 77) | def get(self, current_time: datetime.datetime) -> str | None:
    method set (line 96) | def set(self, pypi_version: str, current_time: datetime.datetime) -> N...
  class UpgradePrompt (line 135) | class UpgradePrompt:
    method __rich__ (line 139) | def __rich__(self) -> Group:
  function was_installed_by_pip (line 159) | def was_installed_by_pip(pkg: str) -> bool:
  function _get_current_remote_pip_version (line 169) | def _get_current_remote_pip_version(
  function _self_version_check_logic (line 197) | def _self_version_check_logic(
  function pip_self_version_check (line 231) | def pip_self_version_check(session: PipSession, options: optparse.Values...

FILE: src/pip/_internal/utils/_jaraco_text.py
  function _nonblank (line 36) | def _nonblank(str):
  function yield_lines (line 41) | def yield_lines(iterable):
  function _ (line 60) | def _(text):
  function drop_comment (line 64) | def drop_comment(line):
  function join_continuation (line 79) | def join_continuation(lines):

FILE: src/pip/_internal/utils/_log.py
  class VerboseLogger (line 16) | class VerboseLogger(logging.Logger):
    method verbose (line 22) | def verbose(self, msg: str, *args: Any, **kwargs: Any) -> None:
  function getLogger (line 26) | def getLogger(name: str) -> VerboseLogger:
  function init_logging (line 31) | def init_logging() -> None:

FILE: src/pip/_internal/utils/appdirs.py
  function user_cache_dir (line 15) | def user_cache_dir(appname: str) -> str:
  function _macos_user_config_dir (line 19) | def _macos_user_config_dir(appname: str, roaming: bool = True) -> str:
  function user_config_dir (line 33) | def user_config_dir(appname: str, roaming: bool = True) -> str:
  function site_config_dirs (line 42) | def site_config_dirs(appname: str) -> list[str]:

FILE: src/pip/_internal/utils/compat.py
  function has_tls (line 16) | def has_tls() -> bool:
  function get_path_uid (line 29) | def get_path_uid(path: str) -> int:
  function open_text_resource (line 62) | def open_text_resource(

FILE: src/pip/_internal/utils/compatibility_tags.py
  function version_info_to_nodot (line 23) | def version_info_to_nodot(version_info: tuple[int, ...]) -> str:
  function _mac_platforms (line 28) | def _mac_platforms(arch: str) -> list[str]:
  function _ios_platforms (line 48) | def _ios_platforms(arch: str) -> list[str]:
  function _android_platforms (line 68) | def _android_platforms(arch: str) -> list[str]:
  function _custom_manylinux_platforms (line 78) | def _custom_manylinux_platforms(arch: str) -> list[str]:
  function _get_custom_platforms (line 99) | def _get_custom_platforms(arch: str) -> list[str]:
  function _expand_allowed_platforms (line 114) | def _expand_allowed_platforms(platforms: list[str] | None) -> list[str] ...
  function _get_python_version (line 131) | def _get_python_version(version: str) -> PythonVersion:
  function _get_custom_interpreter (line 138) | def _get_custom_interpreter(
  function get_supported (line 148) | def get_supported(

FILE: src/pip/_internal/utils/datetime.py
  function today_is_later_than (line 7) | def today_is_later_than(year: int, month: int, day: int) -> bool:
  function parse_iso_datetime (line 14) | def parse_iso_datetime(isodate: str) -> datetime.datetime:

FILE: src/pip/_internal/utils/deprecation.py
  class PipDeprecationWarning (line 18) | class PipDeprecationWarning(Warning):
  function _showwarning (line 26) | def _showwarning(
  function install_warning_logger (line 46) | def install_warning_logger() -> None:
  function deprecated (line 57) | def deprecated(

FILE: src/pip/_internal/utils/direct_url_helpers.py
  function direct_url_as_pep440_direct_reference (line 9) | def direct_url_as_pep440_direct_reference(direct_url: DirectUrl, name: s...
  function direct_url_for_editable (line 32) | def direct_url_for_editable(source_dir: str) -> DirectUrl:
  function direct_url_from_link (line 39) | def direct_url_from_link(

FILE: src/pip/_internal/utils/egg_link.py
  function _egg_link_names (line 19) | def _egg_link_names(raw_name: str) -> list[str]:
  function egg_link_path_from_sys_path (line 34) | def egg_link_path_from_sys_path(raw_name: str) -> str | None:
  function egg_link_path_from_location (line 47) | def egg_link_path_from_location(raw_name: str) -> str | None:

FILE: src/pip/_internal/utils/entrypoints.py
  function _wrapper (line 24) | def _wrapper(args: list[str] | None = None) -> int:
  function get_best_invocation_for_this_pip (line 47) | def get_best_invocation_for_this_pip() -> str:
  function get_best_invocation_for_this_python (line 74) | def get_best_invocation_for_this_python() -> str:

FILE: src/pip/_internal/utils/filesystem.py
  function check_path_owner (line 19) | def check_path_owner(path: str) -> bool:
  function adjacent_tmp_file (line 47) | def adjacent_tmp_file(path: str, **kwargs: Any) -> Generator[BinaryIO, N...
  function test_writable_dir (line 76) | def test_writable_dir(path: str) -> bool:
  function _test_writable_dir_win (line 94) | def _test_writable_dir_win(path: str) -> bool:
  function find_files (line 122) | def find_files(path: str, pattern: str) -> list[str]:
  function file_size (line 132) | def file_size(path: str) -> int | float:
  function format_file_size (line 139) | def format_file_size(path: str) -> str:
  function directory_size (line 143) | def directory_size(path: str) -> int | float:
  function format_directory_size (line 152) | def format_directory_size(path: str) -> str:
  function copy_directory_permissions (line 156) | def copy_directory_permissions(directory: str, target_file: BinaryIO) ->...
  function _subdirs_without_generic (line 168) | def _subdirs_without_generic(
  function subdirs_without_files (line 194) | def subdirs_without_files(path: str) -> Generator[Path]:
  function subdirs_without_wheels (line 199) | def subdirs_without_wheels(path: str) -> Generator[Path]:

FILE: src/pip/_internal/utils/filetypes.py
  function is_archive_file (line 19) | def is_archive_file(name: str) -> bool:

FILE: src/pip/_internal/utils/glibc.py
  function glibc_version_string (line 7) | def glibc_version_string() -> str | None:
  function glibc_version_string_confstr (line 12) | def glibc_version_string_confstr() -> str | None:
  function glibc_version_string_ctypes (line 32) | def glibc_version_string_ctypes() -> str | None:
  function libc_ver (line 92) | def libc_ver() -> tuple[str, str]:

FILE: src/pip/_internal/utils/hashes.py
  class Hashes (line 24) | class Hashes:
    method __init__ (line 30) | def __init__(self, hashes: dict[str, list[str]] | None = None) -> None:
    method __and__ (line 42) | def __and__(self, other: Hashes) -> Hashes:
    method digest_count (line 62) | def digest_count(self) -> int:
    method is_hash_allowed (line 65) | def is_hash_allowed(self, hash_name: str, hex_digest: str) -> bool:
    method check_against_chunks (line 69) | def check_against_chunks(self, chunks: Iterable[bytes]) -> None:
    method _raise (line 92) | def _raise(self, gots: dict[str, _Hash]) -> NoReturn:
    method check_against_file (line 95) | def check_against_file(self, file: BinaryIO) -> None:
    method check_against_path (line 103) | def check_against_path(self, path: str) -> None:
    method has_one_of (line 107) | def has_one_of(self, hashes: dict[str, str]) -> bool:
    method __bool__ (line 114) | def __bool__(self) -> bool:
    method __eq__ (line 118) | def __eq__(self, other: object) -> bool:
    method __hash__ (line 123) | def __hash__(self) -> int:
  class MissingHashes (line 135) | class MissingHashes(Hashes):
    method __init__ (line 143) | def __init__(self) -> None:
    method _raise (line 149) | def _raise(self, gots: dict[str, _Hash]) -> NoReturn:

FILE: src/pip/_internal/utils/logging.py
  class BrokenStdoutLoggingError (line 40) | class BrokenStdoutLoggingError(Exception):
  function _is_broken_pipe_error (line 46) | def _is_broken_pipe_error(exc_class: type[BaseException], exc: BaseExcep...
  function capture_logging (line 60) | def capture_logging() -> Generator[StringIO, None, None]:
  function indent_log (line 92) | def indent_log(num: int = 2) -> Generator[None, None, None]:
  function get_indentation (line 106) | def get_indentation() -> int:
  class IndentingFormatter (line 110) | class IndentingFormatter(logging.Formatter):
    method __init__ (line 113) | def __init__(
    method get_message_start (line 128) | def get_message_start(self, formatted: str, levelno: int) -> str:
    method format (line 144) | def format(self, record: logging.LogRecord) -> str:
  class IndentedRenderable (line 162) | class IndentedRenderable:
    method __rich_console__ (line 166) | def __rich_console__(
  class PipConsole (line 177) | class PipConsole(Console):
    method on_broken_pipe (line 178) | def on_broken_pipe(self) -> None:
  function get_console (line 184) | def get_console(*, stderr: bool = False) -> Console:
  class RichPipStreamHandler (line 193) | class RichPipStreamHandler(RichHandler):
    method __init__ (line 196) | def __init__(self, console: Console) -> None:
    method emit (line 206) | def emit(self, record: logging.LogRecord) -> None:
    method handleError (line 234) | def handleError(self, record: logging.LogRecord) -> None:
  class BetterRotatingFileHandler (line 253) | class BetterRotatingFileHandler(logging.handlers.RotatingFileHandler):
    method _open (line 254) | def _open(self) -> TextIOWrapper:
  class MaxLevelFilter (line 259) | class MaxLevelFilter(Filter):
    method __init__ (line 260) | def __init__(self, level: int) -> None:
    method filter (line 263) | def filter(self, record: logging.LogRecord) -> bool:
  class ExcludeLoggerFilter (line 267) | class ExcludeLoggerFilter(Filter):
    method filter (line 272) | def filter(self, record: logging.LogRecord) -> bool:
  function setup_logging (line 278) | def setup_logging(verbosity: int, no_color: bool, user_log_file: str | N...

FILE: src/pip/_internal/utils/misc.py
  function get_pip_version (line 70) | def get_pip_version() -> str:
  function normalize_version_info (line 77) | def normalize_version_info(py_version_info: tuple[int, ...]) -> tuple[in...
  function ensure_dir (line 96) | def ensure_dir(path: str) -> None:
  function get_prog (line 106) | def get_prog() -> str:
  function rmtree (line 120) | def rmtree(dir: str, ignore_errors: bool = False, onexc: OnExc | None = ...
  function _onerror_ignore (line 133) | def _onerror_ignore(*_args: Any) -> None:
  function _onerror_reraise (line 137) | def _onerror_reraise(*_args: Any) -> None:
  function rmtree_errorhandler (line 141) | def rmtree_errorhandler(
  function display_path (line 182) | def display_path(path: str) -> str:
  function backup_dir (line 193) | def backup_dir(dir: str, ext: str = ".bak") -> str:
  function ask_path_exists (line 204) | def ask_path_exists(message: str, options: Iterable[str]) -> str:
  function _check_no_input (line 211) | def _check_no_input(message: str) -> None:
  function ask (line 219) | def ask(message: str, options: Iterable[str]) -> str:
  function ask_input (line 234) | def ask_input(message: str) -> str:
  function ask_password (line 240) | def ask_password(message: str) -> str:
  function strtobool (line 246) | def strtobool(val: str) -> int:
  function format_size (line 262) | def format_size(bytes: float) -> str:
  function tabulate (line 273) | def tabulate(rows: Iterable[Iterable[Any]]) -> tuple[list[str], list[int]]:
  function is_installable_dir (line 287) | def is_installable_dir(path: str) -> bool:
  function read_chunks (line 304) | def read_chunks(
  function normalize_path (line 315) | def normalize_path(path: str, resolve_symlinks: bool = True) -> str:
  function splitext (line 328) | def splitext(path: str) -> tuple[str, str]:
  function renames (line 337) | def renames(old: str, new: str) -> None:
  function is_local (line 354) | def is_local(path: str) -> bool:
  function write_output (line 368) | def write_output(msg: Any, *args: Any) -> None:
  class StreamWrapper (line 372) | class StreamWrapper(StringIO):
    method from_stream (line 376) | def from_stream(cls, orig_stream: TextIO) -> StreamWrapper:
    method encoding (line 384) | def encoding(self) -> str:  # type: ignore
  function enum (line 389) | def enum(*sequential: Any, **named: Any) -> type[Any]:
  function build_netloc (line 396) | def build_netloc(host: str, port: int | None) -> str:
  function build_url_from_netloc (line 408) | def build_url_from_netloc(netloc: str, scheme: str = "https") -> str:
  function parse_netloc (line 418) | def parse_netloc(netloc: str) -> tuple[str | None, int | None]:
  function split_auth_from_netloc (line 427) | def split_auth_from_netloc(netloc: str) -> NetlocTuple:
  function redact_netloc (line 456) | def redact_netloc(netloc: str) -> str:
  function _transform_url (line 476) | def _transform_url(
  function _get_netloc (line 496) | def _get_netloc(netloc: str) -> NetlocTuple:
  function _redact_netloc (line 500) | def _redact_netloc(netloc: str) -> tuple[str]:
  function split_auth_netloc_from_url (line 504) | def split_auth_netloc_from_url(
  function remove_auth_from_url (line 516) | def remove_auth_from_url(url: str) -> str:
  function redact_auth_from_url (line 523) | def redact_auth_from_url(url: str) -> str:
  function redact_auth_from_requirement (line 528) | def redact_auth_from_requirement(req: Requirement) -> str:
  class HiddenText (line 536) | class HiddenText:
    method __repr__ (line 540) | def __repr__(self) -> str:
    method __str__ (line 543) | def __str__(self) -> str:
    method __eq__ (line 546) | def __eq__(self, other: object) -> bool:
  function hide_value (line 560) | def hide_value(value: str) -> HiddenText:
  function hide_url (line 564) | def hide_url(url: str) -> HiddenText:
  function protect_pip_from_modification_on_windows (line 569) | def protect_pip_from_modification_on_windows(modifying_pip: bool) -> None:
  function check_externally_managed (line 595) | def check_externally_managed() -> None:
  function is_console_interactive (line 610) | def is_console_interactive() -> bool:
  function hash_file (line 615) | def hash_file(path: str, blocksize: int = 1 << 20) -> tuple[Any, int]:
  function pairwise (line 627) | def pairwise(iterable: Iterable[Any]) -> Iterator[tuple[Any, Any]]:
  function partition (line 638) | def partition(
  class ConfiguredBuildBackendHookCaller (line 651) | class ConfiguredBuildBackendHookCaller(BuildBackendHookCaller):
    method __init__ (line 652) | def __init__(
    method build_wheel (line 666) | def build_wheel(
    method build_sdist (line 677) | def build_sdist(
    method build_editable (line 685) | def build_editable(
    method get_requires_for_build_wheel (line 696) | def get_requires_for_build_wheel(
    method get_requires_for_build_sdist (line 702) | def get_requires_for_build_sdist(
    method get_requires_for_build_editable (line 708) | def get_requires_for_build_editable(
    method prepare_metadata_for_build_wheel (line 714) | def prepare_metadata_for_build_wheel(
    method prepare_metadata_for_build_editable (line 727) | def prepare_metadata_for_build_editable(
  function warn_if_run_as_root (line 741) | def warn_if_run_as_root() -> None:

FILE: src/pip/_internal/utils/packaging.py
  function check_requires_python (line 13) | def check_requires_python(
  function get_requirement (line 37) | def get_requirement(req_string: str) -> Requirement:

FILE: src/pip/_internal/utils/pylock.py
  function _pylock_package_from_install_requirement (line 21) | def _pylock_package_from_install_requirement(
  function pylock_from_install_requirements (line 103) | def pylock_from_install_requirements(

FILE: src/pip/_internal/utils/retry.py
  function retry (line 14) | def retry(

FILE: src/pip/_internal/utils/subprocess.py
  function make_command (line 20) | def make_command(*args: str | HiddenText | CommandArgs) -> CommandArgs:
  function format_command_args (line 37) | def format_command_args(args: list[str] | CommandArgs) -> str:
  function reveal_command_args (line 52) | def reveal_command_args(args: list[str] | CommandArgs) -> list[str]:
  function call_subprocess (line 59) | def call_subprocess(
  function runner_with_spinner_message (line 227) | def runner_with_spinner_message(message: str) -> Callable[..., None]:

FILE: src/pip/_internal/utils/temp_dir.py
  function global_tempdir_manager (line 38) | def global_tempdir_manager() -> Generator[None, None, None]:
  class TempDirectoryTypeRegistry (line 48) | class TempDirectoryTypeRegistry:
    method __init__ (line 51) | def __init__(self) -> None:
    method set_delete (line 54) | def set_delete(self, kind: str, value: bool) -> None:
    method get_delete (line 60) | def get_delete(self, kind: str) -> bool:
  function tempdir_registry (line 71) | def tempdir_registry() -> Generator[TempDirectoryTypeRegistry, None, None]:
  class _Default (line 84) | class _Default:
  class TempDirectory (line 91) | class TempDirectory:
    method __init__ (line 112) | def __init__(
    method path (line 148) | def path(self) -> str:
    method __repr__ (line 152) | def __repr__(self) -> str:
    method __enter__ (line 155) | def __enter__(self: _T) -> _T:
    method __exit__ (line 158) | def __exit__(self, exc: Any, value: Any, tb: Any) -> None:
    method _create (line 169) | def _create(self, kind: str) -> str:
    method cleanup (line 179) | def cleanup(self) -> None:
  class AdjacentTempDirectory (line 224) | class AdjacentTempDirectory(TempDirectory):
    method __init__ (line 246) | def __init__(self, original: str, delete: bool | None = None) -> None:
    method _generate_names (line 251) | def _generate_names(cls, name: str) -> Generator[str, None, None]:
    method _create (line 276) | def _create(self, kind: str) -> str:

FILE: src/pip/_internal/utils/unpacking.py
  function current_umask (line 45) | def current_umask() -> int:
  function split_leading_dir (line 52) | def split_leading_dir(path: str) -> list[str]:
  function has_leading_dir (line 64) | def has_leading_dir(paths: Iterable[str]) -> bool:
  function is_within_directory (line 79) | def is_within_directory(directory: str, target: str) -> bool:
  function _get_default_mode_plus_executable (line 90) | def _get_default_mode_plus_executable() -> int:
  function set_extracted_file_to_default_mode_plus_executable (line 94) | def set_extracted_file_to_default_mode_plus_executable(path: str) -> None:
  function zip_item_is_executable (line 102) | def zip_item_is_executable(info: ZipInfo) -> bool:
  function unzip_file (line 109) | def unzip_file(filename: str, location: str, flatten: bool = True) -> None:
  function untar_file (line 155) | def untar_file(filename: str, location: str) -> None:
  function is_symlink_target_in_tar (line 251) | def is_symlink_target_in_tar(tar: tarfile.TarFile, tarinfo: tarfile.TarI...
  function _untar_without_filter (line 265) | def _untar_without_filter(
  function unpack_file (line 334) | def unpack_file(

FILE: src/pip/_internal/utils/urls.py
  function path_to_url (line 9) | def path_to_url(path: str) -> str:
  function url_to_path (line 19) | def url_to_path(url: str) -> str:

FILE: src/pip/_internal/utils/virtualenv.py
  function _running_under_venv (line 15) | def _running_under_venv() -> bool:
  function _running_under_legacy_virtualenv (line 23) | def _running_under_legacy_virtualenv() -> bool:
  function running_under_virtualenv (line 32) | def running_under_virtualenv() -> bool:
  function _get_pyvenv_cfg_lines (line 37) | def _get_pyvenv_cfg_lines() -> list[str] | None:
  function _no_global_under_venv (line 52) | def _no_global_under_venv() -> bool:
  function _no_global_under_legacy_virtualenv (line 81) | def _no_global_under_legacy_virtualenv() -> bool:
  function virtualenv_no_global (line 95) | def virtualenv_no_global() -> bool:

FILE: src/pip/_internal/utils/wheel.py
  function parse_wheel (line 18) | def parse_wheel(wheel_zip: ZipFile, name: str) -> tuple[str, Message]:
  function wheel_dist_info_dir (line 36) | def wheel_dist_info_dir(source: ZipFile, name: str) -> str:
  function read_wheel_metadata_file (line 67) | def read_wheel_metadata_file(source: ZipFile, path: str) -> bytes:
  function wheel_metadata (line 76) | def wheel_metadata(source: ZipFile, dist_info_dir: str) -> Message:
  function wheel_version (line 95) | def wheel_version(wheel_data: Message) -> tuple[int, ...]:
  function check_compatibility (line 111) | def check_compatibility(version: tuple[int, ...], name: str) -> None:

FILE: src/pip/_internal/vcs/bazaar.py
  class Bazaar (line 19) | class Bazaar(VersionControl):
    method get_base_rev_args (line 34) | def get_base_rev_args(rev: str) -> list[str]:
    method fetch_new (line 37) | def fetch_new(
    method switch (line 58) | def switch(
    method update (line 67) | def update(
    method get_url_rev_and_auth (line 92) | def get_url_rev_and_auth(cls, url: str) -> tuple[str, str | None, Auth...
    method get_remote_url (line 100) | def get_remote_url(cls, location: str) -> str:
    method get_revision (line 115) | def get_revision(cls, location: str) -> str:
    method is_commit_id_equal (line 125) | def is_commit_id_equal(cls, dest: str, name: str | None) -> bool:

FILE: src/pip/_internal/vcs/git.py
  function looks_like_hash (line 58) | def looks_like_hash(sha: str) -> bool:
  class Git (line 62) | class Git(VersionControl):
    method get_base_rev_args (line 79) | def get_base_rev_args(rev: str) -> list[str]:
    method run_command (line 83) | def run_command(cls, *args: Any, **kwargs: Any) -> str:
    method is_immutable_rev_checkout (line 91) | def is_immutable_rev_checkout(self, url: str, dest: str) -> bool:
    method get_git_version (line 105) | def get_git_version(self) -> tuple[int, ...]:
    method get_current_branch (line 119) | def get_current_branch(cls, location: str) -> str | None:
    method get_revision_sha (line 144) | def get_revision_sha(cls, dest: str, rev: str) -> tuple[str | None, bo...
    method _should_fetch (line 190) | def _should_fetch(cls, dest: str, rev: str) -> bool:
    method resolve_revision (line 213) | def resolve_revision(
    method is_commit_id_equal (line 259) | def is_commit_id_equal(cls, dest: str, name: str | None) -> bool:
    method fetch_new (line 273) | def fetch_new(
    method switch (line 336) | def switch(
    method update (line 358) | def update(
    method get_remote_url (line 389) | def get_remote_url(cls, location: str) -> str:
    method _git_remote_to_pip_url (line 419) | def _git_remote_to_pip_url(url: str) -> str:
    method has_commit (line 450) | def has_commit(cls, location: str, rev: str) -> bool:
    method get_revision (line 466) | def get_revision(cls, location: str, rev: str | None = None) -> str:
    method get_subdirectory (line 478) | def get_subdirectory(cls, location: str) -> str | None:
    method get_url_rev_and_auth (line 496) | def get_url_rev_and_auth(cls, url: str) -> tuple[str, str | None, Auth...
    method update_submodules (line 527) | def update_submodules(cls, location: str, verbosity: int = 0) -> None:
    method get_repository_root (line 541) | def get_repository_root(cls, location: str) -> str | None:
    method should_add_vcs_url_prefix (line 566) | def should_add_vcs_url_prefix(repo_url: str) -> bool:

FILE: src/pip/_internal/vcs/mercurial.py
  class Mercurial (line 21) | class Mercurial(VersionControl):
    method get_base_rev_args (line 34) | def get_base_rev_args(rev: str) -> list[str]:
    method fetch_new (line 37) | def fetch_new(
    method switch (line 61) | def switch(
    method update (line 86) | def update(
    method get_remote_url (line 103) | def get_remote_url(cls, location: str) -> str:
    method get_revision (line 115) | def get_revision(cls, location: str) -> str:
    method get_requirement_revision (line 128) | def get_requirement_revision(cls, location: str) -> str:
    method is_commit_id_equal (line 142) | def is_commit_id_equal(cls, dest: str, name: str | None) -> bool:
    method get_subdirectory (line 147) | def get_subdirectory(cls, location: str) -> str | None:
    method get_repository_root (line 161) | def get_repository_root(cls, location: str) -> str | None:

FILE: src/pip/_internal/vcs/subversion.py
  class Subversion (line 31) | class Subversion(VersionControl):
    method should_add_vcs_url_prefix (line 38) | def should_add_vcs_url_prefix(cls, remote_url: str) -> bool:
    method get_base_rev_args (line 42) | def get_base_rev_args(rev: str) -> list[str]:
    method get_revision (line 46) | def get_revision(cls, location: str) -> str:
    method get_netloc_and_auth (line 75) | def get_netloc_and_auth(
    method get_url_rev_and_auth (line 90) | def get_url_rev_and_auth(cls, url: str) -> tuple[str, str | None, Auth...
    method make_rev_args (line 98) | def make_rev_args(username: str | None, password: HiddenText | None) -...
    method get_remote_url (line 108) | def get_remote_url(cls, location: str) -> str:
    method _get_svn_url_rev (line 132) | def _get_svn_url_rev(cls, location: str) -> tuple[str | None, int]:
    method is_commit_id_equal (line 182) | def is_commit_id_equal(cls, dest: str, name: str | None) -> bool:
    method __init__ (line 186) | def __init__(self, use_interactive: bool | None = None) -> None:
    method call_vcs_version (line 200) | def call_vcs_version(self) -> tuple[int, ...]:
    method get_vcs_version (line 228) | def get_vcs_version(self) -> tuple[int, ...]:
    method get_remote_call_options (line 248) | def get_remote_call_options(self) -> CommandArgs:
    method fetch_new (line 279) | def fetch_new(
    method switch (line 303) | def switch(
    method update (line 319) | def update(

FILE: src/pip/_internal/vcs/versioncontrol.py
  function is_url (line 45) | def is_url(name: str) -> bool:
  function make_vcs_requirement_url (line 55) | def make_vcs_requirement_url(
  function find_path_to_project_root_from_repo_root (line 74) | def find_path_to_project_root_from_repo_root(
  class RemoteNotFoundError (line 103) | class RemoteNotFoundError(Exception):
  class RemoteNotValidError (line 107) | class RemoteNotValidError(Exception):
    method __init__ (line 108) | def __init__(self, url: str):
  class RevOptions (line 114) | class RevOptions:
    method __repr__ (line 130) | def __repr__(self) -> str:
    method arg_rev (line 134) | def arg_rev(self) -> str | None:
    method to_args (line 140) | def to_args(self) -> CommandArgs:
    method to_display (line 152) | def to_display(self) -> str:
    method make_new (line 158) | def make_new(self, rev: str) -> RevOptions:
  class VcsSupport (line 168) | class VcsSupport:
    method __init__ (line 172) | def __init__(self) -> None:
    method __iter__ (line 178) | def __iter__(self) -> Iterator[str]:
    method backends (line 182) | def backends(self) -> list[VersionControl]:
    method dirnames (line 186) | def dirnames(self) -> list[str]:
    method all_schemes (line 190) | def all_schemes(self) -> list[str]:
    method register (line 196) | def register(self, cls: type[VersionControl]) -> None:
    method unregister (line 204) | def unregister(self, name: str) -> None:
    method get_backend_for_dir (line 208) | def get_backend_for_dir(self, location: str) -> VersionControl | None:
    method get_backend_for_scheme (line 231) | def get_backend_for_scheme(self, scheme: str) -> VersionControl | None:
    method get_backend (line 240) | def get_backend(self, name: str) -> VersionControl | None:
  class VersionControl (line 251) | class VersionControl:
    method should_add_vcs_url_prefix (line 262) | def should_add_vcs_url_prefix(cls, remote_url: str) -> bool:
    method get_subdirectory (line 270) | def get_subdirectory(cls, location: str) -> str | None:
    method get_requirement_revision (line 278) | def get_requirement_revision(cls, repo_dir: str) -> str:
    method get_src_requirement (line 285) | def get_src_requirement(cls, repo_dir: str, project_name: str) -> str:
    method get_base_rev_args (line 309) | def get_base_rev_args(rev: str) -> list[str]:
    method is_immutable_rev_checkout (line 318) | def is_immutable_rev_checkout(self, url: str, dest: str) -> bool:
    method make_rev_options (line 332) | def make_rev_options(
    method _is_local_repository (line 345) | def _is_local_repository(cls, repo: str) -> bool:
    method get_netloc_and_auth (line 354) | def get_netloc_and_auth(
    method get_url_rev_and_auth (line 375) | def get_url_rev_and_auth(cls, url: str) -> tuple[str, str | None, Auth...
    method make_rev_args (line 406) | def make_rev_args(username: str | None, password: HiddenText | None) -...
    method get_url_rev_options (line 412) | def get_url_rev_options(self, url: HiddenText) -> tuple[HiddenText, Re...
    method normalize_url (line 428) | def normalize_url(url: str) -> str:
    method compare_urls (line 436) | def compare_urls(cls, url1: str, url2: str) -> bool:
    method fetch_new (line 442) | def fetch_new(
    method switch (line 456) | def switch(
    method update (line 471) | def update(
    method is_commit_id_equal (line 487) | def is_commit_id_equal(cls, dest: str, name: str | None) -> bool:
    method obtain (line 497) | def obtain(self, dest: str, url: HiddenText, verbosity: int) -> None:
    method unpack (line 586) | def unpack(self, location: str, url: HiddenText, verbosity: int) -> None:
    method get_remote_url (line 599) | def get_remote_url(cls, location: str) -> str:
    method get_revision (line 609) | def get_revision(cls, location: str) -> str:
    method run_command (line 616) | def run_command(
    method is_repository_directory (line 674) | def is_repository_directory(cls, path: str) -> bool:
    method get_repository_root (line 682) | def get_repository_root(cls, location: str) -> str | None:

FILE: src/pip/_internal/wheel_builder.py
  function _contains_egg_info (line 34) | def _contains_egg_info(s: str) -> bool:
  function _should_cache (line 42) | def _should_cache(
  function _get_cache_dir (line 73) | def _get_cache_dir(
  function _verify_one (line 89) | def _verify_one(req: InstallRequirement, wheel_path: str) -> None:
  function _build_one (line 118) | def _build_one(
  function _build_one_inside_env (line 152) | def _build_one_inside_env(
  function build (line 204) | def build(

FILE: src/pip/_vendor/__init__.py
  function vendored (line 29) | def vendored(modulename):

FILE: src/pip/_vendor/cachecontrol/_cmd.py
  function setup_logging (line 22) | def setup_logging() -> None:
  function get_session (line 28) | def get_session() -> requests.Session:
  function get_args (line 40) | def get_args() -> Namespace:
  function main (line 46) | def main() -> None:

FILE: src/pip/_vendor/cachecontrol/adapter.py
  class CacheControlAdapter (line 26) | class CacheControlAdapter(HTTPAdapter):
    method __init__ (line 29) | def __init__(
    method send (line 50) | def send(
    method build_response (line 80) | def build_response(  # type: ignore[override]
    method close (line 165) | def close(self) -> None:

FILE: src/pip/_vendor/cachecontrol/cache.py
  class BaseCache (line 19) | class BaseCache:
    method get (line 20) | def get(self, key: str) -> bytes | None:
    method set (line 23) | def set(
    method delete (line 28) | def delete(self, key: str) -> None:
    method close (line 31) | def close(self) -> None:
  class DictCache (line 35) | class DictCache(BaseCache):
    method __init__ (line 36) | def __init__(self, init_dict: MutableMapping[str, bytes] | None = None...
    method get (line 40) | def get(self, key: str) -> bytes | None:
    method set (line 43) | def set(
    method delete (line 49) | def delete(self, key: str) -> None:
  class SeparateBodyBaseCache (line 55) | class SeparateBodyBaseCache(BaseCache):
    method set_body (line 68) | def set_body(self, key: str, body: bytes) -> None:
    method get_body (line 71) | def get_body(self, key: str) -> IO[bytes] | None:

FILE: src/pip/_vendor/cachecontrol/caches/file_cache.py
  class _FileCacheMixin (line 22) | class _FileCacheMixin:
    method __init__ (line 25) | def __init__(
    method encode (line 55) | def encode(x: str) -> str:
    method _fn (line 58) | def _fn(self, name: str) -> str:
    method get (line 65) | def get(self, key: str) -> bytes | None:
    method set (line 74) | def set(
    method _write (line 80) | def _write(self, path: str, data: bytes) -> None:
    method _delete (line 98) | def _delete(self, key: str, suffix: str) -> None:
  class FileCache (line 107) | class FileCache(_FileCacheMixin, BaseCache):
    method delete (line 113) | def delete(self, key: str) -> None:
  class SeparateBodyFileCache (line 117) | class SeparateBodyFileCache(_FileCacheMixin, SeparateBodyBaseCache):
    method get_body (line 123) | def get_body(self, key: str) -> IO[bytes] | None:
    method set_body (line 130) | def set_body(self, key: str, body: bytes) -> None:
    method delete (line 134) | def delete(self, key: str) -> None:
  function url_to_file_path (line 139) | def url_to_file_path(url: str, filecache: FileCache) -> str:

FILE: src/pip/_vendor/cachecontrol/caches/redis_cache.py
  class RedisCache (line 16) | class RedisCache(BaseCache):
    method __init__ (line 17) | def __init__(self, conn: Redis[bytes]) -> None:
    method get (line 20) | def get(self, key: str) -> bytes | None:
    method set (line 23) | def set(
    method delete (line 37) | def delete(self, key: str) -> None:
    method clear (line 40) | def clear(self) -> None:
    method close (line 46) | def close(self) -> None:

FILE: src/pip/_vendor/cachecontrol/controller.py
  function parse_uri (line 39) | def parse_uri(uri: str) -> tuple[str, str, str, str, str]:
  class CacheController (line 50) | class CacheController:
    method __init__ (line 53) | def __init__(
    method _urlnorm (line 66) | def _urlnorm(cls, uri: str) -> str:
    method cache_url (line 86) | def cache_url(cls, uri: str) -> str:
    method parse_cache_control (line 89) | def parse_cache_control(self, headers: Mapping[str, str]) -> dict[str,...
    method _load_from_cache (line 143) | def _load_from_cache(self, request: PreparedRequest) -> HTTPResponse |...
    method cached_request (line 169) | def cached_request(self, request: PreparedRequest) -> HTTPResponse | L...
    method conditional_headers (line 279) | def conditional_headers(self, request: PreparedRequest) -> dict[str, s...
    method _cache_set (line 294) | def _cache_set(
    method cache_response (line 324) | def cache_response(
    method update_cached_response (line 471) | def update_cached_response(

FILE: src/pip/_vendor/cachecontrol/filewrapper.py
  class CallbackFileWrapper (line 15) | class CallbackFileWrapper:
    method __init__ (line 34) | def __init__(
    method __getattr__ (line 41) | def __getattr__(self, name: str) -> Any:
    method __is_fp_closed (line 53) | def __is_fp_closed(self) -> bool:
    method _close (line 71) | def _close(self) -> None:
    method read (line 99) | def read(self, amt: int | None = None) -> bytes:
    method _safe_read (line 110) | def _safe_read(self, amt: int) -> bytes:

FILE: src/pip/_vendor/cachecontrol/heuristics.py
  function expire_after (line 18) | def expire_after(delta: timedelta, date: datetime | None = None) -> date...
  function datetime_to_header (line 23) | def datetime_to_header(dt: datetime) -> str:
  class BaseHeuristic (line 27) | class BaseHeuristic:
    method warning (line 28) | def warning(self, response: HTTPResponse) -> str | None:
    method update_headers (line 39) | def update_headers(self, response: HTTPResponse) -> dict[str, str]:
    method apply (line 48) | def apply(self, response: HTTPResponse) -> HTTPResponse:
  class OneDayCache (line 60) | class OneDayCache(BaseHeuristic):
    method update_headers (line 66) | def update_headers(self, response: HTTPResponse) -> dict[str, str]:
  class ExpiresAfter (line 80) | class ExpiresAfter(BaseHeuristic):
    method __init__ (line 85) | def __init__(self, **kw: Any) -> None:
    method update_headers (line 88) | def update_headers(self, response: HTTPResponse) -> dict[str, str]:
    method warning (line 92) | def warning(self, response: HTTPResponse) -> str | None:
  class LastModified (line 97) | class LastModified(BaseHeuristic):
    method update_headers (line 124) | def update_headers(self, resp: HTTPResponse) -> dict[str, str]:
    method warning (line 156) | def warning(self, resp: HTTPResponse) -> str | None:

FILE: src/pip/_vendor/cachecontrol/serialize.py
  class Serializer (line 17) | class Serializer:
    method dumps (line 20) | def dumps(
    method serialize (line 62) | def serialize(self, data: dict[str, Any]) -> bytes:
    method loads (line 65) | def loads(
    method prepare_response (line 83) | def prepare_response(
    method _loads_v4 (line 135) | def _loads_v4(

FILE: src/pip/_vendor/cachecontrol/wrapper.py
  function CacheControl (line 20) | def CacheControl(

FILE: src/pip/_vendor/certifi/core.py
  function exit_cacert_ctx (line 10) | def exit_cacert_ctx() -> None:
  function where (line 21) | def where() -> str:
  function contents (line 46) | def contents() -> str:
  function where (line 56) | def where() -> str:
  function contents (line 82) | def contents() -> str:

FILE: src/pip/_vendor/dependency_groups/__main__.py
  function main (line 8) | def main() -> None:

FILE: src/pip/_vendor/dependency_groups/_implementation.py
  function _normalize_name (line 10) | def _normalize_name(name: str) -> str:
  function _normalize_group_names (line 14) | def _normalize_group_names(
  class DependencyGroupInclude (line 36) | class DependencyGroupInclude:
  class CyclicDependencyError (line 40) | class CyclicDependencyError(ValueError):
    method __init__ (line 45) | def __init__(self, requested_group: str, group: str, include_group: st...
  class DependencyGroupResolver (line 60) | class DependencyGroupResolver:
    method __init__ (line 72) | def __init__(
    method lookup (line 88) | def lookup(self, group: str) -> tuple[Requirement | DependencyGroupInc...
    method resolve (line 106) | def resolve(self, group: str) -> tuple[Requirement, ...]:
    method _parse_group (line 123) | def _parse_group(
    method _resolve (line 156) | def _resolve(self, group: str, requested_group: str) -> tuple[Requirem...
  function resolve (line 193) | def resolve(

FILE: src/pip/_vendor/dependency_groups/_lint_dependency_groups.py
  function main (line 10) | def main(*, argv: list[str] | None = None) -> None:

FILE: src/pip/_vendor/dependency_groups/_pip_wrapper.py
  function _invoke_pip (line 11) | def _invoke_pip(deps: list[str]) -> None:
  function main (line 15) | def main(*, argv: list[str] | None = None) -> None:

FILE: src/pip/_vendor/distlib/__init__.py
  class DistlibException (line 12) | class DistlibException(Exception):
  class NullHandler (line 20) | class NullHandler(logging.Handler):
    method handle (line 22) | def handle(self, record):
    method emit (line 25) | def emit(self, record):
    method createLock (line 28) | def createLock(self):

FILE: src/pip/_vendor/distlib/compat.py
  function quote (line 30) | def quote(s):
  class CertificateError (line 93) | class CertificateError(ValueError):
  function _dnsname_match (line 96) | def _dnsname_match(dn, hostname, max_wildcards=1):
  function match_hostname (line 145) | def match_hostname(cert, hostname):
  class Container (line 192) | class Container(object):
    method __init__ (line 197) | def __init__(self, **kwargs):
  function which (line 205) | def which(cmd, mode=os.F_OK | os.X_OK, path=None):
  class ZipExtFile (line 277) | class ZipExtFile(BaseZipExtFile):
    method __init__ (line 279) | def __init__(self, base):
    method __enter__ (line 282) | def __enter__(self):
    method __exit__ (line 285) | def __exit__(self, *exc_info):
  class ZipFile (line 289) | class ZipFile(BaseZipFile):
    method __enter__ (line 291) | def __enter__(self):
    method __exit__ (line 294) | def __exit__(self, *exc_info):
    method open (line 298) | def open(self, *args, **kwargs):
  function python_implementation (line 307) | def python_implementation():
  function callable (line 325) | def callable(obj):
  function fsencode (line 345) | def fsencode(filename):
  function fsdecode (line 354) | def fsdecode(filename):
  function _get_normal_name (line 371) | def _get_normal_name(orig_enc):
  function detect_encoding (line 382) | def detect_encoding(readline):
  function _recursive_repr (line 494) | def _recursive_repr(fillvalue='...'):
  class ChainMap (line 524) | class ChainMap(MutableMapping):
    method __init__ (line 537) | def __init__(self, *maps):
    method __missing__ (line 544) | def __missing__(self, key):
    method __getitem__ (line 547) | def __getitem__(self, key):
    method get (line 557) | def get(self, key, default=None):
    method __len__ (line 560) | def __len__(self):
    method __iter__ (line 564) | def __iter__(self):
    method __contains__ (line 567) | def __contains__(self, key):
    method __bool__ (line 570) | def __bool__(self):
    method __repr__ (line 574) | def __repr__(self):
    method fromkeys (line 579) | def fromkeys(cls, iterable, *args):
    method copy (line 583) | def copy(self):
    method new_child (line 589) | def new_child(self):  # like Django's Context.push()
    method parents (line 594) | def parents(self):  # like Django's Context.pop()
    method __setitem__ (line 598) | def __setitem__(self, key, value):
    method __delitem__ (line 601) | def __delitem__(self, key):
    method popitem (line 608) | def popitem(self):
    method pop (line 615) | def pop(self, key, *args):
    method clear (line 623) | def clear(self):
  function cache_from_source (line 632) | def cache_from_source(path, debug_override=None):
  class OrderedDict (line 659) | class OrderedDict(dict):
    method __init__ (line 672) | def __init__(self, *args, **kwds):
    method __setitem__ (line 689) | def __setitem__(self, key, value, dict_setitem=dict.__setitem__):
    method __delitem__ (line 699) | def __delitem__(self, key, dict_delitem=dict.__delitem__):
    method __iter__ (line 708) | def __iter__(self):
    method __reversed__ (line 716) | def __reversed__(self):
    method clear (line 724) | def clear(self):
    method popitem (line 736) | def popitem(self, last=True):
    method keys (line 761) | def keys(self):
    method values (line 765) | def values(self):
    method items (line 769) | def items(self):
    method iterkeys (line 773) | def iterkeys(self):
    method itervalues (line 777) | def itervalues(self):
    method iteritems (line 782) | def iteritems(self):
    method update (line 787) | def update(*args, **kwds):
    method pop (line 822) | def pop(self, key, default=__marker):
    method setdefault (line 835) | def setdefault(self, key, default=None):
    method __repr__ (line 842) | def __repr__(self, _repr_running=None):
    method __reduce__ (line 857) | def __reduce__(self):
    method copy (line 867) | def copy(self):
    method fromkeys (line 872) | def fromkeys(cls, iterable, value=None):
    method __eq__ (line 882) | def __eq__(self, other):
    method __ne__ (line 892) | def __ne__(self, other):
    method viewkeys (line 897) | def viewkeys(self):
    method viewvalues (line 901) | def viewvalues(self):
    method viewitems (line 905) | def viewitems(self):
  function valid_ident (line 915) | def valid_ident(s):
  class ConvertingDict (line 930) | class ConvertingDict(dict):
    method __getitem__ (line 933) | def __getitem__(self, key):
    method get (line 945) | def get(self, key, default=None):
  function pop (line 957) | def pop(self, key, default=None):
  class ConvertingList (line 967) | class ConvertingList(list):
    method __getitem__ (line 970) | def __getitem__(self, key):
    method pop (line 982) | def pop(self, idx=-1):
  class ConvertingTuple (line 991) | class ConvertingTuple(tuple):
    method __getitem__ (line 994) | def __getitem__(self, key):
  class BaseConfigurator (line 1004) | class BaseConfigurator(object):
    method __init__ (line 1024) | def __init__(self, config):
    method resolve (line 1028) | def resolve(self, s):
    method ext_convert (line 1051) | def ext_convert(self, value):
    method cfg_convert (line 1055) | def cfg_convert(self, value):
    method convert (line 1090) | def convert(self, value):
    method configure_custom (line 1119) | def configure_custom(self, config):
    method as_tuple (line 1133) | def as_tuple(self, value):

FILE: src/pip/_vendor/distlib/resources.py
  class ResourceCache (line 27) | class ResourceCache(Cache):
    method __init__ (line 28) | def __init__(self, base=None):
    method is_stale (line 34) | def is_stale(self, resource, path):
    method get (line 45) | def get(self, resource):
  class ResourceBase (line 71) | class ResourceBase(object):
    method __init__ (line 72) | def __init__(self, finder, name):
  class Resource (line 77) | class Resource(ResourceBase):
    method as_stream (line 85) | def as_stream(self):
    method file_path (line 95) | def file_path(self):
    method bytes (line 102) | def bytes(self):
    method size (line 106) | def size(self):
  class ResourceContainer (line 110) | class ResourceContainer(ResourceBase):
    method resources (line 114) | def resources(self):
  class ResourceFinder (line 118) | class ResourceFinder(object):
    method __init__ (line 128) | def __init__(self, module):
    method _adjust_path (line 133) | def _adjust_path(self, path):
    method _make_path (line 136) | def _make_path(self, resource_name):
    method _find (line 148) | def _find(self, path):
    method get_cache_info (line 151) | def get_cache_info(self, resource):
    method find (line 154) | def find(self, resource_name):
    method get_stream (line 166) | def get_stream(self, resource):
    method get_bytes (line 169) | def get_bytes(self, resource):
    method get_size (line 173) | def get_size(self, resource):
    method get_resources (line 176) | def get_resources(self, resource):
    method is_container (line 182) | def is_container(self, resource):
    method iterator (line 187) | def iterator(self, resource_name):
  class ZipResourceFinder (line 208) | class ZipResourceFinder(ResourceFinder):
    method __init__ (line 212) | def __init__(self, module):
    method _adjust_path (line 223) | def _adjust_path(self, path):
    method _find (line 226) | def _find(self, path):
    method get_cache_info (line 244) | def get_cache_info(self, resource):
    method get_bytes (line 249) | def get_bytes(self, resource):
    method get_stream (line 252) | def get_stream(self, resource):
    method get_size (line 255) | def get_size(self, resource):
    method get_resources (line 259) | def get_resources(self, resource):
    method _is_directory (line 274) | def _is_directory(self, path):
  function register_finder (line 306) | def register_finder(loader, finder_maker):
  function finder (line 313) | def finder(package):
  function finder_for_path (line 341) | def finder_for_path(path):

FILE: src/pip/_vendor/distlib/scripts.py
  function enquote_executable (line 71) | def enquote_executable(executable):
  class ScriptMaker (line 91) | class ScriptMaker(object):
    method __init__ (line 100) | def __init__(self, source_dir, target_dir, add_launchers=True, dry_run...
    method _get_alternate_executable (line 114) | def _get_alternate_executable(self, executable, options):
    method _is_shell (line 123) | def _is_shell(self, executable):
    method _fix_jython_executable (line 135) | def _fix_jython_executable(self, executable):
    method _build_shebang (line 147) | def _build_shebang(self, executable, post_interp):
    method _get_shebang (line 183) | def _get_shebang(self, encoding, post_interp=b'', options=None):
    method _get_script_text (line 249) | def _get_script_text(self, entry):
    method get_manifest (line 255) | def get_manifest(self, exename):
    method _write_script (line 259) | def _write_script(self, names, shebang, script_bytes, filenames, ext):
    method get_script_filenames (line 316) | def get_script_filenames(self, name):
    method _make_script (line 326) | def _make_script(self, entry, filenames, options=None):
    method _copy_script (line 342) | def _copy_script(self, script, filenames):
    method dry_run (line 393) | def dry_run(self):
    method dry_run (line 397) | def dry_run(self, value):
    method _get_launcher (line 404) | def _get_launcher(self, kind):
    method make (line 419) | def make(self, specification, options=None):
    method make_multiple (line 438) | def make_multiple(self, specifications, options=None):

FILE: src/pip/_vendor/distlib/util.py
  function parse_marker (line 54) | def parse_marker(marker_string):
  function parse_requirement (line 144) | def parse_requirement(req):
  function get_resources_dests (line 268) | def get_resources_dests(resources_root, rules):
  function in_venv (line 294) | def in_venv():
  function get_executable (line 304) | def get_executable():
  function proceed (line 322) | def proceed(prompt, allowed_chars, error_prompt=None, default=None):
  function extract_by_key (line 338) | def extract_by_key(d, keys):
  function read_exports (line 348) | def read_exports(stream):
  function write_exports (line 395) | def write_exports(exports, stream):
  function tempdir (line 415) | def tempdir():
  function chdir (line 424) | def chdir(d):
  function socket_timeout (line 434) | def socket_timeout(seconds=15):
  class cached_property (line 443) | class cached_property(object):
    method __init__ (line 445) | def __init__(self, func):
    method __get__ (line 450) | def __get__(self, obj, cls=None):
  function convert_path (line 459) | def convert_path(pathname):
  class FileOperator (line 486) | class FileOperator(object):
    method __init__ (line 488) | def __init__(self, dry_run=False):
    method _init_record (line 493) | def _init_record(self):
    method record_as_written (line 498) | def record_as_written(self, path):
    method newer (line 502) | def newer(self, source, target):
    method copy_file (line 521) | def copy_file(self, infile, outfile, check=True):
    method copy_stream (line 538) | def copy_stream(self, instream, outfile, encoding=None):
    method write_binary_file (line 553) | def write_binary_file(self, path, data):
    method write_text_file (line 562) | def write_text_file(self, path, data, encoding):
    method set_mode (line 565) | def set_mode(self, bits, mask, files):
    method ensure_dir (line 579) | def ensure_dir(self, path):
    method byte_compile (line 591) | def byte_compile(self, path, optimize=False, force=False, prefix=None,...
    method ensure_removed (line 610) | def ensure_removed(self, path):
    method is_writable (line 631) | def is_writable(self, path):
    method commit (line 643) | def commit(self):
    method rollback (line 653) | def rollback(self):
  function resolve (line 672) | def resolve(module_name, dotted_path):
  class ExportEntry (line 687) | class ExportEntry(object):
    method __init__ (line 689) | def __init__(self, name, prefix, suffix, flags):
    method value (line 696) | def value(self):
    method __repr__ (line 699) | def __repr__(self):  # pragma: no cover
    method __eq__ (line 702) | def __eq__(self, other):
  function get_export_entry (line 720) | def get_export_entry(specification):
  function get_cache_base (line 751) | def get_cache_base(suffix=None):
  function path_to_cache_dir (line 792) | def path_to_cache_dir(path, use_abspath=True):
  function ensure_slash (line 809) | def ensure_slash(s):
  function parse_credentials (line 815) | def parse_credentials(netloc):
  function get_process_umask (line 830) | def get_process_umask():
  function is_string_sequence (line 836) | def is_string_sequence(seq):
  function split_filename (line 852) | def split_filename(filename, project_name=None):
  function parse_name_and_version (line 882) | def parse_name_and_version(p):
  function get_extras (line 898) | def get_extras(requested, available):
  function _get_external_data (line 926) | def _get_external_data(url):
  function get_project_data (line 950) | def get_project_data(name):
  function get_package_data (line 957) | def get_package_data(name, version):
  class Cache (line 963) | class Cache(object):
    method __init__ (line 970) | def __init__(self, base):
    method prefix_to_dir (line 984) | def prefix_to_dir(self, prefix, use_abspath=True):
    method clear (line 990) | def clear(self):
  class EventMixin (line 1007) | class EventMixin(object):
    method __init__ (line 1012) | def __init__(self):
    method add (line 1015) | def add(self, event, subscriber, append=True):
    method remove (line 1035) | def remove(self, event, subscriber):
    method get_subscribers (line 1047) | def get_subscribers(self, event):
    method publish (line 1054) | def publish(self, event, *args, **kwargs):
  class Sequencer (line 1080) | class Sequencer(object):
    method __init__ (line 1082) | def __init__(self):
    method add_node (line 1087) | def add_node(self, node):
    method remove_node (line 1090) | def remove_node(self, node, edges=False):
    method add (line 1106) | def add(self, pred, succ):
    method remove (line 1111) | def remove(self, pred, succ):
    method is_step (line 1124) | def is_step(self, step):
    method get_steps (line 1127) | def get_steps(self, final):
    method strong_connections (line 1153) | def strong_connections(self):
    method dot (line 1205) | def dot(self):
  function unarchive (line 1224) | def unarchive(archive_filename, dest_dir, format=None, check=True):
  function zip_dir (line 1292) | def zip_dir(directory):
  class Progress (line 1313) | class Progress(object):
    method __init__ (line 1316) | def __init__(self, minval=0, maxval=100):
    method update (line 1324) | def update(self, curval):
    method increment (line 1334) | def increment(self, incr):
    method start (line 1338) | def start(self):
    method stop (line 1342) | def stop(self):
    method maximum (line 1348) | def maximum(self):
    method percentage (line 1352) | def percentage(self):
    method format_duration (line 1362) | def format_duration(self, duration):
    method ETA (line 1372) | def ETA(self):
    method speed (line 1391) | def speed(self):
  function iglob (line 1412) | def iglob(path_glob):
  function _iglob (line 1423) | def _iglob(path_glob):
  class HTTPSConnection (line 1458) | class HTTPSConnection(httplib.HTTPSConnection):
    method connect (line 1463) | def connect(self):
  class HTTPSHandler (line 1491) | class HTTPSHandler(BaseHTTPSHandler):
    method __init__ (line 1493) | def __init__(self, ca_certs, check_domain=True):
    method _conn_maker (line 1498) | def _conn_maker(self, *args, **kwargs):
    method https_open (line 1514) | def https_open(self, req):
  class HTTPSOnlyHandler (line 1533) | class HTTPSOnlyHandler(HTTPSHandler, HTTPHandler):
    method http_open (line 1535) | def http_open(self, req):
  class Transport (line 1543) | class Transport(xmlrpclib.Transport):
    method __init__ (line 1545) | def __init__(self, timeout, use_datetime=0):
    method make_connection (line 1549) | def make_connection(self, host):
  class SafeTransport (line 1559) | class SafeTransport(xmlrpclib.SafeTransport):
    method __init__ (line 1561) | def __init__(self, timeout, use_datetime=0):
    method make_connection (line 1565) | def make_connection(self, host):
  class ServerProxy (line 1576) | class ServerProxy(xmlrpclib.ServerProxy):
    method __init__ (line 1578) | def __init__(self, uri, **kwargs):
  function _csv_open (line 1601) | def _csv_open(fn, mode, **kwargs):
  class CSVBase (line 1612) | class CSVBase(object):
    method __enter__ (line 1619) | def __enter__(self):
    method __exit__ (line 1622) | def __exit__(self, *exc_info):
  class CSVReader (line 1626) | class CSVReader(CSVBase):
    method __init__ (line 1628) | def __init__(self, **kwargs):
    method __iter__ (line 1639) | def __iter__(self):
    method next (line 1642) | def next(self):
  class CSVWriter (line 1653) | class CSVWriter(CSVBase):
    method __init__ (line 1655) | def __init__(self, fn, **kwargs):
    method writerow (line 1659) | def writerow(self, row):
  class Configurator (line 1675) | class Configurator(BaseConfigurator):
    method __init__ (line 1680) | def __init__(self, config, base=None):
    method configure_custom (line 1684) | def configure_custom(self, config):
    method __getitem__ (line 1716) | def __getitem__(self, key):
    method inc_convert (line 1722) | def inc_convert(self, value):
  class SubprocessMixin (line 1731) | class SubprocessMixin(object):
    method __init__ (line 1736) | def __init__(self, verbose=False, progress=None):
    method reader (line 1740) | def reader(self, stream, context):
    method run_command (line 1761) | def run_command(self, cmd, **kwargs):
  function normalize_name (line 1777) | def normalize_name(name):
  class PyPIRCFile (line 1794) | class PyPIRCFile(object):
    method __init__ (line 1799) | def __init__(self, fn=None, url=None):
    method read (line 1805) | def read(self):
    method update (line 1858) | def update(self, username, password):
  function _load_pypirc (line 1871) | def _load_pypirc(index):
  function _store_pypirc (line 1878) | def _store_pypirc(index):
  function get_host_platform (line 1888) | def get_host_platform():
  function get_platform (line 1978) | def get_platform():

FILE: src/pip/_vendor/distro/distro.py
  class VersionDict (line 61) | class VersionDict(TypedDict):
  class InfoDict (line 67) | class InfoDict(TypedDict):
  function linux_distribution (line 160) | def linux_distribution(full_distribution_name: bool = True) -> Tuple[str...
  function id (line 203) | def id() -> str:
  function name (line 287) | def name(pretty: bool = False) -> str:
  function version (line 326) | def version(pretty: bool = False, best: bool = False) -> str:
  function version_parts (line 374) | def version_parts(best: bool = False) -> Tuple[str, str, str]:
  function major_version (line 391) | def major_version(best: bool = False) -> str:
  function minor_version (line 404) | def minor_version(best: bool = False) -> str:
  function build_number (line 417) | def build_number(best: bool = False) -> str:
  function like (line 430) | def like() -> str:
  function codename (line 447) | def codename() -> str:
  function info (line 471) | def info(pretty: bool = False, best: bool = False) -> InfoDict:
  function os_release_info (line 515) | def os_release_info() -> Dict[str, str]:
  function lsb_release_info (line 525) | def lsb_release_info() -> Dict[str, str]:
  function distro_release_info (line 536) | def distro_release_info() -> Dict[str, str]:
  function uname_info (line 546) | def uname_info() -> Dict[str, str]:
  function os_release_attr (line 554) | def os_release_attr(attribute: str) -> str:
  function lsb_release_attr (line 573) | def lsb_release_attr(attribute: str) -> str:
  function distro_release_attr (line 593) | def distro_release_attr(attribute: str) -> str:
  function uname_attr (line 612) | def uname_attr(attribute: str) -> str:
  class cached_property (line 633) | class cached_property:  # type: ignore
    method __init__ (line 639) | def __init__(self, f: Callable[[Any], Any]) -> None:
    method __get__ (line 643) | def __get__(self, obj: Any, owner: Type[Any]) -> Any:
  class LinuxDistribution (line 649) | class LinuxDistribution:
    method __init__ (line 667) | def __init__(
    method __repr__ (line 800) | def __repr__(self) -> str:
    method linux_distribution (line 817) | def linux_distribution(
    method id (line 833) | def id(self) -> str:
    method name (line 861) | def name(self, pretty: bool = False) -> str:
    method version (line 884) | def version(self, pretty: bool = False, best: bool = False) -> str:
    method version_parts (line 926) | def version_parts(self, best: bool = False) -> Tuple[str, str, str]:
    method major_version (line 942) | def major_version(self, best: bool = False) -> str:
    method minor_version (line 950) | def minor_version(self, best: bool = False) -> str:
    method build_number (line 958) | def build_number(self, best: bool = False) -> str:
    method like (line 966) | def like(self) -> str:
    method codename (line 974) | def codename(self) -> str:
    method info (line 991) | def info(self, pretty: bool = False, best: bool = False) -> InfoDict:
    method os_release_info (line 1010) | def os_release_info(self) -> Dict[str, str]:
    method lsb_release_info (line 1019) | def lsb_release_info(self) -> Dict[str, str]:
    method distro_release_info (line 1029) | def distro_release_info(self) -> Dict[str, str]:
    method uname_info (line 1039) | def uname_info(self) -> Dict[str, str]:
    method oslevel_info (line 1048) | def oslevel_info(self) -> str:
    method os_release_attr (line 1054) | def os_release_attr(self, attribute: str) -> str:
    method lsb_release_attr (line 1063) | def lsb_release_attr(self, attribute: str) -> str:
    method distro_release_attr (line 1072) | def distro_release_attr(self, attribute: str) -> str:
    method uname_attr (line 1081) | def uname_attr(self, attribute: str) -> str:
    method _os_release_info (line 1091) | def _os_release_info(self) -> Dict[str, str]:
    method _parse_os_release_content (line 1104) | def _parse_os_release_content(lines: TextIO) -> Dict[str, str]:
    method _lsb_release_info (line 1154) | def _lsb_release_info(self) -> Dict[str, str]:
    method _parse_lsb_release_content (line 1173) | def _parse_lsb_release_content(lines: Iterable[str]) -> Dict[str, str]:
    method _uname_info (line 1197) | def _uname_info(self) -> Dict[str, str]:
    method _oslevel_info (line 1209) | def _oslevel_info(self) -> str:
    method _debian_version (line 1219) | def _debian_version(self) -> str:
    method _parse_uname_content (line 1229) | def _parse_uname_content(lines: Sequence[str]) -> Dict[str, str]:
    method _to_str (line 1248) | def _to_str(bytestring: bytes) -> str:
    method _distro_release_info (line 1253) | def _distro_release_info(self) -> Dict[str, str]:
    method _parse_distro_release_file (line 1311) | def _parse_distro_release_file(self, filepath: str) -> Dict[str, str]:
    method _parse_distro_release_content (line 1334) | def _parse_distro_release_content(line: str) -> Dict[str, str]:
  function main (line 1362) | def main() -> None:

FILE: src/pip/_vendor/idna/codec.py
  class Codec (line 10) | class Codec(codecs.Codec):
    method encode (line 11) | def encode(self, data: str, errors: str = "strict") -> Tuple[bytes, int]:
    method decode (line 20) | def decode(self, data: bytes, errors: str = "strict") -> Tuple[str, int]:
  class IncrementalEncoder (line 30) | class IncrementalEncoder(codecs.BufferedIncrementalEncoder):
    method _buffer_encode (line 31) | def _buffer_encode(self, data: str, errors: str, final: bool) -> Tuple...
  class IncrementalDecoder (line 64) | class IncrementalDecoder(codecs.BufferedIncrementalDecoder):
    method _buffer_decode (line 65) | def _buffer_decode(self, data: Any, errors: str, final: bool) -> Tuple...
  class StreamWriter (line 100) | class StreamWriter(Codec, codecs.StreamWriter):
  class StreamReader (line 104) | class StreamReader(Codec, codecs.StreamReader):
  function search_function (line 108) | def search_function(name: str) -> Optional[codecs.CodecInfo]:

FILE: src/pip/_vendor/idna/compat.py
  function ToASCII (line 6) | def ToASCII(label: str) -> bytes:
  function ToUnicode (line 10) | def ToUnicode(label: Union[bytes, bytearray]) -> str:
  function nameprep (line 14) | def nameprep(s: Any) -> None:

FILE: src/pip/_vendor/idna/core.py
  class IDNAError (line 14) | class IDNAError(UnicodeError):
  class IDNABidiError (line 20) | class IDNABidiError(IDNAError):
  class InvalidCodepoint (line 26) | class InvalidCodepoint(IDNAError):
  class InvalidCodepointContext (line 32) | class InvalidCodepointContext(IDNAError):
  function _combining_class (line 38) | def _combining_class(cp: int) -> int:
  function _is_script (line 46) | def _is_script(cp: str, script: str) -> bool:
  function _punycode (line 50) | def _punycode(s: str) -> bytes:
  function _unot (line 54) | def _unot(s: int) -> str:
  function valid_label_length (line 58) | def valid_label_length(label: Union[bytes, str]) -> bool:
  function valid_string_length (line 64) | def valid_string_length(label: Union[bytes, str], trailing_dot: bool) ->...
  function check_bidi (line 70) | def check_bidi(label: str, check_ltr: bool = False) -> bool:
  function check_initial_combiner (line 140) | def check_initial_combiner(label: str) -> bool:
  function check_hyphen_ok (line 146) | def check_hyphen_ok(label: str) -> bool:
  function check_nfc (line 154) | def check_nfc(label: str) -> None:
  function valid_contextj (line 159) | def valid_contextj(label: str, pos: int) -> bool:
  function valid_contexto (line 203) | def valid_contexto(label: str, pos: int, exception: bool = False) -> bool:
  function check_label (line 245) | def check_label(label: Union[str, bytes, bytearray]) -> None:
  function alabel (line 284) | def alabel(label: str) -> bytes:
  function ulabel (line 303) | def ulabel(label: Union[str, bytes, bytearray]) -> str:
  function uts46_remap (line 332) | def uts46_remap(domain: str, std3_rules: bool = True, transitional: bool...
  function encode (line 366) | def encode(
  function decode (line 405) | def decode(

FILE: src/pip/_vendor/idna/intranges.py
  function intranges_from_list (line 12) | def intranges_from_list(list_: List[int]) -> Tuple[int, ...]:
  function _encode_range (line 34) | def _encode_range(start: int, end: int) -> int:
  function _decode_range (line 38) | def _decode_range(r: int) -> Tuple[int, int]:
  function intranges_contain (line 42) | def intranges_contain(int_: int, ranges: Tuple[int, ...]) -> bool:

FILE: src/pip/_vendor/idna/uts46data.py
  function _seg_0 (line 12) | def _seg_0() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_1 (line 117) | def _seg_1() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_2 (line 222) | def _seg_2() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_3 (line 327) | def _seg_3() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_4 (line 432) | def _seg_4() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_5 (line 537) | def _seg_5() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_6 (line 642) | def _seg_6() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_7 (line 747) | def _seg_7() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_8 (line 852) | def _seg_8() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_9 (line 957) | def _seg_9() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_10 (line 1062) | def _seg_10() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_11 (line 1167) | def _seg_11() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_12 (line 1272) | def _seg_12() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_13 (line 1377) | def _seg_13() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_14 (line 1482) | def _seg_14() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_15 (line 1587) | def _seg_15() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_16 (line 1692) | def _seg_16() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_17 (line 1797) | def _seg_17() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_18 (line 1902) | def _seg_18() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_19 (line 2007) | def _seg_19() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_20 (line 2112) | def _seg_20() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_21 (line 2217) | def _seg_21() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_22 (line 2322) | def _seg_22() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_23 (line 2427) | def _seg_23() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_24 (line 2532) | def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_25 (line 2637) | def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_26 (line 2742) | def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_27 (line 2847) | def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_28 (line 2952) | def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_29 (line 3057) | def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_30 (line 3162) | def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_31 (line 3267) | def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_32 (line 3372) | def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_33 (line 3477) | def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_34 (line 3582) | def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_35 (line 3687) | def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_36 (line 3792) | def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_37 (line 3897) | def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_38 (line 4002) | def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_39 (line 4107) | def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_40 (line 4212) | def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_41 (line 4317) | def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_42 (line 4422) | def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_43 (line 4527) | def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_44 (line 4632) | def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_45 (line 4737) | def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_46 (line 4842) | def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_47 (line 4947) | def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_48 (line 5052) | def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_49 (line 5157) | def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_50 (line 5262) | def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_51 (line 5367) | def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_52 (line 5472) | def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_53 (line 5577) | def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_54 (line 5682) | def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_55 (line 5787) | def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_56 (line 5892) | def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_57 (line 5997) | def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_58 (line 6102) | def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_59 (line 6207) | def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_60 (line 6312) | def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_61 (line 6417) | def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_62 (line 6522) | def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_63 (line 6627) | def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_64 (line 6732) | def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_65 (line 6837) | def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_66 (line 6942) | def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_67 (line 7047) | def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_68 (line 7152) | def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_69 (line 7257) | def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_70 (line 7362) | def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_71 (line 7467) | def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_72 (line 7572) | def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_73 (line 7677) | def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_74 (line 7782) | def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_75 (line 7887) | def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_76 (line 7992) | def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_77 (line 8097) | def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_78 (line 8202) | def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_79 (line 8307) | def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_80 (line 8412) | def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_81 (line 8517) | def _seg_81() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_82 (line 8622) | def _seg_82() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
  function _seg_83 (line 8727) | def _seg_83() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:

FILE: src/pip/_vendor/msgpack/__init__.py
  function pack (line 20) | def pack(o, stream, **kwargs):
  function packb (line 30) | def packb(o, **kwargs):
  function unpack (line 39) | def unpack(stream, **kwargs):

FILE: src/pip/_vendor/msgpack/exceptions.py
  class UnpackException (line 1) | class UnpackException(Exception):
  class BufferFull (line 10) | class BufferFull(UnpackException):
  class OutOfData (line 14) | class OutOfData(UnpackException):
  class FormatError (line 18) | class FormatError(ValueError, UnpackException):
  class StackError (line 22) | class StackError(ValueError, UnpackException):
  class ExtraData (line 30) | class ExtraData(UnpackValueError):
    method __init__ (line 37) | def __init__(self, unpacked, extra):
    method __str__ (line 41) | def __str__(self):

FILE: src/pip/_vendor/msgpack/ext.py
  class ExtType (line 6) | class ExtType(namedtuple("ExtType", "code data")):
    method __new__ (line 9) | def __new__(cls, code, data):
  class Timestamp (line 19) | class Timestamp:
    method __init__ (line 31) | def __init__(self, seconds, nanoseconds=0):
    method __repr__ (line 53) | def __repr__(self):
    method __eq__ (line 57) | def __eq__(self, other):
    method __ne__ (line 63) | def __ne__(self, other):
    method __hash__ (line 67) | def __hash__(self):
    method from_bytes (line 71) | def from_bytes(b):
    method to_bytes (line 97) | def to_bytes(self):
    method from_unix (line 119) | def from_unix(unix_sec):
    method to_unix (line 129) | def to_unix(self):
    method from_unix_nano (line 138) | def from_unix_nano(unix_ns):
    method to_unix_nano (line 146) | def to_unix_nano(self):
    method to_datetime (line 154) | def to_datetime(self):
    method from_datetime (line 165) | def from_datetime(dt):

FILE: src/pip/_vendor/msgpack/fallback.py
  class BytesIO (line 13) | class BytesIO:
    method __init__ (line 14) | def __init__(self, s=b""):
    method write (line 21) | def write(self, s):
    method getvalue (line 28) | def getvalue(self):
  function newlist_hint (line 36) | def newlist_hint(size):
  function _check_type_strict (line 58) | def _check_type_strict(obj, t, type=type, tuple=tuple):
  function _get_data_from_buffer (line 65) | def _get_data_from_buffer(obj):
  function unpackb (line 72) | def unpackb(packed, **kwargs):
  class Unpacker (line 130) | class Unpacker:
    method __init__ (line 226) | def __init__(
    method feed (
Condensed preview — 950 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (7,327K chars).
[
  {
    "path": ".devcontainer/devcontainer.json",
    "chars": 680,
    "preview": "{\n\t\"name\": \"pip\",\n\t\"image\": \"mcr.microsoft.com/devcontainers/python:3\",\n\t\"remoteUser\": \"vscode\",\n\t\"remoteEnv\": {\n\t\t\"PATH"
  },
  {
    "path": ".devcontainer/postCreate.sh",
    "chars": 317,
    "preview": "#!/bin/bash\nset -Eeuo pipefail\n\n# Get the workspace directory\nWORKSPACE_DIR=\"${WORKSPACE_DIR:-/workspaces/pip}\"\ncd \"$WOR"
  },
  {
    "path": ".git-blame-ignore-revs",
    "chars": 3049,
    "preview": "917b41d6d73535c090fc312668dff353cdaef906  # Blacken docs/html/conf.py\ned383dd8afa8fe0250dcf9b8962927ada0e21c89  # Blacke"
  },
  {
    "path": ".gitattributes",
    "chars": 206,
    "preview": "# Patches must have Unix-style line endings, even on Windows\ntools/vendoring/patches/* eol=lf\n# The CA Bundle should alw"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "chars": 643,
    "preview": "# Contributing to pip\n\nThank you for your interest in contributing to pip! There are many ways to\ncontribute, and we app"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 692,
    "preview": "github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]\npatreon: # Replace with a single P"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug-report.yml",
    "chars": 1972,
    "preview": "name: Bug report\ndescription: Something is not working correctly.\nlabels: \"S: needs triage, type: bug\"\n\nbody:\n  - type: "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 334,
    "preview": "# Documentation for this file can be found at:\n# https://help.github.com/en/github/building-a-strong-community/configuri"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature-request.yml",
    "chars": 1732,
    "preview": "name: Feature request\ndescription: Suggest an idea for this project\nlabels: \"S: needs triage, type: feature request\"\n\nbo"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 493,
    "preview": "<!---\nThank you for your soon to be pull request. Before you submit this, please\ndouble check to make sure that you've a"
  },
  {
    "path": ".github/chronographer.yml",
    "chars": 314,
    "preview": "branch-protection-check-name: Changelog entry\naction-hints:\n  check-title-prefix: \"Chronographer: \"\n  external-docs-url:"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 286,
    "preview": "version: 2\nupdates:\n  - package-ecosystem: \"github-actions\"\n    directory: \"/\"\n    schedule:\n      interval: \"weekly\"\n  "
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 8409,
    "preview": "name: CI\n\non:\n  push:\n    branches: [main]\n    tags:\n      # Tags for all potential release numbers till 2030.\n      - \""
  },
  {
    "path": ".github/workflows/lock-threads.yml",
    "chars": 407,
    "preview": "name: 'Lock Closed Threads'\n\non:\n  schedule:\n    - cron: '0 7 * * *'  # 7am UTC, daily\n  workflow_dispatch:\n\npermissions"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 1288,
    "preview": "name: Publish Python 🐍 distribution 📦 to PyPI\n\non:\n  push:\n    tags:\n      - \"*\"\n\njobs:\n  build:\n    name: Build distrib"
  },
  {
    "path": ".github/workflows/update-rtd-redirects.yml",
    "chars": 713,
    "preview": "name: Update documentation redirects\n\non:\n  push:\n    branches: [main]\n    paths:\n      - \".readthedocs-custom-redirects"
  },
  {
    "path": ".gitignore",
    "chars": 582,
    "preview": "# Byte-compiled files\n__pycache__/\n*$py.class\n\n# Distribution / packaging\n/build/\n/dist/\n*.egg\n*.eggs\n*.egg-info/\nMANIFE"
  },
  {
    "path": ".mailmap",
    "chars": 4592,
    "preview": "Adam Wentz                                                  <awentz@theonion.com>\nAlethea Flowers     <magicalgirl@googl"
  },
  {
    "path": ".pre-commit-config.yaml",
    "chars": 2060,
    "preview": "exclude: 'src/pip/_vendor/'\n\nrepos:\n- repo: https://github.com/pre-commit/pre-commit-hooks\n  rev: v6.0.0\n  hooks:\n  - id"
  },
  {
    "path": ".readthedocs-custom-redirects.yml",
    "chars": 992,
    "preview": "# This file is read by tools/update-rtd-redirects.py.\n# It is related to Read the Docs, but is not a file processed by t"
  },
  {
    "path": ".readthedocs.yml",
    "chars": 205,
    "preview": "version: 2\n\nbuild:\n  os: ubuntu-22.04\n  tools:\n    python: \"3.11\"\n  jobs:\n    install:\n      - pip install .\n      - pip"
  },
  {
    "path": "AI_POLICY.md",
    "chars": 4725,
    "preview": "# Generative AI / LLM Policy\n\nWe appreciate that we can't realistically police how you author your pull requests, which "
  },
  {
    "path": "AUTHORS.txt",
    "chars": 11641,
    "preview": "@Switch01\nA_Rog\nAakanksha Agrawal\nAarni Koskela\nAbhinav Sagar\nABHYUDAY PRATAP SINGH\nabs51295\nAceGentile\nAdam Chainz\nAdam"
  },
  {
    "path": "LICENSE.txt",
    "chars": 1093,
    "preview": "Copyright (c) 2008-present The pip developers (see AUTHORS.txt file)\n\nPermission is hereby granted, free of charge, to a"
  },
  {
    "path": "NEWS.rst",
    "chars": 241641,
    "preview": ".. note\n\n    You should *NOT* be adding new change log entries to this file, this\n    file is managed by towncrier. You "
  },
  {
    "path": "README.rst",
    "chars": 2376,
    "preview": "pip - The Python Package Installer\n==================================\n\n.. |pypi-version| image:: https://img.shields.io/"
  },
  {
    "path": "SECURITY.md",
    "chars": 345,
    "preview": "# Security Policy\n\n## Reporting a Vulnerability\n\nPlease read the guidelines on reporting security issues [on the\nofficia"
  },
  {
    "path": "build-project/.python-version",
    "chars": 5,
    "preview": "3.12\n"
  },
  {
    "path": "build-project/build-project.py",
    "chars": 1968,
    "preview": "#!/usr/bin/env python3\n\"\"\"Build pip using pinned build requirements.\"\"\"\n\nimport subprocess\nimport tempfile\nimport venv\nf"
  },
  {
    "path": "build-project/build-requirements.in",
    "chars": 16,
    "preview": "build\nflit-core\n"
  },
  {
    "path": "build-project/build-requirements.txt",
    "chars": 1019,
    "preview": "#\n# This file is autogenerated by pip-compile with Python 3.12\n# by the following command:\n#\n#    pip-compile --allow-un"
  },
  {
    "path": "docs/html/cli/index.md",
    "chars": 697,
    "preview": "# Commands\n\nThe general options that apply to all the commands listed below can be\nfound [under the `pip` page in this s"
  },
  {
    "path": "docs/html/cli/pip.rst",
    "chars": 2126,
    "preview": "===\npip\n===\n\n\nUsage\n*****\n\n.. tab:: Unix/macOS\n\n    .. code-block:: shell\n\n        python -m pip <command> [options]\n\n.."
  },
  {
    "path": "docs/html/cli/pip_cache.rst",
    "chars": 296,
    "preview": "\n.. _`pip cache`:\n\npip cache\n---------\n\n\nUsage\n*****\n\n.. tab:: Unix/macOS\n\n   .. pip-command-usage:: cache \"python -m pi"
  },
  {
    "path": "docs/html/cli/pip_check.rst",
    "chars": 1473,
    "preview": ".. _`pip check`:\n\n=========\npip check\n=========\n\n\nUsage\n=====\n\n.. tab:: Unix/macOS\n\n   .. pip-command-usage:: check \"pyt"
  },
  {
    "path": "docs/html/cli/pip_config.rst",
    "chars": 316,
    "preview": "\n.. _`pip config`:\n\n==========\npip config\n==========\n\n\nUsage\n=====\n\n.. tab:: Unix/macOS\n\n   .. pip-command-usage:: confi"
  },
  {
    "path": "docs/html/cli/pip_debug.rst",
    "chars": 444,
    "preview": ".. _`pip debug`:\n\n=========\npip debug\n=========\n\n\nUsage\n=====\n\n.. tab:: Unix/macOS\n\n   .. pip-command-usage:: debug \"pyt"
  },
  {
    "path": "docs/html/cli/pip_download.rst",
    "chars": 6959,
    "preview": "\n.. _`pip download`:\n\n============\npip download\n============\n\n\nUsage\n=====\n\n.. tab:: Unix/macOS\n\n   .. pip-command-usage"
  },
  {
    "path": "docs/html/cli/pip_freeze.rst",
    "chars": 2500,
    "preview": "\n.. _`pip freeze`:\n\n==========\npip freeze\n==========\n\n\nUsage\n=====\n\n.. tab:: Unix/macOS\n\n   .. pip-command-usage:: freez"
  },
  {
    "path": "docs/html/cli/pip_hash.rst",
    "chars": 1813,
    "preview": ".. _`pip hash`:\n\n========\npip hash\n========\n\n\nUsage\n=====\n\n.. tab:: Unix/macOS\n\n   .. pip-command-usage:: hash \"python -"
  },
  {
    "path": "docs/html/cli/pip_index.rst",
    "chars": 812,
    "preview": ".. _`pip index`:\n\n===========\npip index\n===========\n\n\n\nUsage\n=====\n\n.. tab:: Unix/macOS\n\n   .. pip-command-usage:: index"
  },
  {
    "path": "docs/html/cli/pip_inspect.rst",
    "chars": 430,
    "preview": ".. _`pip inspect`:\n\n===========\npip inspect\n===========\n\n.. versionadded:: 22.2\n\n\nUsage\n=====\n\n.. tab:: Unix/macOS\n\n   ."
  },
  {
    "path": "docs/html/cli/pip_install.rst",
    "chars": 17778,
    "preview": ".. _`pip install`:\n\n===========\npip install\n===========\n\n\n\nUsage\n=====\n\n.. tab:: Unix/macOS\n\n   .. pip-command-usage:: i"
  },
  {
    "path": "docs/html/cli/pip_list.rst",
    "chars": 5378,
    "preview": ".. _`pip list`:\n\n========\npip list\n========\n\n\n\nUsage\n=====\n\n.. tab:: Unix/macOS\n\n   .. pip-command-usage:: list \"python "
  },
  {
    "path": "docs/html/cli/pip_lock.rst",
    "chars": 625,
    "preview": "\n.. _`pip lock`:\n\n========\npip lock\n========\n\n\n\nUsage\n=====\n\n.. tab:: Unix/macOS\n\n   .. pip-command-usage:: lock \"python"
  },
  {
    "path": "docs/html/cli/pip_search.rst",
    "chars": 1203,
    "preview": ".. _`pip search`:\n\n==========\npip search\n==========\n\n\n\nUsage\n=====\n\n.. tab:: Unix/macOS\n\n   .. pip-command-usage:: searc"
  },
  {
    "path": "docs/html/cli/pip_show.rst",
    "chars": 4605,
    "preview": ".. _`pip show`:\n\n========\npip show\n========\n\n\n\nUsage\n=====\n\n.. tab:: Unix/macOS\n\n   .. pip-command-usage:: show \"python "
  },
  {
    "path": "docs/html/cli/pip_uninstall.rst",
    "chars": 1099,
    "preview": ".. _`pip uninstall`:\n\n=============\npip uninstall\n=============\n\n\n\nUsage\n=====\n\n.. tab:: Unix/macOS\n\n   .. pip-command-u"
  },
  {
    "path": "docs/html/cli/pip_wheel.rst",
    "chars": 1737,
    "preview": "\n.. _`pip wheel`:\n\n=========\npip wheel\n=========\n\n\n\nUsage\n=====\n\n.. tab:: Unix/macOS\n\n   .. pip-command-usage:: wheel \"p"
  },
  {
    "path": "docs/html/conf.py",
    "chars": 5011,
    "preview": "\"\"\"Sphinx configuration file for pip's documentation.\"\"\"\n\nimport glob\nimport os\nimport pathlib\nimport re\nimport sys\n\n# A"
  },
  {
    "path": "docs/html/copyright.rst",
    "chars": 214,
    "preview": ":orphan:\n\n=========\nCopyright\n=========\n\npip and this documentation is:\n\nCopyright © 2008-2020 The pip developers (see `"
  },
  {
    "path": "docs/html/development/architecture/anatomy.rst",
    "chars": 7752,
    "preview": ".. note::\n\n    This section of the documentation is currently being written. pip\n    developers welcome your help to com"
  },
  {
    "path": "docs/html/development/architecture/command-line-interface.rst",
    "chars": 9207,
    "preview": "======================\nCommand Line Interface\n======================\n\nThe ``pip._internal.cli`` package is responsible f"
  },
  {
    "path": "docs/html/development/architecture/configuration-files.rst",
    "chars": 5471,
    "preview": "===========================\nConfiguration File Handling\n===========================\n\nThe ``pip._internal.configuration``"
  },
  {
    "path": "docs/html/development/architecture/index.rst",
    "chars": 841,
    "preview": ".. _architecture-pip-internals:\n\n===============================\nArchitecture of pip's internals\n======================="
  },
  {
    "path": "docs/html/development/architecture/overview.rst",
    "chars": 5580,
    "preview": ".. note::\n\n    This section of the documentation is currently being written. pip\n    developers welcome your help to com"
  },
  {
    "path": "docs/html/development/architecture/package-finding.rst",
    "chars": 11100,
    "preview": "Finding and choosing files (``index`` and ``PackageFinder``)\n-----------------------------------------------------------"
  },
  {
    "path": "docs/html/development/architecture/upgrade-options.rst",
    "chars": 4067,
    "preview": "=============================================\nOptions that control the installation process\n============================"
  },
  {
    "path": "docs/html/development/ci.rst",
    "chars": 8156,
    "preview": ".. note::\n\n    This section of the documentation is currently out of date.\n\n    pip developers welcome your help to upda"
  },
  {
    "path": "docs/html/development/contributing.rst",
    "chars": 11656,
    "preview": "============\nContributing\n============\n\nPip's internals\n===============\n\nWe have an in-progress guide to the\n:ref:`archi"
  },
  {
    "path": "docs/html/development/conventions.rst",
    "chars": 2283,
    "preview": ":orphan:\n\n=========================\nDocumentation Conventions\n=========================\n\nThis document describes the con"
  },
  {
    "path": "docs/html/development/getting-started.rst",
    "chars": 6406,
    "preview": "===============\nGetting Started\n===============\n\nWe’re pleased that you are interested in working on pip.\n\nThis document"
  },
  {
    "path": "docs/html/development/index.rst",
    "chars": 876,
    "preview": "===========\nDevelopment\n===========\n\npip is a volunteer maintained open source project and we welcome contributions\nof a"
  },
  {
    "path": "docs/html/development/issue-triage.md",
    "chars": 13025,
    "preview": "```{note}\nThis section of the documentation is currently being written. pip\ndevelopers welcome your help to complete thi"
  },
  {
    "path": "docs/html/development/release-process.rst",
    "chars": 8890,
    "preview": "===============\nRelease process\n===============\n\n.. _`Release Cadence`:\n\nRelease Cadence\n===============\n\nThe pip projec"
  },
  {
    "path": "docs/html/development/vendoring-policy.rst",
    "chars": 49,
    "preview": ".. include:: ../../../src/pip/_vendor/README.rst\n"
  },
  {
    "path": "docs/html/getting-started.md",
    "chars": 2651,
    "preview": "# Getting Started\n\nTo get started with using pip, you should [install Python] on your system.\n\n[install Python]: https:/"
  },
  {
    "path": "docs/html/index.md",
    "chars": 1698,
    "preview": "---\nhide-toc: true\n---\n\n# pip\n\npip is the [package installer for Python][recommended]. You can use it to\ninstall package"
  },
  {
    "path": "docs/html/installation.md",
    "chars": 4120,
    "preview": "# Installation\n\nUsually, pip is automatically installed if you are:\n\n- working in a\n  {ref}`virtual environment <pypug:C"
  },
  {
    "path": "docs/html/installing.rst",
    "chars": 219,
    "preview": ":orphan:\n\n.. meta::\n\n  :http-equiv=refresh: 3; url=../installation/\n\nThis page has moved\n===================\n\nYou should"
  },
  {
    "path": "docs/html/news.rst",
    "chars": 228,
    "preview": "=========\nChangelog\n=========\n\n.. attention::\n\n    Major and minor releases of pip also include changes listed within\n  "
  },
  {
    "path": "docs/html/quickstart.rst",
    "chars": 225,
    "preview": ":orphan:\n\n.. meta::\n\n  :http-equiv=refresh: 3; url=../getting-started/\n\nThis page has moved\n===================\n\nYou sho"
  },
  {
    "path": "docs/html/reference/build-system.md",
    "chars": 6736,
    "preview": "(build-interface)=\n\n# Build System Interface\n\nWhen dealing with installable source distributions of a package, pip does "
  },
  {
    "path": "docs/html/reference/index.md",
    "chars": 272,
    "preview": "# Reference\n\nReference provides information about various file formats, interfaces and\ninteroperability standards that p"
  },
  {
    "path": "docs/html/reference/inspect-report.md",
    "chars": 8326,
    "preview": "# `pip inspect` JSON output specification\n\n```{versionadded} 22.2\n```\n\n```{versionchanged} 23.0\n``version`` has been bum"
  },
  {
    "path": "docs/html/reference/installation-report.md",
    "chars": 7112,
    "preview": "# Installation Report\n\n```{versionadded} 22.2\n```\n\n```{versionchanged} 23.0\n``version`` has been bumped to ``1`` and the"
  },
  {
    "path": "docs/html/reference/pip.rst",
    "chars": 215,
    "preview": ":orphan:\n\n.. meta::\n\n  :http-equiv=refresh: 3; url=../../cli/pip/\n\nThis page has moved\n===================\n\nYou should b"
  },
  {
    "path": "docs/html/reference/pip_cache.rst",
    "chars": 227,
    "preview": ":orphan:\n\n.. meta::\n\n  :http-equiv=refresh: 3; url=../../cli/pip_cache/\n\nThis page has moved\n===================\n\nYou sh"
  },
  {
    "path": "docs/html/reference/pip_check.rst",
    "chars": 227,
    "preview": ":orphan:\n\n.. meta::\n\n  :http-equiv=refresh: 3; url=../../cli/pip_check/\n\nThis page has moved\n===================\n\nYou sh"
  },
  {
    "path": "docs/html/reference/pip_config.rst",
    "chars": 229,
    "preview": ":orphan:\n\n.. meta::\n\n  :http-equiv=refresh: 3; url=../../cli/pip_config/\n\nThis page has moved\n===================\n\nYou s"
  },
  {
    "path": "docs/html/reference/pip_debug.rst",
    "chars": 227,
    "preview": ":orphan:\n\n.. meta::\n\n  :http-equiv=refresh: 3; url=../../cli/pip_debug/\n\nThis page has moved\n===================\n\nYou sh"
  },
  {
    "path": "docs/html/reference/pip_download.rst",
    "chars": 233,
    "preview": ":orphan:\n\n.. meta::\n\n  :http-equiv=refresh: 3; url=../../cli/pip_download/\n\nThis page has moved\n===================\n\nYou"
  },
  {
    "path": "docs/html/reference/pip_freeze.rst",
    "chars": 229,
    "preview": ":orphan:\n\n.. meta::\n\n  :http-equiv=refresh: 3; url=../../cli/pip_freeze/\n\nThis page has moved\n===================\n\nYou s"
  },
  {
    "path": "docs/html/reference/pip_hash.rst",
    "chars": 225,
    "preview": ":orphan:\n\n.. meta::\n\n  :http-equiv=refresh: 3; url=../../cli/pip_hash/\n\nThis page has moved\n===================\n\nYou sho"
  },
  {
    "path": "docs/html/reference/pip_index.rst",
    "chars": 227,
    "preview": ":orphan:\n\n.. meta::\n\n  :http-equiv=refresh: 3; url=../../cli/pip_index/\n\nThis page has moved\n===================\n\nYou sh"
  },
  {
    "path": "docs/html/reference/pip_install.rst",
    "chars": 231,
    "preview": ":orphan:\n\n.. meta::\n\n  :http-equiv=refresh: 3; url=../../cli/pip_install/\n\nThis page has moved\n===================\n\nYou "
  },
  {
    "path": "docs/html/reference/pip_list.rst",
    "chars": 225,
    "preview": ":orphan:\n\n.. meta::\n\n  :http-equiv=refresh: 3; url=../../cli/pip_list/\n\nThis page has moved\n===================\n\nYou sho"
  },
  {
    "path": "docs/html/reference/pip_search.rst",
    "chars": 229,
    "preview": ":orphan:\n\n.. meta::\n\n  :http-equiv=refresh: 3; url=../../cli/pip_search/\n\nThis page has moved\n===================\n\nYou s"
  },
  {
    "path": "docs/html/reference/pip_show.rst",
    "chars": 225,
    "preview": ":orphan:\n\n.. meta::\n\n  :http-equiv=refresh: 3; url=../../cli/pip_show/\n\nThis page has moved\n===================\n\nYou sho"
  },
  {
    "path": "docs/html/reference/pip_uninstall.rst",
    "chars": 235,
    "preview": ":orphan:\n\n.. meta::\n\n  :http-equiv=refresh: 3; url=../../cli/pip_uninstall/\n\nThis page has moved\n===================\n\nYo"
  },
  {
    "path": "docs/html/reference/pip_wheel.rst",
    "chars": 227,
    "preview": ":orphan:\n\n.. meta::\n\n  :http-equiv=refresh: 3; url=../../cli/pip_wheel/\n\nThis page has moved\n===================\n\nYou sh"
  },
  {
    "path": "docs/html/reference/requirement-specifiers.md",
    "chars": 1931,
    "preview": "(Requirement Specifiers)=\n\n# Requirement Specifiers\n\npip supports installing from a package index using a {term}`require"
  },
  {
    "path": "docs/html/reference/requirements-file-format.md",
    "chars": 4348,
    "preview": "(requirements-file-format)=\n\n# Requirements File Format\n\nRequirements files serve as a list of items to be installed by "
  },
  {
    "path": "docs/html/topics/authentication.md",
    "chars": 6518,
    "preview": "# Authentication\n\n## Basic HTTP authentication\n\npip supports basic HTTP-based authentication credentials. This is done b"
  },
  {
    "path": "docs/html/topics/caching.md",
    "chars": 4994,
    "preview": "# Caching\n\n```{versionadded} 6.0\n\n```\n\npip provides an on-by-default caching, designed to reduce the amount of time\nspen"
  },
  {
    "path": "docs/html/topics/configuration.md",
    "chars": 6445,
    "preview": "(configuration)=\n\n# Configuration\n\npip allows a user to change its behaviour via 3 mechanisms:\n\n- command line options\n-"
  },
  {
    "path": "docs/html/topics/dependency-resolution.md",
    "chars": 16549,
    "preview": "# Dependency Resolution\n\npip is capable of determining and installing the dependencies of packages. The\nprocess of deter"
  },
  {
    "path": "docs/html/topics/deps.dot",
    "chars": 353,
    "preview": "digraph G {\n  graph [fontname = \"Handlee\"];\n  node [fontname = \"Handlee\"];\n  edge [fontname = \"Handlee\"];\n\n  bgcolor=tra"
  },
  {
    "path": "docs/html/topics/https-certificates.md",
    "chars": 1959,
    "preview": "(SSL Certificate Verification)=\n\n# HTTPS Certificates\n\n```{versionadded} 1.3\n\n```\n\nBy default, pip will perform SSL cert"
  },
  {
    "path": "docs/html/topics/index.md",
    "chars": 427,
    "preview": "# Topic Guides\n\nThese pages provide detailed information on individual topics.\n\n```{note}\nThis section of the documentat"
  },
  {
    "path": "docs/html/topics/local-project-installs.md",
    "chars": 2982,
    "preview": "# Local project installs\n\nIt is extremely common to have a project, available in a folder/directory on your computer [^1"
  },
  {
    "path": "docs/html/topics/more-dependency-resolution.md",
    "chars": 9433,
    "preview": "# More on Dependency Resolution\n\nThis article goes into more detail about pip's dependency resolution algorithm.\nIn cert"
  },
  {
    "path": "docs/html/topics/python-option.md",
    "chars": 938,
    "preview": "# Managing a different Python interpreter\n\n```{versionadded} 22.3\n```\n\nOccasionally, you may want to use pip to manage a"
  },
  {
    "path": "docs/html/topics/repeatable-installs.md",
    "chars": 3514,
    "preview": "(repeatability)=\n# Repeatable Installs\n\npip can be used to achieve various levels of repeatable environments. This page\n"
  },
  {
    "path": "docs/html/topics/secure-installs.md",
    "chars": 5000,
    "preview": "# Secure installs\n\nBy default, pip does not perform any checks to protect against remote tampering and involves running "
  },
  {
    "path": "docs/html/topics/vcs-support.md",
    "chars": 6045,
    "preview": "(vcs support)=\n# VCS Support\n\npip supports installing from various version control systems (VCS).\nThis support requires "
  },
  {
    "path": "docs/html/topics/workflow.md",
    "chars": 2056,
    "preview": "# Pip is not a workflow management tool\n\nThe core purpose of pip is to *manage the packages installed in your\nenvironmen"
  },
  {
    "path": "docs/html/user_guide.rst",
    "chars": 47437,
    "preview": "==========\nUser Guide\n==========\n\n.. Hello there!\n\n   If you're thinking of adding content to this page... please take a"
  },
  {
    "path": "docs/html/ux-research-design/contribute.md",
    "chars": 1281,
    "preview": "# How to Contribute\n\n## Participate in UX Research\n\nIt is important that we hear from pip users so that we can:\n\n- Under"
  },
  {
    "path": "docs/html/ux-research-design/guidance.md",
    "chars": 30482,
    "preview": "# UX Guidance\n\nThis section of the documentation is intended for contributors who wish to work on improving pip's user e"
  },
  {
    "path": "docs/html/ux-research-design/index.md",
    "chars": 562,
    "preview": "# UX Research & Design\n\n```{toctree}\n:hidden:\n\ncontribute\nguidance\nresearch-results/index\n```\n\nWelcome to pip’s UX resea"
  },
  {
    "path": "docs/html/ux-research-design/research-results/about-our-users.md",
    "chars": 18471,
    "preview": "# About pip's Users\n\n## Problem\n\nWe want to understand users' background, their cultural environment, and how they exper"
  },
  {
    "path": "docs/html/ux-research-design/research-results/ci-cd.md",
    "chars": 2635,
    "preview": "# How pip is used in interactive environments (i.e. CI, CD)\n\n## Problem\n\nWe want to know about the contexts in which pip"
  },
  {
    "path": "docs/html/ux-research-design/research-results/improving-pips-documentation.md",
    "chars": 18419,
    "preview": "# Improving pip's Documentation\n\n## Problem\n\nWe want to establish whether or not the [official pip documentation](https:"
  },
  {
    "path": "docs/html/ux-research-design/research-results/index.md",
    "chars": 9072,
    "preview": "# UX Research Results\n\nOver the course of 2020, the pip team worked on improving pip's user experience, developing a bet"
  },
  {
    "path": "docs/html/ux-research-design/research-results/mental-models.md",
    "chars": 9512,
    "preview": "# How Users Understand pip\n\n## Problem\n\nWe want to understand how pip's users understand pip as a tool: what they think "
  },
  {
    "path": "docs/html/ux-research-design/research-results/override-conflicting-dependencies.md",
    "chars": 3978,
    "preview": "# Providing an override to install packages with conflicting dependencies\n\n## Problem\n\nCurrently, when a user has depend"
  },
  {
    "path": "docs/html/ux-research-design/research-results/personas.md",
    "chars": 15088,
    "preview": "# pip Personas\n\n## Problem\n\nWe want to develop personas for pip's user to facilitate faster user-centered decision makin"
  },
  {
    "path": "docs/html/ux-research-design/research-results/pip-force-reinstall.md",
    "chars": 5536,
    "preview": "# pip --force-reinstall\n\n## Problem\n\nCurrently, when `pip install [package-name] --force-reinstall` is executed, instead"
  },
  {
    "path": "docs/html/ux-research-design/research-results/pip-search.md",
    "chars": 6940,
    "preview": "# pip search\n\n## Problem\n\nBy default, `pip search` searches packages on PyPI.org from the command line. However, the tea"
  },
  {
    "path": "docs/html/ux-research-design/research-results/pip-upgrade-conflict.md",
    "chars": 3287,
    "preview": "# pip Upgrade Conflict\n\n## Problem\n\nCurrently, pip does _not_ take into account packages that are already installed when"
  },
  {
    "path": "docs/html/ux-research-design/research-results/prioritizing-features.md",
    "chars": 7500,
    "preview": "# Prioritizing pip Features\n\n## Problem\n\nThe pip development team is small, and has limited time and energy to work on i"
  },
  {
    "path": "docs/html/ux-research-design/research-results/users-and-security.md",
    "chars": 13882,
    "preview": "# How pip users think about security\n\n## Problem\n\nWe wanted to understand how pip users think about security when instal"
  },
  {
    "path": "docs/html/ux-research-design/resolution-impossible-example.md",
    "chars": 3177,
    "preview": "---\norphan:\n---\n\n# Example error: ResolutionImpossible\n\n## What if there are user-provided pinned packages?\n\nWhere a use"
  },
  {
    "path": "docs/man/commands/cache.rst",
    "chars": 193,
    "preview": ":orphan:\n\n=========\npip-cache\n=========\n\nDescription\n***********\n\n.. pip-command-description:: cache\n\nUsage\n*****\n\n.. pi"
  },
  {
    "path": "docs/man/commands/check.rst",
    "chars": 193,
    "preview": ":orphan:\n\n=========\npip-check\n=========\n\nDescription\n***********\n\n.. pip-command-description:: check\n\nUsage\n*****\n\n.. pi"
  },
  {
    "path": "docs/man/commands/config.rst",
    "chars": 199,
    "preview": ":orphan:\n\n==========\npip-config\n==========\n\nDescription\n***********\n\n.. pip-command-description:: config\n\nUsage\n*****\n\n."
  },
  {
    "path": "docs/man/commands/debug.rst",
    "chars": 332,
    "preview": ":orphan:\n\n==========\npip-debug\n==========\n\nDescription\n***********\n\n.. pip-command-description:: debug\n\nUsage\n*****\n\n.. "
  },
  {
    "path": "docs/man/commands/download.rst",
    "chars": 211,
    "preview": ":orphan:\n\n============\npip-download\n============\n\nDescription\n***********\n\n.. pip-command-description:: download\n\nUsage\n"
  },
  {
    "path": "docs/man/commands/freeze.rst",
    "chars": 199,
    "preview": ":orphan:\n\n==========\npip-freeze\n==========\n\nDescription\n***********\n\n.. pip-command-description:: freeze\n\nUsage\n*****\n\n."
  },
  {
    "path": "docs/man/commands/hash.rst",
    "chars": 187,
    "preview": ":orphan:\n\n========\npip-hash\n========\n\nDescription\n***********\n\n.. pip-command-description:: hash\n\nUsage\n*****\n\n.. pip-co"
  },
  {
    "path": "docs/man/commands/help.rst",
    "chars": 187,
    "preview": ":orphan:\n\n========\npip-help\n========\n\nDescription\n***********\n\n.. pip-command-description:: help\n\nUsage\n*****\n\n.. pip-co"
  },
  {
    "path": "docs/man/commands/index.rst",
    "chars": 197,
    "preview": ":orphan:\n\n===========\npip-index\n===========\n\nDescription\n***********\n\n.. pip-command-description:: index\n\nUsage\n*****\n\n."
  },
  {
    "path": "docs/man/commands/install.rst",
    "chars": 205,
    "preview": ":orphan:\n\n===========\npip-install\n===========\n\nDescription\n***********\n\n.. pip-command-description:: install\n\nUsage\n****"
  },
  {
    "path": "docs/man/commands/list.rst",
    "chars": 187,
    "preview": ":orphan:\n\n========\npip-list\n========\n\nDescription\n***********\n\n.. pip-command-description:: list\n\nUsage\n*****\n\n.. pip-co"
  },
  {
    "path": "docs/man/commands/lock.rst",
    "chars": 187,
    "preview": ":orphan:\n\n========\npip-lock\n========\n\nDescription\n***********\n\n.. pip-command-description:: lock\n\nUsage\n*****\n\n.. pip-co"
  },
  {
    "path": "docs/man/commands/search.rst",
    "chars": 199,
    "preview": ":orphan:\n\n==========\npip-search\n==========\n\nDescription\n***********\n\n.. pip-command-description:: search\n\nUsage\n*****\n\n."
  },
  {
    "path": "docs/man/commands/show.rst",
    "chars": 187,
    "preview": ":orphan:\n\n========\npip-show\n========\n\nDescription\n***********\n\n.. pip-command-description:: show\n\nUsage\n*****\n\n.. pip-co"
  },
  {
    "path": "docs/man/commands/uninstall.rst",
    "chars": 217,
    "preview": ":orphan:\n\n=============\npip-uninstall\n=============\n\nDescription\n***********\n\n.. pip-command-description:: uninstall\n\nUs"
  },
  {
    "path": "docs/man/commands/wheel.rst",
    "chars": 193,
    "preview": ":orphan:\n\n=========\npip-wheel\n=========\n\nDescription\n***********\n\n.. pip-command-description:: wheel\n\nUsage\n*****\n\n.. pi"
  },
  {
    "path": "docs/man/index.rst",
    "chars": 875,
    "preview": ":orphan:\n\n========\nMan Page\n========\n\nSYNOPSIS\n********\n\npip <command> [options]\n\nDESCRIPTION\n***********\n\npip is the Py"
  },
  {
    "path": "docs/pip_sphinxext.py",
    "chars": 11277,
    "preview": "\"\"\"pip sphinx extensions\"\"\"\n\nfrom __future__ import annotations\n\nimport optparse\nimport pathlib\nimport re\nimport sys\nfro"
  },
  {
    "path": "news/.gitignore",
    "chars": 12,
    "preview": "!.gitignore\n"
  },
  {
    "path": "news/13226.bugfix.rst",
    "chars": 70,
    "preview": "Fix misleading error message when a constraint file cannot be opened.\n"
  },
  {
    "path": "news/13826.process.rst",
    "chars": 27,
    "preview": "Add an explicit AI policy.\n"
  },
  {
    "path": "news/13845.trivial.rst",
    "chars": 68,
    "preview": "Add Python 3.15 to CI and fix ``importlib.metadata`` compatibility.\n"
  },
  {
    "path": "noxfile.py",
    "chars": 15966,
    "preview": "\"\"\"Automation using nox.\"\"\"\n\nimport argparse\nimport glob\nimport os\nimport shutil\nimport sys\nfrom collections.abc import "
  },
  {
    "path": "pyproject.toml",
    "chars": 10927,
    "preview": "[project]\ndynamic = [\"version\"]\nname = \"pip\"\ndescription = \"The PyPA recommended tool for installing Python packages.\"\nr"
  },
  {
    "path": "src/pip/__init__.py",
    "chars": 358,
    "preview": "from __future__ import annotations\n\n__version__ = \"26.1.dev0\"\n\n\ndef main(args: list[str] | None = None) -> int:\n    \"\"\"T"
  },
  {
    "path": "src/pip/__main__.py",
    "chars": 854,
    "preview": "import os\nimport sys\n\n# Remove '' and current working directory from the first entry\n# of sys.path, if present to avoid "
  },
  {
    "path": "src/pip/__pip-runner__.py",
    "chars": 1450,
    "preview": "\"\"\"Execute exactly this copy of pip, within a different environment.\n\nThis file is named as it is, to ensure that this m"
  },
  {
    "path": "src/pip/_internal/__init__.py",
    "chars": 511,
    "preview": "from __future__ import annotations\n\nfrom pip._internal.utils import _log\n\n# init_logging() must be called before any cal"
  },
  {
    "path": "src/pip/_internal/build_env.py",
    "chars": 21911,
    "preview": "\"\"\"Build Environment used for isolation during sdist building\"\"\"\n\nfrom __future__ import annotations\n\nimport logging\nimp"
  },
  {
    "path": "src/pip/_internal/cache.py",
    "chars": 10345,
    "preview": "\"\"\"Cache Management\"\"\"\n\nfrom __future__ import annotations\n\nimport hashlib\nimport json\nimport logging\nimport os\nfrom pat"
  },
  {
    "path": "src/pip/_internal/cli/__init__.py",
    "chars": 131,
    "preview": "\"\"\"Subpackage containing all of pip's command line interface related code\"\"\"\n\n# This file intentionally does not import "
  },
  {
    "path": "src/pip/_internal/cli/autocompletion.py",
    "chars": 7193,
    "preview": "\"\"\"Logic that powers autocompletion installed by ``pip completion``.\"\"\"\n\nfrom __future__ import annotations\n\nimport optp"
  },
  {
    "path": "src/pip/_internal/cli/base_command.py",
    "chars": 9168,
    "preview": "\"\"\"Base Command class, and related routines\"\"\"\n\nfrom __future__ import annotations\n\nimport logging\nimport logging.config"
  },
  {
    "path": "src/pip/_internal/cli/cmdoptions.py",
    "chars": 36164,
    "preview": "\"\"\"\nshared options and groups\n\nThe principle here is to define options once, but *not* instantiate them\nglobally. One re"
  },
  {
    "path": "src/pip/_internal/cli/command_context.py",
    "chars": 817,
    "preview": "from collections.abc import Generator\nfrom contextlib import AbstractContextManager, ExitStack, contextmanager\nfrom typi"
  },
  {
    "path": "src/pip/_internal/cli/index_command.py",
    "chars": 6484,
    "preview": "\"\"\"\nContains command classes which may interact with an index / the network.\n\nUnlike its sister module, req_command, thi"
  },
  {
    "path": "src/pip/_internal/cli/main.py",
    "chars": 3137,
    "preview": "\"\"\"Primary application entrypoint.\"\"\"\n\nfrom __future__ import annotations\n\nimport locale\nimport logging\nimport os\nimport"
  },
  {
    "path": "src/pip/_internal/cli/main_parser.py",
    "chars": 4403,
    "preview": "\"\"\"A single place for constructing and exposing the main parser\"\"\"\n\nfrom __future__ import annotations\n\nimport os\nimport"
  },
  {
    "path": "src/pip/_internal/cli/parser.py",
    "chars": 13827,
    "preview": "\"\"\"Base option parser setup\"\"\"\n\nfrom __future__ import annotations\n\nimport logging\nimport optparse\nimport os\nimport re\ni"
  },
  {
    "path": "src/pip/_internal/cli/progress_bars.py",
    "chars": 4706,
    "preview": "from __future__ import annotations\n\nimport functools\nimport sys\nfrom collections.abc import Generator, Iterable, Iterato"
  },
  {
    "path": "src/pip/_internal/cli/req_command.py",
    "chars": 16482,
    "preview": "\"\"\"Contains the RequirementCommand base class.\n\nThis class is in a separate module so the commands that do not always\nne"
  },
  {
    "path": "src/pip/_internal/cli/spinners.py",
    "chars": 7362,
    "preview": "from __future__ import annotations\n\nimport contextlib\nimport itertools\nimport logging\nimport sys\nimport time\nfrom collec"
  },
  {
    "path": "src/pip/_internal/cli/status_codes.py",
    "chars": 116,
    "preview": "SUCCESS = 0\nERROR = 1\nUNKNOWN_ERROR = 2\nVIRTUALENV_NOT_FOUND = 3\nPREVIOUS_BUILD_DIR_ERROR = 4\nNO_MATCHES_FOUND = 23\n"
  },
  {
    "path": "src/pip/_internal/commands/__init__.py",
    "chars": 4026,
    "preview": "\"\"\"\nPackage containing all pip commands\n\"\"\"\n\nfrom __future__ import annotations\n\nimport importlib\nfrom collections impor"
  },
  {
    "path": "src/pip/_internal/commands/cache.py",
    "chars": 9142,
    "preview": "import os\nimport textwrap\nfrom optparse import Values\nfrom typing import Callable\n\nfrom pip._internal.cli.base_command i"
  },
  {
    "path": "src/pip/_internal/commands/check.py",
    "chars": 2244,
    "preview": "import logging\nfrom optparse import Values\n\nfrom pip._internal.cli.base_command import Command\nfrom pip._internal.cli.st"
  },
  {
    "path": "src/pip/_internal/commands/completion.py",
    "chars": 4565,
    "preview": "import sys\nimport textwrap\nfrom optparse import Values\n\nfrom pip._internal.cli.base_command import Command\nfrom pip._int"
  },
  {
    "path": "src/pip/_internal/commands/configuration.py",
    "chars": 10105,
    "preview": "from __future__ import annotations\n\nimport logging\nimport os\nimport subprocess\nfrom optparse import Values\nfrom typing i"
  },
  {
    "path": "src/pip/_internal/commands/debug.py",
    "chars": 6805,
    "preview": "from __future__ import annotations\n\nimport locale\nimport logging\nimport os\nimport sys\nfrom optparse import Values\nfrom t"
  },
  {
    "path": "src/pip/_internal/commands/download.py",
    "chars": 5178,
    "preview": "import logging\nimport os\nfrom optparse import Values\n\nfrom pip._internal.cli import cmdoptions\nfrom pip._internal.cli.cm"
  },
  {
    "path": "src/pip/_internal/commands/freeze.py",
    "chars": 3099,
    "preview": "import sys\nfrom optparse import Values\n\nfrom pip._internal.cli import cmdoptions\nfrom pip._internal.cli.base_command imp"
  },
  {
    "path": "src/pip/_internal/commands/hash.py",
    "chars": 1679,
    "preview": "import hashlib\nimport logging\nimport sys\nfrom optparse import Values\n\nfrom pip._internal.cli.base_command import Command"
  },
  {
    "path": "src/pip/_internal/commands/help.py",
    "chars": 1108,
    "preview": "from optparse import Values\n\nfrom pip._internal.cli.base_command import Command\nfrom pip._internal.cli.status_codes impo"
  },
  {
    "path": "src/pip/_internal/commands/index.py",
    "chars": 5520,
    "preview": "from __future__ import annotations\n\nimport json\nimport logging\nfrom collections.abc import Iterable\nfrom optparse import"
  },
  {
    "path": "src/pip/_internal/commands/inspect.py",
    "chars": 3177,
    "preview": "import logging\nfrom optparse import Values\nfrom typing import Any\n\nfrom pip._vendor.packaging.markers import default_env"
  },
  {
    "path": "src/pip/_internal/commands/install.py",
    "chars": 30588,
    "preview": "from __future__ import annotations\n\nimport errno\nimport json\nimport operator\nimport os\nimport shutil\nimport site\nfrom op"
  },
  {
    "path": "src/pip/_internal/commands/list.py",
    "chars": 13497,
    "preview": "from __future__ import annotations\n\nimport json\nimport logging\nfrom collections.abc import Generator, Sequence\nfrom emai"
  },
  {
    "path": "src/pip/_internal/commands/lock.py",
    "chars": 6027,
    "preview": "import sys\nfrom optparse import Values\nfrom pathlib import Path\n\nfrom pip._vendor import tomli_w\nfrom pip._vendor.packag"
  },
  {
    "path": "src/pip/_internal/commands/search.py",
    "chars": 5782,
    "preview": "from __future__ import annotations\n\nimport logging\nimport shutil\nimport sys\nimport textwrap\nimport xmlrpc.client\nfrom co"
  },
  {
    "path": "src/pip/_internal/commands/show.py",
    "chars": 8066,
    "preview": "from __future__ import annotations\n\nimport logging\nimport string\nfrom collections.abc import Generator, Iterable, Iterat"
  },
  {
    "path": "src/pip/_internal/commands/uninstall.py",
    "chars": 3868,
    "preview": "import logging\nfrom optparse import Values\n\nfrom pip._vendor.packaging.utils import canonicalize_name\n\nfrom pip._interna"
  },
  {
    "path": "src/pip/_internal/commands/wheel.py",
    "chars": 5880,
    "preview": "import logging\nimport os\nimport shutil\nfrom optparse import Values\n\nfrom pip._internal.cache import WheelCache\nfrom pip."
  },
  {
    "path": "src/pip/_internal/configuration.py",
    "chars": 14568,
    "preview": "\"\"\"Configuration management setup\n\nSome terminology:\n- name\n  As written in config files.\n- value\n  Value associated wit"
  },
  {
    "path": "src/pip/_internal/distributions/__init__.py",
    "chars": 858,
    "preview": "from pip._internal.distributions.base import AbstractDistribution\nfrom pip._internal.distributions.sdist import SourceDi"
  },
  {
    "path": "src/pip/_internal/distributions/base.py",
    "chars": 1830,
    "preview": "from __future__ import annotations\n\nimport abc\nfrom typing import TYPE_CHECKING\n\nfrom pip._internal.metadata.base import"
  },
  {
    "path": "src/pip/_internal/distributions/installed.py",
    "chars": 929,
    "preview": "from __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nfrom pip._internal.distributions.base import Abstr"
  },
  {
    "path": "src/pip/_internal/distributions/sdist.py",
    "chars": 6627,
    "preview": "from __future__ import annotations\n\nimport logging\nfrom collections.abc import Iterable\nfrom typing import TYPE_CHECKING"
  },
  {
    "path": "src/pip/_internal/distributions/wheel.py",
    "chars": 1364,
    "preview": "from __future__ import annotations\n\nfrom typing import TYPE_CHECKING\n\nfrom pip._vendor.packaging.utils import canonicali"
  },
  {
    "path": "src/pip/_internal/exceptions.py",
    "chars": 32157,
    "preview": "\"\"\"Exceptions used throughout package.\n\nThis module MUST NOT try to import from anything within `pip._internal` to\nopera"
  },
  {
    "path": "src/pip/_internal/index/__init__.py",
    "chars": 29,
    "preview": "\"\"\"Index interaction code\"\"\"\n"
  },
  {
    "path": "src/pip/_internal/index/collector.py",
    "chars": 16144,
    "preview": "\"\"\"\nThe main purpose of this module is to expose LinkCollector.collect_sources().\n\"\"\"\n\nfrom __future__ import annotation"
  },
  {
    "path": "src/pip/_internal/index/package_finder.py",
    "chars": 41776,
    "preview": "\"\"\"Routines related to PyPI, indexes\"\"\"\n\nfrom __future__ import annotations\n\nimport datetime\nimport enum\nimport functool"
  },
  {
    "path": "src/pip/_internal/index/sources.py",
    "chars": 8639,
    "preview": "from __future__ import annotations\n\nimport logging\nimport mimetypes\nimport os\nfrom collections import defaultdict\nfrom c"
  },
  {
    "path": "src/pip/_internal/locations/__init__.py",
    "chars": 14157,
    "preview": "from __future__ import annotations\n\nimport functools\nimport logging\nimport os\nimport pathlib\nimport sys\nimport sysconfig"
  },
  {
    "path": "src/pip/_internal/locations/_distutils.py",
    "chars": 5975,
    "preview": "\"\"\"Locations where we look for configs, install stuff, etc\"\"\"\n\n# The following comment should be removed at some point i"
  },
  {
    "path": "src/pip/_internal/locations/_sysconfig.py",
    "chars": 7779,
    "preview": "from __future__ import annotations\n\nimport logging\nimport os\nimport sys\nimport sysconfig\nfrom typing import Callable\n\nfr"
  }
]

// ... and 750 more files (download for full content)

About this extraction

This page contains the full source code of the pypa/pip GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 950 files (6.6 MB), approximately 1.8M tokens, and a symbol index with 7934 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!