taskcluster-taskgraph 24.1.0__tar.gz → 24.2.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 (271) hide show
  1. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/.github/workflows/codspeed.yml +1 -1
  2. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/.github/workflows/pypi-publish.yml +6 -6
  3. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/.pre-commit-config.yaml +2 -2
  4. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/CHANGELOG.md +19 -0
  5. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/PKG-INFO +1 -1
  6. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/howto/bootstrap-taskgraph.rst +10 -17
  7. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/pyproject.toml +1 -1
  8. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/create.py +13 -8
  9. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/main.py +18 -18
  10. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/morph.py +3 -1
  11. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/parameters.py +13 -10
  12. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/run-task/fetch-content +1 -1
  13. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/run-task/run-task +150 -83
  14. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/transforms/docker_image.py +2 -2
  15. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/docker/fetch/Dockerfile +1 -1
  16. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/docker/index-task/Dockerfile +1 -1
  17. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/docker/index-task/insert-indexes.js +1 -1
  18. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/docker/index-task/package.json +3 -2
  19. taskcluster_taskgraph-24.2.0/taskcluster/docker/index-task/yarn.lock +245 -0
  20. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/docker/run-task/Dockerfile +1 -1
  21. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/docker/skopeo/Dockerfile +3 -3
  22. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/template/{{cookiecutter.project_name}}/taskcluster/docker/linux/Dockerfile +1 -1
  23. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/conftest.py +8 -0
  24. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_create.py +42 -0
  25. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_graph_perf.py +1 -1
  26. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_morph.py +1 -1
  27. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_scripts_fetch_content.py +2 -1
  28. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_scripts_run_task.py +72 -0
  29. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/uv.lock +235 -235
  30. taskcluster_taskgraph-24.1.0/taskcluster/docker/index-task/yarn.lock +0 -293
  31. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/.codespell-ignore-words.txt +0 -0
  32. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/.github/CODEOWNERS +0 -0
  33. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/.github/workflows/codeql-analysis.yml +0 -0
  34. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/.gitignore +0 -0
  35. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/.readthedocs.yaml +0 -0
  36. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/.taskcluster.yml +0 -0
  37. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/.yamllint +0 -0
  38. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/CODE_OF_CONDUCT.md +0 -0
  39. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/CONTRIBUTING.rst +0 -0
  40. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/LICENSE +0 -0
  41. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/Makefile +0 -0
  42. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/README.rst +0 -0
  43. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/concepts/index.rst +0 -0
  44. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/concepts/kind.rst +0 -0
  45. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/concepts/loading.rst +0 -0
  46. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/concepts/optimization.rst +0 -0
  47. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/concepts/overview.rst +0 -0
  48. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/concepts/scopes.rst +0 -0
  49. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/concepts/task-graphs.rst +0 -0
  50. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/concepts/transforms.rst +0 -0
  51. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/conf.py +0 -0
  52. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/contributing.rst +0 -0
  53. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/glossary.rst +0 -0
  54. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/howto/create-actions.rst +0 -0
  55. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/howto/create-tasks.rst +0 -0
  56. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/howto/debugging.rst +0 -0
  57. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/howto/define-schemas.rst +0 -0
  58. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/howto/docker.rst +0 -0
  59. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/howto/index.rst +0 -0
  60. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/howto/load-task-locally.rst +0 -0
  61. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/howto/resolve-keyed-by.rst +0 -0
  62. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/howto/run-locally.rst +0 -0
  63. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/howto/send-notifications.rst +0 -0
  64. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/howto/use-fetches.rst +0 -0
  65. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/index.rst +0 -0
  66. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/reference/cli.rst +0 -0
  67. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/reference/index.rst +0 -0
  68. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/reference/migrations.rst +0 -0
  69. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/reference/optimization-strategies.rst +0 -0
  70. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/reference/parameters.rst +0 -0
  71. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/reference/source/modules.rst +0 -0
  72. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/reference/source/taskgraph.actions.rst +0 -0
  73. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/reference/source/taskgraph.loader.rst +0 -0
  74. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/reference/source/taskgraph.optimize.rst +0 -0
  75. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/reference/source/taskgraph.rst +0 -0
  76. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/reference/source/taskgraph.transforms.rst +0 -0
  77. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/reference/source/taskgraph.transforms.run.rst +0 -0
  78. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/reference/source/taskgraph.util.rst +0 -0
  79. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/reference/transforms/chunking.rst +0 -0
  80. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/reference/transforms/from_deps.rst +0 -0
  81. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/reference/transforms/index.rst +0 -0
  82. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/reference/transforms/matrix.rst +0 -0
  83. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/reference/transforms/task_context.rst +0 -0
  84. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/tutorials/connecting-taskcluster.rst +0 -0
  85. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/tutorials/creating-a-task-graph.rst +0 -0
  86. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/tutorials/example-taskcluster.yml +0 -0
  87. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/tutorials/getting-started.rst +0 -0
  88. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/docs/tutorials/index.rst +0 -0
  89. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/make.bat +0 -0
  90. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/packages/pytest-taskgraph/README.md +0 -0
  91. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/packages/pytest-taskgraph/pyproject.toml +0 -0
  92. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/packages/pytest-taskgraph/src/pytest_taskgraph/__init__.py +0 -0
  93. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/packages/pytest-taskgraph/src/pytest_taskgraph/fixtures/gen.py +0 -0
  94. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/packages/pytest-taskgraph/src/pytest_taskgraph/fixtures/vcs.py +0 -0
  95. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/packages/sphinx-taskgraph/README.md +0 -0
  96. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/packages/sphinx-taskgraph/pyproject.toml +0 -0
  97. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/packages/sphinx-taskgraph/src/sphinx_taskgraph/__init__.py +0 -0
  98. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/packages/sphinx-taskgraph/src/sphinx_taskgraph/autoschema.py +0 -0
  99. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/renovate.json +0 -0
  100. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/__init__.py +0 -0
  101. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/actions/__init__.py +0 -0
  102. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/actions/add_new_jobs.py +0 -0
  103. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/actions/cancel.py +0 -0
  104. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/actions/cancel_all.py +0 -0
  105. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/actions/rebuild_cached_tasks.py +0 -0
  106. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/actions/registry.py +0 -0
  107. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/actions/retrigger.py +0 -0
  108. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/actions/util.py +0 -0
  109. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/config.py +0 -0
  110. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/decision.py +0 -0
  111. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/docker.py +0 -0
  112. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/filter_tasks.py +0 -0
  113. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/generator.py +0 -0
  114. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/graph.py +0 -0
  115. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/loader/__init__.py +0 -0
  116. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/loader/default.py +0 -0
  117. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/loader/transform.py +0 -0
  118. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/optimize/__init__.py +0 -0
  119. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/optimize/base.py +0 -0
  120. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/optimize/strategies.py +0 -0
  121. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/run-task/hgrc +0 -0
  122. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/run-task/robustcheckout.py +0 -0
  123. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/target_tasks.py +0 -0
  124. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/task.py +0 -0
  125. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/taskgraph.py +0 -0
  126. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/transforms/__init__.py +0 -0
  127. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/transforms/base.py +0 -0
  128. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/transforms/cached_tasks.py +0 -0
  129. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/transforms/chunking.py +0 -0
  130. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/transforms/code_review.py +0 -0
  131. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/transforms/fetch.py +0 -0
  132. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/transforms/from_deps.py +0 -0
  133. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/transforms/matrix.py +0 -0
  134. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/transforms/notify.py +0 -0
  135. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/transforms/run/__init__.py +0 -0
  136. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/transforms/run/common.py +0 -0
  137. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/transforms/run/index_search.py +0 -0
  138. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/transforms/run/run_task.py +0 -0
  139. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/transforms/run/toolchain.py +0 -0
  140. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/transforms/task.py +0 -0
  141. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/transforms/task_context.py +0 -0
  142. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/__init__.py +0 -0
  143. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/archive.py +0 -0
  144. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/attributes.py +0 -0
  145. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/cached_tasks.py +0 -0
  146. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/caches.py +0 -0
  147. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/copy.py +0 -0
  148. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/dependencies.py +0 -0
  149. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/docker.py +0 -0
  150. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/hash.py +0 -0
  151. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/json.py +0 -0
  152. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/keyed_by.py +0 -0
  153. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/parameterization.py +0 -0
  154. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/path.py +0 -0
  155. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/python_path.py +0 -0
  156. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/readonlydict.py +0 -0
  157. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/schema.py +0 -0
  158. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/set_name.py +0 -0
  159. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/shell.py +0 -0
  160. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/task_context.py +0 -0
  161. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/taskcluster.py +0 -0
  162. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/taskgraph.py +0 -0
  163. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/templates.py +0 -0
  164. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/time.py +0 -0
  165. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/treeherder.py +0 -0
  166. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/vcs.py +0 -0
  167. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/verify.py +0 -0
  168. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/workertypes.py +0 -0
  169. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/src/taskgraph/util/yaml.py +0 -0
  170. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/config.yml +0 -0
  171. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/docker/REGISTRY +0 -0
  172. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/docker/decision/Dockerfile +0 -0
  173. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/docker/decision/HASH +0 -0
  174. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/docker/decision/README.md +0 -0
  175. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/docker/decision/VERSION +0 -0
  176. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/docker/decision/system-setup.sh +0 -0
  177. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/docker/image_builder/README.rst +0 -0
  178. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/docker/index-task/README +0 -0
  179. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/docker/python/Dockerfile +0 -0
  180. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/docker/run-task/system-setup.sh +0 -0
  181. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/docker/skopeo/policy.json +0 -0
  182. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/docker/skopeo/push_image.sh +0 -0
  183. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/kinds/check/kind.yml +0 -0
  184. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/kinds/codecov/kind.yml +0 -0
  185. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/kinds/complete/kind.yml +0 -0
  186. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/kinds/doc/kind.yml +0 -0
  187. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/kinds/docker-image/kind.yml +0 -0
  188. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/kinds/fetch/kind.yml +0 -0
  189. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/kinds/push-image/kind.yml +0 -0
  190. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/kinds/test/kind.yml +0 -0
  191. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/kinds/test/linux.yml +0 -0
  192. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/kinds/test/windows.yml +0 -0
  193. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/scripts/codecov-upload.py +0 -0
  194. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/self_taskgraph/__init__.py +0 -0
  195. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/self_taskgraph/custom_parameters.py +0 -0
  196. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/self_taskgraph/custom_target_tasks.py +0 -0
  197. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/self_taskgraph/transforms/add_pr_route.py +0 -0
  198. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/self_taskgraph/transforms/push_image.py +0 -0
  199. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/test/params/main-repo-pull-request-untrusted.yml +0 -0
  200. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/test/params/main-repo-pull-request.yml +0 -0
  201. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/test/params/main-repo-push.yml +0 -0
  202. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/test/params/main-repo-release-pytest-taskgraph.yml +0 -0
  203. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/taskcluster/test/params/main-repo-release-taskcluster-taskgraph.yml +0 -0
  204. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/template/cookiecutter.json +0 -0
  205. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/template/hooks/post_gen_project.py +0 -0
  206. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/template/{{cookiecutter.project_name}}/taskcluster/config.yml +0 -0
  207. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/template/{{cookiecutter.project_name}}/taskcluster/kinds/docker-image/kind.yml +0 -0
  208. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/template/{{cookiecutter.project_name}}/taskcluster/kinds/hello/kind.yml +0 -0
  209. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/template/{{cookiecutter.project_name}}/taskcluster/{{cookiecutter.project_slug}}_taskgraph/transforms/hello.py +0 -0
  210. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/template/{{cookiecutter.project_name}}/taskcluster.github.yml +0 -0
  211. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/__init__.py +0 -0
  212. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/automationrelevance.json +0 -0
  213. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/data/task_context.yml +0 -0
  214. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/data/taskcluster/config.yml +0 -0
  215. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/data/taskcluster/docker/hello-world/Dockerfile +0 -0
  216. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/data/taskcluster/docker/hello-world-tag/Dockerfile +0 -0
  217. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/data/taskcluster/docker/hello-world-tag/REGISTRY +0 -0
  218. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/data/taskcluster/docker/hello-world-tag/VERSION +0 -0
  219. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/data/taskcluster/kinds/docker-image/kind.yml +0 -0
  220. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/data/taskcluster/scripts/toolchain/run.ps1 +0 -0
  221. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/data/taskcluster/scripts/toolchain/run.sh +0 -0
  222. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/data/taskcluster/test_taskgraph/transforms/foo.py +0 -0
  223. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/data/testmod/thing.py +0 -0
  224. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/mockedopen.py +0 -0
  225. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_actions_rebuild_cached_tasks.py +0 -0
  226. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_actions_registry.py +0 -0
  227. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_config.py +0 -0
  228. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_decision.py +0 -0
  229. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_docker.py +0 -0
  230. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_generator.py +0 -0
  231. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_graph.py +0 -0
  232. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_main.py +0 -0
  233. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_optimize.py +0 -0
  234. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_optimize_strategies.py +0 -0
  235. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_parameters.py +0 -0
  236. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_target_tasks.py +0 -0
  237. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_taskgraph.py +0 -0
  238. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_transform_chunking.py +0 -0
  239. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_transform_docker_image.py +0 -0
  240. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_transform_task_context.py +0 -0
  241. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_transforms_base.py +0 -0
  242. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_transforms_cached_tasks.py +0 -0
  243. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_transforms_fetch.py +0 -0
  244. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_transforms_from_deps.py +0 -0
  245. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_transforms_matrix.py +0 -0
  246. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_transforms_notify.py +0 -0
  247. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_transforms_run.py +0 -0
  248. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_transforms_run_run_task.py +0 -0
  249. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_transforms_run_toolchain.py +0 -0
  250. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_transforms_task.py +0 -0
  251. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_util_archive.py +0 -0
  252. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_util_attributes.py +0 -0
  253. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_util_cached_tasks.py +0 -0
  254. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_util_copy.py +0 -0
  255. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_util_dependencies.py +0 -0
  256. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_util_docker.py +0 -0
  257. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_util_json.py +0 -0
  258. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_util_keyed_by.py +0 -0
  259. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_util_parameterization.py +0 -0
  260. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_util_path.py +0 -0
  261. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_util_python_path.py +0 -0
  262. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_util_readonlydict.py +0 -0
  263. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_util_schema.py +0 -0
  264. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_util_taskcluster.py +0 -0
  265. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_util_templates.py +0 -0
  266. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_util_time.py +0 -0
  267. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_util_treeherder.py +0 -0
  268. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_util_vcs.py +0 -0
  269. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_util_verify.py +0 -0
  270. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/test/test_util_workertypes.py +0 -0
  271. {taskcluster_taskgraph-24.1.0 → taskcluster_taskgraph-24.2.0}/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.0] - 2026-07-15
4
+
5
+ ### Added
6
+
7
+ - Included profile data for `run-task` VCS operations in the log
8
+
9
+ ### Fixed
10
+
11
+ - Ensure `INDEX_RANK` env is cast to a string for index tasks
12
+ - Properly capture all exceptions in `taskgraph.create.create_tasks`
13
+ - Send `Accept-Encoding` header in `fetch-content` script
14
+ - Release graphs from memory upon completion when using `taskgraph <phase> --diff`
15
+
16
+ ## [24.1.1] - 2026-06-11
17
+
18
+ ### Fixed
19
+
20
+ - Use proper `comm` parameters in Git repos as well
21
+
3
22
  ## [24.1.0] - 2026-06-04
4
23
 
5
24
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taskcluster-taskgraph
3
- Version: 24.1.0
3
+ Version: 24.2.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
@@ -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.0"
4
+ version = "24.2.0"
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
 
@@ -222,6 +222,7 @@ def generate_taskgraph(options, parameters, overrides, logdir):
222
222
  return 0
223
223
 
224
224
  futures = {}
225
+ returncode = 0
225
226
  with ProcessPoolExecutor(max_workers=options["max_workers"]) as executor:
226
227
  for spec in parameters:
227
228
  f = executor.submit(
@@ -229,25 +230,24 @@ def generate_taskgraph(options, parameters, overrides, logdir):
229
230
  )
230
231
  futures[f] = spec
231
232
 
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()
233
+ for future in as_completed(futures):
234
+ output_file = options["output_file"]
235
+ spec = futures.pop(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()
245
245
 
246
- dump_output(
247
- out,
248
- path=output_file,
249
- params_spec=spec if len(parameters) > 1 else None,
250
- )
246
+ dump_output(
247
+ out,
248
+ path=output_file,
249
+ params_spec=spec if len(parameters) > 1 else None,
250
+ )
251
251
 
252
252
  return returncode
253
253
 
@@ -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
 
@@ -291,30 +291,33 @@ class Parameters(ReadOnlyDict):
291
291
 
292
292
  :return str: The URL displaying the given path.
293
293
  """
294
+ if "comm/" in path:
295
+ path = path.split("comm/")[1]
296
+ repo_key = "comm_head_repository"
297
+ rev_key = "comm_head_rev"
298
+ else:
299
+ repo_key = "head_repository"
300
+ rev_key = "head_rev"
301
+
294
302
  if self["repository_type"] == "hg":
295
- if "comm/" in path:
296
- path = path.split("comm/")[1]
297
- repo = self["comm_head_repository"]
298
- rev = self["comm_head_rev"]
299
- else:
300
- repo = self["head_repository"]
301
- rev = self["head_rev"]
303
+ repo = self[repo_key]
304
+ rev = self[rev_key]
302
305
  endpoint = "file" if pretty else "raw-file"
303
306
  return f"{repo}/{endpoint}/{rev}/{path}"
304
307
  elif self["repository_type"] == "git":
305
308
  # For getting the file URL for git repositories, we only support a Github HTTPS remote
306
- repo = self["head_repository"]
309
+ repo = self[repo_key]
307
310
  if repo.startswith("https://github.com/"):
308
311
  if repo.endswith("/"):
309
312
  repo = repo[:-1]
310
313
 
311
- rev = self["head_rev"]
314
+ rev = self[rev_key]
312
315
  endpoint = "blob" if pretty else "raw"
313
316
  return f"{repo}/{endpoint}/{rev}/{path}"
314
317
  elif repo.startswith("git@github.com:"):
315
318
  if repo.endswith(".git"):
316
319
  repo = repo[:-4]
317
- rev = self["head_rev"]
320
+ rev = self[rev_key]
318
321
  endpoint = "blob" if pretty else "raw"
319
322
  return "{}/{}/{}/{}".format(
320
323
  repo.replace("git@github.com:", "https://github.com/"),
@@ -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({