On Sat 26/02/2022 22:22, Stuart Henderson wrote:
> Newer setuptools_scm uses a different TOML parser, py-tomli; port attached.
> OK to import? There's some slight mess, we don't handle distutils
> ports without setup.py yet, so there's a patch to add a tweaked
> file from an old upstream version.

py-tomli looks good, and builds. OK bket@

> The scm diff to go with it is below (this one is needed by newer
> setuptools_rust).

Diff looks good, and builds. I'm seeing two failing tests (test.log
enclosed), likely because I'm using PORTS_PRIVSEP=Yes. OK bket@
============================= test session starts ==============================
platform openbsd7 -- Python 3.9.10, pytest-6.2.5, py-1.11.0, pluggy-1.0.0
setuptools version 57.4.0 from 
'/usr/local/lib/python3.9/site-packages/setuptools/__init__.py'
setuptools_scm version 6.4.2 from 
'/tmp/ports/pobj/py-setuptools_scm-6.4.2-python3/setuptools_scm-6.4.2/lib/setuptools_scm/__init__.py'
rootdir: /tmp/ports/pobj/py-setuptools_scm-6.4.2-python3/setuptools_scm-6.4.2, 
configfile: tox.ini, testpaths: testing
collected 237 items

testing/test_basic_api.py .s...............                              [  7%]
testing/test_config.py ...........                                       [ 11%]
testing/test_file_finder.py ....................................         [ 27%]
testing/test_functions.py .........................                      [ 37%]
testing/test_git.py ...............x...........X.....                    [ 51%]
testing/test_hg_git.py s                                                 [ 51%]
testing/test_integration.py ............F...                             [ 58%]
testing/test_main.py ....                                                [ 60%]
testing/test_mercurial.py ................                               [ 67%]
testing/test_regressions.py ..F.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 0x4b1099c7c70>
wd = <WD /tmp/pytest-of-_pbuild/pytest-1/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)
lib/setuptools_scm/utils.py:97: in do
    out, err, ret = do_ex(cmd, cwd)
lib/setuptools_scm/utils.py:85: in do_ex
    p = _popen_pipes(cmd, cwd)
lib/setuptools_scm/utils.py:61: in _popen_pipes
    return subprocess.Popen(
/usr/local/lib/python3.9/subprocess.py:951: in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <Popen: returncode: 255 args: ['python', 'setup.py', '--version']>
args = ['python', 'setup.py', '--version'], executable = b'python'
preexec_fn = None, close_fds = True, pass_fds = ()
cwd = '/tmp/pytest-of-_pbuild/pytest-1/test_pretend_version_accepts_b0/wd'
env = {'BINGRP': 'bin', 'BINMODE': '755', 'BINOWN': 'root', 'BSD_INSTALL_DATA': 
'/tmp/ports/pobj/py-setuptools_scm-6.4.2-python3/bin/install -c -m 644', ...}
startupinfo = None, creationflags = 0, shell = False, p2cread = -1
p2cwrite = -1, c2pread = 11, c2pwrite = 12, errread = 13, errwrite = 14
restore_signals = True, gid = None, gids = None, uid = None, umask = -1
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,
                       gid, gids, uid, umask,
                       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
                and gid is None
                and gids is None
                and uid is None
                and umask < 0):
            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,
                        gid, gids, uid, umask,
                        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/local/lib/python3.9/subprocess.py:1821: FileNotFoundError
---------------------------- Captured stderr setup -----------------------------
cmd 'git init'
 in /tmp/pytest-of-_pbuild/pytest-1/test_pretend_version_accepts_b0/wd
out b'Initialized empty Git repository in 
/tmp/pytest-of-_pbuild/pytest-1/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-_pbuild/pytest-1/test_pretend_version_accepts_b0/wd
cmd 'git config user.name "a test"'
 in /tmp/pytest-of-_pbuild/pytest-1/test_pretend_version_accepts_b0/wd
----------------------------- Captured stdout call -----------------------------
dummy
----------------------------- Captured stderr call -----------------------------
abs root {'root': 
'/tmp/pytest-of-_pbuild/pytest-1/test_pretend_version_accepts_b0/wd', 
'relative_to': None}
root '/tmp/pytest-of-_pbuild/pytest-1/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-_pbuild/pytest-1/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 
"/tmp/ports/pobj/py-setuptools_scm-6.4.2-python3/setuptools_scm-6.4.2/lib/setuptools_scm/_version_cls.py",
 line 62, in _version_as_tuple
    parsed_version = Version(version_str)
  File "/usr/local/lib/python3.9/site-packages/packaging/version.py", line 298, 
in __init__
    raise InvalidVersion("Invalid version: '{0}'".format(version))
packaging.version.InvalidVersion: Invalid version: 'dummy'
______________________________ test_pip_download _______________________________

tmpdir = local('/tmp/pytest-of-_pbuild/pytest-1/test_pip_download0')
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x4b0fbb23bb0>

    @pytest.mark.issue(164)
    def test_pip_download(tmpdir, monkeypatch):
        monkeypatch.chdir(tmpdir)
>       subprocess.check_call([sys.executable, "-m", "pip", "download", 
> "lz4==0.9.0"])

/tmp/ports/pobj/py-setuptools_scm-6.4.2-python3/setuptools_scm-6.4.2/testing/test_regressions.py:60:
 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

popenargs = (['/usr/local/bin/python3.9', '-m', 'pip', 'download', 
'lz4==0.9.0'],)
kwargs = {}, retcode = 1
cmd = ['/usr/local/bin/python3.9', '-m', 'pip', 'download', 'lz4==0.9.0']

    def check_call(*popenargs, **kwargs):
        """Run command with arguments.  Wait for command to complete.  If
        the exit code was zero then return, otherwise raise
        CalledProcessError.  The CalledProcessError object will have the
        return code in the returncode attribute.
    
        The arguments are the same as for the call function.  Example:
    
        check_call(["ls", "-l"])
        """
        retcode = call(*popenargs, **kwargs)
        if retcode:
            cmd = kwargs.get("args")
            if cmd is None:
                cmd = popenargs[0]
>           raise CalledProcessError(retcode, cmd)
E           subprocess.CalledProcessError: Command 
'['/usr/local/bin/python3.9', '-m', 'pip', 'download', 'lz4==0.9.0']' returned 
non-zero exit status 1.

/usr/local/lib/python3.9/subprocess.py:373: CalledProcessError
----------------------------- Captured stderr call -----------------------------
WARNING: The directory '/py-setuptools_scm-6.4.2_writes_to_HOME/.cache/pip' or 
its parent directory is not owned or is not writable by the current user. The 
cache has been disabled. Check the permissions and owner of that directory. If 
executing pip with sudo, you may want sudo's -H flag.
WARNING: Keyring is skipped due to an exception: Failed to unlock the item!
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, 
status=None)) after connection broken by 
'NewConnectionError('<pip._vendor.urllib3.connection.HTTPSConnection object at 
0x20e02bd7ac0>: Failed to establish a new connection: [Errno 13] Permission 
denied')': /simple/lz4/
WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, 
status=None)) after connection broken by 
'NewConnectionError('<pip._vendor.urllib3.connection.HTTPSConnection object at 
0x20e02bcd0d0>: Failed to establish a new connection: [Errno 13] Permission 
denied')': /simple/lz4/
WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, 
status=None)) after connection broken by 
'NewConnectionError('<pip._vendor.urllib3.connection.HTTPSConnection object at 
0x20e02be5280>: Failed to establish a new connection: [Errno 13] Permission 
denied')': /simple/lz4/
WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, 
status=None)) after connection broken by 
'NewConnectionError('<pip._vendor.urllib3.connection.HTTPSConnection object at 
0x20e02be56d0>: Failed to establish a new connection: [Errno 13] Permission 
denied')': /simple/lz4/
WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, 
status=None)) after connection broken by 
'NewConnectionError('<pip._vendor.urllib3.connection.HTTPSConnection object at 
0x20e02be5700>: Failed to establish a new connection: [Errno 13] Permission 
denied')': /simple/lz4/
ERROR: Could not find a version that satisfies the requirement lz4==0.9.0
ERROR: No matching distribution found for lz4==0.9.0
=========================== short test summary info ============================
FAILED testing/test_integration.py::test_pretend_version_accepts_bad_string
FAILED testing/test_regressions.py::test_pip_download - subprocess.CalledProc...
= 2 failed, 200 passed, 32 skipped, 2 xfailed, 1 xpassed in 205.33s (0:03:25) ==
*** Error 1 in . (/usr/ports/lang/python/python.port.mk:294 'do-test': @cd 
/tmp/ports/pobj/py-setuptools_scm-6.4.2-python3/setuptools_scm-6....)

Reply via email to