Commit Graph

10420 Commits

Author SHA1 Message Date
Stéphane Bidoul 4bfc54df9b
Merge pull request #8552 from chrahunt/do-not-extract-wheel-in-prepare
Do not extract wheels in requirement preparation
2020-07-07 09:46:57 +02:00
Chris Hunt c9f87a645b Inline constant variable 2020-07-06 21:19:43 -04:00
Chris Hunt d3955e7837 Don't unpack wheels during preparation
For some time we have not needed to pre-emptively unpack wheels as part
of metadata processing, but kept the existing logic because the
behavior would start to diverge more for different package types. In
this case, though, removing the special cases for wheels makes this
logic a bit simpler, so it is worth doing.
2020-07-06 21:15:35 -04:00
Christopher Hunt 334f06e224
Merge pull request #8054 from deveshks/correct-package-name-while-install
Canonicalize req name while doing pre-install package search
2020-07-06 12:10:33 -04:00
Devesh Kumar Singh 6c1030ca95 Fix comment order for retrying module 2020-07-06 19:17:26 +05:30
Christopher Hunt 161ee7f852
Merge pull request #8548 from chrahunt/better-wheel-empty-dir-test
Refactor test for empty directory in wheel
2020-07-06 09:25:31 -04:00
Devesh Kumar Singh ac624f1e4f Reword news entry 2020-07-06 13:42:09 +05:30
Devesh Kumar Singh 04fedfe53c Create custom get_distribution function 2020-07-06 13:42:05 +05:30
Devesh Kumar Singh 2bdec6c9fd Parametrize unit test 2020-07-06 13:32:09 +05:30
Devesh Kumar Singh 40261a475f Add unit tests to verify pkg name normalization 2020-07-06 13:32:09 +05:30
Devesh Kumar Singh 782913725f Canonicalize req name while doing pre-install package search 2020-07-06 13:32:09 +05:30
Paul Moore 547a8e9f72
Merge pull request #8483 from uranusjr/new-resolver-no-reinstall-direct-url-if-same-version
Skip installing if the version matches locally
2020-07-06 07:57:40 +01:00
Tzu-ping Chung 01e0700e68 Skip installing if the version matches locally
This check only applies to explicit requirements since we avoid
downloading the dist from finder altogether when there is a matching
installation (although the check wouldn’t change the behaviour in that
case anyway).

We can do this when we build the `ExplicitRequirement` instead, like how
we did for `SpecifierRequirement`, but that would require us to resolve
the direct requirement’s version eagerly, which I don’t want to.

The implemented approach checks the version only after resolution, at
which point the distribution is already built anyway and the operation
is cheap.
2020-07-06 11:06:14 +08:00
Christopher Hunt 4ba51d2e9c
Merge pull request #8501 from uranusjr/refactor-create-link-collector
Tidy up link collector constructor imports
2020-07-05 21:44:31 -04:00
Chris Hunt 5e4c1a96a2 Remove unused argument 2020-07-05 20:16:36 -04:00
Chris Hunt ba96ba3b08 Reduce empty directory test coupling to implementation
Our previous test required that the implementation use a temporary
directory and unpack the wheel in-place. Now we just provide a
conventional empty directory in the wheel file itself.
2020-07-05 20:16:36 -04:00
Chris Hunt a9c7f229b0 Create sample project wheel inline 2020-07-05 20:16:36 -04:00
Pradyun Gedam cf418d7290
Merge pull request #8544 from sbidoul/req_file-typing-sbi 2020-07-06 02:39:02 +05:30
Stéphane Bidoul df79ae4233
Enable strict typing in req_file.py 2020-07-05 19:11:41 +02:00
Stéphane Bidoul caad983734
Fix docstring typo 2020-07-05 19:11:41 +02:00
Christopher Hunt 1f8a4dde26
Merge pull request #8541 from chrahunt/refactor/compile-file-next-steps
Byte-compile files after installation
2020-07-05 12:56:39 -04:00
Stéphane Bidoul c2350444e1
Merge pull request #8322 from deveshks/mypy-internal-ops
Complete type annotations in "pip._internal.operations.{check,freeze}" and "pip._internal.utils.subprocess"
2020-07-05 16:51:16 +02:00
Chris Hunt 452e683eda Move byte-compilation after installing wheel files
There are a few changes here:

1. The byte-compilation now occurs after we copy the root-scheme files
   and files from any wheel data dirs
1. Instead of iterating over the files in the unpacked wheel directory,
   we iterate over the installed files as they exist in the installation
   path
2. In addition to asserting that pyc files were created, we also add
   them to the list of installed files, so they will be included in RECORD

By compiling after installation, we no longer depend on a separate
temporary directory - this brings us closer to installing directly from
wheel files.

By compiling with source files as they exist in the installation output
directory, we no longer generate pyc files with an embedded randomized
temp directory - this means that wheel installs can be deterministic.
2020-07-05 09:38:35 -04:00
Chris Hunt 42c01ae97e Normalize Path to str in wheel tests
In our next commit we will use the scheme path to locate files to
byte-compile. If the scheme path is a `Path`, then that causes
`compileall.compile_file` (via `py_compile.compile`) to fail with:

```
.tox/py38/lib/python3.8/site-packages/pip/_internal/operations/install/wheel.py:615: in install_unpacked_wheel
    success = compileall.compile_file(
../../../.pyenv/versions/3.8.0/lib/python3.8/compileall.py:157: in compile_file
    ok = py_compile.compile(fullname, cfile, dfile, True,
../../../.pyenv/versions/3.8.0/lib/python3.8/py_compile.py:162: in compile
    bytecode = importlib._bootstrap_external._code_to_timestamp_pyc(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

code = <code object <module> at 0x7fa7e274f500, file "/tmp/user/1000/pytest-of-chris/pytest-37/test_std_install_with_direct_u0/dest/lib/sample/__init__.py", line 1>, mtime = 1593910285.2200587, source_size = 134

>   ???
E   ValueError: unmarshallable object
```

Debugging in gdb shows that the error is set due to the `Path` object
being present in the code object, which `marshal.dumps` can't handle
(frame 1):

```
 0  w_complex_object (v=<optimized out>, flag=<optimized out>, p=0x7fffffff7160) at Python/marshal.c:564
 1  w_object (v=<Path at remote 0x7fffee51f120>, p=0x7fffffff7160) at Python/marshal.c:370
 2  w_complex_object (v=<code at remote 0x7fffee591710>, flag=<optimized out>, p=0x7fffffff7160) at Python/marshal.c:544
 3  w_object (v=<code at remote 0x7fffee591710>, p=0x7fffffff7160) at Python/marshal.c:370
 4  w_complex_object (v=('1.2.0', <code at remote 0x7fffee591710>, 'main', None), flag=<optimized out>, p=0x7fffffff7160) at Python/marshal.c:475
 5  w_object (v=('1.2.0', <code at remote 0x7fffee591710>, 'main', None), p=0x7fffffff7160) at Python/marshal.c:370
 6  w_complex_object (v=<code at remote 0x7fffee591ea0>, flag=<optimized out>, p=0x7fffffff7160) at Python/marshal.c:539
 7  w_object (p=0x7fffffff7160, v=<code at remote 0x7fffee591ea0>) at Python/marshal.c:370
 8  PyMarshal_WriteObjectToString (version=<optimized out>, x=<code at remote 0x7fffee591ea0>) at Python/marshal.c:1598
 9  marshal_dumps_impl (module=<optimized out>, version=<optimized out>, value=<code at remote 0x7fffee591ea0>) at Python/marshal.c:1739
 10 marshal_dumps (module=<optimized out>, args=<optimized out>, nargs=<optimized out>) at Python/clinic/marshal.c.h:124
```

In the interest of easy git bisects, we commit this fix before the code
that would expose the bug.
2020-07-05 09:38:08 -04:00
Chris Hunt 2ece73cc86 Confirm that pyc files are written during installation
In order to add generated pyc files to the RECORD file for our package,
we need to know their path! To raise confidence that we're doing this
correctly, we assert the existence of the expected 'pyc' files while
still using the old installation logic.

Some valid reasons why pyc files may not be generated:

1. Syntax error in the installed Python files
2. There is already a pyc file in-place that isn't writable by the
   current user

We don't fail installation in those cases today, and we wouldn't want to
change our behavior here, so we only assert that the pyc file was
created if `compileall.compile_file` indicates success.
2020-07-05 09:38:07 -04:00
Chris Hunt 4cb6f729ab Filter to files actually processed by compileall.compile_file
`compileall.compile_file` returns a success parameter, but can return
"successful" without actually generating a pyc file if the input file
was filtered out and compilation was not attempted.

In our file processing we mirror that logic, to ensure that a truthy
success returned by `compileall.compile_file` actually indicates a file
was written.
2020-07-05 09:37:47 -04:00
Chris Hunt 0a3a558e38 Use compileall.compile_file instead of compileall.compile_dir
We want to move towards having more control over the generation of pyc
files, which will allow us to provide deterministic installs and
generate pyc files without relying on an already-extracted wheel.

To that end, here we are stripping away one layer of abstraction,
`compileall.compile_dir`. `compileall.compile_dir` essentially recurses
through the provided directories and passes the files and args verbatim
to `compileall.compile_file`, so removing that layer means that we
directly call `compileall.compile_file`.

We make the assumption that we can successfully walk over the
source file tree, since we just wrote it, and omit the per-directory
traversal error handling done by `compileall.compile_dir`.
2020-07-05 09:37:45 -04:00
Pradyun Gedam 8db4fc8224
Merge pull request #8530 from pradyunsg/rollout-flags 2020-07-05 01:50:25 +05:30
Pradyun Gedam 107ec292c2
Merge pull request #8539 from pradyunsg/warn-on-unsupported-use-of-constraints 2020-07-05 01:48:54 +05:30
Pradyun Gedam 28592d4c31
Allow for the deprecation warning in tests 2020-07-05 01:01:02 +05:30
Chris Hunt b5f02f9dd8 Check that expected text is written in include files
This is a little more specific than checking that we happened to create
an already-empty file, and is a better mirror for reality.
2020-07-04 14:23:10 -04:00
Chris Hunt 0b0d53e8fa Use wheel helper function instead of pre-created wheel file 2020-07-04 14:22:15 -04:00
Chris Hunt 00191b2db1 Explicitly test that header file was created as-expected
Since this is the special part of this test. This gives us more
confidence that we're doing the right thing when removing the standalone
wheel file next.
2020-07-04 14:22:15 -04:00
Pradyun Gedam 6437bec269
Warn on to-be-removed forms of constraints 2020-07-04 18:01:38 +05:30
Pradyun Gedam 20431888cb
Move check_invalid_constraint_type to req_install.py 2020-07-04 18:01:28 +05:30
Pradyun Gedam ace5485836
Change reject_invalid_constraint_types to be reusable 2020-07-04 17:50:42 +05:30
Nguyễn Gia Phong 512221e1c1 Make utils.parallel tests tear down properly 2020-07-04 15:07:38 +07:00
Christopher Hunt feb2a24f14
Merge pull request #8537 from chrahunt/refactor/read-record-from-wheel
Read RECORD from wheel file directly during install
2020-07-03 22:00:34 -04:00
Christopher Hunt 196f5487f9
Merge pull request #8535 from chrahunt/refactor/extract-console-script-spec-source
Extract console script spec calculation from install_unpacked_wheel
2020-07-03 21:58:57 -04:00
Chris Hunt d7b5a776b3 Move record_path closer to first use 2020-07-03 20:53:56 -04:00
Chris Hunt d441f9518b Get wheel RECORD directly from wheel file
This reduces our dependence on disk files, and removes some complexity
around Python 2/3 compatibility with the csv module.
2020-07-03 20:49:16 -04:00
Christopher Hunt 231211a7ab
Merge pull request #8531 from chrahunt/simplify-get-entrypoints
Get entrypoints directly from wheel during installation
2020-07-03 20:26:29 -04:00
Chris Hunt 0433200135 Move dest_info_dir construction closer to first use
Reducing the scope of variables makes it easier to refactor, since
we can extract whole contiguous chunks of code later.
2020-07-03 19:46:45 -04:00
Chris Hunt 3930e4b063 Drop unused argument 2020-07-03 19:46:45 -04:00
Chris Hunt 479154b4ae Get Wheel entrypoints from Distribution instead of file
Since the Distribution pulls its data directly from the Wheel file,
without extracting intermediate files to disk, this brings us closer to
installing from Wheels without extracting everything.
2020-07-03 19:46:45 -04:00
Chris Hunt d49d97f19f Pass Wheel distribution to install.wheel.get_entrypoints
Right now we're just wiring up the arguments. Next we will actually use
them.
2020-07-03 19:46:45 -04:00
Chris Hunt a953787152 Extract entrypoint test text construction into variable
We need this to construct the new argument to `get_entrypoints`.
2020-07-03 19:46:45 -04:00
Christopher Hunt dd38d81a6e
Merge pull request #8536 from chrahunt/add-no-entrypoint-test
Test `wheel.get_entrypoints` when none are expected
2020-07-03 19:40:22 -04:00
Pradyun Gedam 0acdbf8943
Merge pull request #8504 from McSinyx/list-speed-up-nw
Parallelize pip list --outdated and --uptodate
2020-07-04 03:31:26 +05:30
Chris Hunt 3fad029b77 Test `get_entrypoints` when none are expected 2020-07-03 17:49:56 -04:00