Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

6.4.2: pyeste is failing in one unit because it has hardcoded python executable name #714

Closed
kloczek opened this issue May 23, 2022 · 1 comment
Labels

Comments

@kloczek
Copy link

kloczek commented May 23, 2022

Looks like one unit is failing becaue it has hardcoded python executable name.

+ pytest -ra --ignore testing/test_hg_git.py
=========================================================================== test session starts ============================================================================
platform linux -- Python 3.8.13, pytest-7.1.2, pluggy-1.0.0
setuptools version 62.2.0 from '/usr/lib/python3.8/site-packages/setuptools/__init__.py'
setuptools_scm version 6.4.2 from '/home/tkloczko/rpmbuild/BUILDROOT/python-setuptools_scm-6.4.2-3.fc35.x86_64/usr/lib/python3.8/site-packages/setuptools_scm/__init__.py'
rootdir: /home/tkloczko/rpmbuild/BUILD/setuptools_scm-6.4.2, configfile: tox.ini, testpaths: testing
collected 236 items

testing/test_basic_api.py .................                                                                                                                          [  7%]
testing/test_config.py ...........                                                                                                                                   [ 11%]
testing/test_file_finder.py .s.s.s.s.s.s.s.s.s.s.s..ss.s.s.s.s.s                                                                                                     [ 27%]
testing/test_functions.py .........................                                                                                                                  [ 37%]
testing/test_git.py ...............x...........X.....                                                                                                                [ 51%]
testing/test_integration.py s...........F...                                                                                                                         [ 58%]
testing/test_main.py ....                                                                                                                                            [ 60%]
testing/test_mercurial.py ssssssssssssssss                                                                                                                           [ 66%]
testing/test_regressions.py ....s                                                                                                                                    [ 69%]
testing/test_setuptools_support.py sssssssssssssssssssssssssssss                                                                                                     [ 81%]
testing/test_version.py .........................................x..                                                                                                 [100%]

================================================================================= FAILURES =================================================================================
_________________________________________________________________ test_pretend_version_accepts_bad_string __________________________________________________________________

monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x7f998421d0d0>, wd = <WD /tmp/pytest-of-tkloczko/pytest-0/test_pretend_version_accepts_b0/wd>

    def test_pretend_version_accepts_bad_string(monkeypatch, wd):
        monkeypatch.setenv(PRETEND_KEY, "dummy")
        wd.write("setup.py", SETUP_PY_PLAIN)
        assert wd.get_version(write_to="test.py") == "dummy"
>       assert wd("python setup.py --version") == "0.0.0"

testing/test_integration.py:122:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
testing/conftest.py:46: in __call__
    return do(cmd, self.cwd)
../../BUILDROOT/python-setuptools_scm-6.4.2-3.fc35.x86_64/usr/lib/python3.8/site-packages/setuptools_scm/utils.py:97: in do
    out, err, ret = do_ex(cmd, cwd)
../../BUILDROOT/python-setuptools_scm-6.4.2-3.fc35.x86_64/usr/lib/python3.8/site-packages/setuptools_scm/utils.py:85: in do_ex
    p = _popen_pipes(cmd, cwd)
../../BUILDROOT/python-setuptools_scm-6.4.2-3.fc35.x86_64/usr/lib/python3.8/site-packages/setuptools_scm/utils.py:61: in _popen_pipes
    return subprocess.Popen(
/usr/lib64/python3.8/subprocess.py:858: in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <subprocess.Popen object at 0x7f998420c790>, args = ['python', 'setup.py', '--version'], executable = b'python', preexec_fn = None, close_fds = True, pass_fds = ()
cwd = '/tmp/pytest-of-tkloczko/pytest-0/test_pretend_version_accepts_b0/wd'
env = {'BASH_ENV': '/usr/share/lmod/lmod/init/bash', 'BASH_FUNC_ml%%': '() {  eval "$($LMOD_DIR/ml_cmd "$@")"\n}', 'BASH_FUN... eval ${which_declare} ) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot $@\n}', ...}
startupinfo = None, creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 13, c2pwrite = 14, errread = 15, errwrite = 16, restore_signals = True
start_new_session = False

    def _execute_child(self, args, executable, preexec_fn, close_fds,
                       pass_fds, cwd, env,
                       startupinfo, creationflags, shell,
                       p2cread, p2cwrite,
                       c2pread, c2pwrite,
                       errread, errwrite,
                       restore_signals, start_new_session):
        """Execute program (POSIX version)"""

        if isinstance(args, (str, bytes)):
            args = [args]
        elif isinstance(args, os.PathLike):
            if shell:
                raise TypeError('path-like args is not allowed when '
                                'shell is true')
            args = [args]
        else:
            args = list(args)

        if shell:
            # On Android the default shell is at '/system/bin/sh'.
            unix_shell = ('/system/bin/sh' if
                      hasattr(sys, 'getandroidapilevel') else '/bin/sh')
            args = [unix_shell, "-c"] + args
            if executable:
                args[0] = executable

        if executable is None:
            executable = args[0]

        sys.audit("subprocess.Popen", executable, args, cwd, env)

        if (_USE_POSIX_SPAWN
                and os.path.dirname(executable)
                and preexec_fn is None
                and not close_fds
                and not pass_fds
                and cwd is None
                and (p2cread == -1 or p2cread > 2)
                and (c2pwrite == -1 or c2pwrite > 2)
                and (errwrite == -1 or errwrite > 2)
                and not start_new_session):
            self._posix_spawn(args, executable, env, restore_signals,
                              p2cread, p2cwrite,
                              c2pread, c2pwrite,
                              errread, errwrite)
            return

        orig_executable = executable

        # For transferring possible exec failure from child to parent.
        # Data format: "exception name:hex errno:description"
        # Pickle is not used; it is complex and involves memory allocation.
        errpipe_read, errpipe_write = os.pipe()
        # errpipe_write must not be in the standard io 0, 1, or 2 fd range.
        low_fds_to_close = []
        while errpipe_write < 3:
            low_fds_to_close.append(errpipe_write)
            errpipe_write = os.dup(errpipe_write)
        for low_fd in low_fds_to_close:
            os.close(low_fd)
        try:
            try:
                # We must avoid complex work that could involve
                # malloc or free in the child process to avoid
                # potential deadlocks, thus we do all this here.
                # and pass it to fork_exec()

                if env is not None:
                    env_list = []
                    for k, v in env.items():
                        k = os.fsencode(k)
                        if b'=' in k:
                            raise ValueError("illegal environment variable name")
                        env_list.append(k + b'=' + os.fsencode(v))
                else:
                    env_list = None  # Use execv instead of execve.
                executable = os.fsencode(executable)
                if os.path.dirname(executable):
                    executable_list = (executable,)
                else:
                    # This matches the behavior of os._execvpe().
                    executable_list = tuple(
                        os.path.join(os.fsencode(dir), executable)
                        for dir in os.get_exec_path(env))
                fds_to_keep = set(pass_fds)
                fds_to_keep.add(errpipe_write)
                self.pid = _posixsubprocess.fork_exec(
                        args, executable_list,
                        close_fds, tuple(sorted(map(int, fds_to_keep))),
                        cwd, env_list,
                        p2cread, p2cwrite, c2pread, c2pwrite,
                        errread, errwrite,
                        errpipe_read, errpipe_write,
                        restore_signals, start_new_session, preexec_fn)
                self._child_created = True
            finally:
                # be sure the FD is closed no matter what
                os.close(errpipe_write)

            self._close_pipe_fds(p2cread, p2cwrite,
                                 c2pread, c2pwrite,
                                 errread, errwrite)

            # Wait for exec to fail or succeed; possibly raising an
            # exception (limited in size)
            errpipe_data = bytearray()
            while True:
                part = os.read(errpipe_read, 50000)
                errpipe_data += part
                if not part or len(errpipe_data) > 50000:
                    break
        finally:
            # be sure the FD is closed no matter what
            os.close(errpipe_read)

        if errpipe_data:
            try:
                pid, sts = os.waitpid(self.pid, 0)
                if pid == self.pid:
                    self._handle_exitstatus(sts)
                else:
                    self.returncode = sys.maxsize
            except ChildProcessError:
                pass

            try:
                exception_name, hex_errno, err_msg = (
                        errpipe_data.split(b':', 2))
                # The encoding here should match the encoding
                # written in by the subprocess implementations
                # like _posixsubprocess
                err_msg = err_msg.decode()
            except ValueError:
                exception_name = b'SubprocessError'
                hex_errno = b'0'
                err_msg = 'Bad exception data from child: {!r}'.format(
                              bytes(errpipe_data))
            child_exception_type = getattr(
                    builtins, exception_name.decode('ascii'),
                    SubprocessError)
            if issubclass(child_exception_type, OSError) and hex_errno:
                errno_num = int(hex_errno, 16)
                child_exec_never_called = (err_msg == "noexec")
                if child_exec_never_called:
                    err_msg = ""
                    # The error must be from chdir(cwd).
                    err_filename = cwd
                else:
                    err_filename = orig_executable
                if errno_num != 0:
                    err_msg = os.strerror(errno_num)
>               raise child_exception_type(errno_num, err_msg, err_filename)
E               FileNotFoundError: [Errno 2] No such file or directory: 'python'

/usr/lib64/python3.8/subprocess.py:1704: FileNotFoundError
-------------------------------------------------------------------------- Captured stderr setup ---------------------------------------------------------------------------
cmd 'git init'
 in /tmp/pytest-of-tkloczko/pytest-0/test_pretend_version_accepts_b0/wd
out b'Initialized empty Git repository in /tmp/pytest-of-tkloczko/pytest-0/test_pretend_version_accepts_b0/wd/.git/\n'
err b"hint: Using 'master' as the name for the initial branch. This default branch name\nhint: is subject to change. To configure the initial branch name to use in all\nhint: of your new repositories, which will suppress this warning, call:\nhint: \nhint: \tgit config --global init.defaultBranch <name>\nhint: \nhint: Names commonly chosen instead of 'master' are 'main', 'trunk' and\nhint: 'development'. The just-created branch can be renamed via this command:\nhint: \nhint: \tgit branch -m <name>\n"
cmd 'git config user.email [email protected]'
 in /tmp/pytest-of-tkloczko/pytest-0/test_pretend_version_accepts_b0/wd
cmd 'git config user.name "a test"'
 in /tmp/pytest-of-tkloczko/pytest-0/test_pretend_version_accepts_b0/wd
--------------------------------------------------------------------------- Captured stdout call ---------------------------------------------------------------------------
dummy
--------------------------------------------------------------------------- Captured stderr call ---------------------------------------------------------------------------
abs root {'root': '/tmp/pytest-of-tkloczko/pytest-0/test_pretend_version_accepts_b0/wd', 'relative_to': None}
root '/tmp/pytest-of-tkloczko/pytest-0/test_pretend_version_accepts_b0/wd'
relative_to None
dist name: None
version dummy -> dummy
scm version <ScmVersion dummy d=None n=None d=False b=None>
config {'version_scheme': 'guess-next-dev', 'local_scheme': 'node-and-date'}
cmd 'python setup.py --version'
 in /tmp/pytest-of-tkloczko/pytest-0/test_pretend_version_accepts_b0/wd
---------------------------------------------------------------------------- Captured log call -----------------------------------------------------------------------------
ERROR    setuptools_scm:_version_cls.py:66 failed to parse version dummy
Traceback (most recent call last):
  File "/home/tkloczko/rpmbuild/BUILDROOT/python-setuptools_scm-6.4.2-3.fc35.x86_64/usr/lib/python3.8/site-packages/setuptools_scm/_version_cls.py", line 62, in _version_as_tuple
    parsed_version = Version(version_str)
  File "/usr/lib/python3.8/site-packages/packaging/version.py", line 266, in __init__
    raise InvalidVersion(f"Invalid version: '{version}'")
packaging.version.InvalidVersion: Invalid version: 'dummy'
========================================================================= short test summary info ==========================================================================
SKIPPED [18] testing/test_file_finder.py:24: hg executable not found
SKIPPED [1] testing/test_integration.py:24: could not import 'toml': No module named 'toml'
SKIPPED [5] testing/test_mercurial.py:37: hg executable not found
SKIPPED [1] testing/test_mercurial.py:49: hg executable not found
SKIPPED [1] testing/test_mercurial.py:55: hg executable not found
SKIPPED [1] testing/test_mercurial.py:69: hg executable not found
SKIPPED [1] testing/test_mercurial.py:97: hg executable not found
SKIPPED [1] testing/test_mercurial.py:112: hg executable not found
SKIPPED [1] testing/test_mercurial.py:122: hg executable not found
SKIPPED [1] testing/test_mercurial.py:147: hg executable not found
SKIPPED [1] testing/test_mercurial.py:152: hg executable not found
SKIPPED [1] testing/test_mercurial.py:159: hg executable not found
SKIPPED [1] testing/test_mercurial.py:171: hg executable not found
SKIPPED [1] testing/test_mercurial.py:181: hg executable not found
SKIPPED [1] testing/test_regressions.py:84: this bug is only valid on windows
SKIPPED [29] testing/test_setuptools_support.py:75: testing on legacy setuptools disabled, pass --test-legacy to run them
XFAIL testing/test_git.py::test_git_worktree_support
  sometimes relative path results
XFAIL testing/test_version.py::test_calver_by_date_semver[SemVer dirty]
XPASS testing/test_git.py::test_non_dotted_version https://github.com/pypa/setuptools_scm/issues/449
FAILED testing/test_integration.py::test_pretend_version_accepts_bad_string - FileNotFoundError: [Errno 2] No such file or directory: 'python'
===================================================== 1 failed, 167 passed, 65 skipped, 2 xfailed, 1 xpassed in 26.69s =====================================================
RonnyPfannschmidt added a commit to RonnyPfannschmidt/setuptools_scm that referenced this issue May 29, 2022
@kloczek
Copy link
Author

kloczek commented Jun 21, 2022

Thank you 👍
Commit commit be applied on top of last version so will test that when new version will be available.
(do you have any plans to make new version soon? .. I see that there is +40 commits since last one 😋 )

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants