nixbot

builds

failed mcptoon-0.7.19 checks.aarch64-linux.pkgs-mcptoon · build #4847 · raw

1bld3: building bc8x0snwsffhqqvhfsl9rl7vr5flq7xx-mcptoon-0.7.19.drv2Sourcing python-remove-tests-dir-hook3Sourcing python-catch-conflicts-hook.sh4Sourcing python-remove-bin-bytecode-hook.sh5Sourcing pypa-build-hook6Using pypaBuildPhase7Sourcing python-runtime-deps-check-hook8Using pythonRuntimeDepsCheckHook9Sourcing pypa-install-hook10Using pypaInstallPhase11Sourcing python-imports-check-hook.sh12Using pythonImportsCheckPhase13Sourcing python-namespaces-hook14Sourcing python-catch-conflicts-hook.sh15Sourcing pytest-check-hook16Using pytestCheckPhase
unpackPhase
17unpacking source archive /nix/store/yjfl19d0f41pk6ws1ji37pa8w25sc7hg-source18source root is source19setting SOURCE_DATE_EPOCH to timestamp 315619200 of file "source/tests/test_watch.py"
configurePhase
20no configure script, doing nothing
buildPhase
21Executing pypaBuildPhase22Creating a wheel...23pypa build flags: --no-isolation --outdir dist/ --wheel24* Getting build dependencies for wheel...25/nix/store/idlwgfiz0sx90mimq3jjxl7vyi4pqspy-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/config/_apply_pyprojecttoml.py:82: SetuptoolsDeprecationWarning: `project.license` as a TOML table is deprecated26!!2728 ********************************************************************************29 Please use a simple string containing a SPDX expression for `project.license`. You can also use `project.license-files`. (Both options available on setuptools>=77.0.0).3031 By 2027-Feb-18, you need to update your project and remove deprecated calls32 or your builds will no longer be supported.3334 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.35 ********************************************************************************3637!!38 corresp(dist, value, root_dir)39/nix/store/idlwgfiz0sx90mimq3jjxl7vyi4pqspy-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/config/_apply_pyprojecttoml.py:61: SetuptoolsDeprecationWarning: License classifiers are deprecated.40!!4142 ********************************************************************************43 Please consider removing the following classifiers in favor of a SPDX license expression:4445 License :: OSI Approved :: Apache Software License4647 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.48 ********************************************************************************4950!!51 dist._finalize_license_expression()52/nix/store/idlwgfiz0sx90mimq3jjxl7vyi4pqspy-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/dist.py:765: SetuptoolsDeprecationWarning: License classifiers are deprecated.53!!5455 ********************************************************************************56 Please consider removing the following classifiers in favor of a SPDX license expression:5758 License :: OSI Approved :: Apache Software License5960 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.61 ********************************************************************************6263!!64 self._finalize_license_expression()65running egg_info66creating src/mcptoon.egg-info67writing src/mcptoon.egg-info/PKG-INFO68writing dependency_links to src/mcptoon.egg-info/dependency_links.txt69writing entry points to src/mcptoon.egg-info/entry_points.txt70writing requirements to src/mcptoon.egg-info/requires.txt71writing top-level names to src/mcptoon.egg-info/top_level.txt72writing manifest file 'src/mcptoon.egg-info/SOURCES.txt'73reading manifest file 'src/mcptoon.egg-info/SOURCES.txt'74adding license file 'LICENSE'75adding license file 'NOTICE'76writing manifest file 'src/mcptoon.egg-info/SOURCES.txt'77* Building wheel...78/nix/store/idlwgfiz0sx90mimq3jjxl7vyi4pqspy-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/config/_apply_pyprojecttoml.py:82: SetuptoolsDeprecationWarning: `project.license` as a TOML table is deprecated79!!8081 ********************************************************************************82 Please use a simple string containing a SPDX expression for `project.license`. You can also use `project.license-files`. (Both options available on setuptools>=77.0.0).8384 By 2027-Feb-18, you need to update your project and remove deprecated calls85 or your builds will no longer be supported.8687 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.88 ********************************************************************************8990!!91 corresp(dist, value, root_dir)92/nix/store/idlwgfiz0sx90mimq3jjxl7vyi4pqspy-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/config/_apply_pyprojecttoml.py:61: SetuptoolsDeprecationWarning: License classifiers are deprecated.93!!9495 ********************************************************************************96 Please consider removing the following classifiers in favor of a SPDX license expression:9798 License :: OSI Approved :: Apache Software License99100 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.101 ********************************************************************************102103!!104 dist._finalize_license_expression()105/nix/store/idlwgfiz0sx90mimq3jjxl7vyi4pqspy-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/dist.py:765: SetuptoolsDeprecationWarning: License classifiers are deprecated.106!!107108 ********************************************************************************109 Please consider removing the following classifiers in favor of a SPDX license expression:110111 License :: OSI Approved :: Apache Software License112113 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.114 ********************************************************************************115116!!117 self._finalize_license_expression()118running bdist_wheel119running build120running build_py121creating build/lib/mcptoon122copying src/mcptoon/native_tools.py -> build/lib/mcptoon123copying src/mcptoon/usage.py -> build/lib/mcptoon124copying src/mcptoon/serve.py -> build/lib/mcptoon125copying src/mcptoon/health.py -> build/lib/mcptoon126copying src/mcptoon/installer.py -> build/lib/mcptoon127copying src/mcptoon/demo_server.py -> build/lib/mcptoon128copying src/mcptoon/router.py -> build/lib/mcptoon129copying src/mcptoon/config.py -> build/lib/mcptoon130copying src/mcptoon/toon_vendored.py -> build/lib/mcptoon131copying src/mcptoon/__init__.py -> build/lib/mcptoon132copying src/mcptoon/client.py -> build/lib/mcptoon133copying src/mcptoon/sync.py -> build/lib/mcptoon134copying src/mcptoon/manifest.py -> build/lib/mcptoon135copying src/mcptoon/cache.py -> build/lib/mcptoon136copying src/mcptoon/skills.py -> build/lib/mcptoon137copying src/mcptoon/bench.py -> build/lib/mcptoon138copying src/mcptoon/watch.py -> build/lib/mcptoon139copying src/mcptoon/cli.py -> build/lib/mcptoon140copying src/mcptoon/discover.py -> build/lib/mcptoon141copying src/mcptoon/errors.py -> build/lib/mcptoon142copying src/mcptoon/__main__.py -> build/lib/mcptoon143copying src/mcptoon/output.py -> build/lib/mcptoon144copying src/mcptoon/schema_simplifier.py -> build/lib/mcptoon145copying src/mcptoon/plugin.py -> build/lib/mcptoon146copying src/mcptoon/demo.py -> build/lib/mcptoon147running egg_info148writing src/mcptoon.egg-info/PKG-INFO149writing dependency_links to src/mcptoon.egg-info/dependency_links.txt150writing entry points to src/mcptoon.egg-info/entry_points.txt151writing requirements to src/mcptoon.egg-info/requires.txt152writing top-level names to src/mcptoon.egg-info/top_level.txt153reading manifest file 'src/mcptoon.egg-info/SOURCES.txt'154adding license file 'LICENSE'155adding license file 'NOTICE'156writing manifest file 'src/mcptoon.egg-info/SOURCES.txt'157installing to build/bdist.linux-aarch64/wheel158running install159running install_lib160creating build/bdist.linux-aarch64/wheel161creating build/bdist.linux-aarch64/wheel/mcptoon162copying build/lib/mcptoon/bench.py -> build/bdist.linux-aarch64/wheel/./mcptoon163copying build/lib/mcptoon/__main__.py -> build/bdist.linux-aarch64/wheel/./mcptoon164copying build/lib/mcptoon/watch.py -> build/bdist.linux-aarch64/wheel/./mcptoon165copying build/lib/mcptoon/client.py -> build/bdist.linux-aarch64/wheel/./mcptoon166copying build/lib/mcptoon/native_tools.py -> build/bdist.linux-aarch64/wheel/./mcptoon167copying build/lib/mcptoon/sync.py -> build/bdist.linux-aarch64/wheel/./mcptoon168copying build/lib/mcptoon/cache.py -> build/bdist.linux-aarch64/wheel/./mcptoon169copying build/lib/mcptoon/discover.py -> build/bdist.linux-aarch64/wheel/./mcptoon170copying build/lib/mcptoon/skills.py -> build/bdist.linux-aarch64/wheel/./mcptoon171copying build/lib/mcptoon/output.py -> build/bdist.linux-aarch64/wheel/./mcptoon172copying build/lib/mcptoon/plugin.py -> build/bdist.linux-aarch64/wheel/./mcptoon173copying build/lib/mcptoon/demo.py -> build/bdist.linux-aarch64/wheel/./mcptoon174copying build/lib/mcptoon/manifest.py -> build/bdist.linux-aarch64/wheel/./mcptoon175copying build/lib/mcptoon/errors.py -> build/bdist.linux-aarch64/wheel/./mcptoon176copying build/lib/mcptoon/schema_simplifier.py -> build/bdist.linux-aarch64/wheel/./mcptoon177copying build/lib/mcptoon/__init__.py -> build/bdist.linux-aarch64/wheel/./mcptoon178copying build/lib/mcptoon/cli.py -> build/bdist.linux-aarch64/wheel/./mcptoon179copying build/lib/mcptoon/toon_vendored.py -> build/bdist.linux-aarch64/wheel/./mcptoon180copying build/lib/mcptoon/health.py -> build/bdist.linux-aarch64/wheel/./mcptoon181copying build/lib/mcptoon/serve.py -> build/bdist.linux-aarch64/wheel/./mcptoon182copying build/lib/mcptoon/usage.py -> build/bdist.linux-aarch64/wheel/./mcptoon183copying build/lib/mcptoon/demo_server.py -> build/bdist.linux-aarch64/wheel/./mcptoon184copying build/lib/mcptoon/installer.py -> build/bdist.linux-aarch64/wheel/./mcptoon185copying build/lib/mcptoon/router.py -> build/bdist.linux-aarch64/wheel/./mcptoon186copying build/lib/mcptoon/config.py -> build/bdist.linux-aarch64/wheel/./mcptoon187running install_egg_info188Copying src/mcptoon.egg-info to build/bdist.linux-aarch64/wheel/./mcptoon-0.7.19-py3.14.egg-info189running install_scripts190creating build/bdist.linux-aarch64/wheel/mcptoon-0.7.19.dist-info/WHEEL191creating '/build/source/dist/.tmp-4fs7hrji/mcptoon-0.7.19-py3-none-any.whl' and adding 'build/bdist.linux-aarch64/wheel' to it192adding 'mcptoon/__init__.py'193adding 'mcptoon/__main__.py'194adding 'mcptoon/bench.py'195adding 'mcptoon/cache.py'196adding 'mcptoon/cli.py'197adding 'mcptoon/client.py'198adding 'mcptoon/config.py'199adding 'mcptoon/demo.py'200adding 'mcptoon/demo_server.py'201adding 'mcptoon/discover.py'202adding 'mcptoon/errors.py'203adding 'mcptoon/health.py'204adding 'mcptoon/installer.py'205adding 'mcptoon/manifest.py'206adding 'mcptoon/native_tools.py'207adding 'mcptoon/output.py'208adding 'mcptoon/plugin.py'209adding 'mcptoon/router.py'210adding 'mcptoon/schema_simplifier.py'211adding 'mcptoon/serve.py'212adding 'mcptoon/skills.py'213adding 'mcptoon/sync.py'214adding 'mcptoon/toon_vendored.py'215adding 'mcptoon/usage.py'216adding 'mcptoon/watch.py'217adding 'mcptoon-0.7.19.dist-info/licenses/LICENSE'218adding 'mcptoon-0.7.19.dist-info/licenses/NOTICE'219adding 'mcptoon-0.7.19.dist-info/METADATA'220adding 'mcptoon-0.7.19.dist-info/WHEEL'221adding 'mcptoon-0.7.19.dist-info/entry_points.txt'222adding 'mcptoon-0.7.19.dist-info/top_level.txt'223adding 'mcptoon-0.7.19.dist-info/RECORD'224removing build/bdist.linux-aarch64/wheel225Successfully built mcptoon-0.7.19-py3-none-any.whl226Finished creating a wheel...227Finished executing pypaBuildPhase
pythonRuntimeDepsCheckHook
228Executing pythonRuntimeDepsCheck229Checking runtime dependencies for mcptoon-0.7.19-py3-none-any.whl230Finished executing pythonRuntimeDepsCheck
installPhase
231Executing pypaInstallPhase232Successfully installed mcptoon-0.7.19-py3-none-any.whl233Finished executing pypaInstallPhase
pythonOutputDistPhase
234Executing pythonOutputDistPhase235Finished executing pythonOutputDistPhase
fixupPhase
236shrinking RPATHs of ELF executables and libraries in /nix/store/c2xz1zj9vy04k6b6i3pp2nbmpib60sqa-mcptoon-0.7.19237checking for references to /build/ in /nix/store/c2xz1zj9vy04k6b6i3pp2nbmpib60sqa-mcptoon-0.7.19...238patching script interpreter paths in /nix/store/c2xz1zj9vy04k6b6i3pp2nbmpib60sqa-mcptoon-0.7.19239stripping (with command strip and flags -S -p) in /nix/store/c2xz1zj9vy04k6b6i3pp2nbmpib60sqa-mcptoon-0.7.19/lib /nix/store/c2xz1zj9vy04k6b6i3pp2nbmpib60sqa-mcptoon-0.7.19/bin240shrinking RPATHs of ELF executables and libraries in /nix/store/vzcjv1fq2fsjs78yqcnc0c26zxf2d4k5-mcptoon-0.7.19-dist241checking for references to /build/ in /nix/store/vzcjv1fq2fsjs78yqcnc0c26zxf2d4k5-mcptoon-0.7.19-dist...242patching script interpreter paths in /nix/store/vzcjv1fq2fsjs78yqcnc0c26zxf2d4k5-mcptoon-0.7.19-dist243Rewriting #!/nix/store/3fl7bdkdxk2k4nssy1d1161isbzn6bsr-python3-3.14.7/bin/python3.14 to #!/nix/store/3fl7bdkdxk2k4nssy1d1161isbzn6bsr-python3-3.14.7244wrapping `/nix/store/c2xz1zj9vy04k6b6i3pp2nbmpib60sqa-mcptoon-0.7.19/bin/mcptoon'...245Executing pythonRemoveTestsDir246Finished executing pythonRemoveTestsDir
installCheckPhase
247no Makefile or custom installCheckPhase, doing nothing
pythonImportsCheckPhase
248Executing pythonImportsCheckPhase249Check whether the following modules can be imported: mcptoon
pytestCheckPhase
250Executing pytestCheckPhase251pytest flags: -m pytest252============================= test session starts ==============================253platform linux -- Python 3.14.7, pytest-9.1.1, pluggy-1.6.0254rootdir: /build/source255configfile: pyproject.toml256testpaths: tests257collected 1059 items 258259tests/test_bench.py ............. [ 1%]260tests/test_cache.py .... [ 1%]261tests/test_calculator.py .......................... [ 4%]262tests/test_claude_plugin_package.py ............. [ 5%]263tests/test_cli_flags.py ........... [ 6%]264tests/test_client.py .............................. [ 9%]265tests/test_command_coverage.py .... [ 9%]266tests/test_completion.py ........ [ 10%]267tests/test_config.py ......... [ 11%]268tests/test_dead_server_diagnostics.py ... [ 11%]269tests/test_demo.py ..................... [ 13%]270tests/test_demo_dead_package.py ........ [ 14%]271tests/test_demo_server.py .............................................. [ 18%]272..... [ 18%]273tests/test_discover.py .................................... [ 22%]274tests/test_doctor_star_hint.py ..... [ 22%]275tests/test_envelope.py ........ [ 23%]276tests/test_fallback_json.py ...... [ 24%]277tests/test_footprint_claims.py ............ [ 25%]278tests/test_gemini_manifest.py ...... [ 25%]279tests/test_health.py ............. [ 27%]280tests/test_help_shortcircuit.py ......... [ 27%]281tests/test_llms_txt.py ...... [ 28%]282tests/test_native_tools.py ........................... [ 31%]283tests/test_output.py ................................................... [ 35%]284........................................................................ [ 42%]285................ [ 44%]286tests/test_plugin_install.py .......... [ 45%]287tests/test_plugin_scan.py ............................... [ 48%]288tests/test_policy_overrides.py ................ [ 49%]289tests/test_readme_links.py ... [ 49%]290tests/test_registry_sync.py ............ [ 50%]291tests/test_router.py ............................................ [ 55%]292tests/test_search.py ................................ [ 58%]293tests/test_serve.py .................................................... [ 63%]294... [ 63%]295tests/test_serve_perf.py .......... [ 64%]296tests/test_serve_prompts.py ........ [ 65%]297tests/test_skills.py ................................................... [ 69%]298................................FFF....... [ 73%]299tests/test_stats_toggle.py ......... [ 74%]300tests/test_stderr_pipe_deadlock.py .... [ 75%]301tests/test_sync.py ................ [ 76%]302tests/test_tier_claims_consistent.py .... [ 76%]303tests/test_toml_config.py .......................... [ 79%]304tests/test_toon_cross_validate.py ............................... [ 82%]305tests/test_v02_features.py .................................... [ 85%]306tests/test_v04_features.py ................ [ 87%]307tests/test_v05_features.py ...................... [ 89%]308tests/test_v072_delight.py ..........s.. [ 90%]309tests/test_v073_http_security.py .............................. [ 93%]310tests/test_v074_stdio_timeout.py ............ [ 94%]311tests/test_v076_stateless_serve.py ................... [ 96%]312tests/test_v07_spec2026.py ..................... [ 98%]313tests/test_watch.py .................. [100%]314315=================================== FAILURES ===================================316_____ TombstoneTests.test_removal_uses_the_shared_graveyard_when_given_one _____317318self = <tests.test_skills.TombstoneTests testMethod=test_removal_uses_the_shared_graveyard_when_given_one>319320 def setUp(self):321 self.tmp = tempfile.TemporaryDirectory()322 self.base = Path(self.tmp.name)323 self.repo = self.base / "repo"324 (self.repo / "skills" / "alpha").mkdir(parents=True)325 (self.repo / "skills" / "alpha" / "SKILL.md").write_text(326 "---\nname: alpha\ndescription: d\n---\n", encoding="utf-8")327 (self.repo / "unrelated.txt").write_text("keep me\n", encoding="utf-8")328> self._git("init")329330tests/test_skills.py:940: 331_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 332tests/test_skills.py:951: in _git333 return subprocess.run(["git", *args], cwd=str(self.repo),334/nix/store/3fl7bdkdxk2k4nssy1d1161isbzn6bsr-python3-3.14.7/lib/python3.14/subprocess.py:555: in run335 with Popen(*popenargs, **kwargs) as process:336 ^^^^^^^^^^^^^^^^^^^^^^^^^^^337/nix/store/3fl7bdkdxk2k4nssy1d1161isbzn6bsr-python3-3.14.7/lib/python3.14/subprocess.py:1039: in __init__338 self._execute_child(args, executable, preexec_fn, close_fds,339_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 340341self = <Popen: returncode: 255 args: ['git', 'init']>, args = ['git', 'init']342executable = b'git', preexec_fn = None, close_fds = True, pass_fds = ()343cwd = '/build/tmpnzxe_f9a/repo', env = None, startupinfo = None344creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11345c2pwrite = 12, errread = 13, errwrite = 14, restore_signals = True, gid = None346gids = None, uid = None, umask = -1, start_new_session = False347process_group = -1348349 def _execute_child(self, args, executable, preexec_fn, close_fds,350 pass_fds, cwd, env,351 startupinfo, creationflags, shell,352 p2cread, p2cwrite,353 c2pread, c2pwrite,354 errread, errwrite,355 restore_signals,356 gid, gids, uid, umask,357 start_new_session, process_group):358 """Execute program (POSIX version)"""359 360 if isinstance(args, (str, bytes)):361 args = [args]362 elif isinstance(args, os.PathLike):363 if shell:364 raise TypeError('path-like args is not allowed when '365 'shell is true')366 args = [args]367 else:368 args = list(args)369 370 if shell:371 # On Android the default shell is at '/system/bin/sh'.372 unix_shell = ('/system/bin/sh' if373 hasattr(sys, 'getandroidapilevel') else '/nix/store/idnyqaaix26szkvhs1mjgi7990jajz9a-bash-5.3p15/bin/sh')374 args = [unix_shell, "-c"] + args375 if executable:376 args[0] = executable377 378 if executable is None:379 executable = args[0]380 381 sys.audit("subprocess.Popen", executable, args, cwd, env)382 383 if (_USE_POSIX_SPAWN384 and os.path.dirname(executable)385 and preexec_fn is None386 and (not close_fds or _HAVE_POSIX_SPAWN_CLOSEFROM)387 and not pass_fds388 and cwd is None389 and (p2cread == -1 or p2cread > 2)390 and (c2pwrite == -1 or c2pwrite > 2)391 and (errwrite == -1 or errwrite > 2)392 and not start_new_session393 and process_group == -1394 and gid is None395 and gids is None396 and uid is None397 and umask < 0):398 self._posix_spawn(args, executable, env, restore_signals, close_fds,399 p2cread, p2cwrite,400 c2pread, c2pwrite,401 errread, errwrite)402 return403 404 orig_executable = executable405 406 # For transferring possible exec failure from child to parent.407 # Data format: "exception name:hex errno:description"408 # Pickle is not used; it is complex and involves memory allocation.409 errpipe_read, errpipe_write = os.pipe()410 # errpipe_write must not be in the standard io 0, 1, or 2 fd range.411 low_fds_to_close = []412 while errpipe_write < 3:413 low_fds_to_close.append(errpipe_write)414 errpipe_write = os.dup(errpipe_write)415 for low_fd in low_fds_to_close:416 os.close(low_fd)417 try:418 try:419 # We must avoid complex work that could involve420 # malloc or free in the child process to avoid421 # potential deadlocks, thus we do all this here.422 # and pass it to fork_exec()423 424 if env is not None:425 env_list = []426 for k, v in env.items():427 k = os.fsencode(k)428 if b'=' in k:429 raise ValueError("illegal environment variable name")430 env_list.append(k + b'=' + os.fsencode(v))431 else:432 env_list = None # Use execv instead of execve.433 executable = os.fsencode(executable)434 if os.path.dirname(executable):435 executable_list = (executable,)436 else:437 # This matches the behavior of os._execvpe().438 executable_list = tuple(439 os.path.join(os.fsencode(dir), executable)440 for dir in os.get_exec_path(env))441 fds_to_keep = set(pass_fds)442 fds_to_keep.add(errpipe_write)443 self.pid = _fork_exec(444 args, executable_list,445 close_fds, tuple(sorted(map(int, fds_to_keep))),446 cwd, env_list,447 p2cread, p2cwrite, c2pread, c2pwrite,448 errread, errwrite,449 errpipe_read, errpipe_write,450 restore_signals, start_new_session,451 process_group, gid, gids, uid, umask,452 preexec_fn)453 self._child_created = True454 finally:455 # be sure the FD is closed no matter what456 os.close(errpipe_write)457 458 self._close_pipe_fds(p2cread, p2cwrite,459 c2pread, c2pwrite,460 errread, errwrite)461 462 # Wait for exec to fail or succeed; possibly raising an463 # exception (limited in size)464 errpipe_data = bytearray()465 while True:466 part = os.read(errpipe_read, 50000)467 errpipe_data += part468 if not part or len(errpipe_data) > 50000:469 break470 finally:471 # be sure the FD is closed no matter what472 os.close(errpipe_read)473 474 if errpipe_data:475 try:476 pid, sts = os.waitpid(self.pid, 0)477 if pid == self.pid:478 self._handle_exitstatus(sts)479 else:480 self.returncode = sys.maxsize481 except ChildProcessError:482 pass483 484 try:485 exception_name, hex_errno, err_msg = (486 errpipe_data.split(b':', 2))487 # The encoding here should match the encoding488 # written in by the subprocess implementations489 # like _posixsubprocess490 err_msg = err_msg.decode()491 except ValueError:492 exception_name = b'SubprocessError'493 hex_errno = b'0'494 err_msg = 'Bad exception data from child: {!r}'.format(495 bytes(errpipe_data))496 child_exception_type = getattr(497 builtins, exception_name.decode('ascii'),498 SubprocessError)499 if issubclass(child_exception_type, OSError) and hex_errno:500 errno_num = int(hex_errno, 16)501 if err_msg == "noexec:chdir":502 err_msg = ""503 # The error must be from chdir(cwd).504 err_filename = cwd505 elif err_msg == "noexec":506 err_msg = ""507 err_filename = None508 else:509 err_filename = orig_executable510 if errno_num != 0:511 err_msg = os.strerror(errno_num)512 if err_filename is not None:513> raise child_exception_type(errno_num, err_msg, err_filename)514E FileNotFoundError: [Errno 2] No such file or directory: 'git'515516/nix/store/3fl7bdkdxk2k4nssy1d1161isbzn6bsr-python3-3.14.7/lib/python3.14/subprocess.py:1990: FileNotFoundError517__________ TombstoneTests.test_removal_without_a_repo_still_archives ___________518519self = <tests.test_skills.TombstoneTests testMethod=test_removal_without_a_repo_still_archives>520521 def setUp(self):522 self.tmp = tempfile.TemporaryDirectory()523 self.base = Path(self.tmp.name)524 self.repo = self.base / "repo"525 (self.repo / "skills" / "alpha").mkdir(parents=True)526 (self.repo / "skills" / "alpha" / "SKILL.md").write_text(527 "---\nname: alpha\ndescription: d\n---\n", encoding="utf-8")528 (self.repo / "unrelated.txt").write_text("keep me\n", encoding="utf-8")529> self._git("init")530531tests/test_skills.py:940: 532_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 533tests/test_skills.py:951: in _git534 return subprocess.run(["git", *args], cwd=str(self.repo),535/nix/store/3fl7bdkdxk2k4nssy1d1161isbzn6bsr-python3-3.14.7/lib/python3.14/subprocess.py:555: in run536 with Popen(*popenargs, **kwargs) as process:537 ^^^^^^^^^^^^^^^^^^^^^^^^^^^538/nix/store/3fl7bdkdxk2k4nssy1d1161isbzn6bsr-python3-3.14.7/lib/python3.14/subprocess.py:1039: in __init__539 self._execute_child(args, executable, preexec_fn, close_fds,540_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 541542self = <Popen: returncode: 255 args: ['git', 'init']>, args = ['git', 'init']543executable = b'git', preexec_fn = None, close_fds = True, pass_fds = ()544cwd = '/build/tmpg4z99_re/repo', env = None, startupinfo = None545creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11546c2pwrite = 12, errread = 13, errwrite = 14, restore_signals = True, gid = None547gids = None, uid = None, umask = -1, start_new_session = False548process_group = -1549550 def _execute_child(self, args, executable, preexec_fn, close_fds,551 pass_fds, cwd, env,552 startupinfo, creationflags, shell,553 p2cread, p2cwrite,554 c2pread, c2pwrite,555 errread, errwrite,556 restore_signals,557 gid, gids, uid, umask,558 start_new_session, process_group):559 """Execute program (POSIX version)"""560 561 if isinstance(args, (str, bytes)):562 args = [args]563 elif isinstance(args, os.PathLike):564 if shell:565 raise TypeError('path-like args is not allowed when '566 'shell is true')567 args = [args]568 else:569 args = list(args)570 571 if shell:572 # On Android the default shell is at '/system/bin/sh'.573 unix_shell = ('/system/bin/sh' if574 hasattr(sys, 'getandroidapilevel') else '/nix/store/idnyqaaix26szkvhs1mjgi7990jajz9a-bash-5.3p15/bin/sh')575 args = [unix_shell, "-c"] + args576 if executable:577 args[0] = executable578 579 if executable is None:580 executable = args[0]581 582 sys.audit("subprocess.Popen", executable, args, cwd, env)583 584 if (_USE_POSIX_SPAWN585 and os.path.dirname(executable)586 and preexec_fn is None587 and (not close_fds or _HAVE_POSIX_SPAWN_CLOSEFROM)588 and not pass_fds589 and cwd is None590 and (p2cread == -1 or p2cread > 2)591 and (c2pwrite == -1 or c2pwrite > 2)592 and (errwrite == -1 or errwrite > 2)593 and not start_new_session594 and process_group == -1595 and gid is None596 and gids is None597 and uid is None598 and umask < 0):599 self._posix_spawn(args, executable, env, restore_signals, close_fds,600 p2cread, p2cwrite,601 c2pread, c2pwrite,602 errread, errwrite)603 return604 605 orig_executable = executable606 607 # For transferring possible exec failure from child to parent.608 # Data format: "exception name:hex errno:description"609 # Pickle is not used; it is complex and involves memory allocation.610 errpipe_read, errpipe_write = os.pipe()611 # errpipe_write must not be in the standard io 0, 1, or 2 fd range.612 low_fds_to_close = []613 while errpipe_write < 3:614 low_fds_to_close.append(errpipe_write)615 errpipe_write = os.dup(errpipe_write)616 for low_fd in low_fds_to_close:617 os.close(low_fd)618 try:619 try:620 # We must avoid complex work that could involve621 # malloc or free in the child process to avoid622 # potential deadlocks, thus we do all this here.623 # and pass it to fork_exec()624 625 if env is not None:626 env_list = []627 for k, v in env.items():628 k = os.fsencode(k)629 if b'=' in k:630 raise ValueError("illegal environment variable name")631 env_list.append(k + b'=' + os.fsencode(v))632 else:633 env_list = None # Use execv instead of execve.634 executable = os.fsencode(executable)635 if os.path.dirname(executable):636 executable_list = (executable,)637 else:638 # This matches the behavior of os._execvpe().639 executable_list = tuple(640 os.path.join(os.fsencode(dir), executable)641 for dir in os.get_exec_path(env))642 fds_to_keep = set(pass_fds)643 fds_to_keep.add(errpipe_write)644 self.pid = _fork_exec(645 args, executable_list,646 close_fds, tuple(sorted(map(int, fds_to_keep))),647 cwd, env_list,648 p2cread, p2cwrite, c2pread, c2pwrite,649 errread, errwrite,650 errpipe_read, errpipe_write,651 restore_signals, start_new_session,652 process_group, gid, gids, uid, umask,653 preexec_fn)654 self._child_created = True655 finally:656 # be sure the FD is closed no matter what657 os.close(errpipe_write)658 659 self._close_pipe_fds(p2cread, p2cwrite,660 c2pread, c2pwrite,661 errread, errwrite)662 663 # Wait for exec to fail or succeed; possibly raising an664 # exception (limited in size)665 errpipe_data = bytearray()666 while True:667 part = os.read(errpipe_read, 50000)668 errpipe_data += part669 if not part or len(errpipe_data) > 50000:670 break671 finally:672 # be sure the FD is closed no matter what673 os.close(errpipe_read)674 675 if errpipe_data:676 try:677 pid, sts = os.waitpid(self.pid, 0)678 if pid == self.pid:679 self._handle_exitstatus(sts)680 else:681 self.returncode = sys.maxsize682 except ChildProcessError:683 pass684 685 try:686 exception_name, hex_errno, err_msg = (687 errpipe_data.split(b':', 2))688 # The encoding here should match the encoding689 # written in by the subprocess implementations690 # like _posixsubprocess691 err_msg = err_msg.decode()692 except ValueError:693 exception_name = b'SubprocessError'694 hex_errno = b'0'695 err_msg = 'Bad exception data from child: {!r}'.format(696 bytes(errpipe_data))697 child_exception_type = getattr(698 builtins, exception_name.decode('ascii'),699 SubprocessError)700 if issubclass(child_exception_type, OSError) and hex_errno:701 errno_num = int(hex_errno, 16)702 if err_msg == "noexec:chdir":703 err_msg = ""704 # The error must be from chdir(cwd).705 err_filename = cwd706 elif err_msg == "noexec":707 err_msg = ""708 err_filename = None709 else:710 err_filename = orig_executable711 if errno_num != 0:712 err_msg = os.strerror(errno_num)713 if err_filename is not None:714> raise child_exception_type(errno_num, err_msg, err_filename)715E FileNotFoundError: [Errno 2] No such file or directory: 'git'716717/nix/store/3fl7bdkdxk2k4nssy1d1161isbzn6bsr-python3-3.14.7/lib/python3.14/subprocess.py:1990: FileNotFoundError718_________ TombstoneTests.test_tombstone_commits_only_the_removed_path __________719720self = <tests.test_skills.TombstoneTests testMethod=test_tombstone_commits_only_the_removed_path>721722 def setUp(self):723 self.tmp = tempfile.TemporaryDirectory()724 self.base = Path(self.tmp.name)725 self.repo = self.base / "repo"726 (self.repo / "skills" / "alpha").mkdir(parents=True)727 (self.repo / "skills" / "alpha" / "SKILL.md").write_text(728 "---\nname: alpha\ndescription: d\n---\n", encoding="utf-8")729 (self.repo / "unrelated.txt").write_text("keep me\n", encoding="utf-8")730> self._git("init")731732tests/test_skills.py:940: 733_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 734tests/test_skills.py:951: in _git735 return subprocess.run(["git", *args], cwd=str(self.repo),736/nix/store/3fl7bdkdxk2k4nssy1d1161isbzn6bsr-python3-3.14.7/lib/python3.14/subprocess.py:555: in run737 with Popen(*popenargs, **kwargs) as process:738 ^^^^^^^^^^^^^^^^^^^^^^^^^^^739/nix/store/3fl7bdkdxk2k4nssy1d1161isbzn6bsr-python3-3.14.7/lib/python3.14/subprocess.py:1039: in __init__740 self._execute_child(args, executable, preexec_fn, close_fds,741_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 742743self = <Popen: returncode: 255 args: ['git', 'init']>, args = ['git', 'init']744executable = b'git', preexec_fn = None, close_fds = True, pass_fds = ()745cwd = '/build/tmpct7xot5k/repo', env = None, startupinfo = None746creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = 11747c2pwrite = 12, errread = 13, errwrite = 14, restore_signals = True, gid = None748gids = None, uid = None, umask = -1, start_new_session = False749process_group = -1750751 def _execute_child(self, args, executable, preexec_fn, close_fds,752 pass_fds, cwd, env,753 startupinfo, creationflags, shell,754 p2cread, p2cwrite,755 c2pread, c2pwrite,756 errread, errwrite,757 restore_signals,758 gid, gids, uid, umask,759 start_new_session, process_group):760 """Execute program (POSIX version)"""761 762 if isinstance(args, (str, bytes)):763 args = [args]764 elif isinstance(args, os.PathLike):765 if shell:766 raise TypeError('path-like args is not allowed when '767 'shell is true')768 args = [args]769 else:770 args = list(args)771 772 if shell:773 # On Android the default shell is at '/system/bin/sh'.774 unix_shell = ('/system/bin/sh' if775 hasattr(sys, 'getandroidapilevel') else '/nix/store/idnyqaaix26szkvhs1mjgi7990jajz9a-bash-5.3p15/bin/sh')776 args = [unix_shell, "-c"] + args777 if executable:778 args[0] = executable779 780 if executable is None:781 executable = args[0]782 783 sys.audit("subprocess.Popen", executable, args, cwd, env)784 785 if (_USE_POSIX_SPAWN786 and os.path.dirname(executable)787 and preexec_fn is None788 and (not close_fds or _HAVE_POSIX_SPAWN_CLOSEFROM)789 and not pass_fds790 and cwd is None791 and (p2cread == -1 or p2cread > 2)792 and (c2pwrite == -1 or c2pwrite > 2)793 and (errwrite == -1 or errwrite > 2)794 and not start_new_session795 and process_group == -1796 and gid is None797 and gids is None798 and uid is None799 and umask < 0):800 self._posix_spawn(args, executable, env, restore_signals, close_fds,801 p2cread, p2cwrite,802 c2pread, c2pwrite,803 errread, errwrite)804 return805 806 orig_executable = executable807 808 # For transferring possible exec failure from child to parent.809 # Data format: "exception name:hex errno:description"810 # Pickle is not used; it is complex and involves memory allocation.811 errpipe_read, errpipe_write = os.pipe()812 # errpipe_write must not be in the standard io 0, 1, or 2 fd range.813 low_fds_to_close = []814 while errpipe_write < 3:815 low_fds_to_close.append(errpipe_write)816 errpipe_write = os.dup(errpipe_write)817 for low_fd in low_fds_to_close:818 os.close(low_fd)819 try:820 try:821 # We must avoid complex work that could involve822 # malloc or free in the child process to avoid823 # potential deadlocks, thus we do all this here.824 # and pass it to fork_exec()825 826 if env is not None:827 env_list = []828 for k, v in env.items():829 k = os.fsencode(k)830 if b'=' in k:831 raise ValueError("illegal environment variable name")832 env_list.append(k + b'=' + os.fsencode(v))833 else:834 env_list = None # Use execv instead of execve.835 executable = os.fsencode(executable)836 if os.path.dirname(executable):837 executable_list = (executable,)838 else:839 # This matches the behavior of os._execvpe().840 executable_list = tuple(841 os.path.join(os.fsencode(dir), executable)842 for dir in os.get_exec_path(env))843 fds_to_keep = set(pass_fds)844 fds_to_keep.add(errpipe_write)845 self.pid = _fork_exec(846 args, executable_list,847 close_fds, tuple(sorted(map(int, fds_to_keep))),848 cwd, env_list,849 p2cread, p2cwrite, c2pread, c2pwrite,850 errread, errwrite,851 errpipe_read, errpipe_write,852 restore_signals, start_new_session,853 process_group, gid, gids, uid, umask,854 preexec_fn)855 self._child_created = True856 finally:857 # be sure the FD is closed no matter what858 os.close(errpipe_write)859 860 self._close_pipe_fds(p2cread, p2cwrite,861 c2pread, c2pwrite,862 errread, errwrite)863 864 # Wait for exec to fail or succeed; possibly raising an865 # exception (limited in size)866 errpipe_data = bytearray()867 while True:868 part = os.read(errpipe_read, 50000)869 errpipe_data += part870 if not part or len(errpipe_data) > 50000:871 break872 finally:873 # be sure the FD is closed no matter what874 os.close(errpipe_read)875 876 if errpipe_data:877 try:878 pid, sts = os.waitpid(self.pid, 0)879 if pid == self.pid:880 self._handle_exitstatus(sts)881 else:882 self.returncode = sys.maxsize883 except ChildProcessError:884 pass885 886 try:887 exception_name, hex_errno, err_msg = (888 errpipe_data.split(b':', 2))889 # The encoding here should match the encoding890 # written in by the subprocess implementations891 # like _posixsubprocess892 err_msg = err_msg.decode()893 except ValueError:894 exception_name = b'SubprocessError'895 hex_errno = b'0'896 err_msg = 'Bad exception data from child: {!r}'.format(897 bytes(errpipe_data))898 child_exception_type = getattr(899 builtins, exception_name.decode('ascii'),900 SubprocessError)901 if issubclass(child_exception_type, OSError) and hex_errno:902 errno_num = int(hex_errno, 16)903 if err_msg == "noexec:chdir":904 err_msg = ""905 # The error must be from chdir(cwd).906 err_filename = cwd907 elif err_msg == "noexec":908 err_msg = ""909 err_filename = None910 else:911 err_filename = orig_executable912 if errno_num != 0:913 err_msg = os.strerror(errno_num)914 if err_filename is not None:915> raise child_exception_type(errno_num, err_msg, err_filename)916E FileNotFoundError: [Errno 2] No such file or directory: 'git'917918/nix/store/3fl7bdkdxk2k4nssy1d1161isbzn6bsr-python3-3.14.7/lib/python3.14/subprocess.py:1990: FileNotFoundError919=========================== short test summary info ============================920FAILED tests/test_skills.py::TombstoneTests::test_removal_uses_the_shared_graveyard_when_given_one - FileNotFoundError: [Errno 2] No such file or directory: 'git'921FAILED tests/test_skills.py::TombstoneTests::test_removal_without_a_repo_still_archives - FileNotFoundError: [Errno 2] No such file or directory: 'git'922FAILED tests/test_skills.py::TombstoneTests::test_tombstone_commits_only_the_removed_path - FileNotFoundError: [Errno 2] No such file or directory: 'git'923============= 3 failed, 1055 passed, 1 skipped in 71.76s (0:01:11) =============