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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (270) hide show
  1. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/.pre-commit-config.yaml +2 -2
  2. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/.taskcluster.yml +2 -0
  3. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/CHANGELOG.md +17 -0
  4. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/PKG-INFO +1 -1
  5. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/reference/migrations.rst +11 -0
  6. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/reference/transforms/task_context.rst +34 -7
  7. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/packages/pytest-taskgraph/src/pytest_taskgraph/fixtures/gen.py +0 -3
  8. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/pyproject.toml +1 -1
  9. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/decision.py +37 -42
  10. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/parameters.py +0 -7
  11. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/transforms/docker_image.py +1 -1
  12. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/transforms/task.py +3 -5
  13. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/transforms/task_context.py +20 -5
  14. taskcluster_taskgraph-24.0.0/test/test_transform_task_context.py +222 -0
  15. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/uv.lock +133 -133
  16. taskcluster_taskgraph-23.1.0/.github/workflows/pre-commit-autoupdate.yml +0 -15
  17. taskcluster_taskgraph-23.1.0/.github/workflows/pre-commit.yml +0 -12
  18. taskcluster_taskgraph-23.1.0/test/test_transform_task_context.py +0 -94
  19. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/.codespell-ignore-words.txt +0 -0
  20. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/.github/CODEOWNERS +0 -0
  21. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/.github/workflows/codeql-analysis.yml +0 -0
  22. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/.github/workflows/pypi-publish.yml +0 -0
  23. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/.gitignore +0 -0
  24. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/.readthedocs.yaml +0 -0
  25. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/.yamllint +0 -0
  26. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/CODE_OF_CONDUCT.md +0 -0
  27. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/CONTRIBUTING.rst +0 -0
  28. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/LICENSE +0 -0
  29. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/Makefile +0 -0
  30. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/README.rst +0 -0
  31. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/concepts/index.rst +0 -0
  32. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/concepts/kind.rst +0 -0
  33. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/concepts/loading.rst +0 -0
  34. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/concepts/optimization.rst +0 -0
  35. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/concepts/overview.rst +0 -0
  36. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/concepts/scopes.rst +0 -0
  37. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/concepts/task-graphs.rst +0 -0
  38. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/concepts/transforms.rst +0 -0
  39. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/conf.py +0 -0
  40. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/contributing.rst +0 -0
  41. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/glossary.rst +0 -0
  42. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/howto/bootstrap-taskgraph.rst +0 -0
  43. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/howto/create-actions.rst +0 -0
  44. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/howto/create-tasks.rst +0 -0
  45. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/howto/debugging.rst +0 -0
  46. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/howto/define-schemas.rst +0 -0
  47. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/howto/docker.rst +0 -0
  48. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/howto/index.rst +0 -0
  49. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/howto/load-task-locally.rst +0 -0
  50. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/howto/resolve-keyed-by.rst +0 -0
  51. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/howto/run-locally.rst +0 -0
  52. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/howto/send-notifications.rst +0 -0
  53. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/howto/use-fetches.rst +0 -0
  54. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/index.rst +0 -0
  55. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/reference/cli.rst +0 -0
  56. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/reference/index.rst +0 -0
  57. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/reference/optimization-strategies.rst +0 -0
  58. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/reference/parameters.rst +0 -0
  59. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/reference/source/modules.rst +0 -0
  60. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/reference/source/taskgraph.actions.rst +0 -0
  61. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/reference/source/taskgraph.loader.rst +0 -0
  62. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/reference/source/taskgraph.optimize.rst +0 -0
  63. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/reference/source/taskgraph.rst +0 -0
  64. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/reference/source/taskgraph.transforms.rst +0 -0
  65. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/reference/source/taskgraph.transforms.run.rst +0 -0
  66. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/reference/source/taskgraph.util.rst +0 -0
  67. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/reference/transforms/chunking.rst +0 -0
  68. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/reference/transforms/from_deps.rst +0 -0
  69. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/reference/transforms/index.rst +0 -0
  70. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/reference/transforms/matrix.rst +0 -0
  71. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/tutorials/connecting-taskcluster.rst +0 -0
  72. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/tutorials/creating-a-task-graph.rst +0 -0
  73. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/tutorials/example-taskcluster.yml +0 -0
  74. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/tutorials/getting-started.rst +0 -0
  75. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/docs/tutorials/index.rst +0 -0
  76. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/make.bat +0 -0
  77. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/packages/pytest-taskgraph/README.md +0 -0
  78. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/packages/pytest-taskgraph/pyproject.toml +0 -0
  79. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/packages/pytest-taskgraph/src/pytest_taskgraph/__init__.py +0 -0
  80. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/packages/pytest-taskgraph/src/pytest_taskgraph/fixtures/vcs.py +0 -0
  81. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/packages/sphinx-taskgraph/README.md +0 -0
  82. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/packages/sphinx-taskgraph/pyproject.toml +0 -0
  83. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/packages/sphinx-taskgraph/src/sphinx_taskgraph/__init__.py +0 -0
  84. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/packages/sphinx-taskgraph/src/sphinx_taskgraph/autoschema.py +0 -0
  85. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/renovate.json +0 -0
  86. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/__init__.py +0 -0
  87. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/actions/__init__.py +0 -0
  88. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/actions/add_new_jobs.py +0 -0
  89. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/actions/cancel.py +0 -0
  90. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/actions/cancel_all.py +0 -0
  91. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/actions/rebuild_cached_tasks.py +0 -0
  92. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/actions/registry.py +0 -0
  93. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/actions/retrigger.py +0 -0
  94. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/actions/util.py +0 -0
  95. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/config.py +0 -0
  96. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/create.py +0 -0
  97. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/docker.py +0 -0
  98. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/filter_tasks.py +0 -0
  99. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/generator.py +0 -0
  100. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/graph.py +0 -0
  101. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/loader/__init__.py +0 -0
  102. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/loader/default.py +0 -0
  103. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/loader/transform.py +0 -0
  104. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/main.py +0 -0
  105. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/morph.py +0 -0
  106. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/optimize/__init__.py +0 -0
  107. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/optimize/base.py +0 -0
  108. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/optimize/strategies.py +0 -0
  109. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/run-task/fetch-content +0 -0
  110. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/run-task/hgrc +0 -0
  111. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/run-task/robustcheckout.py +0 -0
  112. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/run-task/run-task +0 -0
  113. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/target_tasks.py +0 -0
  114. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/task.py +0 -0
  115. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/taskgraph.py +0 -0
  116. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/transforms/__init__.py +0 -0
  117. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/transforms/base.py +0 -0
  118. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/transforms/cached_tasks.py +0 -0
  119. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/transforms/chunking.py +0 -0
  120. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/transforms/code_review.py +0 -0
  121. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/transforms/fetch.py +0 -0
  122. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/transforms/from_deps.py +0 -0
  123. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/transforms/matrix.py +0 -0
  124. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/transforms/notify.py +0 -0
  125. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/transforms/run/__init__.py +0 -0
  126. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/transforms/run/common.py +0 -0
  127. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/transforms/run/index_search.py +0 -0
  128. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/transforms/run/run_task.py +0 -0
  129. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/transforms/run/toolchain.py +0 -0
  130. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/__init__.py +0 -0
  131. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/archive.py +0 -0
  132. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/attributes.py +0 -0
  133. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/cached_tasks.py +0 -0
  134. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/caches.py +0 -0
  135. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/copy.py +0 -0
  136. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/dependencies.py +0 -0
  137. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/docker.py +0 -0
  138. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/hash.py +0 -0
  139. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/json.py +0 -0
  140. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/keyed_by.py +0 -0
  141. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/parameterization.py +0 -0
  142. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/path.py +0 -0
  143. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/python_path.py +0 -0
  144. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/readonlydict.py +0 -0
  145. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/schema.py +0 -0
  146. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/set_name.py +0 -0
  147. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/shell.py +0 -0
  148. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/taskcluster.py +0 -0
  149. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/taskgraph.py +0 -0
  150. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/templates.py +0 -0
  151. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/time.py +0 -0
  152. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/treeherder.py +0 -0
  153. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/vcs.py +0 -0
  154. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/verify.py +0 -0
  155. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/workertypes.py +0 -0
  156. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/src/taskgraph/util/yaml.py +0 -0
  157. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/config.yml +0 -0
  158. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/docker/REGISTRY +0 -0
  159. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/docker/decision/Dockerfile +0 -0
  160. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/docker/decision/HASH +0 -0
  161. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/docker/decision/README.md +0 -0
  162. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/docker/decision/VERSION +0 -0
  163. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/docker/decision/system-setup.sh +0 -0
  164. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/docker/fetch/Dockerfile +0 -0
  165. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/docker/image_builder/README.rst +0 -0
  166. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/docker/index-task/Dockerfile +0 -0
  167. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/docker/index-task/README +0 -0
  168. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/docker/index-task/insert-indexes.js +0 -0
  169. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/docker/index-task/package.json +0 -0
  170. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/docker/index-task/yarn.lock +0 -0
  171. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/docker/python/Dockerfile +0 -0
  172. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/docker/run-task/Dockerfile +0 -0
  173. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/docker/run-task/system-setup.sh +0 -0
  174. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/docker/skopeo/Dockerfile +0 -0
  175. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/docker/skopeo/policy.json +0 -0
  176. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/docker/skopeo/push_image.sh +0 -0
  177. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/kinds/check/kind.yml +0 -0
  178. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/kinds/codecov/kind.yml +0 -0
  179. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/kinds/complete/kind.yml +0 -0
  180. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/kinds/doc/kind.yml +0 -0
  181. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/kinds/docker-image/kind.yml +0 -0
  182. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/kinds/fetch/kind.yml +0 -0
  183. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/kinds/push-image/kind.yml +0 -0
  184. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/kinds/test/kind.yml +0 -0
  185. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/kinds/test/linux.yml +0 -0
  186. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/kinds/test/windows.yml +0 -0
  187. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/scripts/codecov-upload.py +0 -0
  188. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/self_taskgraph/__init__.py +0 -0
  189. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/self_taskgraph/custom_parameters.py +0 -0
  190. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/self_taskgraph/custom_target_tasks.py +0 -0
  191. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/self_taskgraph/transforms/add_pr_route.py +0 -0
  192. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/self_taskgraph/transforms/push_image.py +0 -0
  193. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/test/params/main-repo-pull-request-untrusted.yml +0 -0
  194. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/test/params/main-repo-pull-request.yml +0 -0
  195. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/test/params/main-repo-push.yml +0 -0
  196. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/test/params/main-repo-release-pytest-taskgraph.yml +0 -0
  197. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/taskcluster/test/params/main-repo-release-taskcluster-taskgraph.yml +0 -0
  198. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/template/cookiecutter.json +0 -0
  199. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/template/hooks/post_gen_project.py +0 -0
  200. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/template/{{cookiecutter.project_name}}/taskcluster/config.yml +0 -0
  201. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/template/{{cookiecutter.project_name}}/taskcluster/docker/linux/Dockerfile +0 -0
  202. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/template/{{cookiecutter.project_name}}/taskcluster/kinds/docker-image/kind.yml +0 -0
  203. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/template/{{cookiecutter.project_name}}/taskcluster/kinds/hello/kind.yml +0 -0
  204. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/template/{{cookiecutter.project_name}}/taskcluster/{{cookiecutter.project_slug}}_taskgraph/transforms/hello.py +0 -0
  205. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/template/{{cookiecutter.project_name}}/taskcluster.github.yml +0 -0
  206. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/__init__.py +0 -0
  207. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/automationrelevance.json +0 -0
  208. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/conftest.py +0 -0
  209. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/data/task_context.yml +0 -0
  210. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/data/taskcluster/config.yml +0 -0
  211. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/data/taskcluster/docker/hello-world/Dockerfile +0 -0
  212. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/data/taskcluster/docker/hello-world-tag/Dockerfile +0 -0
  213. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/data/taskcluster/docker/hello-world-tag/REGISTRY +0 -0
  214. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/data/taskcluster/docker/hello-world-tag/VERSION +0 -0
  215. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/data/taskcluster/kinds/docker-image/kind.yml +0 -0
  216. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/data/taskcluster/scripts/toolchain/run.ps1 +0 -0
  217. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/data/taskcluster/scripts/toolchain/run.sh +0 -0
  218. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/data/taskcluster/test_taskgraph/transforms/foo.py +0 -0
  219. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/data/testmod/thing.py +0 -0
  220. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/mockedopen.py +0 -0
  221. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_actions_rebuild_cached_tasks.py +0 -0
  222. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_actions_registry.py +0 -0
  223. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_config.py +0 -0
  224. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_create.py +0 -0
  225. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_decision.py +0 -0
  226. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_docker.py +0 -0
  227. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_generator.py +0 -0
  228. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_graph.py +0 -0
  229. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_main.py +0 -0
  230. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_morph.py +0 -0
  231. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_optimize.py +0 -0
  232. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_optimize_strategies.py +0 -0
  233. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_parameters.py +0 -0
  234. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_scripts_fetch_content.py +0 -0
  235. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_scripts_run_task.py +0 -0
  236. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_target_tasks.py +0 -0
  237. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_taskgraph.py +0 -0
  238. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_transform_chunking.py +0 -0
  239. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_transform_docker_image.py +0 -0
  240. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_transforms_base.py +0 -0
  241. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_transforms_cached_tasks.py +0 -0
  242. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_transforms_fetch.py +0 -0
  243. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_transforms_from_deps.py +0 -0
  244. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_transforms_matrix.py +0 -0
  245. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_transforms_notify.py +0 -0
  246. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_transforms_run.py +0 -0
  247. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_transforms_run_run_task.py +0 -0
  248. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_transforms_run_toolchain.py +0 -0
  249. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_transforms_task.py +0 -0
  250. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_util_archive.py +0 -0
  251. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_util_attributes.py +0 -0
  252. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_util_cached_tasks.py +0 -0
  253. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_util_copy.py +0 -0
  254. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_util_dependencies.py +0 -0
  255. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_util_docker.py +0 -0
  256. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_util_json.py +0 -0
  257. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_util_keyed_by.py +0 -0
  258. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_util_parameterization.py +0 -0
  259. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_util_path.py +0 -0
  260. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_util_python_path.py +0 -0
  261. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_util_readonlydict.py +0 -0
  262. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_util_schema.py +0 -0
  263. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_util_taskcluster.py +0 -0
  264. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_util_templates.py +0 -0
  265. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_util_time.py +0 -0
  266. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_util_treeherder.py +0 -0
  267. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_util_vcs.py +0 -0
  268. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_util_verify.py +0 -0
  269. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_util_workertypes.py +0 -0
  270. {taskcluster_taskgraph-23.1.0 → taskcluster_taskgraph-24.0.0}/test/test_util_yaml.py +0 -0
@@ -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.12
16
+ rev: v0.15.15
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.8
22
+ rev: 0.11.17
23
23
  hooks:
24
24
  - id: uv-lock
25
25
  - repo: https://github.com/adrienverge/yamllint.git
@@ -9,6 +9,8 @@ reporting: checks-v1
9
9
  autoCancelPreviousChecks: true
10
10
  policy:
11
11
  pullRequests: public_restricted
12
+ hooks:
13
+ - name: lint/pre-commit-v1
12
14
  tasks:
13
15
  # NOTE: support for actions in ci-admin requires that the `tasks` property be an array *before* JSON-e rendering
14
16
  # takes place.
@@ -1,5 +1,22 @@
1
1
  # Change Log
2
2
 
3
+ ## [24.0.0] - 2026-06-03
4
+
5
+ ### Changed
6
+
7
+ - BREAKING CHANGE: Must pass in `--allow-parameter-override` if using try_task_config
8
+ - BREAKING CHANGE: Default level 1 artifact expiry changed from 1 year to 28 days
9
+
10
+ ### Removed
11
+
12
+ - BREAKING CHANGE: Removed `Parameters.is_try()` helper method
13
+
14
+ ## [23.2.0] - 2026-06-03
15
+
16
+ ### Added
17
+
18
+ - `task-context` now calls `resolve_keyed_by` on `substitution-fields` (#968)
19
+
3
20
  ## [23.1.0] - 2026-05-26
4
21
 
5
22
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: taskcluster-taskgraph
3
- Version: 23.1.0
3
+ Version: 24.0.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
@@ -3,6 +3,17 @@ Migration Guide
3
3
 
4
4
  This page can help when migrating Taskgraph across major versions.
5
5
 
6
+ 23.x -> 24.x
7
+ ------------
8
+
9
+ * You must now pass in `--allow-parameter-override` into Decision tasks that
10
+ need to load the `try_task_config.json` file at the root of the repo.
11
+ * `taskgraph.parameters.Parameters.is_try()` is removed. Either in-line the old
12
+ method to a utility or use alternative logic.
13
+ * Level 1 artifacts' default expiry changed from "1 year" to "28 days". If
14
+ needed, set `task-expires-after` in `taskcluster/config.yml` to adjust the
15
+ default back.
16
+
6
17
  22.x -> 23.x
7
18
  ------------
8
19
 
@@ -4,8 +4,8 @@ Task Context Transforms
4
4
  =======================
5
5
 
6
6
  The :mod:`taskgraph.transforms.task_context` transform can be used to
7
- substitute values into any field in a task with data that is not known
8
- until ``taskgraph`` runs.
7
+ resolve keys and/or substitute values into any field in a task with data
8
+ that is not known until ``taskgraph`` runs.
9
9
 
10
10
  This data can be provided in a few ways, as described below.
11
11
 
@@ -37,7 +37,10 @@ Then create a ``task-context`` section in your task definition, e.g:
37
37
 
38
38
  tasks:
39
39
  build:
40
- description: my description {foo}
40
+ description:
41
+ by-foo:
42
+ bar: super special description for bar tasks
43
+ default: my description of {foo}
41
44
  task-context:
42
45
  from-parameters:
43
46
  foo: foo
@@ -50,9 +53,30 @@ are used:
50
53
 
51
54
  .. code-block:: yaml
52
55
 
53
- foo: with some extra
56
+ foo: bar
57
+
58
+ ...the description will end up with a value of "super special description for bar tasks".
54
59
 
55
- ...the description will end up with a value of "my description with some extra".
60
+ When ``foo`` is set to any other value (eg: ``bar``) the description will end with the
61
+ ``default`` value with the value of ``foo`` substituted in (eg: ``my description of bar``).
62
+
63
+ This pattern is often used to configure things vary based on how tasks are created. For example, the following can be used to adjust the scopes a task is given depending on the GitHub event that created the decision task:
64
+
65
+ .. code-block:: yaml
66
+
67
+ tasks:
68
+ build:
69
+ task-context:
70
+ from-parameters:
71
+ tasks_for: tasks_for
72
+ substitution-fields:
73
+ - scopes
74
+
75
+ scopes:
76
+ by-tasks-for:
77
+ github-push:
78
+ - secrets:get:project/foo/api_token
79
+ default: []
56
80
 
57
81
  When using ``from-parameters`` you may also provide an ordered list of keys to
58
82
  look for in the parameters, with the first one found being used. For example,
@@ -154,8 +178,11 @@ Finally, the name of the task is added to the context implicitly. For example:
154
178
  This will evaluate the description correctly, even though there are no
155
179
  ``task-context`` keys defined on the individual tasks.
156
180
 
157
- Precedence
158
- ----------
181
+ Order of Operations & Precedence
182
+ --------------------------------
183
+
184
+ Keys will be resolved on ``substitution-fields`` first, then substitution
185
+ will be performed on the resolved value.
159
186
 
160
187
  If the same key is found in multiple places the order of precedence is as
161
188
  follows: ``from-parameters``, ``from-object`` keys, ``from-file`` and finally
@@ -123,9 +123,6 @@ def graph_config(datadir):
123
123
  class FakeParameters(dict):
124
124
  strict = True
125
125
 
126
- def is_try(self):
127
- return self["level"] != 3
128
-
129
126
  def file_url(self, path, pretty=False):
130
127
  return path
131
128
 
@@ -1,7 +1,7 @@
1
1
  ### Project
2
2
  [project]
3
3
  name = "taskcluster-taskgraph"
4
- version = "23.1.0"
4
+ version = "24.0.0"
5
5
  description = "Build taskcluster taskgraphs"
6
6
  readme = "README.rst"
7
7
  authors = [
@@ -252,31 +252,27 @@ def get_decision_parameters(graph_config, options):
252
252
  assert callable(decision_params)
253
253
  decision_params(graph_config, parameters)
254
254
 
255
- if options.get("try_task_config_file"):
256
- task_config_file = os.path.abspath(options.get("try_task_config_file"))
257
- else:
258
- # if try_task_config.json is present, load it
259
- task_config_file = os.path.join(os.getcwd(), "try_task_config.json")
260
-
261
- # load try settings
262
- if ("try" in project and options["tasks_for"] == "hg-push") or options[
263
- "tasks_for"
264
- ] == "github-pull-request":
265
- set_try_config(parameters, task_config_file)
266
-
267
- # load extra parameters from vcs note if able
268
- note_ref = "refs/notes/decision-parameters"
269
- if options.get("allow_parameter_override") and (
270
- note_params := repo.get_note(note_ref, parameters["head_repository"])
271
- ):
272
- try:
273
- note_params = json.loads(note_params)
274
- logger.info(
275
- f"Overriding parameters from {note_ref}:\n{json.dumps(note_params, indent=2)}"
276
- )
277
- parameters.update(note_params)
278
- except ValueError as e:
279
- raise Exception(f"Failed to parse {note_ref} as JSON: {e}") from e
255
+ # load extra parameters from file or vcs note if able
256
+ if options.get("allow_parameter_override"):
257
+ note_ref = "refs/notes/decision-parameters"
258
+ if options.get("try_task_config_file"):
259
+ task_config_file = os.path.abspath(options.get("try_task_config_file"))
260
+ else:
261
+ # if try_task_config.json is present, load it
262
+ task_config_file = os.path.join(os.getcwd(), "try_task_config.json")
263
+
264
+ if os.path.isfile(task_config_file):
265
+ set_try_config(parameters, task_config_file)
266
+
267
+ elif note_params := repo.get_note(note_ref, parameters["head_repository"]):
268
+ try:
269
+ note_params = json.loads(note_params)
270
+ logger.info(
271
+ f"Overriding parameters from {note_ref}:\n{json.dumps(note_params, indent=2)}"
272
+ )
273
+ parameters.update(note_params)
274
+ except ValueError as e:
275
+ raise Exception(f"Failed to parse {note_ref} as JSON: {e}") from e
280
276
 
281
277
  result = Parameters(**parameters)
282
278
  result.check()
@@ -284,23 +280,22 @@ def get_decision_parameters(graph_config, options):
284
280
 
285
281
 
286
282
  def set_try_config(parameters, task_config_file):
287
- if os.path.isfile(task_config_file):
288
- logger.info(f"using try tasks from {task_config_file}")
289
- with open(task_config_file) as fh:
290
- task_config = json.load(fh)
291
- task_config_version = task_config.pop("version")
292
- if task_config_version == 2:
293
- validate_schema(
294
- try_task_config_schema_v2,
295
- task_config,
296
- "Invalid v2 `try_task_config.json`.",
297
- )
298
- parameters.update(task_config["parameters"])
299
- return
300
- else:
301
- raise Exception(
302
- f"Unknown `try_task_config.json` version: {task_config_version}"
303
- )
283
+ logger.info(f"using try tasks from {task_config_file}")
284
+ with open(task_config_file) as fh:
285
+ task_config = json.load(fh)
286
+ task_config_version = task_config.pop("version")
287
+ if task_config_version == 2:
288
+ validate_schema(
289
+ try_task_config_schema_v2,
290
+ task_config,
291
+ "Invalid v2 `try_task_config.json`.",
292
+ )
293
+ parameters.update(task_config["parameters"])
294
+ return
295
+ else:
296
+ raise Exception(
297
+ f"Unknown `try_task_config.json` version: {task_config_version}"
298
+ )
304
299
 
305
300
 
306
301
  def write_artifact(filename, data):
@@ -273,13 +273,6 @@ class Parameters(ReadOnlyDict):
273
273
  except KeyError:
274
274
  raise KeyError(f"taskgraph parameter {k!r} not found")
275
275
 
276
- def is_try(self):
277
- """
278
- Determine whether this graph is being built on a try project or for
279
- `mach try fuzzy`.
280
- """
281
- return "try" in self["project"] or self["tasks_for"] == "github-pull-request"
282
-
283
276
  @property
284
277
  def moz_build_date(self):
285
278
  # XXX self["moz_build_date"] is left as a string because:
@@ -130,7 +130,7 @@ def fill_template(config, tasks):
130
130
  "artifact_prefix": "public",
131
131
  },
132
132
  "always-target": True,
133
- "expires-after": expires if config.params.is_try() else "1 year",
133
+ "expires-after": expires if config.params["level"] == "1" else "1 year",
134
134
  "scopes": [],
135
135
  "run-on-projects": [],
136
136
  "worker-type": "images",
@@ -457,12 +457,10 @@ def build_docker_worker_payload(config, task, task_def):
457
457
  else:
458
458
  suffix = cache_version
459
459
 
460
- skip_untrusted = config.params.is_try() or level == 1
461
-
462
460
  for cache in worker["caches"]:
463
461
  # Some caches aren't enabled in environments where we can't
464
462
  # guarantee certain behavior. Filter those out.
465
- if cache.get("skip-untrusted") and skip_untrusted:
463
+ if cache.get("skip-untrusted") and level == 1:
466
464
  continue
467
465
 
468
466
  name = "{trust_domain}-level-{level}-{name}-{suffix}".format(
@@ -484,7 +482,7 @@ def build_docker_worker_payload(config, task, task_def):
484
482
  if run_task and worker.get("volumes"):
485
483
  payload["env"]["TASKCLUSTER_VOLUMES"] = ";".join(sorted(worker["volumes"]))
486
484
 
487
- if payload.get("cache") and skip_untrusted: # type: ignore
485
+ if payload.get("cache") and level == 1: # type: ignore
488
486
  payload["env"]["TASKCLUSTER_UNTRUSTED_CACHES"] = "1"
489
487
 
490
488
  if features:
@@ -999,7 +997,7 @@ def build_task(config, tasks):
999
997
  if "expires-after" not in task:
1000
998
  task["expires-after"] = (
1001
999
  config.graph_config._config.get("task-expires-after", "28 days")
1002
- if config.params.is_try()
1000
+ if config.params["level"] == "1"
1003
1001
  else "1 year"
1004
1002
  )
1005
1003
 
@@ -1,14 +1,20 @@
1
1
  from typing import Optional, Union
2
2
 
3
3
  from taskgraph.transforms.base import TransformSequence
4
- from taskgraph.util.schema import Schema
4
+ from taskgraph.util.schema import Schema, resolve_keyed_by
5
5
  from taskgraph.util.templates import deep_get, substitute_task_fields
6
6
  from taskgraph.util.yaml import load_yaml
7
7
 
8
8
 
9
+ class ResolveKeyedByConfigOptions(Schema):
10
+ # forwarded to `resolve_keyed_by`; see that function for details
11
+ defer: Optional[list[str]] = None
12
+ enforce_single_match: Optional[bool] = None
13
+
14
+
9
15
  class TaskContextConfig(Schema):
10
16
  # A list of fields in the task to substitute the provided values
11
- # into.
17
+ # into and/or resolve keys in.
12
18
  substitution_fields: list[str]
13
19
  # Retrieve task context values from parameters. A single
14
20
  # parameter may be provided or a list of parameters in
@@ -22,13 +28,15 @@ class TaskContextConfig(Schema):
22
28
  from_file: Optional[str] = None
23
29
  # Key/value pairs to be used as task context
24
30
  from_object: Optional[object] = None
31
+ resolve_keyed_by_options: Optional[ResolveKeyedByConfigOptions] = None
25
32
 
26
33
 
27
34
  #: Schema for the task_context transforms
28
35
  class TaskContextSchema(Schema, forbid_unknown_fields=False, kw_only=True):
29
36
  name: Optional[str] = None
30
- # `task-context` can be used to substitute values into any field in a
31
- # task with data that is not known until `taskgraph` runs.
37
+ # `task-context` can be used to substitute values into any field or resolve
38
+ # keys in a field in a task with data that is not known until `taskgraph`
39
+ # runs.
32
40
  #
33
41
  # This data can be provided via `from-parameters` or `from-file`,
34
42
  # which can pull in values from parameters and a defined yml file
@@ -46,6 +54,9 @@ class TaskContextSchema(Schema, forbid_unknown_fields=False, kw_only=True):
46
54
  # - File
47
55
  #
48
56
  # That is to say: parameters will always override anything else.
57
+ #
58
+ # Each entry in `substitution-fields` will first have `resolved_keyed_by`
59
+ # called on it, and then substitutions will be performed.
49
60
  task_context: Optional[TaskContextConfig] = None
50
61
 
51
62
 
@@ -89,6 +100,10 @@ def render_task(config, tasks):
89
100
  if "name" in task:
90
101
  subs.setdefault("name", task["name"])
91
102
 
92
- # Now that we have our combined context, we can substitute.
103
+ # Now that we have our combined context, we can resolve keys and substitute.
104
+ task_name = task.get("name", task.get("label", "?"))
105
+ resolve_keyed_by_options = sub_config.get("resolve-keyed-by-options") or {}
106
+ for field in fields:
107
+ resolve_keyed_by(task, field, task_name, **resolve_keyed_by_options, **subs)
93
108
  substitute_task_fields(task, fields, **subs)
94
109
  yield task
@@ -0,0 +1,222 @@
1
+ """
2
+ Tests for the 'task_context' transforms.
3
+ """
4
+
5
+ import os.path
6
+ from copy import deepcopy
7
+ from pprint import pprint
8
+
9
+ import pytest
10
+ from pytest_taskgraph import FakeParameters
11
+
12
+ from taskgraph.transforms import task_context
13
+ from taskgraph.transforms.base import TransformConfig
14
+
15
+ here = os.path.abspath(os.path.dirname(__file__))
16
+
17
+ BASE_PARAMS = {
18
+ "base_repository": "http://hg.example.com",
19
+ "build_date": 0,
20
+ "build_number": 1,
21
+ "enable_always_target": True,
22
+ "head_repository": "http://hg.example.com",
23
+ "head_rev": "abcdef",
24
+ "head_ref": "default",
25
+ "level": "1",
26
+ "moz_build_date": 0,
27
+ "next_version": "1.0.1",
28
+ "owner": "some-owner",
29
+ "project": "some-project",
30
+ "pushlog_id": 1,
31
+ "repository_type": "hg",
32
+ "target_tasks_method": "test_method",
33
+ "tasks_for": "hg-push",
34
+ "try_mode": None,
35
+ "version": "1.0.0",
36
+ }
37
+
38
+
39
+ def make_config(graph_config, extra_params=None):
40
+ params_data = dict(BASE_PARAMS)
41
+ if extra_params:
42
+ params_data.update(extra_params)
43
+ params = FakeParameters(params_data)
44
+ return TransformConfig(
45
+ "test", str(here), {}, params, {}, graph_config, write_artifacts=False
46
+ )
47
+
48
+
49
+ TASK_DEFAULTS = {
50
+ "description": "fake description {object} {file} {param} {object_and_file} "
51
+ "{object_and_param} {file_and_param} {object_file_and_param} {param_fallback} {name}",
52
+ "name": "fake-task-name",
53
+ "task-context": {
54
+ "from-parameters": {
55
+ "param": "param",
56
+ "object_and_param": "object_and_param",
57
+ "file_and_param": "file_and_param",
58
+ "object_file_and_param": "object_file_and_param",
59
+ "param_fallback": ["missing-param", "default"],
60
+ },
61
+ "from-file": f"{here}/data/task_context.yml",
62
+ "from-object": {
63
+ "object": "object",
64
+ "object_and_param": "shouldn't be used",
65
+ "object_and_file": "object-overrides-file",
66
+ "object_file_and_param": "shouldn't be used",
67
+ },
68
+ "substitution-fields": [
69
+ "description",
70
+ ],
71
+ },
72
+ }
73
+ EXPECTED_DESCRIPTION = (
74
+ "fake description object file param object-overrides-file "
75
+ "param-overrides-object param-overrides-file param-overrides-all default fake-task-name"
76
+ )
77
+ NO_CONTEXT = deepcopy(TASK_DEFAULTS)
78
+ del NO_CONTEXT["task-context"]
79
+
80
+
81
+ @pytest.mark.parametrize(
82
+ "task,description",
83
+ (
84
+ pytest.param(deepcopy(TASK_DEFAULTS), EXPECTED_DESCRIPTION, id="with-context"),
85
+ pytest.param(
86
+ deepcopy(NO_CONTEXT), TASK_DEFAULTS["description"], id="no-context"
87
+ ),
88
+ ),
89
+ )
90
+ def test_transforms(request, run_transform, graph_config, task, description):
91
+ config = make_config(
92
+ graph_config,
93
+ {
94
+ "param": "param",
95
+ "object_and_param": "param-overrides-object",
96
+ "file_and_param": "param-overrides-file",
97
+ "object_file_and_param": "param-overrides-all",
98
+ "default": "default",
99
+ },
100
+ )
101
+
102
+ task = run_transform(task_context.transforms, task, config=config)[0]
103
+ print("Dumping task:")
104
+ pprint(task, indent=2)
105
+
106
+ assert task["description"] == description
107
+
108
+
109
+ def test_resolve_keyed_by_from_parameters(run_transform, graph_config):
110
+ task = {
111
+ "name": "fake-task-name",
112
+ "description": {
113
+ "by-platform": {
114
+ "linux": "resolved-from-parameters",
115
+ "default": "default-value",
116
+ },
117
+ },
118
+ "task-context": {
119
+ "from-parameters": {"platform": "platform"},
120
+ "substitution-fields": ["description"],
121
+ },
122
+ }
123
+ config = make_config(graph_config, {"platform": "linux"})
124
+
125
+ task = run_transform(task_context.transforms, task, config=config)[0]
126
+ pprint(task, indent=2)
127
+
128
+ assert task["description"] == "resolved-from-parameters"
129
+
130
+
131
+ def test_resolve_keyed_by_from_file(run_transform, graph_config):
132
+ task = {
133
+ "name": "fake-task-name",
134
+ "description": {
135
+ "by-file": {
136
+ "file": "resolved-from-file",
137
+ "default": "default-value",
138
+ },
139
+ },
140
+ "task-context": {
141
+ "from-file": f"{here}/data/task_context.yml",
142
+ "substitution-fields": ["description"],
143
+ },
144
+ }
145
+ config = make_config(graph_config)
146
+
147
+ task = run_transform(task_context.transforms, task, config=config)[0]
148
+ pprint(task, indent=2)
149
+
150
+ assert task["description"] == "resolved-from-file"
151
+
152
+
153
+ def test_resolve_keyed_by_from_object(run_transform, graph_config):
154
+ task = {
155
+ "name": "fake-task-name",
156
+ "description": {
157
+ "by-flavor": {
158
+ "chocolate": "resolved-from-object",
159
+ "default": "default-value",
160
+ },
161
+ },
162
+ "task-context": {
163
+ "from-object": {"flavor": "chocolate"},
164
+ "substitution-fields": ["description"],
165
+ },
166
+ }
167
+ config = make_config(graph_config)
168
+
169
+ task = run_transform(task_context.transforms, task, config=config)[0]
170
+ pprint(task, indent=2)
171
+
172
+ assert task["description"] == "resolved-from-object"
173
+
174
+
175
+ def test_resolve_keyed_by_missing_context_no_defer(run_transform, graph_config):
176
+ task = {
177
+ "name": "fake-task-name",
178
+ "description": {
179
+ "by-missing": {
180
+ "linux": "should-not-resolve",
181
+ },
182
+ },
183
+ "task-context": {
184
+ "substitution-fields": ["description"],
185
+ },
186
+ }
187
+ config = make_config(graph_config)
188
+
189
+ with pytest.raises(Exception):
190
+ run_transform(task_context.transforms, task, config=config)
191
+
192
+
193
+ def test_resolve_keyed_by_missing_context_with_defer(run_transform, graph_config):
194
+ task = {
195
+ "name": "fake-task-name",
196
+ "description": {
197
+ "by-flavor": {
198
+ "chocolate": {
199
+ "by-missing": {
200
+ "linux": "should-not-resolve",
201
+ "default": "also-should-not-resolve",
202
+ },
203
+ },
204
+ },
205
+ },
206
+ "task-context": {
207
+ "from-object": {"flavor": "chocolate"},
208
+ "resolve-keyed-by-options": {"defer": ["missing"]},
209
+ "substitution-fields": ["description"],
210
+ },
211
+ }
212
+ config = make_config(graph_config)
213
+
214
+ task = run_transform(task_context.transforms, task, config=config)[0]
215
+ pprint(task, indent=2)
216
+
217
+ assert task["description"] == {
218
+ "by-missing": {
219
+ "linux": "should-not-resolve",
220
+ "default": "also-should-not-resolve",
221
+ },
222
+ }