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....)