taskcluster-taskgraph 24.1.1__tar.gz → 24.2.1__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 (271) hide show
  1. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/.github/workflows/codspeed.yml +1 -1
  2. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/.github/workflows/pypi-publish.yml +6 -6
  3. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/.pre-commit-config.yaml +2 -2
  4. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/CHANGELOG.md +19 -0
  5. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/PKG-INFO +1 -1
  6. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/howto/bootstrap-taskgraph.rst +10 -17
  7. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/pyproject.toml +1 -1
  8. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/create.py +13 -8
  9. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/main.py +29 -19
  10. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/morph.py +3 -1
  11. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/run-task/fetch-content +1 -1
  12. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/run-task/run-task +150 -83
  13. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/transforms/docker_image.py +2 -2
  14. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/docker/fetch/Dockerfile +1 -1
  15. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/docker/index-task/Dockerfile +1 -1
  16. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/docker/index-task/insert-indexes.js +1 -1
  17. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/docker/index-task/package.json +3 -2
  18. taskcluster_taskgraph-24.2.1/taskcluster/docker/index-task/yarn.lock +245 -0
  19. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/docker/run-task/Dockerfile +1 -1
  20. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/docker/skopeo/Dockerfile +3 -3
  21. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/template/{{cookiecutter.project_name}}/taskcluster/docker/linux/Dockerfile +1 -1
  22. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/conftest.py +8 -0
  23. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_create.py +42 -0
  24. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_graph_perf.py +1 -1
  25. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_morph.py +1 -1
  26. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_scripts_fetch_content.py +2 -1
  27. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_scripts_run_task.py +72 -0
  28. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/uv.lock +235 -235
  29. taskcluster_taskgraph-24.1.1/taskcluster/docker/index-task/yarn.lock +0 -293
  30. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/.codespell-ignore-words.txt +0 -0
  31. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/.github/CODEOWNERS +0 -0
  32. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/.github/workflows/codeql-analysis.yml +0 -0
  33. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/.gitignore +0 -0
  34. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/.readthedocs.yaml +0 -0
  35. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/.taskcluster.yml +0 -0
  36. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/.yamllint +0 -0
  37. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/CODE_OF_CONDUCT.md +0 -0
  38. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/CONTRIBUTING.rst +0 -0
  39. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/LICENSE +0 -0
  40. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/Makefile +0 -0
  41. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/README.rst +0 -0
  42. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/concepts/index.rst +0 -0
  43. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/concepts/kind.rst +0 -0
  44. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/concepts/loading.rst +0 -0
  45. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/concepts/optimization.rst +0 -0
  46. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/concepts/overview.rst +0 -0
  47. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/concepts/scopes.rst +0 -0
  48. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/concepts/task-graphs.rst +0 -0
  49. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/concepts/transforms.rst +0 -0
  50. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/conf.py +0 -0
  51. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/contributing.rst +0 -0
  52. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/glossary.rst +0 -0
  53. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/howto/create-actions.rst +0 -0
  54. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/howto/create-tasks.rst +0 -0
  55. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/howto/debugging.rst +0 -0
  56. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/howto/define-schemas.rst +0 -0
  57. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/howto/docker.rst +0 -0
  58. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/howto/index.rst +0 -0
  59. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/howto/load-task-locally.rst +0 -0
  60. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/howto/resolve-keyed-by.rst +0 -0
  61. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/howto/run-locally.rst +0 -0
  62. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/howto/send-notifications.rst +0 -0
  63. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/howto/use-fetches.rst +0 -0
  64. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/index.rst +0 -0
  65. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/reference/cli.rst +0 -0
  66. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/reference/index.rst +0 -0
  67. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/reference/migrations.rst +0 -0
  68. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/reference/optimization-strategies.rst +0 -0
  69. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/reference/parameters.rst +0 -0
  70. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/reference/source/modules.rst +0 -0
  71. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/reference/source/taskgraph.actions.rst +0 -0
  72. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/reference/source/taskgraph.loader.rst +0 -0
  73. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/reference/source/taskgraph.optimize.rst +0 -0
  74. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/reference/source/taskgraph.rst +0 -0
  75. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/reference/source/taskgraph.transforms.rst +0 -0
  76. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/reference/source/taskgraph.transforms.run.rst +0 -0
  77. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/reference/source/taskgraph.util.rst +0 -0
  78. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/reference/transforms/chunking.rst +0 -0
  79. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/reference/transforms/from_deps.rst +0 -0
  80. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/reference/transforms/index.rst +0 -0
  81. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/reference/transforms/matrix.rst +0 -0
  82. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/reference/transforms/task_context.rst +0 -0
  83. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/tutorials/connecting-taskcluster.rst +0 -0
  84. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/tutorials/creating-a-task-graph.rst +0 -0
  85. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/tutorials/example-taskcluster.yml +0 -0
  86. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/tutorials/getting-started.rst +0 -0
  87. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/docs/tutorials/index.rst +0 -0
  88. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/make.bat +0 -0
  89. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/packages/pytest-taskgraph/README.md +0 -0
  90. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/packages/pytest-taskgraph/pyproject.toml +0 -0
  91. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/packages/pytest-taskgraph/src/pytest_taskgraph/__init__.py +0 -0
  92. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/packages/pytest-taskgraph/src/pytest_taskgraph/fixtures/gen.py +0 -0
  93. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/packages/pytest-taskgraph/src/pytest_taskgraph/fixtures/vcs.py +0 -0
  94. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/packages/sphinx-taskgraph/README.md +0 -0
  95. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/packages/sphinx-taskgraph/pyproject.toml +0 -0
  96. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/packages/sphinx-taskgraph/src/sphinx_taskgraph/__init__.py +0 -0
  97. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/packages/sphinx-taskgraph/src/sphinx_taskgraph/autoschema.py +0 -0
  98. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/renovate.json +0 -0
  99. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/__init__.py +0 -0
  100. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/actions/__init__.py +0 -0
  101. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/actions/add_new_jobs.py +0 -0
  102. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/actions/cancel.py +0 -0
  103. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/actions/cancel_all.py +0 -0
  104. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/actions/rebuild_cached_tasks.py +0 -0
  105. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/actions/registry.py +0 -0
  106. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/actions/retrigger.py +0 -0
  107. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/actions/util.py +0 -0
  108. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/config.py +0 -0
  109. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/decision.py +0 -0
  110. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/docker.py +0 -0
  111. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/filter_tasks.py +0 -0
  112. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/generator.py +0 -0
  113. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/graph.py +0 -0
  114. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/loader/__init__.py +0 -0
  115. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/loader/default.py +0 -0
  116. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/loader/transform.py +0 -0
  117. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/optimize/__init__.py +0 -0
  118. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/optimize/base.py +0 -0
  119. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/optimize/strategies.py +0 -0
  120. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/parameters.py +0 -0
  121. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/run-task/hgrc +0 -0
  122. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/run-task/robustcheckout.py +0 -0
  123. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/target_tasks.py +0 -0
  124. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/task.py +0 -0
  125. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/taskgraph.py +0 -0
  126. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/transforms/__init__.py +0 -0
  127. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/transforms/base.py +0 -0
  128. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/transforms/cached_tasks.py +0 -0
  129. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/transforms/chunking.py +0 -0
  130. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/transforms/code_review.py +0 -0
  131. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/transforms/fetch.py +0 -0
  132. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/transforms/from_deps.py +0 -0
  133. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/transforms/matrix.py +0 -0
  134. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/transforms/notify.py +0 -0
  135. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/transforms/run/__init__.py +0 -0
  136. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/transforms/run/common.py +0 -0
  137. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/transforms/run/index_search.py +0 -0
  138. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/transforms/run/run_task.py +0 -0
  139. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/transforms/run/toolchain.py +0 -0
  140. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/transforms/task.py +0 -0
  141. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/transforms/task_context.py +0 -0
  142. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/__init__.py +0 -0
  143. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/archive.py +0 -0
  144. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/attributes.py +0 -0
  145. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/cached_tasks.py +0 -0
  146. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/caches.py +0 -0
  147. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/copy.py +0 -0
  148. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/dependencies.py +0 -0
  149. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/docker.py +0 -0
  150. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/hash.py +0 -0
  151. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/json.py +0 -0
  152. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/keyed_by.py +0 -0
  153. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/parameterization.py +0 -0
  154. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/path.py +0 -0
  155. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/python_path.py +0 -0
  156. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/readonlydict.py +0 -0
  157. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/schema.py +0 -0
  158. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/set_name.py +0 -0
  159. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/shell.py +0 -0
  160. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/task_context.py +0 -0
  161. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/taskcluster.py +0 -0
  162. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/taskgraph.py +0 -0
  163. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/templates.py +0 -0
  164. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/time.py +0 -0
  165. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/treeherder.py +0 -0
  166. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/vcs.py +0 -0
  167. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/verify.py +0 -0
  168. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/workertypes.py +0 -0
  169. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/src/taskgraph/util/yaml.py +0 -0
  170. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/config.yml +0 -0
  171. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/docker/REGISTRY +0 -0
  172. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/docker/decision/Dockerfile +0 -0
  173. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/docker/decision/HASH +0 -0
  174. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/docker/decision/README.md +0 -0
  175. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/docker/decision/VERSION +0 -0
  176. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/docker/decision/system-setup.sh +0 -0
  177. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/docker/image_builder/README.rst +0 -0
  178. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/docker/index-task/README +0 -0
  179. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/docker/python/Dockerfile +0 -0
  180. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/docker/run-task/system-setup.sh +0 -0
  181. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/docker/skopeo/policy.json +0 -0
  182. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/docker/skopeo/push_image.sh +0 -0
  183. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/kinds/check/kind.yml +0 -0
  184. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/kinds/codecov/kind.yml +0 -0
  185. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/kinds/complete/kind.yml +0 -0
  186. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/kinds/doc/kind.yml +0 -0
  187. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/kinds/docker-image/kind.yml +0 -0
  188. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/kinds/fetch/kind.yml +0 -0
  189. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/kinds/push-image/kind.yml +0 -0
  190. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/kinds/test/kind.yml +0 -0
  191. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/kinds/test/linux.yml +0 -0
  192. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/kinds/test/windows.yml +0 -0
  193. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/scripts/codecov-upload.py +0 -0
  194. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/self_taskgraph/__init__.py +0 -0
  195. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/self_taskgraph/custom_parameters.py +0 -0
  196. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/self_taskgraph/custom_target_tasks.py +0 -0
  197. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/self_taskgraph/transforms/add_pr_route.py +0 -0
  198. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/self_taskgraph/transforms/push_image.py +0 -0
  199. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/test/params/main-repo-pull-request-untrusted.yml +0 -0
  200. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/test/params/main-repo-pull-request.yml +0 -0
  201. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/test/params/main-repo-push.yml +0 -0
  202. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/test/params/main-repo-release-pytest-taskgraph.yml +0 -0
  203. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/taskcluster/test/params/main-repo-release-taskcluster-taskgraph.yml +0 -0
  204. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/template/cookiecutter.json +0 -0
  205. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/template/hooks/post_gen_project.py +0 -0
  206. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/template/{{cookiecutter.project_name}}/taskcluster/config.yml +0 -0
  207. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/template/{{cookiecutter.project_name}}/taskcluster/kinds/docker-image/kind.yml +0 -0
  208. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/template/{{cookiecutter.project_name}}/taskcluster/kinds/hello/kind.yml +0 -0
  209. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/template/{{cookiecutter.project_name}}/taskcluster/{{cookiecutter.project_slug}}_taskgraph/transforms/hello.py +0 -0
  210. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/template/{{cookiecutter.project_name}}/taskcluster.github.yml +0 -0
  211. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/__init__.py +0 -0
  212. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/automationrelevance.json +0 -0
  213. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/data/task_context.yml +0 -0
  214. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/data/taskcluster/config.yml +0 -0
  215. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/data/taskcluster/docker/hello-world/Dockerfile +0 -0
  216. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/data/taskcluster/docker/hello-world-tag/Dockerfile +0 -0
  217. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/data/taskcluster/docker/hello-world-tag/REGISTRY +0 -0
  218. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/data/taskcluster/docker/hello-world-tag/VERSION +0 -0
  219. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/data/taskcluster/kinds/docker-image/kind.yml +0 -0
  220. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/data/taskcluster/scripts/toolchain/run.ps1 +0 -0
  221. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/data/taskcluster/scripts/toolchain/run.sh +0 -0
  222. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/data/taskcluster/test_taskgraph/transforms/foo.py +0 -0
  223. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/data/testmod/thing.py +0 -0
  224. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/mockedopen.py +0 -0
  225. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_actions_rebuild_cached_tasks.py +0 -0
  226. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_actions_registry.py +0 -0
  227. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_config.py +0 -0
  228. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_decision.py +0 -0
  229. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_docker.py +0 -0
  230. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_generator.py +0 -0
  231. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_graph.py +0 -0
  232. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_main.py +0 -0
  233. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_optimize.py +0 -0
  234. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_optimize_strategies.py +0 -0
  235. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_parameters.py +0 -0
  236. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_target_tasks.py +0 -0
  237. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_taskgraph.py +0 -0
  238. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_transform_chunking.py +0 -0
  239. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_transform_docker_image.py +0 -0
  240. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_transform_task_context.py +0 -0
  241. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_transforms_base.py +0 -0
  242. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_transforms_cached_tasks.py +0 -0
  243. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_transforms_fetch.py +0 -0
  244. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_transforms_from_deps.py +0 -0
  245. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_transforms_matrix.py +0 -0
  246. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_transforms_notify.py +0 -0
  247. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_transforms_run.py +0 -0
  248. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_transforms_run_run_task.py +0 -0
  249. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_transforms_run_toolchain.py +0 -0
  250. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_transforms_task.py +0 -0
  251. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_util_archive.py +0 -0
  252. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_util_attributes.py +0 -0
  253. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_util_cached_tasks.py +0 -0
  254. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_util_copy.py +0 -0
  255. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_util_dependencies.py +0 -0
  256. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_util_docker.py +0 -0
  257. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_util_json.py +0 -0
  258. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_util_keyed_by.py +0 -0
  259. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_util_parameterization.py +0 -0
  260. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_util_path.py +0 -0
  261. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_util_python_path.py +0 -0
  262. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_util_readonlydict.py +0 -0
  263. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_util_schema.py +0 -0
  264. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_util_taskcluster.py +0 -0
  265. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_util_templates.py +0 -0
  266. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_util_time.py +0 -0
  267. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_util_treeherder.py +0 -0
  268. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_util_vcs.py +0 -0
  269. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_util_verify.py +0 -0
  270. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_util_workertypes.py +0 -0
  271. {taskcluster_taskgraph-24.1.1 → taskcluster_taskgraph-24.2.1}/test/test_util_yaml.py +0 -0
@@ -25,7 +25,7 @@ jobs:
25
25
  - name: Install dependencies
26
26
  run: uv sync
27
27
  - name: Run benchmarks
28
- uses: CodSpeedHQ/action@9d332c4d90b43981c3e55ae8e38e68709996240f # v4.17.0
28
+ uses: CodSpeedHQ/action@a4a36bb07c0638b0b4ca52bf1f3dad1b4289e52f # v4.18.1
29
29
  with:
30
30
  mode: simulation
31
31
  run: uv run pytest test/ --codspeed
@@ -13,9 +13,9 @@ jobs:
13
13
  steps:
14
14
  - name: Checkout sources
15
15
  uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
16
- - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
16
+ - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
17
17
  with:
18
- python-version: '3.11'
18
+ python-version: '3.14'
19
19
  cache: 'pip'
20
20
  - name: Build taskcluster-taskgraph package distributions
21
21
  run: |
@@ -39,9 +39,9 @@ jobs:
39
39
  steps:
40
40
  - name: Checkout sources
41
41
  uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
42
- - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
42
+ - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
43
43
  with:
44
- python-version: '3.11'
44
+ python-version: '3.14'
45
45
  cache: 'pip'
46
46
  - name: Build pytest-taskgraph package distributions
47
47
  working-directory: packages/pytest-taskgraph
@@ -62,9 +62,9 @@ jobs:
62
62
  steps:
63
63
  - name: Checkout sources
64
64
  uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
65
- - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
65
+ - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
66
66
  with:
67
- python-version: '3.11'
67
+ python-version: '3.14'
68
68
  cache: 'pip'
69
69
  - name: Build sphinx-taskgraph package distributions
70
70
  working-directory: packages/sphinx-taskgraph
@@ -13,13 +13,13 @@ repos:
13
13
  exclude: template
14
14
  - id: check-added-large-files
15
15
  - repo: https://github.com/astral-sh/ruff-pre-commit
16
- rev: v0.15.15
16
+ rev: v0.15.20
17
17
  hooks:
18
18
  - id: ruff
19
19
  args: [--fix, --exit-non-zero-on-fix]
20
20
  - id: ruff-format
21
21
  - repo: https://github.com/astral-sh/uv-pre-commit
22
- rev: 0.11.17
22
+ rev: 0.11.26
23
23
  hooks:
24
24
  - id: uv-lock
25
25
  - repo: https://github.com/adrienverge/yamllint.git
@@ -1,5 +1,24 @@
1
1
  # Change Log
2
2
 
3
+ ## [24.2.1] - 2026-07-27
4
+
5
+ ### Fixed
6
+
7
+ - Don't run nested ProcessPoolExecutors (#1008)
8
+
9
+ ## [24.2.0] - 2026-07-15
10
+
11
+ ### Added
12
+
13
+ - Included profile data for `run-task` VCS operations in the log
14
+
15
+ ### Fixed
16
+
17
+ - Ensure `INDEX_RANK` env is cast to a string for index tasks
18
+ - Properly capture all exceptions in `taskgraph.create.create_tasks`
19
+ - Send `Accept-Encoding` header in `fetch-content` script
20
+ - Release graphs from memory upon completion when using `taskgraph <phase> --diff`
21
+
3
22
  ## [24.1.1] - 2026-06-11
4
23
 
5
24
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taskcluster-taskgraph
3
- Version: 24.1.1
3
+ Version: 24.2.1
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
@@ -73,22 +73,15 @@ This section outlines the recommended way to do that.
73
73
  Define Requirements
74
74
  ~~~~~~~~~~~~~~~~~~~
75
75
 
76
- We'll use a tool called `pip-compile`_ to help generate the
77
- ``requirements.txt`` that will contain our Decision task dependencies,
78
- including Taskgraph itself.
76
+ We'll use `uv`_ to help generate the ``requirements.txt`` that will contain our
77
+ Decision task dependencies, including Taskgraph itself.
79
78
 
80
79
  .. note::
81
80
 
82
81
  You may use other tools to create the ``requirements.txt``, such as
83
- `hashin`_. As long as package hashes are included.
82
+ `pip-compile`_ or `hashin`_. As long as package hashes are included.
84
83
 
85
- First make sure you have ``pip-compile`` installed:
86
-
87
- .. code-block:: bash
88
-
89
- pip install pip-tools
90
-
91
- Next, create the ``requirements.in`` file. For this example, let's pretend that
84
+ First make sure you `install uv`_. Next, create the ``requirements.in`` file. For this example, let's pretend that
92
85
  in addition to ``taskcluster-taskgraph`` we also want to depend on
93
86
  ``requests``:
94
87
 
@@ -100,9 +93,7 @@ in addition to ``taskcluster-taskgraph`` we also want to depend on
100
93
  requests
101
94
  EOF
102
95
 
103
- # This works best if you use the same Python as the one used in the Decision
104
- # image (currently 3.13).
105
- pip-compile --generate-hashes --output-file requirements.txt requirements.in
96
+ uv pip compile --universal --generate-hashes --output-file requirements.txt requirements.in
106
97
 
107
98
  .. note::
108
99
 
@@ -113,6 +104,8 @@ in addition to ``taskcluster-taskgraph`` we also want to depend on
113
104
  If you end up creating transforms that require additional packages, add them to
114
105
  ``requirements.in`` and re-generate the lock file.
115
106
 
107
+ .. _uv: https://docs.astral.sh/uv/
108
+ .. _install uv: https://docs.astral.sh/uv/getting-started/installation/
116
109
  .. _pip-compile: https://github.com/jazzband/pip-tools
117
110
  .. _hashin: https://github.com/peterbe/hashin
118
111
  .. _version specifiers: https://pip.pypa.io/en/stable/cli/pip_install/#requirement-specifiers
@@ -186,7 +179,7 @@ file:
186
179
  .. code-block:: shell
187
180
 
188
181
  cd taskcluster
189
- pip-compile --generate-hashes --output-file requirements.txt requirements.in
182
+ uv pip compile --universal --generate-hashes --output-file requirements.txt requirements.in
190
183
 
191
184
  If you pinned the package to a specific version don't forget to update
192
185
  ``requirements.in`` first.
@@ -209,7 +202,7 @@ accomplished using `pip's version control support`_:
209
202
 
210
203
  cd taskcluster
211
204
  echo "taskcluster-taskgraph@git+https://github.com/taskcluster/taskgraph@refs/pull/123/head" > requirements.in
212
- pip-compile --output-file requirements.txt requirements.in
205
+ uv pip compile --universal --output-file requirements.txt requirements.in
213
206
 
214
207
  Next edit your ``.taskcluster.yml`` to disable hashing since pip does not
215
208
  support `hashes with url requirements`_:
@@ -222,7 +215,7 @@ support `hashes with url requirements`_:
222
215
 
223
216
  .. note::
224
217
 
225
- Be sure to omit the ``--generate-hashes`` argument to ``pip-compile``
218
+ Be sure to omit the ``--generate-hashes`` argument to ``uv pip compile``
226
219
  otherwise ``pip`` will implicitly turn hashing back on.
227
220
 
228
221
  This way you can push an experimental change to a PR and then install it in
@@ -1,7 +1,7 @@
1
1
  ### Project
2
2
  [project]
3
3
  name = "taskcluster-taskgraph"
4
- version = "24.1.1"
4
+ version = "24.2.1"
5
5
  description = "Build taskcluster taskgraphs"
6
6
  readme = "README.rst"
7
7
  authors = [
@@ -64,7 +64,6 @@ def create_tasks(graph_config, taskgraph, label_to_taskid, params, decision_task
64
64
  fs = {}
65
65
  fs_to_task = {}
66
66
  skipped = set()
67
- errors = {}
68
67
 
69
68
  # We can't submit a task until its dependencies have been submitted.
70
69
  # So our strategy is to walk the graph and submit tasks once all
@@ -72,12 +71,6 @@ def create_tasks(graph_config, taskgraph, label_to_taskid, params, decision_task
72
71
  tasklist = set(taskgraph.graph.visit_postorder())
73
72
  alltasks = tasklist.copy()
74
73
 
75
- def handle_exception(fut):
76
- if exc := fut.exception():
77
- task_id, label = fs_to_task[fut]
78
- skipped.add(task_id)
79
- errors[label] = exc
80
-
81
74
  def schedule_tasks():
82
75
  to_remove = set()
83
76
  new = set()
@@ -87,7 +80,13 @@ def create_tasks(graph_config, taskgraph, label_to_taskid, params, decision_task
87
80
  new.add(fut)
88
81
  fs[task_id] = fut
89
82
  fs_to_task[fut] = (task_id, label)
90
- fut.add_done_callback(handle_exception)
83
+
84
+ def mark_failed_as_skipped(fut):
85
+ if fut.exception():
86
+ task_id, _ = fs_to_task[fut]
87
+ skipped.add(task_id)
88
+
89
+ fut.add_done_callback(mark_failed_as_skipped)
91
90
 
92
91
  for task_id in tasklist:
93
92
  task_def = taskgraph.tasks[task_id].task
@@ -127,6 +126,12 @@ def create_tasks(graph_config, taskgraph, label_to_taskid, params, decision_task
127
126
  # Wait for all futures to complete.
128
127
  futures.wait(fs.values())
129
128
 
129
+ # Collect errors.
130
+ errors = {}
131
+ for fut, (task_id, label) in fs_to_task.items():
132
+ if exc := fut.exception():
133
+ errors[label] = exc
134
+
130
135
  if errors:
131
136
  raise CreateTasksException(errors)
132
137
 
@@ -179,6 +179,16 @@ def format_taskgraph(options, parameters, overrides, logfile=None):
179
179
  return format_method(tg)
180
180
 
181
181
 
182
+ def format_taskgraph_multiple(*args, **kwargs):
183
+ """Thin wrapper around format_taskgraph to avoid the taskgraph generator
184
+ that it runs using multiple processes. (This function is intended to be
185
+ called by something that is already using a ProcessPoolExecutor, so
186
+ there's no advantage to spawning additional processes in the subprocesses.)"""
187
+
188
+ os.environ["TASKGRAPH_SERIAL"] = "1"
189
+ return format_taskgraph(*args, **kwargs)
190
+
191
+
182
192
  def dump_output(out, path=None, params_spec=None):
183
193
  from taskgraph.parameters import Parameters # noqa: PLC0415
184
194
 
@@ -222,32 +232,32 @@ def generate_taskgraph(options, parameters, overrides, logdir):
222
232
  return 0
223
233
 
224
234
  futures = {}
235
+ returncode = 0
225
236
  with ProcessPoolExecutor(max_workers=options["max_workers"]) as executor:
226
237
  for spec in parameters:
227
238
  f = executor.submit(
228
- format_taskgraph, options, spec, overrides, logfile(spec)
239
+ format_taskgraph_multiple, options, spec, overrides, logfile(spec)
229
240
  )
230
241
  futures[f] = spec
231
242
 
232
- returncode = 0
233
- for future in as_completed(futures):
234
- output_file = options["output_file"]
235
- spec = futures[future]
236
- e = future.exception()
237
- if e:
238
- returncode = 1
239
- out = "".join(traceback.format_exception(type(e), e, e.__traceback__))
240
- if options["diff"]:
241
- # Dump to console so we don't accidentally diff the tracebacks.
242
- output_file = None
243
- else:
244
- out = future.result()
243
+ for future in as_completed(futures):
244
+ output_file = options["output_file"]
245
+ spec = futures.pop(future)
246
+ e = future.exception()
247
+ if e:
248
+ returncode = 1
249
+ out = "".join(traceback.format_exception(type(e), e, e.__traceback__))
250
+ if options["diff"]:
251
+ # Dump to console so we don't accidentally diff the tracebacks.
252
+ output_file = None
253
+ else:
254
+ out = future.result()
245
255
 
246
- dump_output(
247
- out,
248
- path=output_file,
249
- params_spec=spec if len(parameters) > 1 else None,
250
- )
256
+ dump_output(
257
+ out,
258
+ path=output_file,
259
+ params_spec=spec if len(parameters) > 1 else None,
260
+ )
251
261
 
252
262
  return returncode
253
263
 
@@ -147,7 +147,9 @@ def make_index_task(parent_task, taskgraph, label_to_taskid, parameters, graph_c
147
147
  task.task["payload"]["command"] = ["insert-indexes.js"] + index_paths
148
148
  task.task["payload"]["env"] = {
149
149
  "TARGET_TASKID": parent_task.task_id,
150
- "INDEX_RANK": parent_task.task.get("extra", {}).get("index", {}).get("rank", 0),
150
+ "INDEX_RANK": str(
151
+ parent_task.task.get("extra", {}).get("index", {}).get("rank", 0)
152
+ ),
151
153
  }
152
154
  return task, taskgraph, label_to_taskid
153
155
 
@@ -181,7 +181,7 @@ def stream_download(url, sha256=None, size=None, headers=None):
181
181
  length = 0
182
182
 
183
183
  t0 = time.time()
184
- req_headers = {}
184
+ req_headers = {"Accept-Encoding": "gzip"}
185
185
  for header in headers:
186
186
  key, val = header.split(":")
187
187
  req_headers[key.strip()] = val.strip()
@@ -14,6 +14,7 @@ current time to improve log usefulness.
14
14
  """
15
15
 
16
16
  import argparse
17
+ import contextlib
17
18
  import datetime
18
19
  import errno
19
20
  import io
@@ -567,6 +568,61 @@ def configure_volume_posix(volume, user, group, running_as_root):
567
568
  set_dir_permissions(volume, user.pw_uid, group.gr_gid)
568
569
 
569
570
 
571
+ class PerfRecorder:
572
+ """Collects operation timings and emits them as PERFHERDER_DATA."""
573
+
574
+ def __init__(self, framework: str):
575
+ self.framework = framework
576
+ self.optimes = []
577
+ self._stack = []
578
+
579
+ def start(self, *names: str):
580
+ self._stack.append((time.time(), names))
581
+
582
+ def stop(self, errored: bool = False):
583
+ start, names = self._stack.pop()
584
+ elapsed = time.time() - start
585
+ suffix = "_errored" if errored else ""
586
+ for name in names:
587
+ self.optimes.append((name + suffix, elapsed))
588
+
589
+ @contextlib.contextmanager
590
+ def record(self, *names: str):
591
+ self.start(*names)
592
+ try:
593
+ yield
594
+ except BaseException:
595
+ self.stop(errored=True)
596
+ raise
597
+ else:
598
+ self.stop()
599
+
600
+ def emit(self):
601
+ instance_type = os.environ.get("TASKCLUSTER_INSTANCE_TYPE")
602
+ if not instance_type or not self.optimes:
603
+ return
604
+
605
+ suites = []
606
+ for op, duration in self.optimes:
607
+ suites.append(
608
+ {
609
+ "name": op,
610
+ "value": duration,
611
+ "lowerIsBetter": True,
612
+ "shouldAlert": False,
613
+ "extraOptions": [instance_type],
614
+ "subtests": [],
615
+ }
616
+ )
617
+
618
+ perfherder = {"framework": {"name": self.framework}, "suites": suites}
619
+ sys.stdout.write(
620
+ "PERFHERDER_DATA: {}\n".format(json.dumps(perfherder, sort_keys=True))
621
+ )
622
+ sys.stdout.flush()
623
+ self.optimes = []
624
+
625
+
570
626
  def git_fetch(
571
627
  destination_path: str,
572
628
  *targets: str,
@@ -668,105 +724,114 @@ def git_checkout(
668
724
  "Must specify both ssh_key_file and ssh_known_hosts_file, if either are specified",
669
725
  )
670
726
 
671
- # Bypass Git's "safe directory" feature as the destination could be
672
- # coming from a cache and therefore cloned by a different user.
673
- args = [
674
- "git",
675
- "config",
676
- "--global",
677
- "--add",
678
- "safe.directory",
679
- Path(destination_path).as_posix(),
680
- ]
681
- retry_required_command(b"vcs", args, extra_env=env)
682
-
683
- if not os.path.exists(destination_path):
684
- # Repository doesn't already exist, needs to be cloned
727
+ has_repo = os.path.exists(destination_path)
728
+ perf = PerfRecorder("vcs")
729
+ with perf.record("overall", "overall_pull" if has_repo else "overall_clone"):
730
+ # Bypass Git's "safe directory" feature as the destination could be
731
+ # coming from a cache and therefore cloned by a different user.
685
732
  args = [
686
733
  "git",
687
- "clone",
734
+ "config",
735
+ "--global",
736
+ "--add",
737
+ "safe.directory",
738
+ Path(destination_path).as_posix(),
688
739
  ]
689
-
690
- if shallow:
691
- args.extend(["--depth=1", "--no-checkout"])
692
-
693
- args.extend(
694
- [
695
- base_repo if base_repo else head_repo,
696
- destination_path,
697
- ]
698
- )
699
-
700
740
  retry_required_command(b"vcs", args, extra_env=env)
701
741
 
702
- # For Github based repos, base_rev often doesn't refer to an ancestor of
703
- # head_rev simply due to Github not providing that information in their
704
- # webhook events. Therefore we fetch it independently from `head_rev` so
705
- # that consumers can compute the merge-base or files modified between the
706
- # two as needed.
707
- if base_rev and base_rev != NULL_REVISION:
708
- git_fetch(destination_path, base_rev, shallow=shallow, env=env)
709
-
710
- # If a head_ref was provided, it might be tag, so we need to make sure we fetch
711
- # those. This is explicitly only done when base and head repo match,
712
- # because it is the only scenario where tags could be present. (PRs, for
713
- # example, always include an explicit rev.) Failure to do this could result
714
- # in not having a tag, or worse: having an outdated version of one.
715
- tags = False
716
- if head_ref and not head_ref.startswith("refs/heads/") and base_repo == head_repo:
717
- tags = True
718
-
719
- # Fetch head_ref and/or head_rev
720
- targets = []
721
- if head_ref:
722
- targets.append(head_ref)
723
- if not head_ref or (shallow and head_rev):
724
- # If head_ref wasn't provided, we fallback to head_rev. If we have a
725
- # shallow clone, head_rev needs to be fetched independently regardless.
726
- targets.append(head_rev)
727
-
728
- git_fetch(
729
- destination_path,
730
- *targets,
731
- remote=head_repo,
732
- tags=tags,
733
- shallow=shallow,
734
- env=env,
735
- )
736
-
737
- args = [
738
- "git",
739
- "checkout",
740
- "-f",
741
- ]
742
+ if not has_repo:
743
+ # Repository doesn't already exist, needs to be cloned
744
+ args = [
745
+ "git",
746
+ "clone",
747
+ ]
742
748
 
743
- if head_ref:
744
- args.extend(["-B", shortref(head_ref)])
749
+ if shallow:
750
+ args.extend(["--depth=1", "--no-checkout"])
745
751
 
746
- # `git fetch` set `FETCH_HEAD` reference to the last commit of the desired branch
747
- args.append(head_rev if head_rev else "FETCH_HEAD")
752
+ args.extend(
753
+ [
754
+ base_repo if base_repo else head_repo,
755
+ destination_path,
756
+ ]
757
+ )
748
758
 
749
- run_required_command(b"vcs", args, cwd=destination_path)
759
+ with perf.record("clone"):
760
+ retry_required_command(b"vcs", args, extra_env=env)
761
+
762
+ # For Github based repos, base_rev often doesn't refer to an ancestor of
763
+ # head_rev simply due to Github not providing that information in their
764
+ # webhook events. Therefore we fetch it independently from `head_rev` so
765
+ # that consumers can compute the merge-base or files modified between the
766
+ # two as needed.
767
+ if base_rev and base_rev != NULL_REVISION:
768
+ with perf.record("fetch_base"):
769
+ git_fetch(destination_path, base_rev, shallow=shallow, env=env)
770
+
771
+ # If a head_ref was provided, it might be tag, so we need to make sure we fetch
772
+ # those. This is explicitly only done when base and head repo match,
773
+ # because it is the only scenario where tags could be present. (PRs, for
774
+ # example, always include an explicit rev.) Failure to do this could result
775
+ # in not having a tag, or worse: having an outdated version of one.
776
+ tags = False
777
+ if head_ref and not head_ref.startswith("refs/heads/") and base_repo == head_repo:
778
+ tags = True
779
+
780
+ # Fetch head_ref and/or head_rev
781
+ targets = []
782
+ if head_ref:
783
+ targets.append(head_ref)
784
+ if not head_ref or (shallow and head_rev):
785
+ # If head_ref wasn't provided, we fallback to head_rev. If we have a
786
+ # shallow clone, head_rev needs to be fetched independently regardless.
787
+ targets.append(head_rev)
788
+
789
+ with perf.record("pull"):
790
+ git_fetch(
791
+ destination_path,
792
+ *targets,
793
+ remote=head_repo,
794
+ tags=tags,
795
+ shallow=shallow,
796
+ env=env,
797
+ )
750
798
 
751
- if os.path.exists(os.path.join(destination_path, ".gitmodules")):
752
799
  args = [
753
800
  "git",
754
- "submodule",
755
- "init",
801
+ "checkout",
802
+ "-f",
756
803
  ]
757
804
 
758
- run_required_command(b"vcs", args, cwd=destination_path)
805
+ if head_ref:
806
+ args.extend(["-B", shortref(head_ref)])
759
807
 
760
- args = [
761
- "git",
762
- "submodule",
763
- "update",
764
- "--force", # Overrides any potential local changes
765
- ]
808
+ # `git fetch` set `FETCH_HEAD` reference to the last commit of the desired branch
809
+ args.append(head_rev if head_rev else "FETCH_HEAD")
810
+
811
+ with perf.record("update"):
812
+ run_required_command(b"vcs", args, cwd=destination_path)
766
813
 
767
- run_required_command(b"vcs", args, cwd=destination_path)
814
+ if os.path.exists(os.path.join(destination_path, ".gitmodules")):
815
+ args = [
816
+ "git",
817
+ "submodule",
818
+ "init",
819
+ ]
768
820
 
769
- _clean_git_checkout(destination_path)
821
+ run_required_command(b"vcs", args, cwd=destination_path)
822
+
823
+ args = [
824
+ "git",
825
+ "submodule",
826
+ "update",
827
+ "--force", # Overrides any potential local changes
828
+ ]
829
+
830
+ with perf.record("submodule_update"):
831
+ run_required_command(b"vcs", args, cwd=destination_path)
832
+
833
+ with perf.record("purge"):
834
+ _clean_git_checkout(destination_path)
770
835
 
771
836
  args = ["git", "rev-parse", "--verify", "HEAD"]
772
837
 
@@ -793,6 +858,8 @@ def git_checkout(
793
858
 
794
859
  print_line(b"vcs", msg.encode("utf-8"))
795
860
 
861
+ perf.emit()
862
+
796
863
  return commit_hash
797
864
 
798
865
 
@@ -20,9 +20,9 @@ CONTEXTS_DIR = "docker-contexts"
20
20
  DIGEST_RE = re.compile("^[0-9a-f]{64}$")
21
21
 
22
22
  IMAGE_BUILDER_IMAGE = (
23
- "mozillareleases/image_builder:6.1.0"
23
+ "mozillareleases/image_builder:6.2.0"
24
24
  "@sha256:"
25
- "10c614e928500a7d5138773fb58941a24a17948e1a8193768e9ba762ba3e9c7e"
25
+ "f7df722770d6caadea79b2de458e072d8b3d93e59675b34dffb32c3e7e30f5b9"
26
26
  )
27
27
 
28
28
  transforms = TransformSequence()
@@ -1,4 +1,4 @@
1
- FROM debian:12-slim
1
+ FROM debian:12-slim@sha256:60eac759739651111db372c07be67863818726f754804b8707c90979bda511df
2
2
  LABEL maintainer="Release Engineering <release@mozilla.com>"
3
3
 
4
4
  ### Add worker user and setup its workspace.
@@ -1,4 +1,4 @@
1
- FROM node:18-alpine
1
+ FROM node:24-alpine@sha256:a0b9bf06e4e6193cf7a0f58816cc935ff8c2a908f81e6f1a95432d679c54fbfd
2
2
 
3
3
  ENV NODE_ENV production
4
4
  RUN mkdir /app
@@ -1,4 +1,4 @@
1
- let taskcluster = require("taskcluster-client");
1
+ import taskcluster from "@taskcluster/client";
2
2
 
3
3
  // Create instance of index client
4
4
  let index = new taskcluster.Index({
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "private": true,
3
+ "type": "module",
3
4
  "scripts": {
4
5
  "start": "node index.js"
5
6
  },
6
7
  "dependencies": {
7
- "taskcluster-client": "55.3.2"
8
+ "@taskcluster/client": "101.0.0"
8
9
  },
9
10
  "engines": {
10
- "node": "18"
11
+ "node": "^24"
11
12
  }
12
13
  }