nixbot

builds

failed mcptoon-0.7.17 checks.aarch64-darwin.pkgs-mcptoon · build #4819 · raw

1Sourcing python-remove-tests-dir-hook2Sourcing python-catch-conflicts-hook.sh3Sourcing python-remove-bin-bytecode-hook.sh4Sourcing pypa-build-hook5Using pypaBuildPhase6Sourcing python-runtime-deps-check-hook7Using pythonRuntimeDepsCheckHook8Sourcing pypa-install-hook9Using pypaInstallPhase10Sourcing python-imports-check-hook.sh11Using pythonImportsCheckPhase12Sourcing python-namespaces-hook13Sourcing python-catch-conflicts-hook.sh14Sourcing pytest-check-hook15Using pytestCheckPhase
unpackPhase
16unpacking source archive /nix/store/92q287ar3njqi8x54ib1ap60df8m9720-source17source root is source18setting SOURCE_DATE_EPOCH to timestamp 315619200 of file "source/tests/test_watch.py"
configurePhase
19no configure script, doing nothing
buildPhase
20Executing pypaBuildPhase21Creating a wheel...22pypa build flags: --no-isolation --outdir dist/ --wheel23* Getting build dependencies for wheel...24/nix/store/qmli4gwqi36clrxc1i29q6mnf8sizlbc-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 deprecated25!!2627 ********************************************************************************28 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).2930 By 2027-Feb-18, you need to update your project and remove deprecated calls31 or your builds will no longer be supported.3233 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.34 ********************************************************************************3536!!37 corresp(dist, value, root_dir)38/nix/store/qmli4gwqi36clrxc1i29q6mnf8sizlbc-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/config/_apply_pyprojecttoml.py:61: SetuptoolsDeprecationWarning: License classifiers are deprecated.39!!4041 ********************************************************************************42 Please consider removing the following classifiers in favor of a SPDX license expression:4344 License :: OSI Approved :: Apache Software License4546 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.47 ********************************************************************************4849!!50 dist._finalize_license_expression()51/nix/store/qmli4gwqi36clrxc1i29q6mnf8sizlbc-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/dist.py:765: SetuptoolsDeprecationWarning: License classifiers are deprecated.52!!5354 ********************************************************************************55 Please consider removing the following classifiers in favor of a SPDX license expression:5657 License :: OSI Approved :: Apache Software License5859 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.60 ********************************************************************************6162!!63 self._finalize_license_expression()64running egg_info65creating src/mcptoon.egg-info66writing src/mcptoon.egg-info/PKG-INFO67writing dependency_links to src/mcptoon.egg-info/dependency_links.txt68writing entry points to src/mcptoon.egg-info/entry_points.txt69writing requirements to src/mcptoon.egg-info/requires.txt70writing top-level names to src/mcptoon.egg-info/top_level.txt71writing manifest file 'src/mcptoon.egg-info/SOURCES.txt'72reading manifest file 'src/mcptoon.egg-info/SOURCES.txt'73adding license file 'LICENSE'74adding license file 'NOTICE'75writing manifest file 'src/mcptoon.egg-info/SOURCES.txt'76* Building wheel...77/nix/store/qmli4gwqi36clrxc1i29q6mnf8sizlbc-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 deprecated78!!7980 ********************************************************************************81 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).8283 By 2027-Feb-18, you need to update your project and remove deprecated calls84 or your builds will no longer be supported.8586 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.87 ********************************************************************************8889!!90 corresp(dist, value, root_dir)91/nix/store/qmli4gwqi36clrxc1i29q6mnf8sizlbc-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/config/_apply_pyprojecttoml.py:61: SetuptoolsDeprecationWarning: License classifiers are deprecated.92!!9394 ********************************************************************************95 Please consider removing the following classifiers in favor of a SPDX license expression:9697 License :: OSI Approved :: Apache Software License9899 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.100 ********************************************************************************101102!!103 dist._finalize_license_expression()104/nix/store/qmli4gwqi36clrxc1i29q6mnf8sizlbc-python3.14-setuptools-83.0.0/lib/python3.14/site-packages/setuptools/dist.py:765: SetuptoolsDeprecationWarning: License classifiers are deprecated.105!!106107 ********************************************************************************108 Please consider removing the following classifiers in favor of a SPDX license expression:109110 License :: OSI Approved :: Apache Software License111112 See https://packaging.python.org/en/latest/guides/writing-pyproject-toml/#license for details.113 ********************************************************************************114115!!116 self._finalize_license_expression()117running bdist_wheel118running build119running build_py120creating build/lib/mcptoon121copying src/mcptoon/sync.py -> build/lib/mcptoon122copying src/mcptoon/config.py -> build/lib/mcptoon123copying src/mcptoon/skills.py -> build/lib/mcptoon124copying src/mcptoon/manifest.py -> build/lib/mcptoon125copying src/mcptoon/health.py -> build/lib/mcptoon126copying src/mcptoon/discover.py -> build/lib/mcptoon127copying src/mcptoon/client.py -> build/lib/mcptoon128copying src/mcptoon/cache.py -> build/lib/mcptoon129copying src/mcptoon/__init__.py -> build/lib/mcptoon130copying src/mcptoon/serve.py -> build/lib/mcptoon131copying src/mcptoon/native_tools.py -> build/lib/mcptoon132copying src/mcptoon/bench.py -> build/lib/mcptoon133copying src/mcptoon/installer.py -> build/lib/mcptoon134copying src/mcptoon/cli.py -> build/lib/mcptoon135copying src/mcptoon/toon_vendored.py -> build/lib/mcptoon136copying src/mcptoon/plugin.py -> build/lib/mcptoon137copying src/mcptoon/errors.py -> build/lib/mcptoon138copying src/mcptoon/watch.py -> build/lib/mcptoon139copying src/mcptoon/demo_server.py -> build/lib/mcptoon140copying src/mcptoon/router.py -> build/lib/mcptoon141copying src/mcptoon/demo.py -> build/lib/mcptoon142copying src/mcptoon/schema_simplifier.py -> build/lib/mcptoon143copying src/mcptoon/usage.py -> build/lib/mcptoon144copying src/mcptoon/__main__.py -> build/lib/mcptoon145copying src/mcptoon/output.py -> build/lib/mcptoon146running egg_info147writing src/mcptoon.egg-info/PKG-INFO148writing dependency_links to src/mcptoon.egg-info/dependency_links.txt149writing entry points to src/mcptoon.egg-info/entry_points.txt150writing requirements to src/mcptoon.egg-info/requires.txt151writing top-level names to src/mcptoon.egg-info/top_level.txt152reading manifest file 'src/mcptoon.egg-info/SOURCES.txt'153adding license file 'LICENSE'154adding license file 'NOTICE'155writing manifest file 'src/mcptoon.egg-info/SOURCES.txt'156installing to build/bdist.macosx-14.0-arm64/wheel157running install158running install_lib159creating build/bdist.macosx-14.0-arm64/wheel160creating build/bdist.macosx-14.0-arm64/wheel/mcptoon161copying build/lib/mcptoon/sync.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon162copying build/lib/mcptoon/config.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon163copying build/lib/mcptoon/skills.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon164copying build/lib/mcptoon/manifest.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon165copying build/lib/mcptoon/health.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon166copying build/lib/mcptoon/discover.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon167copying build/lib/mcptoon/client.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon168copying build/lib/mcptoon/cache.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon169copying build/lib/mcptoon/__init__.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon170copying build/lib/mcptoon/serve.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon171copying build/lib/mcptoon/native_tools.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon172copying build/lib/mcptoon/bench.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon173copying build/lib/mcptoon/installer.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon174copying build/lib/mcptoon/cli.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon175copying build/lib/mcptoon/toon_vendored.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon176copying build/lib/mcptoon/plugin.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon177copying build/lib/mcptoon/errors.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon178copying build/lib/mcptoon/watch.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon179copying build/lib/mcptoon/demo_server.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon180copying build/lib/mcptoon/router.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon181copying build/lib/mcptoon/demo.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon182copying build/lib/mcptoon/schema_simplifier.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon183copying build/lib/mcptoon/usage.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon184copying build/lib/mcptoon/__main__.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon185copying build/lib/mcptoon/output.py -> build/bdist.macosx-14.0-arm64/wheel/./mcptoon186running install_egg_info187Copying src/mcptoon.egg-info to build/bdist.macosx-14.0-arm64/wheel/./mcptoon-0.7.17-py3.14.egg-info188running install_scripts189creating build/bdist.macosx-14.0-arm64/wheel/mcptoon-0.7.17.dist-info/WHEEL190creating '/nix/var/nix/builds/nix-50546-3925796131/source/dist/.tmp-uhwy3fds/mcptoon-0.7.17-py3-none-any.whl' and adding 'build/bdist.macosx-14.0-arm64/wheel' to it191adding 'mcptoon/__init__.py'192adding 'mcptoon/__main__.py'193adding 'mcptoon/bench.py'194adding 'mcptoon/cache.py'195adding 'mcptoon/cli.py'196adding 'mcptoon/client.py'197adding 'mcptoon/config.py'198adding 'mcptoon/demo.py'199adding 'mcptoon/demo_server.py'200adding 'mcptoon/discover.py'201adding 'mcptoon/errors.py'202adding 'mcptoon/health.py'203adding 'mcptoon/installer.py'204adding 'mcptoon/manifest.py'205adding 'mcptoon/native_tools.py'206adding 'mcptoon/output.py'207adding 'mcptoon/plugin.py'208adding 'mcptoon/router.py'209adding 'mcptoon/schema_simplifier.py'210adding 'mcptoon/serve.py'211adding 'mcptoon/skills.py'212adding 'mcptoon/sync.py'213adding 'mcptoon/toon_vendored.py'214adding 'mcptoon/usage.py'215adding 'mcptoon/watch.py'216adding 'mcptoon-0.7.17.dist-info/licenses/LICENSE'217adding 'mcptoon-0.7.17.dist-info/licenses/NOTICE'218adding 'mcptoon-0.7.17.dist-info/METADATA'219adding 'mcptoon-0.7.17.dist-info/WHEEL'220adding 'mcptoon-0.7.17.dist-info/entry_points.txt'221adding 'mcptoon-0.7.17.dist-info/top_level.txt'222adding 'mcptoon-0.7.17.dist-info/RECORD'223removing build/bdist.macosx-14.0-arm64/wheel224Successfully built mcptoon-0.7.17-py3-none-any.whl225Finished creating a wheel...226Finished executing pypaBuildPhase
pythonRuntimeDepsCheckHook
227Executing pythonRuntimeDepsCheck228Checking runtime dependencies for mcptoon-0.7.17-py3-none-any.whl229Finished executing pythonRuntimeDepsCheck
installPhase
230Executing pypaInstallPhase231Successfully installed mcptoon-0.7.17-py3-none-any.whl232Finished executing pypaInstallPhase
pythonOutputDistPhase
233Executing pythonOutputDistPhase234Finished executing pythonOutputDistPhase
fixupPhase
235checking for references to /nix/var/nix/builds/nix-50546-3925796131/ in /nix/store/pra4aqr551j557c09j4sgi9xq0yn2072-mcptoon-0.7.17...236patching script interpreter paths in /nix/store/pra4aqr551j557c09j4sgi9xq0yn2072-mcptoon-0.7.17237stripping (with command strip and flags -S) in /nix/store/pra4aqr551j557c09j4sgi9xq0yn2072-mcptoon-0.7.17/lib /nix/store/pra4aqr551j557c09j4sgi9xq0yn2072-mcptoon-0.7.17/bin238checking for references to /nix/var/nix/builds/nix-50546-3925796131/ in /nix/store/n9w15pv64annnsyzk2hqlwvz9iqp7lvv-mcptoon-0.7.17-dist...239patching script interpreter paths in /nix/store/n9w15pv64annnsyzk2hqlwvz9iqp7lvv-mcptoon-0.7.17-dist240Rewriting #!/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/bin/python3.14 to #!/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7241wrapping `/nix/store/pra4aqr551j557c09j4sgi9xq0yn2072-mcptoon-0.7.17/bin/mcptoon'...242Executing pythonRemoveTestsDir243Finished executing pythonRemoveTestsDir
installCheckPhase
244no Makefile or custom installCheckPhase, doing nothing
pythonImportsCheckPhase
245Executing pythonImportsCheckPhase246Check whether the following modules can be imported: mcptoon
pytestCheckPhase
247Executing pytestCheckPhase248pytest flags: -m pytest249============================= test session starts ==============================250platform darwin -- Python 3.14.7, pytest-9.1.1, pluggy-1.6.0251rootdir: /nix/var/nix/builds/nix-50546-3925796131/source252configfile: pyproject.toml253testpaths: tests254collected 1050 items 255256tests/test_bench.py ............. [ 1%]257tests/test_cache.py .... [ 1%]258tests/test_calculator.py .......................... [ 4%]259tests/test_claude_plugin_package.py ............. [ 5%]260tests/test_cli_flags.py ........... [ 6%]261tests/test_client.py .............................. [ 9%]262tests/test_command_coverage.py .... [ 9%]263tests/test_completion.py ........ [ 10%]264tests/test_config.py ........ [ 11%]265tests/test_dead_server_diagnostics.py ... [ 11%]266tests/test_demo.py ..................... [ 13%]267tests/test_demo_dead_package.py ........ [ 14%]268tests/test_demo_server.py .............................................. [ 18%]269..... [ 19%]270tests/test_discover.py ................................ [ 22%]271tests/test_doctor_star_hint.py ..... [ 22%]272tests/test_envelope.py ........ [ 23%]273tests/test_fallback_json.py ...... [ 23%]274tests/test_footprint_claims.py ............ [ 25%]275tests/test_gemini_manifest.py ...... [ 25%]276tests/test_health.py ............. [ 26%]277tests/test_help_shortcircuit.py ......... [ 27%]278tests/test_llms_txt.py ...... [ 28%]279tests/test_native_tools.py ........................... [ 30%]280tests/test_output.py ................................................... [ 35%]281........................................................................ [ 42%]282................ [ 44%]283tests/test_plugin_install.py .......... [ 45%]284tests/test_plugin_scan.py ............................... [ 48%]285tests/test_policy_overrides.py ................ [ 49%]286tests/test_readme_links.py ... [ 49%]287tests/test_registry_sync.py ............ [ 50%]288tests/test_router.py ............................................ [ 55%]289tests/test_search.py ................................ [ 58%]290tests/test_serve.py .................................................... [ 63%]291... [ 63%]292tests/test_serve_perf.py .......... [ 64%]293tests/test_serve_prompts.py ........ [ 65%]294tests/test_skills.py ................................................... [ 70%]295................................FFF....... [ 74%]296tests/test_stats_toggle.py ......... [ 74%]297tests/test_sync.py ................ [ 76%]298tests/test_tier_claims_consistent.py .... [ 76%]299tests/test_toml_config.py .......................... [ 79%]300tests/test_toon_cross_validate.py ............................... [ 82%]301tests/test_v02_features.py .................................... [ 85%]302tests/test_v04_features.py ................ [ 87%]303tests/test_v05_features.py ...................... [ 89%]304tests/test_v072_delight.py ..........s.. [ 90%]305tests/test_v073_http_security.py .............................. [ 93%]306tests/test_v074_stdio_timeout.py ............ [ 94%]307tests/test_v076_stateless_serve.py ................... [ 96%]308tests/test_v07_spec2026.py ..................... [ 98%]309tests/test_watch.py .................. [100%]310311=================================== FAILURES ===================================312_____ TombstoneTests.test_removal_uses_the_shared_graveyard_when_given_one _____313314self = <tests.test_skills.TombstoneTests testMethod=test_removal_uses_the_shared_graveyard_when_given_one>315316 def setUp(self):317 self.tmp = tempfile.TemporaryDirectory()318 self.base = Path(self.tmp.name)319 self.repo = self.base / "repo"320 (self.repo / "skills" / "alpha").mkdir(parents=True)321 (self.repo / "skills" / "alpha" / "SKILL.md").write_text(322 "---\nname: alpha\ndescription: d\n---\n", encoding="utf-8")323 (self.repo / "unrelated.txt").write_text("keep me\n", encoding="utf-8")324> self._git("init")325326tests/test_skills.py:940: 327_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 328tests/test_skills.py:951: in _git329 return subprocess.run(["git", *args], cwd=str(self.repo),330/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/subprocess.py:555: in run331 with Popen(*popenargs, **kwargs) as process:332 ^^^^^^^^^^^^^^^^^^^^^^^^^^^333/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/subprocess.py:1039: in __init__334 self._execute_child(args, executable, preexec_fn, close_fds,335_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 336337self = <Popen: returncode: 255 args: ['git', 'init']>, args = ['git', 'init']338executable = b'git', preexec_fn = None, close_fds = True, pass_fds = ()339cwd = '/nix/var/nix/builds/nix-50546-3925796131/tmppyf3yq7w/repo', env = None340startupinfo = None, creationflags = 0, shell = False, p2cread = -1341p2cwrite = -1, c2pread = 14, c2pwrite = 15, errread = 16, errwrite = 17342restore_signals = True, gid = None, gids = None, uid = None, umask = -1343start_new_session = False, process_group = -1344345 def _execute_child(self, args, executable, preexec_fn, close_fds,346 pass_fds, cwd, env,347 startupinfo, creationflags, shell,348 p2cread, p2cwrite,349 c2pread, c2pwrite,350 errread, errwrite,351 restore_signals,352 gid, gids, uid, umask,353 start_new_session, process_group):354 """Execute program (POSIX version)"""355 356 if isinstance(args, (str, bytes)):357 args = [args]358 elif isinstance(args, os.PathLike):359 if shell:360 raise TypeError('path-like args is not allowed when '361 'shell is true')362 args = [args]363 else:364 args = list(args)365 366 if shell:367 # On Android the default shell is at '/system/bin/sh'.368 unix_shell = ('/system/bin/sh' if369 hasattr(sys, 'getandroidapilevel') else '/nix/store/lb6nd0iyy9x0bm7yfx2fkw0wbjllg4ic-bash-5.3p15/bin/sh')370 args = [unix_shell, "-c"] + args371 if executable:372 args[0] = executable373 374 if executable is None:375 executable = args[0]376 377 sys.audit("subprocess.Popen", executable, args, cwd, env)378 379 if (_USE_POSIX_SPAWN380 and os.path.dirname(executable)381 and preexec_fn is None382 and (not close_fds or _HAVE_POSIX_SPAWN_CLOSEFROM)383 and not pass_fds384 and cwd is None385 and (p2cread == -1 or p2cread > 2)386 and (c2pwrite == -1 or c2pwrite > 2)387 and (errwrite == -1 or errwrite > 2)388 and not start_new_session389 and process_group == -1390 and gid is None391 and gids is None392 and uid is None393 and umask < 0):394 self._posix_spawn(args, executable, env, restore_signals, close_fds,395 p2cread, p2cwrite,396 c2pread, c2pwrite,397 errread, errwrite)398 return399 400 orig_executable = executable401 402 # For transferring possible exec failure from child to parent.403 # Data format: "exception name:hex errno:description"404 # Pickle is not used; it is complex and involves memory allocation.405 errpipe_read, errpipe_write = os.pipe()406 # errpipe_write must not be in the standard io 0, 1, or 2 fd range.407 low_fds_to_close = []408 while errpipe_write < 3:409 low_fds_to_close.append(errpipe_write)410 errpipe_write = os.dup(errpipe_write)411 for low_fd in low_fds_to_close:412 os.close(low_fd)413 try:414 try:415 # We must avoid complex work that could involve416 # malloc or free in the child process to avoid417 # potential deadlocks, thus we do all this here.418 # and pass it to fork_exec()419 420 if env is not None:421 env_list = []422 for k, v in env.items():423 k = os.fsencode(k)424 if b'=' in k:425 raise ValueError("illegal environment variable name")426 env_list.append(k + b'=' + os.fsencode(v))427 else:428 env_list = None # Use execv instead of execve.429 executable = os.fsencode(executable)430 if os.path.dirname(executable):431 executable_list = (executable,)432 else:433 # This matches the behavior of os._execvpe().434 executable_list = tuple(435 os.path.join(os.fsencode(dir), executable)436 for dir in os.get_exec_path(env))437 fds_to_keep = set(pass_fds)438 fds_to_keep.add(errpipe_write)439 self.pid = _fork_exec(440 args, executable_list,441 close_fds, tuple(sorted(map(int, fds_to_keep))),442 cwd, env_list,443 p2cread, p2cwrite, c2pread, c2pwrite,444 errread, errwrite,445 errpipe_read, errpipe_write,446 restore_signals, start_new_session,447 process_group, gid, gids, uid, umask,448 preexec_fn)449 self._child_created = True450 finally:451 # be sure the FD is closed no matter what452 os.close(errpipe_write)453 454 self._close_pipe_fds(p2cread, p2cwrite,455 c2pread, c2pwrite,456 errread, errwrite)457 458 # Wait for exec to fail or succeed; possibly raising an459 # exception (limited in size)460 errpipe_data = bytearray()461 while True:462 part = os.read(errpipe_read, 50000)463 errpipe_data += part464 if not part or len(errpipe_data) > 50000:465 break466 finally:467 # be sure the FD is closed no matter what468 os.close(errpipe_read)469 470 if errpipe_data:471 try:472 pid, sts = os.waitpid(self.pid, 0)473 if pid == self.pid:474 self._handle_exitstatus(sts)475 else:476 self.returncode = sys.maxsize477 except ChildProcessError:478 pass479 480 try:481 exception_name, hex_errno, err_msg = (482 errpipe_data.split(b':', 2))483 # The encoding here should match the encoding484 # written in by the subprocess implementations485 # like _posixsubprocess486 err_msg = err_msg.decode()487 except ValueError:488 exception_name = b'SubprocessError'489 hex_errno = b'0'490 err_msg = 'Bad exception data from child: {!r}'.format(491 bytes(errpipe_data))492 child_exception_type = getattr(493 builtins, exception_name.decode('ascii'),494 SubprocessError)495 if issubclass(child_exception_type, OSError) and hex_errno:496 errno_num = int(hex_errno, 16)497 if err_msg == "noexec:chdir":498 err_msg = ""499 # The error must be from chdir(cwd).500 err_filename = cwd501 elif err_msg == "noexec":502 err_msg = ""503 err_filename = None504 else:505 err_filename = orig_executable506 if errno_num != 0:507 err_msg = os.strerror(errno_num)508 if err_filename is not None:509> raise child_exception_type(errno_num, err_msg, err_filename)510E FileNotFoundError: [Errno 2] No such file or directory: 'git'511512/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/subprocess.py:1990: FileNotFoundError513__________ TombstoneTests.test_removal_without_a_repo_still_archives ___________514515self = <tests.test_skills.TombstoneTests testMethod=test_removal_without_a_repo_still_archives>516517 def setUp(self):518 self.tmp = tempfile.TemporaryDirectory()519 self.base = Path(self.tmp.name)520 self.repo = self.base / "repo"521 (self.repo / "skills" / "alpha").mkdir(parents=True)522 (self.repo / "skills" / "alpha" / "SKILL.md").write_text(523 "---\nname: alpha\ndescription: d\n---\n", encoding="utf-8")524 (self.repo / "unrelated.txt").write_text("keep me\n", encoding="utf-8")525> self._git("init")526527tests/test_skills.py:940: 528_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 529tests/test_skills.py:951: in _git530 return subprocess.run(["git", *args], cwd=str(self.repo),531/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/subprocess.py:555: in run532 with Popen(*popenargs, **kwargs) as process:533 ^^^^^^^^^^^^^^^^^^^^^^^^^^^534/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/subprocess.py:1039: in __init__535 self._execute_child(args, executable, preexec_fn, close_fds,536_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 537538self = <Popen: returncode: 255 args: ['git', 'init']>, args = ['git', 'init']539executable = b'git', preexec_fn = None, close_fds = True, pass_fds = ()540cwd = '/nix/var/nix/builds/nix-50546-3925796131/tmpl1palp9a/repo', env = None541startupinfo = None, creationflags = 0, shell = False, p2cread = -1542p2cwrite = -1, c2pread = 14, c2pwrite = 15, errread = 16, errwrite = 17543restore_signals = True, gid = None, gids = None, uid = None, umask = -1544start_new_session = False, process_group = -1545546 def _execute_child(self, args, executable, preexec_fn, close_fds,547 pass_fds, cwd, env,548 startupinfo, creationflags, shell,549 p2cread, p2cwrite,550 c2pread, c2pwrite,551 errread, errwrite,552 restore_signals,553 gid, gids, uid, umask,554 start_new_session, process_group):555 """Execute program (POSIX version)"""556 557 if isinstance(args, (str, bytes)):558 args = [args]559 elif isinstance(args, os.PathLike):560 if shell:561 raise TypeError('path-like args is not allowed when '562 'shell is true')563 args = [args]564 else:565 args = list(args)566 567 if shell:568 # On Android the default shell is at '/system/bin/sh'.569 unix_shell = ('/system/bin/sh' if570 hasattr(sys, 'getandroidapilevel') else '/nix/store/lb6nd0iyy9x0bm7yfx2fkw0wbjllg4ic-bash-5.3p15/bin/sh')571 args = [unix_shell, "-c"] + args572 if executable:573 args[0] = executable574 575 if executable is None:576 executable = args[0]577 578 sys.audit("subprocess.Popen", executable, args, cwd, env)579 580 if (_USE_POSIX_SPAWN581 and os.path.dirname(executable)582 and preexec_fn is None583 and (not close_fds or _HAVE_POSIX_SPAWN_CLOSEFROM)584 and not pass_fds585 and cwd is None586 and (p2cread == -1 or p2cread > 2)587 and (c2pwrite == -1 or c2pwrite > 2)588 and (errwrite == -1 or errwrite > 2)589 and not start_new_session590 and process_group == -1591 and gid is None592 and gids is None593 and uid is None594 and umask < 0):595 self._posix_spawn(args, executable, env, restore_signals, close_fds,596 p2cread, p2cwrite,597 c2pread, c2pwrite,598 errread, errwrite)599 return600 601 orig_executable = executable602 603 # For transferring possible exec failure from child to parent.604 # Data format: "exception name:hex errno:description"605 # Pickle is not used; it is complex and involves memory allocation.606 errpipe_read, errpipe_write = os.pipe()607 # errpipe_write must not be in the standard io 0, 1, or 2 fd range.608 low_fds_to_close = []609 while errpipe_write < 3:610 low_fds_to_close.append(errpipe_write)611 errpipe_write = os.dup(errpipe_write)612 for low_fd in low_fds_to_close:613 os.close(low_fd)614 try:615 try:616 # We must avoid complex work that could involve617 # malloc or free in the child process to avoid618 # potential deadlocks, thus we do all this here.619 # and pass it to fork_exec()620 621 if env is not None:622 env_list = []623 for k, v in env.items():624 k = os.fsencode(k)625 if b'=' in k:626 raise ValueError("illegal environment variable name")627 env_list.append(k + b'=' + os.fsencode(v))628 else:629 env_list = None # Use execv instead of execve.630 executable = os.fsencode(executable)631 if os.path.dirname(executable):632 executable_list = (executable,)633 else:634 # This matches the behavior of os._execvpe().635 executable_list = tuple(636 os.path.join(os.fsencode(dir), executable)637 for dir in os.get_exec_path(env))638 fds_to_keep = set(pass_fds)639 fds_to_keep.add(errpipe_write)640 self.pid = _fork_exec(641 args, executable_list,642 close_fds, tuple(sorted(map(int, fds_to_keep))),643 cwd, env_list,644 p2cread, p2cwrite, c2pread, c2pwrite,645 errread, errwrite,646 errpipe_read, errpipe_write,647 restore_signals, start_new_session,648 process_group, gid, gids, uid, umask,649 preexec_fn)650 self._child_created = True651 finally:652 # be sure the FD is closed no matter what653 os.close(errpipe_write)654 655 self._close_pipe_fds(p2cread, p2cwrite,656 c2pread, c2pwrite,657 errread, errwrite)658 659 # Wait for exec to fail or succeed; possibly raising an660 # exception (limited in size)661 errpipe_data = bytearray()662 while True:663 part = os.read(errpipe_read, 50000)664 errpipe_data += part665 if not part or len(errpipe_data) > 50000:666 break667 finally:668 # be sure the FD is closed no matter what669 os.close(errpipe_read)670 671 if errpipe_data:672 try:673 pid, sts = os.waitpid(self.pid, 0)674 if pid == self.pid:675 self._handle_exitstatus(sts)676 else:677 self.returncode = sys.maxsize678 except ChildProcessError:679 pass680 681 try:682 exception_name, hex_errno, err_msg = (683 errpipe_data.split(b':', 2))684 # The encoding here should match the encoding685 # written in by the subprocess implementations686 # like _posixsubprocess687 err_msg = err_msg.decode()688 except ValueError:689 exception_name = b'SubprocessError'690 hex_errno = b'0'691 err_msg = 'Bad exception data from child: {!r}'.format(692 bytes(errpipe_data))693 child_exception_type = getattr(694 builtins, exception_name.decode('ascii'),695 SubprocessError)696 if issubclass(child_exception_type, OSError) and hex_errno:697 errno_num = int(hex_errno, 16)698 if err_msg == "noexec:chdir":699 err_msg = ""700 # The error must be from chdir(cwd).701 err_filename = cwd702 elif err_msg == "noexec":703 err_msg = ""704 err_filename = None705 else:706 err_filename = orig_executable707 if errno_num != 0:708 err_msg = os.strerror(errno_num)709 if err_filename is not None:710> raise child_exception_type(errno_num, err_msg, err_filename)711E FileNotFoundError: [Errno 2] No such file or directory: 'git'712713/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/subprocess.py:1990: FileNotFoundError714_________ TombstoneTests.test_tombstone_commits_only_the_removed_path __________715716self = <tests.test_skills.TombstoneTests testMethod=test_tombstone_commits_only_the_removed_path>717718 def setUp(self):719 self.tmp = tempfile.TemporaryDirectory()720 self.base = Path(self.tmp.name)721 self.repo = self.base / "repo"722 (self.repo / "skills" / "alpha").mkdir(parents=True)723 (self.repo / "skills" / "alpha" / "SKILL.md").write_text(724 "---\nname: alpha\ndescription: d\n---\n", encoding="utf-8")725 (self.repo / "unrelated.txt").write_text("keep me\n", encoding="utf-8")726> self._git("init")727728tests/test_skills.py:940: 729_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 730tests/test_skills.py:951: in _git731 return subprocess.run(["git", *args], cwd=str(self.repo),732/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/subprocess.py:555: in run733 with Popen(*popenargs, **kwargs) as process:734 ^^^^^^^^^^^^^^^^^^^^^^^^^^^735/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/subprocess.py:1039: in __init__736 self._execute_child(args, executable, preexec_fn, close_fds,737_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 738739self = <Popen: returncode: 255 args: ['git', 'init']>, args = ['git', 'init']740executable = b'git', preexec_fn = None, close_fds = True, pass_fds = ()741cwd = '/nix/var/nix/builds/nix-50546-3925796131/tmpm8r4qd0j/repo', env = None742startupinfo = None, creationflags = 0, shell = False, p2cread = -1743p2cwrite = -1, c2pread = 14, c2pwrite = 15, errread = 16, errwrite = 17744restore_signals = True, gid = None, gids = None, uid = None, umask = -1745start_new_session = False, process_group = -1746747 def _execute_child(self, args, executable, preexec_fn, close_fds,748 pass_fds, cwd, env,749 startupinfo, creationflags, shell,750 p2cread, p2cwrite,751 c2pread, c2pwrite,752 errread, errwrite,753 restore_signals,754 gid, gids, uid, umask,755 start_new_session, process_group):756 """Execute program (POSIX version)"""757 758 if isinstance(args, (str, bytes)):759 args = [args]760 elif isinstance(args, os.PathLike):761 if shell:762 raise TypeError('path-like args is not allowed when '763 'shell is true')764 args = [args]765 else:766 args = list(args)767 768 if shell:769 # On Android the default shell is at '/system/bin/sh'.770 unix_shell = ('/system/bin/sh' if771 hasattr(sys, 'getandroidapilevel') else '/nix/store/lb6nd0iyy9x0bm7yfx2fkw0wbjllg4ic-bash-5.3p15/bin/sh')772 args = [unix_shell, "-c"] + args773 if executable:774 args[0] = executable775 776 if executable is None:777 executable = args[0]778 779 sys.audit("subprocess.Popen", executable, args, cwd, env)780 781 if (_USE_POSIX_SPAWN782 and os.path.dirname(executable)783 and preexec_fn is None784 and (not close_fds or _HAVE_POSIX_SPAWN_CLOSEFROM)785 and not pass_fds786 and cwd is None787 and (p2cread == -1 or p2cread > 2)788 and (c2pwrite == -1 or c2pwrite > 2)789 and (errwrite == -1 or errwrite > 2)790 and not start_new_session791 and process_group == -1792 and gid is None793 and gids is None794 and uid is None795 and umask < 0):796 self._posix_spawn(args, executable, env, restore_signals, close_fds,797 p2cread, p2cwrite,798 c2pread, c2pwrite,799 errread, errwrite)800 return801 802 orig_executable = executable803 804 # For transferring possible exec failure from child to parent.805 # Data format: "exception name:hex errno:description"806 # Pickle is not used; it is complex and involves memory allocation.807 errpipe_read, errpipe_write = os.pipe()808 # errpipe_write must not be in the standard io 0, 1, or 2 fd range.809 low_fds_to_close = []810 while errpipe_write < 3:811 low_fds_to_close.append(errpipe_write)812 errpipe_write = os.dup(errpipe_write)813 for low_fd in low_fds_to_close:814 os.close(low_fd)815 try:816 try:817 # We must avoid complex work that could involve818 # malloc or free in the child process to avoid819 # potential deadlocks, thus we do all this here.820 # and pass it to fork_exec()821 822 if env is not None:823 env_list = []824 for k, v in env.items():825 k = os.fsencode(k)826 if b'=' in k:827 raise ValueError("illegal environment variable name")828 env_list.append(k + b'=' + os.fsencode(v))829 else:830 env_list = None # Use execv instead of execve.831 executable = os.fsencode(executable)832 if os.path.dirname(executable):833 executable_list = (executable,)834 else:835 # This matches the behavior of os._execvpe().836 executable_list = tuple(837 os.path.join(os.fsencode(dir), executable)838 for dir in os.get_exec_path(env))839 fds_to_keep = set(pass_fds)840 fds_to_keep.add(errpipe_write)841 self.pid = _fork_exec(842 args, executable_list,843 close_fds, tuple(sorted(map(int, fds_to_keep))),844 cwd, env_list,845 p2cread, p2cwrite, c2pread, c2pwrite,846 errread, errwrite,847 errpipe_read, errpipe_write,848 restore_signals, start_new_session,849 process_group, gid, gids, uid, umask,850 preexec_fn)851 self._child_created = True852 finally:853 # be sure the FD is closed no matter what854 os.close(errpipe_write)855 856 self._close_pipe_fds(p2cread, p2cwrite,857 c2pread, c2pwrite,858 errread, errwrite)859 860 # Wait for exec to fail or succeed; possibly raising an861 # exception (limited in size)862 errpipe_data = bytearray()863 while True:864 part = os.read(errpipe_read, 50000)865 errpipe_data += part866 if not part or len(errpipe_data) > 50000:867 break868 finally:869 # be sure the FD is closed no matter what870 os.close(errpipe_read)871 872 if errpipe_data:873 try:874 pid, sts = os.waitpid(self.pid, 0)875 if pid == self.pid:876 self._handle_exitstatus(sts)877 else:878 self.returncode = sys.maxsize879 except ChildProcessError:880 pass881 882 try:883 exception_name, hex_errno, err_msg = (884 errpipe_data.split(b':', 2))885 # The encoding here should match the encoding886 # written in by the subprocess implementations887 # like _posixsubprocess888 err_msg = err_msg.decode()889 except ValueError:890 exception_name = b'SubprocessError'891 hex_errno = b'0'892 err_msg = 'Bad exception data from child: {!r}'.format(893 bytes(errpipe_data))894 child_exception_type = getattr(895 builtins, exception_name.decode('ascii'),896 SubprocessError)897 if issubclass(child_exception_type, OSError) and hex_errno:898 errno_num = int(hex_errno, 16)899 if err_msg == "noexec:chdir":900 err_msg = ""901 # The error must be from chdir(cwd).902 err_filename = cwd903 elif err_msg == "noexec":904 err_msg = ""905 err_filename = None906 else:907 err_filename = orig_executable908 if errno_num != 0:909 err_msg = os.strerror(errno_num)910 if err_filename is not None:911> raise child_exception_type(errno_num, err_msg, err_filename)912E FileNotFoundError: [Errno 2] No such file or directory: 'git'913914/nix/store/4l8r0s2r5fna7src82b5fc2hixdvfyw0-python3-3.14.7/lib/python3.14/subprocess.py:1990: FileNotFoundError915=========================== short test summary info ============================916FAILED tests/test_skills.py::TombstoneTests::test_removal_uses_the_shared_graveyard_when_given_one - FileNotFoundError: [Errno 2] No such file or directory: 'git'917FAILED tests/test_skills.py::TombstoneTests::test_removal_without_a_repo_still_archives - FileNotFoundError: [Errno 2] No such file or directory: 'git'918FAILED tests/test_skills.py::TombstoneTests::test_tombstone_commits_only_the_removed_path - FileNotFoundError: [Errno 2] No such file or directory: 'git'919============= 3 failed, 1046 passed, 1 skipped in 79.76s (0:01:19) =============