Skip to content

[BUG] [easy_install] bug on checking the path of the distribution location #4088

Open
@spxd

Description

@spxd

setuptools version

setuptools===68.2.2

Python version

Python 3.10

OS

Windows 11

Additional environment information

No response

Description

I can see if the package source path is already added to the PYTHONPATH then it's failing add the package source directory to the easy-install.pth when I run the "pip install -e ."
 
easy_install.py

    def add(self, dist):
        """Add `dist` to the distribution map"""
        new_path = dist.location not in self.paths and (
            dist.location not in self.sitedirs
            or
            # account for '.' being in PYTHONPATH
            dist.location == os.getcwd()
        )
        if new_path:
            self.paths.append(dist.location)
            self.dirty = True
        super().add(dist)

In def add(self, dist) function in easy_install.py

dist.location == os.getcwd()

This code will return False, because the dist.location is already normcased during finalize_options in develop.py

target = _path.normpath(self.egg_base)

This target is passed as the location in Distribution

   # Make a distribution for the package's source
   self.dist = pkg_resources.Distribution(
       target,
       pkg_resources.PathMetadata(target, os.path.abspath(ei.egg_info)),
       project_name=ei.egg_name,
   )

For example, if the dist.location and os.getcwd() is
dist.location = 'c:\users\abc\work\helloworld'
os.getcwd() = 'C:\Users\abc\work\helloworld'

The result is False, even though they are pointing same path.

it should be updated to

dist.location == os.path.normcase(os.getcwd())

easy_install.py

    def add(self, dist):
        """Add `dist` to the distribution map"""
        new_path = dist.location not in self.paths and (
            dist.location not in self.sitedirs
            or
            # account for '.' being in PYTHONPATH
            # dist.location is _path.nomcased but the os.getcwd() is not
            dist.location == os.path.normcase(os.getcwd())
        )
        if new_path:
            self.paths.append(dist.location)
            self.dirty = True
        super().add(dist)

Expected behavior

The path of source code should be added to the easy-install.pth file when it's installed as editable.

How to Reproduce

Add "." (current path) to the PYTHONPATH then run the "pip install -e ."

Output

If the easy-install.pth is not exist. it will not dump any error.
But if there is easy-install.pth file exist, it will show this erro.

      File "C:\Users\...\lib\site-packages\setuptools\command\easy_install.py", line 1690, in save
        self.dirty |= last_dirty or self.paths != self._init_paths
    TypeError: unsupported operand type(s) for |=: 'list' and 'bool'

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugdeprecatedDeprecated functionality is *partially* supported in a "best effort" mannerhelp wanted

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions