taskcluster-taskgraph 23.0.0__tar.gz → 23.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (270) hide show
  1. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/CHANGELOG.md +13 -0
  2. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/PKG-INFO +1 -1
  3. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/pyproject.toml +1 -1
  4. taskcluster_taskgraph-23.1.0/renovate.json +6 -0
  5. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/actions/util.py +1 -1
  6. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/generator.py +14 -0
  7. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/main.py +5 -0
  8. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/taskgraph.py +3 -1
  9. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/schema.py +15 -7
  10. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/config.yml +1 -0
  11. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/docker/index-task/package.json +1 -1
  12. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/docker/index-task/yarn.lock +67 -74
  13. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/kinds/test/linux.yml +20 -0
  14. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/template/{{cookiecutter.project_name}}/taskcluster/config.yml +3 -3
  15. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/conftest.py +18 -2
  16. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_generator.py +46 -3
  17. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_main.py +40 -0
  18. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_taskgraph.py +36 -0
  19. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_util_schema.py +40 -5
  20. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/uv.lock +1283 -608
  21. taskcluster_taskgraph-23.0.0/.github/dependabot.yml +0 -19
  22. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/.codespell-ignore-words.txt +0 -0
  23. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/.github/CODEOWNERS +0 -0
  24. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/.github/workflows/codeql-analysis.yml +0 -0
  25. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/.github/workflows/pre-commit-autoupdate.yml +0 -0
  26. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/.github/workflows/pre-commit.yml +0 -0
  27. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/.github/workflows/pypi-publish.yml +0 -0
  28. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/.gitignore +0 -0
  29. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/.pre-commit-config.yaml +0 -0
  30. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/.readthedocs.yaml +0 -0
  31. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/.taskcluster.yml +0 -0
  32. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/.yamllint +0 -0
  33. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/CODE_OF_CONDUCT.md +0 -0
  34. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/CONTRIBUTING.rst +0 -0
  35. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/LICENSE +0 -0
  36. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/Makefile +0 -0
  37. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/README.rst +0 -0
  38. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/concepts/index.rst +0 -0
  39. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/concepts/kind.rst +0 -0
  40. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/concepts/loading.rst +0 -0
  41. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/concepts/optimization.rst +0 -0
  42. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/concepts/overview.rst +0 -0
  43. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/concepts/scopes.rst +0 -0
  44. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/concepts/task-graphs.rst +0 -0
  45. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/concepts/transforms.rst +0 -0
  46. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/conf.py +0 -0
  47. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/contributing.rst +0 -0
  48. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/glossary.rst +0 -0
  49. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/howto/bootstrap-taskgraph.rst +0 -0
  50. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/howto/create-actions.rst +0 -0
  51. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/howto/create-tasks.rst +0 -0
  52. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/howto/debugging.rst +0 -0
  53. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/howto/define-schemas.rst +0 -0
  54. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/howto/docker.rst +0 -0
  55. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/howto/index.rst +0 -0
  56. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/howto/load-task-locally.rst +0 -0
  57. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/howto/resolve-keyed-by.rst +0 -0
  58. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/howto/run-locally.rst +0 -0
  59. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/howto/send-notifications.rst +0 -0
  60. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/howto/use-fetches.rst +0 -0
  61. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/index.rst +0 -0
  62. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/reference/cli.rst +0 -0
  63. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/reference/index.rst +0 -0
  64. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/reference/migrations.rst +0 -0
  65. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/reference/optimization-strategies.rst +0 -0
  66. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/reference/parameters.rst +0 -0
  67. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/reference/source/modules.rst +0 -0
  68. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/reference/source/taskgraph.actions.rst +0 -0
  69. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/reference/source/taskgraph.loader.rst +0 -0
  70. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/reference/source/taskgraph.optimize.rst +0 -0
  71. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/reference/source/taskgraph.rst +0 -0
  72. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/reference/source/taskgraph.transforms.rst +0 -0
  73. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/reference/source/taskgraph.transforms.run.rst +0 -0
  74. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/reference/source/taskgraph.util.rst +0 -0
  75. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/reference/transforms/chunking.rst +0 -0
  76. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/reference/transforms/from_deps.rst +0 -0
  77. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/reference/transforms/index.rst +0 -0
  78. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/reference/transforms/matrix.rst +0 -0
  79. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/reference/transforms/task_context.rst +0 -0
  80. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/tutorials/connecting-taskcluster.rst +0 -0
  81. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/tutorials/creating-a-task-graph.rst +0 -0
  82. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/tutorials/example-taskcluster.yml +0 -0
  83. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/tutorials/getting-started.rst +0 -0
  84. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/docs/tutorials/index.rst +0 -0
  85. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/make.bat +0 -0
  86. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/packages/pytest-taskgraph/README.md +0 -0
  87. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/packages/pytest-taskgraph/pyproject.toml +0 -0
  88. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/packages/pytest-taskgraph/src/pytest_taskgraph/__init__.py +0 -0
  89. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/packages/pytest-taskgraph/src/pytest_taskgraph/fixtures/gen.py +0 -0
  90. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/packages/pytest-taskgraph/src/pytest_taskgraph/fixtures/vcs.py +0 -0
  91. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/packages/sphinx-taskgraph/README.md +0 -0
  92. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/packages/sphinx-taskgraph/pyproject.toml +0 -0
  93. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/packages/sphinx-taskgraph/src/sphinx_taskgraph/__init__.py +0 -0
  94. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/packages/sphinx-taskgraph/src/sphinx_taskgraph/autoschema.py +0 -0
  95. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/__init__.py +0 -0
  96. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/actions/__init__.py +0 -0
  97. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/actions/add_new_jobs.py +0 -0
  98. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/actions/cancel.py +0 -0
  99. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/actions/cancel_all.py +0 -0
  100. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/actions/rebuild_cached_tasks.py +0 -0
  101. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/actions/registry.py +0 -0
  102. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/actions/retrigger.py +0 -0
  103. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/config.py +0 -0
  104. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/create.py +0 -0
  105. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/decision.py +0 -0
  106. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/docker.py +0 -0
  107. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/filter_tasks.py +0 -0
  108. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/graph.py +0 -0
  109. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/loader/__init__.py +0 -0
  110. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/loader/default.py +0 -0
  111. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/loader/transform.py +0 -0
  112. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/morph.py +0 -0
  113. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/optimize/__init__.py +0 -0
  114. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/optimize/base.py +0 -0
  115. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/optimize/strategies.py +0 -0
  116. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/parameters.py +0 -0
  117. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/run-task/fetch-content +0 -0
  118. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/run-task/hgrc +0 -0
  119. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/run-task/robustcheckout.py +0 -0
  120. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/run-task/run-task +0 -0
  121. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/target_tasks.py +0 -0
  122. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/task.py +0 -0
  123. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/transforms/__init__.py +0 -0
  124. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/transforms/base.py +0 -0
  125. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/transforms/cached_tasks.py +0 -0
  126. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/transforms/chunking.py +0 -0
  127. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/transforms/code_review.py +0 -0
  128. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/transforms/docker_image.py +0 -0
  129. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/transforms/fetch.py +0 -0
  130. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/transforms/from_deps.py +0 -0
  131. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/transforms/matrix.py +0 -0
  132. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/transforms/notify.py +0 -0
  133. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/transforms/run/__init__.py +0 -0
  134. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/transforms/run/common.py +0 -0
  135. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/transforms/run/index_search.py +0 -0
  136. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/transforms/run/run_task.py +0 -0
  137. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/transforms/run/toolchain.py +0 -0
  138. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/transforms/task.py +0 -0
  139. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/transforms/task_context.py +0 -0
  140. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/__init__.py +0 -0
  141. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/archive.py +0 -0
  142. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/attributes.py +0 -0
  143. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/cached_tasks.py +0 -0
  144. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/caches.py +0 -0
  145. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/copy.py +0 -0
  146. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/dependencies.py +0 -0
  147. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/docker.py +0 -0
  148. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/hash.py +0 -0
  149. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/json.py +0 -0
  150. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/keyed_by.py +0 -0
  151. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/parameterization.py +0 -0
  152. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/path.py +0 -0
  153. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/python_path.py +0 -0
  154. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/readonlydict.py +0 -0
  155. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/set_name.py +0 -0
  156. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/shell.py +0 -0
  157. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/taskcluster.py +0 -0
  158. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/taskgraph.py +0 -0
  159. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/templates.py +0 -0
  160. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/time.py +0 -0
  161. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/treeherder.py +0 -0
  162. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/vcs.py +0 -0
  163. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/verify.py +0 -0
  164. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/workertypes.py +0 -0
  165. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/src/taskgraph/util/yaml.py +0 -0
  166. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/docker/REGISTRY +0 -0
  167. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/docker/decision/Dockerfile +0 -0
  168. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/docker/decision/HASH +0 -0
  169. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/docker/decision/README.md +0 -0
  170. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/docker/decision/VERSION +0 -0
  171. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/docker/decision/system-setup.sh +0 -0
  172. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/docker/fetch/Dockerfile +0 -0
  173. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/docker/image_builder/README.rst +0 -0
  174. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/docker/index-task/Dockerfile +0 -0
  175. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/docker/index-task/README +0 -0
  176. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/docker/index-task/insert-indexes.js +0 -0
  177. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/docker/python/Dockerfile +0 -0
  178. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/docker/run-task/Dockerfile +0 -0
  179. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/docker/run-task/system-setup.sh +0 -0
  180. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/docker/skopeo/Dockerfile +0 -0
  181. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/docker/skopeo/policy.json +0 -0
  182. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/docker/skopeo/push_image.sh +0 -0
  183. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/kinds/check/kind.yml +0 -0
  184. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/kinds/codecov/kind.yml +0 -0
  185. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/kinds/complete/kind.yml +0 -0
  186. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/kinds/doc/kind.yml +0 -0
  187. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/kinds/docker-image/kind.yml +0 -0
  188. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/kinds/fetch/kind.yml +0 -0
  189. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/kinds/push-image/kind.yml +0 -0
  190. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/kinds/test/kind.yml +0 -0
  191. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/kinds/test/windows.yml +0 -0
  192. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/scripts/codecov-upload.py +0 -0
  193. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/self_taskgraph/__init__.py +0 -0
  194. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/self_taskgraph/custom_parameters.py +0 -0
  195. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/self_taskgraph/custom_target_tasks.py +0 -0
  196. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/self_taskgraph/transforms/add_pr_route.py +0 -0
  197. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/self_taskgraph/transforms/push_image.py +0 -0
  198. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/test/params/main-repo-pull-request-untrusted.yml +0 -0
  199. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/test/params/main-repo-pull-request.yml +0 -0
  200. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/test/params/main-repo-push.yml +0 -0
  201. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/test/params/main-repo-release-pytest-taskgraph.yml +0 -0
  202. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/taskcluster/test/params/main-repo-release-taskcluster-taskgraph.yml +0 -0
  203. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/template/cookiecutter.json +0 -0
  204. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/template/hooks/post_gen_project.py +0 -0
  205. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/template/{{cookiecutter.project_name}}/taskcluster/docker/linux/Dockerfile +0 -0
  206. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/template/{{cookiecutter.project_name}}/taskcluster/kinds/docker-image/kind.yml +0 -0
  207. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/template/{{cookiecutter.project_name}}/taskcluster/kinds/hello/kind.yml +0 -0
  208. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/template/{{cookiecutter.project_name}}/taskcluster/{{cookiecutter.project_slug}}_taskgraph/transforms/hello.py +0 -0
  209. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/template/{{cookiecutter.project_name}}/taskcluster.github.yml +0 -0
  210. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/__init__.py +0 -0
  211. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/automationrelevance.json +0 -0
  212. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/data/task_context.yml +0 -0
  213. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/data/taskcluster/config.yml +0 -0
  214. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/data/taskcluster/docker/hello-world/Dockerfile +0 -0
  215. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/data/taskcluster/docker/hello-world-tag/Dockerfile +0 -0
  216. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/data/taskcluster/docker/hello-world-tag/REGISTRY +0 -0
  217. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/data/taskcluster/docker/hello-world-tag/VERSION +0 -0
  218. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/data/taskcluster/kinds/docker-image/kind.yml +0 -0
  219. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/data/taskcluster/scripts/toolchain/run.ps1 +0 -0
  220. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/data/taskcluster/scripts/toolchain/run.sh +0 -0
  221. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/data/taskcluster/test_taskgraph/transforms/foo.py +0 -0
  222. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/data/testmod/thing.py +0 -0
  223. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/mockedopen.py +0 -0
  224. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_actions_rebuild_cached_tasks.py +0 -0
  225. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_actions_registry.py +0 -0
  226. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_config.py +0 -0
  227. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_create.py +0 -0
  228. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_decision.py +0 -0
  229. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_docker.py +0 -0
  230. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_graph.py +0 -0
  231. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_morph.py +0 -0
  232. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_optimize.py +0 -0
  233. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_optimize_strategies.py +0 -0
  234. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_parameters.py +0 -0
  235. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_scripts_fetch_content.py +0 -0
  236. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_scripts_run_task.py +0 -0
  237. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_target_tasks.py +0 -0
  238. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_transform_chunking.py +0 -0
  239. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_transform_docker_image.py +0 -0
  240. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_transform_task_context.py +0 -0
  241. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_transforms_base.py +0 -0
  242. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_transforms_cached_tasks.py +0 -0
  243. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_transforms_fetch.py +0 -0
  244. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_transforms_from_deps.py +0 -0
  245. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_transforms_matrix.py +0 -0
  246. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_transforms_notify.py +0 -0
  247. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_transforms_run.py +0 -0
  248. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_transforms_run_run_task.py +0 -0
  249. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_transforms_run_toolchain.py +0 -0
  250. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_transforms_task.py +0 -0
  251. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_util_archive.py +0 -0
  252. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_util_attributes.py +0 -0
  253. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_util_cached_tasks.py +0 -0
  254. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_util_copy.py +0 -0
  255. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_util_dependencies.py +0 -0
  256. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_util_docker.py +0 -0
  257. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_util_json.py +0 -0
  258. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_util_keyed_by.py +0 -0
  259. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_util_parameterization.py +0 -0
  260. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_util_path.py +0 -0
  261. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_util_python_path.py +0 -0
  262. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_util_readonlydict.py +0 -0
  263. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_util_taskcluster.py +0 -0
  264. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_util_templates.py +0 -0
  265. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_util_time.py +0 -0
  266. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_util_treeherder.py +0 -0
  267. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_util_vcs.py +0 -0
  268. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_util_verify.py +0 -0
  269. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_util_workertypes.py +0 -0
  270. {taskcluster_taskgraph-23.0.0 → taskcluster_taskgraph-23.1.0}/test/test_util_yaml.py +0 -0
@@ -1,5 +1,18 @@
1
1
  # Change Log
2
2
 
3
+ ## [23.1.0] - 2026-05-26
4
+
5
+ ### Added
6
+
7
+ - Updated worker types in the `.taskcluster.yml` template for the d2g migration
8
+
9
+ ### Fixed
10
+
11
+ - `TaskGraph.from_json` now skips dependencies pointing at external taskIds (e.g. from replaced or cached tasks) when rebuilding edges, instead of producing edges to non-existent graph nodes
12
+ - Schema validation errors now display a clean message instead of a noisy traceback
13
+ - Pinned `taskcluster-client` to work around an upstream issue
14
+ - `fetch_graph_and_labels` now handles `HTTPError` instances where `response` is `None`
15
+
3
16
  ## [23.0.0] - 2026-05-04
4
17
 
5
18
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taskcluster-taskgraph
3
- Version: 23.0.0
3
+ Version: 23.1.0
4
4
  Summary: Build taskcluster taskgraphs
5
5
  Project-URL: Repository, https://github.com/taskcluster/taskgraph
6
6
  Project-URL: Issues, https://github.com/taskcluster/taskgraph/issues
@@ -1,7 +1,7 @@
1
1
  ### Project
2
2
  [project]
3
3
  name = "taskcluster-taskgraph"
4
- version = "23.0.0"
4
+ version = "23.1.0"
5
5
  description = "Build taskcluster taskgraphs"
6
6
  readme = "README.rst"
7
7
  authors = [
@@ -0,0 +1,6 @@
1
+ {
2
+ "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3
+ "extends": [
4
+ "github>mozilla-releng/reps:renovate-preset.json5"
5
+ ]
6
+ }
@@ -85,7 +85,7 @@ def fetch_graph_and_labels(parameters, graph_config, task_group_id=None):
85
85
  run_label_to_id = get_artifact(task_id, "public/label-to-taskid.json")
86
86
  label_to_taskid.update(run_label_to_id) # type: ignore
87
87
  except HTTPError as e:
88
- if e.response.status_code != 404:
88
+ if e.response is None or e.response.status_code != 404:
89
89
  raise
90
90
  logger.debug(f"No label-to-taskid.json found for {task_id}: {e}")
91
91
 
@@ -27,6 +27,7 @@ from .task import Task
27
27
  from .taskgraph import TaskGraph
28
28
  from .transforms.base import TransformConfig, TransformSequence
29
29
  from .util.python_path import find_object
30
+ from .util.schema import SchemaValidationError
30
31
  from .util.verify import verifications
31
32
  from .util.yaml import load_yaml
32
33
 
@@ -303,6 +304,9 @@ class TaskGraphGenerator:
303
304
  },
304
305
  self._write_artifacts,
305
306
  )
307
+ except SchemaValidationError as exc:
308
+ logger.error(f"Error loading tasks for kind {kind_name}:\n{exc}")
309
+ raise
306
310
  except Exception:
307
311
  logger.exception(f"Error loading tasks for kind {kind_name}:")
308
312
  raise
@@ -358,6 +362,16 @@ class TaskGraphGenerator:
358
362
  for future in done:
359
363
  if exc := future.exception():
360
364
  executor.shutdown(wait=False, cancel_futures=True)
365
+ kind_name = futures_to_kind.get(future, "?")
366
+ if isinstance(exc, SchemaValidationError):
367
+ logger.error(
368
+ f"Error loading tasks for kind {kind_name}:\n{exc}"
369
+ )
370
+ else:
371
+ logger.error(
372
+ f"Error loading tasks for kind {kind_name}:",
373
+ exc_info=(type(exc), exc, exc.__traceback__),
374
+ )
361
375
  raise exc
362
376
  kind = futures_to_kind.pop(future)
363
377
  futures.remove(future)
@@ -22,6 +22,8 @@ from urllib.parse import urlparse
22
22
  import appdirs
23
23
  import yaml
24
24
 
25
+ from taskgraph.util.schema import SchemaValidationError
26
+
25
27
  Command = namedtuple("Command", ["func", "args", "kwargs", "defaults"])
26
28
  commands = {}
27
29
 
@@ -1207,6 +1209,9 @@ def main(args=sys.argv[1:]):
1207
1209
  args = parser.parse_args(args)
1208
1210
  try:
1209
1211
  return args.command(vars(args))
1212
+ except SchemaValidationError:
1213
+ # Message was already logged; skip the traceback for user input errors.
1214
+ sys.exit(1)
1210
1215
  except Exception:
1211
1216
  traceback.print_exc()
1212
1217
  sys.exit(1)
@@ -63,6 +63,8 @@ class TaskGraph:
63
63
  if "task_id" in value:
64
64
  tasks[key].task_id = value["task_id"]
65
65
  for depname, dep in value["dependencies"].items():
66
- edges.add((key, dep, depname))
66
+ # Task filtering can cause dependencies to be removed from the graph.
67
+ if dep in tasks_dict:
68
+ edges.add((key, dep, depname))
67
69
  task_graph = cls(tasks, Graph(frozenset(tasks), edges))
68
70
  return tasks, task_graph
@@ -23,6 +23,14 @@ TaskPriority = Literal[
23
23
  ]
24
24
 
25
25
 
26
+ class SchemaValidationError(Exception):
27
+ """Raised when user-supplied data fails schema validation.
28
+
29
+ Callers should display the message without a Python traceback, since
30
+ these reflect input errors rather than programmer bugs.
31
+ """
32
+
33
+
26
34
  def validate_schema(schema, obj, msg_prefix):
27
35
  """
28
36
  Validate that object satisfies schema. If not, generate a useful exception
@@ -65,9 +73,13 @@ def validate_schema(schema, obj, msg_prefix):
65
73
  msg = [msg_prefix]
66
74
  for error in exc.errors:
67
75
  msg.append(str(error))
68
- raise Exception("\n".join(msg) + "\n" + pprint.pformat(obj))
76
+ raise SchemaValidationError(
77
+ "\n".join(msg) + "\n" + pprint.pformat(obj)
78
+ ) from None
69
79
  else:
70
- raise Exception(f"{msg_prefix}\n{str(exc)}\n{pprint.pformat(obj)}")
80
+ raise SchemaValidationError(
81
+ f"{msg_prefix}\n{str(exc)}\n{pprint.pformat(obj)}"
82
+ ) from None
71
83
 
72
84
 
73
85
  class OptionallyKeyedBy:
@@ -456,11 +468,7 @@ class Schema(
456
468
  """Validate data against this schema."""
457
469
  if taskgraph.fast:
458
470
  return data
459
-
460
- try:
461
- msgspec.convert(data, cls)
462
- except (msgspec.ValidationError, msgspec.DecodeError) as e:
463
- raise msgspec.ValidationError(str(e))
471
+ msgspec.convert(data, cls)
464
472
 
465
473
 
466
474
  class IndexSchema(Schema):
@@ -8,6 +8,7 @@ treeherder:
8
8
  'doc': 'Documentation tasks'
9
9
  'unit': 'Unit test tasks'
10
10
  'unit-multithread': 'Unit test tasks with multithreading enabled'
11
+ 'unit-serial': 'Unit test tasks with serial enabled'
11
12
  'integration': 'Integration test tasks'
12
13
 
13
14
  index:
@@ -4,7 +4,7 @@
4
4
  "start": "node index.js"
5
5
  },
6
6
  "dependencies": {
7
- "taskcluster-client": "^55.3"
7
+ "taskcluster-client": "55.3.2"
8
8
  },
9
9
  "engines": {
10
10
  "node": "18"
@@ -41,26 +41,21 @@
41
41
  defer-to-connect "^2.0.0"
42
42
 
43
43
  "@types/cacheable-request@^6.0.1":
44
- version "6.0.2"
45
- resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9"
46
- integrity sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==
44
+ version "6.0.3"
45
+ resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183"
46
+ integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==
47
47
  dependencies:
48
48
  "@types/http-cache-semantics" "*"
49
- "@types/keyv" "*"
49
+ "@types/keyv" "^3.1.4"
50
50
  "@types/node" "*"
51
- "@types/responselike" "*"
51
+ "@types/responselike" "^1.0.0"
52
52
 
53
53
  "@types/http-cache-semantics@*":
54
- version "4.0.1"
55
- resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812"
56
- integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==
57
-
58
- "@types/json-buffer@~3.0.0":
59
- version "3.0.0"
60
- resolved "https://registry.yarnpkg.com/@types/json-buffer/-/json-buffer-3.0.0.tgz#85c1ff0f0948fc159810d4b5be35bf8c20875f64"
61
- integrity sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==
54
+ version "4.2.0"
55
+ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz#f6a7788f438cbfde15f29acad46512b4c01913b3"
56
+ integrity sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==
62
57
 
63
- "@types/keyv@*":
58
+ "@types/keyv@^3.1.4":
64
59
  version "3.1.4"
65
60
  resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6"
66
61
  integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==
@@ -68,14 +63,16 @@
68
63
  "@types/node" "*"
69
64
 
70
65
  "@types/node@*":
71
- version "18.0.0"
72
- resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.0.tgz#67c7b724e1bcdd7a8821ce0d5ee184d3b4dd525a"
73
- integrity sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==
74
-
75
- "@types/responselike@*", "@types/responselike@^1.0.0":
76
- version "1.0.0"
77
- resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29"
78
- integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==
66
+ version "25.9.1"
67
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-25.9.1.tgz#3bda556db500ae4319c08e7fc9ab94f19013ba0b"
68
+ integrity sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==
69
+ dependencies:
70
+ undici-types ">=7.24.0 <7.24.7"
71
+
72
+ "@types/responselike@^1.0.0":
73
+ version "1.0.3"
74
+ resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50"
75
+ integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==
79
76
  dependencies:
80
77
  "@types/node" "*"
81
78
 
@@ -85,9 +82,9 @@ cacheable-lookup@^5.0.3:
85
82
  integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==
86
83
 
87
84
  cacheable-request@^7.0.2:
88
- version "7.0.2"
89
- resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27"
90
- integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==
85
+ version "7.0.4"
86
+ resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817"
87
+ integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==
91
88
  dependencies:
92
89
  clone-response "^1.0.2"
93
90
  get-stream "^5.1.0"
@@ -98,26 +95,18 @@ cacheable-request@^7.0.2:
98
95
  responselike "^2.0.0"
99
96
 
100
97
  clone-response@^1.0.2:
101
- version "1.0.2"
102
- resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
103
- integrity sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==
98
+ version "1.0.3"
99
+ resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3"
100
+ integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==
104
101
  dependencies:
105
102
  mimic-response "^1.0.0"
106
103
 
107
- compress-brotli@^1.3.8:
108
- version "1.3.8"
109
- resolved "https://registry.yarnpkg.com/compress-brotli/-/compress-brotli-1.3.8.tgz#0c0a60c97a989145314ec381e84e26682e7b38db"
110
- integrity sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==
111
- dependencies:
112
- "@types/json-buffer" "~3.0.0"
113
- json-buffer "~3.0.1"
114
-
115
104
  debug@^4.1.1:
116
- version "4.3.4"
117
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
118
- integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
105
+ version "4.4.3"
106
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a"
107
+ integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==
119
108
  dependencies:
120
- ms "2.1.2"
109
+ ms "^2.1.3"
121
110
 
122
111
  decompress-response@^6.0.0:
123
112
  version "6.0.0"
@@ -132,9 +121,9 @@ defer-to-connect@^2.0.0:
132
121
  integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==
133
122
 
134
123
  end-of-stream@^1.1.0:
135
- version "1.4.4"
136
- resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
137
- integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
124
+ version "1.4.5"
125
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c"
126
+ integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==
138
127
  dependencies:
139
128
  once "^1.4.0"
140
129
 
@@ -146,9 +135,9 @@ get-stream@^5.1.0:
146
135
  pump "^3.0.0"
147
136
 
148
137
  got@^11.8.1:
149
- version "11.8.5"
150
- resolved "https://registry.yarnpkg.com/got/-/got-11.8.5.tgz#ce77d045136de56e8f024bebb82ea349bc730046"
151
- integrity sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==
138
+ version "11.8.6"
139
+ resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a"
140
+ integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==
152
141
  dependencies:
153
142
  "@sindresorhus/is" "^4.0.0"
154
143
  "@szmarczak/http-timer" "^4.0.5"
@@ -163,9 +152,9 @@ got@^11.8.1:
163
152
  responselike "^2.0.0"
164
153
 
165
154
  hawk@^9.0.1:
166
- version "9.0.1"
167
- resolved "https://registry.yarnpkg.com/hawk/-/hawk-9.0.1.tgz#0be51769103e76fe97a97ae7fa356c313bb93160"
168
- integrity sha512-H2E+5ATFEXmorgVzYl3NzG3PCo2e+euYrHDnRpLLdOtJrQHGRXrJT9/joWnrkHCtzDZkaNoLXg/+TsSkD06eNg==
155
+ version "9.0.2"
156
+ resolved "https://registry.yarnpkg.com/hawk/-/hawk-9.0.2.tgz#64b18c109d86b3a4b3174a76169f2c868297d0c0"
157
+ integrity sha512-EJMLBZAWg+EoI/aAJWDhrYGvucWYvY37CdGXolkol0ITGswkDHtDnjbFcPBaIv3jbtpfWqYjXMm4KhfXPOLCRg==
169
158
  dependencies:
170
159
  "@hapi/b64" "5.x.x"
171
160
  "@hapi/boom" "9.x.x"
@@ -173,9 +162,9 @@ hawk@^9.0.1:
173
162
  "@hapi/hoek" "9.x.x"
174
163
 
175
164
  http-cache-semantics@^4.0.0:
176
- version "4.1.0"
177
- resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
178
- integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
165
+ version "4.2.0"
166
+ resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz#205f4db64f8562b76a4ff9235aa5279839a09dd5"
167
+ integrity sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==
179
168
 
180
169
  http2-wrapper@^1.0.0-beta.5.2:
181
170
  version "1.0.3"
@@ -185,23 +174,22 @@ http2-wrapper@^1.0.0-beta.5.2:
185
174
  quick-lru "^5.1.1"
186
175
  resolve-alpn "^1.0.0"
187
176
 
188
- json-buffer@3.0.1, json-buffer@~3.0.1:
177
+ json-buffer@3.0.1:
189
178
  version "3.0.1"
190
179
  resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
191
180
  integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
192
181
 
193
182
  keyv@^4.0.0:
194
- version "4.3.2"
195
- resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.3.2.tgz#e839df676a0c7ee594c8835e7c1c83742558e5c2"
196
- integrity sha512-kn8WmodVBe12lmHpA6W8OY7SNh6wVR+Z+wZESF4iF5FCazaVXGWOtnbnvX0tMQ1bO+/TmOD9LziuYMvrIIs0xw==
183
+ version "4.5.4"
184
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
185
+ integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
197
186
  dependencies:
198
- compress-brotli "^1.3.8"
199
187
  json-buffer "3.0.1"
200
188
 
201
189
  lodash@^4.17.4:
202
- version "4.17.21"
203
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
204
- integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
190
+ version "4.18.1"
191
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c"
192
+ integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==
205
193
 
206
194
  lowercase-keys@^2.0.0:
207
195
  version "2.0.0"
@@ -218,10 +206,10 @@ mimic-response@^3.1.0:
218
206
  resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
219
207
  integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
220
208
 
221
- ms@2.1.2:
222
- version "2.1.2"
223
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
224
- integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
209
+ ms@^2.1.3:
210
+ version "2.1.3"
211
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
212
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
225
213
 
226
214
  normalize-url@^6.0.1:
227
215
  version "6.1.0"
@@ -241,9 +229,9 @@ p-cancelable@^2.0.0:
241
229
  integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==
242
230
 
243
231
  pump@^3.0.0:
244
- version "3.0.0"
245
- resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
246
- integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
232
+ version "3.0.4"
233
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.4.tgz#1f313430527fa8b905622ebd22fe1444e757ab3c"
234
+ integrity sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==
247
235
  dependencies:
248
236
  end-of-stream "^1.1.0"
249
237
  once "^1.3.1"
@@ -259,9 +247,9 @@ resolve-alpn@^1.0.0:
259
247
  integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==
260
248
 
261
249
  responselike@^2.0.0:
262
- version "2.0.0"
263
- resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723"
264
- integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==
250
+ version "2.0.1"
251
+ resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc"
252
+ integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==
265
253
  dependencies:
266
254
  lowercase-keys "^2.0.0"
267
255
 
@@ -272,7 +260,7 @@ slugid@^4.0.0:
272
260
  dependencies:
273
261
  uuid "^9.0.0"
274
262
 
275
- taskcluster-client@^55.3:
263
+ taskcluster-client@55.3.2:
276
264
  version "55.3.2"
277
265
  resolved "https://registry.yarnpkg.com/taskcluster-client/-/taskcluster-client-55.3.2.tgz#1b518dee818a58ac3a325dfda3772449e5a331c8"
278
266
  integrity sha512-EmPpIaNQsciBbitOC78QvV9MOjUnrDIShBjdJZOxn7NyHXeZIR3m4nZt9M/FeoyEOpm7EHYaij/lABF7GLMjWA==
@@ -285,9 +273,14 @@ taskcluster-client@^55.3:
285
273
  taskcluster-lib-urls "^13.0.0"
286
274
 
287
275
  taskcluster-lib-urls@^13.0.0:
288
- version "13.0.1"
289
- resolved "https://registry.yarnpkg.com/taskcluster-lib-urls/-/taskcluster-lib-urls-13.0.1.tgz#773da8bb9937a52f77ad128961b8d501dfdd042a"
290
- integrity sha512-WrhKMbiWmpPrB0vbzLZq4W35mhdPVLklZY+qrBoI7KQzFAjO/qsgS8ssHL6eYmvBf4fE7C+C9ZFxQpQOUynQvg==
276
+ version "13.0.2"
277
+ resolved "https://registry.yarnpkg.com/taskcluster-lib-urls/-/taskcluster-lib-urls-13.0.2.tgz#27b1ad7bdc1b7bc96b700d876c4e0d5021ee0fa1"
278
+ integrity sha512-onspRpWupIjB15vkvvSAXdtpvgWsKNOCRhcjg1p9GrxodJeW45Os7BK7azMlX7aNqi8uOj4zqB6cokxsLp2uFw==
279
+
280
+ "undici-types@>=7.24.0 <7.24.7":
281
+ version "7.24.6"
282
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.24.6.tgz#61275b485d7fd4e9d269c7cf04ec2873c9cc0f91"
283
+ integrity sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==
291
284
 
292
285
  uuid@^9.0.0:
293
286
  version "9.0.1"
@@ -70,6 +70,26 @@ unit-multithread:
70
70
  command: >-
71
71
  uv run coverage run --data-file /builds/worker/artifacts/coverage --context=py{matrix[python]} -m pytest -vv
72
72
 
73
+ unit-serial:
74
+ description: "Run unit tests with py{matrix[python]} on Linux in serial mode"
75
+ matrix:
76
+ set-name: "unit-serial-py{matrix[python]}"
77
+ substitution-fields: [description, run.command, treeherder, worker, attributes]
78
+ python: ["314"]
79
+ worker:
80
+ docker-image: {in-tree: python}
81
+ env:
82
+ TASKGRAPH_SERIAL: "1"
83
+ artifacts:
84
+ - type: file
85
+ path: "/builds/worker/artifacts/coverage"
86
+ name: "public/coverage.py{matrix[python]}"
87
+ treeherder:
88
+ symbol: unit-serial(py{matrix[python]})
89
+ run:
90
+ command: >-
91
+ uv run coverage run --data-file /builds/worker/artifacts/coverage --context=py{matrix[python]} -m pytest -vv
92
+
73
93
  integration:
74
94
  description: "Run unit tests with py{matrix[python]} on Linux with resolution {matrix[resolution]}"
75
95
  attributes:
@@ -14,14 +14,14 @@ workers:
14
14
  provisioner: '{trust-domain}-{level}'
15
15
  implementation: docker-worker
16
16
  os: linux
17
- worker-type: '{alias}-gcp'
17
+ worker-type: '{alias}'
18
18
  images:
19
19
  provisioner: '{trust-domain}-{level}'
20
20
  implementation: docker-worker
21
21
  os: linux
22
- worker-type: '{alias}-gcp'
22
+ worker-type: '{alias}'
23
23
  t-linux-large:
24
24
  provisioner: '{trust-domain}-t'
25
25
  implementation: docker-worker
26
26
  os: linux
27
- worker-type: '{alias}-gcp'
27
+ worker-type: '{alias}'
@@ -1,5 +1,6 @@
1
1
  import os
2
2
  import platform
3
+ import subprocess
3
4
  import tempfile
4
5
  from pathlib import Path
5
6
 
@@ -20,11 +21,26 @@ os.environ["GIT_CONFIG_NOSYSTEM"] = "1"
20
21
 
21
22
  @pytest.fixture(scope="session", autouse=True)
22
23
  def git_global_config():
23
- # run-task writes to the global git config, so point it at a real
24
- # (writable) empty file instead of ~/.gitconfig.
24
+ # Until https://github.com/taskcluster/taskcluster/issues/6561 we need to
25
+ # preserved the safe directories that `run-task` sets to keep tests
26
+ # working in CI when workers run subsequent tasks.
27
+ existing_safe_dirs = subprocess.run(
28
+ ["git", "config", "--global", "--get-all", "safe.directory"],
29
+ capture_output=True,
30
+ text=True,
31
+ check=False,
32
+ ).stdout.splitlines()
33
+
25
34
  fd, path = tempfile.mkstemp(prefix="taskgraph-gitconfig-")
26
35
  os.close(fd)
27
36
  os.environ["GIT_CONFIG_GLOBAL"] = path
37
+
38
+ for entry in existing_safe_dirs:
39
+ subprocess.run(
40
+ ["git", "config", "--global", "--add", "safe.directory", entry],
41
+ check=False,
42
+ )
43
+
28
44
  yield
29
45
  del os.environ["GIT_CONFIG_GLOBAL"]
30
46
  os.unlink(path)
@@ -13,13 +13,16 @@ from pytest_taskgraph import WithFakeKind, fake_load_graph_config
13
13
  from taskgraph import generator, graph
14
14
  from taskgraph.generator import Kind, load_tasks_for_kind, load_tasks_for_kinds
15
15
  from taskgraph.loader.default import loader as default_loader
16
+ from taskgraph.util.schema import SchemaValidationError
16
17
 
17
18
  linuxonly = pytest.mark.skipif(
18
- platform.system() != "Linux" or os.environ.get("TASKGRAPH_USE_THREADS"),
19
- reason="requires Linux and 'fork' multiprocessing support",
19
+ platform.system() != "Linux"
20
+ or os.environ.get("TASKGRAPH_USE_THREADS")
21
+ or os.environ.get("TASKGRAPH_SERIAL"),
22
+ reason="requires Linux multiprocessing support",
20
23
  )
21
24
  threadsonly = pytest.mark.skipif(
22
- not os.environ.get("TASKGRAPH_USE_THREADS"),
25
+ not os.environ.get("TASKGRAPH_USE_THREADS") or os.environ.get("TASKGRAPH_SERIAL"),
23
26
  reason="requires multithreading to be enabled",
24
27
  )
25
28
 
@@ -70,6 +73,46 @@ def test_kind_ordering_multithread(mocker, maketgg):
70
73
  assert mocked_tpe.loaded_kinds == ["_fake1", "_fake2", "_fake3"]
71
74
 
72
75
 
76
+ def test_schema_validation_error_logged_without_traceback(mocker, caplog, maketgg):
77
+ """SchemaValidationError from a kind is logged at ERROR level with no
78
+ traceback attached (it's user input, not a programmer bug)."""
79
+
80
+ def fail_load_tasks(self, *args, **kwargs):
81
+ raise SchemaValidationError("bad task data")
82
+
83
+ mocker.patch.object(Kind, "load_tasks", fail_load_tasks)
84
+ tgg = maketgg()
85
+
86
+ with caplog.at_level("ERROR"):
87
+ with pytest.raises(SchemaValidationError):
88
+ tgg._run_until("full_task_set")
89
+
90
+ schema_records = [r for r in caplog.records if "Error loading tasks" in r.message]
91
+ assert len(schema_records) == 1
92
+ # logger.error attaches no exc_info — that's the whole point.
93
+ assert schema_records[0].exc_info is None
94
+ assert "bad task data" in schema_records[0].message
95
+
96
+
97
+ def test_other_exceptions_still_log_traceback(mocker, caplog, maketgg):
98
+ """Non-SchemaValidationError exceptions still go through logger.exception
99
+ so real programmer bugs surface their traceback."""
100
+
101
+ def fail_load_tasks(self, *args, **kwargs):
102
+ raise RuntimeError("unexpected bug")
103
+
104
+ mocker.patch.object(Kind, "load_tasks", fail_load_tasks)
105
+ tgg = maketgg()
106
+
107
+ with caplog.at_level("ERROR"):
108
+ with pytest.raises(RuntimeError):
109
+ tgg._run_until("full_task_set")
110
+
111
+ records = [r for r in caplog.records if "Error loading tasks" in r.message]
112
+ assert len(records) == 1
113
+ assert records[0].exc_info is not None
114
+
115
+
73
116
  def test_full_task_set(maketgg):
74
117
  "The full_task_set property has all tasks"
75
118
  tgg = maketgg()
@@ -11,11 +11,13 @@ import pytest
11
11
 
12
12
  import taskgraph
13
13
  from taskgraph.actions import registry
14
+ from taskgraph.generator import Kind
14
15
  from taskgraph.graph import Graph
15
16
  from taskgraph.main import format_kind_graph_mermaid, get_filtered_taskgraph
16
17
  from taskgraph.main import main as taskgraph_main
17
18
  from taskgraph.task import Task
18
19
  from taskgraph.taskgraph import TaskGraph
20
+ from taskgraph.util.schema import SchemaValidationError
19
21
  from taskgraph.util.vcs import GitRepository, HgRepository
20
22
  from taskgraph.util.yaml import load_yaml
21
23
 
@@ -70,6 +72,44 @@ def test_show_taskgraph_parallel(run_taskgraph):
70
72
  assert res == 0
71
73
 
72
74
 
75
+ def test_main_schema_validation_error_no_traceback(
76
+ mocker, run_taskgraph, capsys, caplog
77
+ ):
78
+ """main() exits 1 without printing a Python traceback when a kind raises
79
+ SchemaValidationError — the message was already logged."""
80
+
81
+ def fail_load_tasks(self, *args, **kwargs):
82
+ raise SchemaValidationError("bad task data")
83
+
84
+ mocker.patch.object(Kind, "load_tasks", fail_load_tasks)
85
+
86
+ with caplog.at_level("ERROR"):
87
+ res = run_taskgraph(["full"])
88
+
89
+ assert res == 1
90
+ captured = capsys.readouterr()
91
+ assert "Traceback" not in captured.err
92
+ assert "Traceback" not in captured.out
93
+ assert any("bad task data" in r.message for r in caplog.records)
94
+
95
+
96
+ def test_main_other_exception_prints_traceback(mocker, run_taskgraph, capsys):
97
+ """main() still prints a traceback for unexpected exceptions —
98
+ schema-error suppression must not swallow real bugs."""
99
+
100
+ def fail_load_tasks(self, *args, **kwargs):
101
+ raise RuntimeError("real bug")
102
+
103
+ mocker.patch.object(Kind, "load_tasks", fail_load_tasks)
104
+
105
+ res = run_taskgraph(["full"])
106
+ assert res == 1
107
+
108
+ captured = capsys.readouterr()
109
+ assert "Traceback" in captured.err
110
+ assert "RuntimeError: real bug" in captured.err
111
+
112
+
73
113
  def test_show_taskgraph_parallel_bad_params(tmp_path):
74
114
  # Create parameter files that will cause processing errors
75
115
  bad_params_dir = tmp_path / "bad_params"