taskcluster-taskgraph 6.3.0__tar.gz → 7.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 (139) hide show
  1. {taskcluster-taskgraph-6.3.0/src/taskcluster_taskgraph.egg-info → taskcluster-taskgraph-7.0.0}/PKG-INFO +1 -2
  2. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/README.rst +1 -1
  3. taskcluster-taskgraph-7.0.0/pyproject.toml +61 -0
  4. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/requirements/base.txt +0 -14
  5. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/requirements/dev.txt +0 -8
  6. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/requirements/test.in +1 -0
  7. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/requirements/test.txt +15 -1
  8. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/setup.py +0 -1
  9. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0/src/taskcluster_taskgraph.egg-info}/PKG-INFO +1 -2
  10. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskcluster_taskgraph.egg-info/SOURCES.txt +8 -9
  11. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/__init__.py +1 -1
  12. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/config.py +5 -6
  13. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/create.py +1 -1
  14. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/decision.py +7 -7
  15. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/docker.py +7 -4
  16. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/generator.py +4 -4
  17. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/loader/default.py +2 -2
  18. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/main.py +28 -0
  19. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/run-task/run-task +6 -3
  20. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/target_tasks.py +4 -4
  21. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/transforms/base.py +1 -1
  22. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/transforms/code_review.py +5 -5
  23. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/transforms/fetch.py +30 -30
  24. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/transforms/from_deps.py +1 -1
  25. {taskcluster-taskgraph-6.3.0/src/taskgraph/transforms/job → taskcluster-taskgraph-7.0.0/src/taskgraph/transforms/run}/__init__.py +103 -100
  26. {taskcluster-taskgraph-6.3.0/src/taskgraph/transforms/job → taskcluster-taskgraph-7.0.0/src/taskgraph/transforms/run}/common.py +17 -23
  27. {taskcluster-taskgraph-6.3.0/src/taskgraph/transforms/job → taskcluster-taskgraph-7.0.0/src/taskgraph/transforms/run}/index_search.py +4 -4
  28. {taskcluster-taskgraph-6.3.0/src/taskgraph/transforms/job → taskcluster-taskgraph-7.0.0/src/taskgraph/transforms/run}/run_task.py +18 -18
  29. {taskcluster-taskgraph-6.3.0/src/taskgraph/transforms/job → taskcluster-taskgraph-7.0.0/src/taskgraph/transforms/run}/toolchain.py +19 -19
  30. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/transforms/task.py +23 -17
  31. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/transforms/task_context.py +5 -5
  32. taskcluster-taskgraph-7.0.0/src/taskgraph/util/__init__.py +0 -0
  33. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/util/docker.py +1 -1
  34. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/util/hash.py +5 -1
  35. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/util/parameterization.py +6 -0
  36. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/util/schema.py +3 -3
  37. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/util/taskcluster.py +1 -1
  38. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/util/treeherder.py +9 -6
  39. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/util/vcs.py +0 -34
  40. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_generator.py +6 -6
  41. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_main.py +9 -8
  42. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_morph.py +1 -3
  43. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_transforms_notify.py +2 -5
  44. taskcluster-taskgraph-6.3.0/test/test_transforms_job.py → taskcluster-taskgraph-7.0.0/test/test_transforms_run.py +11 -11
  45. taskcluster-taskgraph-6.3.0/test/test_transforms_job_run_task.py → taskcluster-taskgraph-7.0.0/test/test_transforms_run_run_task.py +5 -5
  46. taskcluster-taskgraph-6.3.0/test/test_transforms_job_toolchain.py → taskcluster-taskgraph-7.0.0/test/test_transforms_run_toolchain.py +16 -16
  47. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_util_docker.py +1 -1
  48. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_util_parameterization.py +9 -1
  49. taskcluster-taskgraph-6.3.0/pyproject.toml +0 -31
  50. taskcluster-taskgraph-6.3.0/src/taskgraph/transforms/__init__.py +0 -3
  51. taskcluster-taskgraph-6.3.0/src/taskgraph/util/decision.py +0 -79
  52. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/LICENSE +0 -0
  53. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/MANIFEST.in +0 -0
  54. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/requirements/base.in +0 -0
  55. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/requirements/dev.in +0 -0
  56. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/setup.cfg +0 -0
  57. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskcluster_taskgraph.egg-info/dependency_links.txt +0 -0
  58. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskcluster_taskgraph.egg-info/entry_points.txt +0 -0
  59. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskcluster_taskgraph.egg-info/requires.txt +0 -0
  60. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskcluster_taskgraph.egg-info/top_level.txt +0 -0
  61. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/actions/__init__.py +0 -0
  62. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/actions/add_new_jobs.py +0 -0
  63. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/actions/cancel.py +0 -0
  64. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/actions/cancel_all.py +0 -0
  65. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/actions/rebuild_cached_tasks.py +0 -0
  66. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/actions/registry.py +0 -0
  67. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/actions/retrigger.py +0 -0
  68. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/actions/util.py +0 -0
  69. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/files_changed.py +0 -0
  70. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/filter_tasks.py +0 -0
  71. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/graph.py +0 -0
  72. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/loader/__init__.py +0 -0
  73. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/loader/transform.py +0 -0
  74. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/morph.py +0 -0
  75. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/optimize/__init__.py +0 -0
  76. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/optimize/base.py +0 -0
  77. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/optimize/strategies.py +0 -0
  78. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/parameters.py +0 -0
  79. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/run-task/fetch-content +0 -0
  80. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/run-task/hgrc +0 -0
  81. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/run-task/robustcheckout.py +0 -0
  82. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/task.py +0 -0
  83. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/taskgraph.py +0 -0
  84. {taskcluster-taskgraph-6.3.0/src/taskgraph/util → taskcluster-taskgraph-7.0.0/src/taskgraph/transforms}/__init__.py +0 -0
  85. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/transforms/cached_tasks.py +0 -0
  86. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/transforms/chunking.py +0 -0
  87. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/transforms/docker_image.py +0 -0
  88. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/transforms/notify.py +0 -0
  89. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/util/archive.py +0 -0
  90. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/util/attributes.py +0 -0
  91. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/util/cached_tasks.py +0 -0
  92. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/util/dependencies.py +0 -0
  93. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/util/keyed_by.py +0 -0
  94. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/util/memoize.py +0 -0
  95. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/util/path.py +0 -0
  96. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/util/python_path.py +0 -0
  97. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/util/readonlydict.py +0 -0
  98. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/util/shell.py +0 -0
  99. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/util/taskgraph.py +0 -0
  100. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/util/templates.py +0 -0
  101. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/util/time.py +0 -0
  102. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/util/verify.py +0 -0
  103. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/util/workertypes.py +0 -0
  104. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/src/taskgraph/util/yaml.py +0 -0
  105. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_actions_rebuild_cached_tasks.py +0 -0
  106. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_actions_registry.py +0 -0
  107. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_create.py +0 -0
  108. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_decision.py +0 -0
  109. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_files_changed.py +0 -0
  110. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_graph.py +0 -0
  111. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_optimize.py +0 -0
  112. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_optimize_strategies.py +0 -0
  113. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_parameters.py +0 -0
  114. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_scripts_fetch_content.py +0 -0
  115. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_scripts_run_task.py +0 -0
  116. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_target_tasks.py +0 -0
  117. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_taskgraph.py +0 -0
  118. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_transform_chunking.py +0 -0
  119. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_transform_docker_image.py +0 -0
  120. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_transform_task_context.py +0 -0
  121. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_transforms_base.py +0 -0
  122. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_transforms_fetch.py +0 -0
  123. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_transforms_from_deps.py +0 -0
  124. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_transforms_task.py +0 -0
  125. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_util_attributes.py +0 -0
  126. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_util_dependencies.py +0 -0
  127. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_util_memoize.py +0 -0
  128. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_util_path.py +0 -0
  129. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_util_python_path.py +0 -0
  130. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_util_readonlydict.py +0 -0
  131. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_util_schema.py +0 -0
  132. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_util_taskcluster.py +0 -0
  133. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_util_templates.py +0 -0
  134. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_util_time.py +0 -0
  135. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_util_treeherder.py +0 -0
  136. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_util_vcs.py +0 -0
  137. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_util_verify.py +0 -0
  138. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_util_workertypes.py +0 -0
  139. {taskcluster-taskgraph-6.3.0 → taskcluster-taskgraph-7.0.0}/test/test_util_yaml.py +0 -0
@@ -1,12 +1,11 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: taskcluster-taskgraph
3
- Version: 6.3.0
3
+ Version: 7.0.0
4
4
  Summary: Build taskcluster taskgraphs
5
5
  Home-page: https://github.com/taskcluster/taskgraph
6
6
  Classifier: Development Status :: 5 - Production/Stable
7
7
  Classifier: Environment :: Console
8
8
  Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)
9
- Classifier: Programming Language :: Python :: 3.7
10
9
  Classifier: Programming Language :: Python :: 3.8
11
10
  Classifier: Programming Language :: Python :: 3.9
12
11
  Classifier: Programming Language :: Python :: 3.10
@@ -68,7 +68,7 @@ CI`_.
68
68
  Installation
69
69
  ------------
70
70
 
71
- Taskgraph supports Python 3.7 and up, and can be installed from Pypi:
71
+ Taskgraph supports Python 3.8 and up, and can be installed from Pypi:
72
72
 
73
73
  .. code-block::
74
74
 
@@ -0,0 +1,61 @@
1
+ [tool.black]
2
+ line-length = 88
3
+ extend-exclude = """(\
4
+ taskcluster/scripts/external_tools)\
5
+ """
6
+
7
+ [tool.pytest.ini_options]
8
+ xfail_strict = true
9
+
10
+ [tool.coverage.run]
11
+ parallel = true
12
+ branch = true
13
+ source = ["src/taskgraph/", "taskgraph", "src/taskgraph/run-task/"]
14
+
15
+ [tool.ruff]
16
+ select = [
17
+ "E", "W", # pycodestyle
18
+ "F", # pyflakes
19
+ "I", # isort
20
+ "PLC", "PLE", # pylint
21
+ "UP", # pyupgrade
22
+ ]
23
+ ignore = [
24
+ "E402",
25
+ "E501", # let black handle line-length
26
+ "E741",
27
+ ]
28
+ target-version = "py38"
29
+
30
+ [tool.ruff.isort]
31
+ known-first-party = ["taskgraph"]
32
+
33
+ [tool.pyright]
34
+ include = ["src"]
35
+ exclude = [ # TODO fix errors in these files
36
+ "src/taskgraph/decision.py",
37
+ "src/taskgraph/docker.py",
38
+ "src/taskgraph/files_changed.py",
39
+ "src/taskgraph/generator.py",
40
+ "src/taskgraph/graph.py",
41
+ "src/taskgraph/main.py",
42
+ "src/taskgraph/morph.py",
43
+ "src/taskgraph/parameters.py",
44
+ "src/taskgraph/taskgraph.py",
45
+ "src/taskgraph/actions/cancel.py",
46
+ "src/taskgraph/actions/cancel_all.py",
47
+ "src/taskgraph/actions/rebuild_cached_tasks.py",
48
+ "src/taskgraph/actions/util.py",
49
+ "src/taskgraph/optimize/base.py",
50
+ "src/taskgraph/run-task/robustcheckout.py",
51
+ "src/taskgraph/transforms/fetch.py",
52
+ "src/taskgraph/transforms/task.py",
53
+ "src/taskgraph/transforms/run/run_task.py",
54
+ "src/taskgraph/util/cached_tasks.py",
55
+ "src/taskgraph/util/decision.py",
56
+ "src/taskgraph/util/python_path.py",
57
+ "src/taskgraph/util/schema.py",
58
+ "src/taskgraph/util/taskcluster.py",
59
+ "src/taskgraph/util/vcs.py",
60
+ "src/taskgraph/util/workertypes.py",
61
+ ]
@@ -118,10 +118,6 @@ idna==3.4 \
118
118
  --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \
119
119
  --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2
120
120
  # via requests
121
- importlib-metadata==6.6.0 \
122
- --hash=sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed \
123
- --hash=sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705
124
- # via click
125
121
  jinja2==3.1.2 \
126
122
  --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \
127
123
  --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61
@@ -271,12 +267,6 @@ text-unidecode==1.3 \
271
267
  --hash=sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8 \
272
268
  --hash=sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93
273
269
  # via python-slugify
274
- typing-extensions==4.6.3 \
275
- --hash=sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26 \
276
- --hash=sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5
277
- # via
278
- # arrow
279
- # importlib-metadata
280
270
  urllib3==2.0.3 \
281
271
  --hash=sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1 \
282
272
  --hash=sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825
@@ -285,7 +275,3 @@ voluptuous==0.13.1 \
285
275
  --hash=sha256:4b838b185f5951f2d6e8752b68fcf18bd7a9c26ded8f143f92d6d28f3921a3e6 \
286
276
  --hash=sha256:e8d31c20601d6773cb14d4c0f42aee29c6821bbd1018039aac7ac5605b489723
287
277
  # via -r requirements/base.in
288
- zipp==3.15.0 \
289
- --hash=sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b \
290
- --hash=sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556
291
- # via importlib-metadata
@@ -14,17 +14,9 @@ identify==2.5.24 \
14
14
  --hash=sha256:0aac67d5b4812498056d28a9a512a483f5085cc28640b02b258a59dac34301d4 \
15
15
  --hash=sha256:986dbfb38b1140e763e413e6feb44cd731faf72d1909543178aa79b0e258265d
16
16
  # via pre-commit
17
- nodeenv==1.8.0 \
18
- --hash=sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2 \
19
- --hash=sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec
20
- # via pre-commit
21
17
  pre-commit==2.21.0 \
22
18
  --hash=sha256:31ef31af7e474a8d8995027fefdfcf509b5c913ff31f2015b4ec4beb26a6f658 \
23
19
  --hash=sha256:e2f91727039fc39a92f58a588a25b87f936de6567eed4f0e673e0507edc75bad
24
20
  # via -r requirements/dev.in
25
21
 
26
22
  # The following packages are considered to be unsafe in a requirements file:
27
- setuptools==67.8.0 \
28
- --hash=sha256:5df61bf30bb10c6f756eb19e7c9f3b473051f48db77fddbe06ff2ca307df9a6f \
29
- --hash=sha256:62642358adc77ffa87233bc4d2354c4b2682d214048f500964dbe760ccedf102
30
- # via nodeenv
@@ -1,6 +1,7 @@
1
1
  -r base.in
2
2
  coverage
3
3
  mock
4
+ pyright
4
5
  pytest
5
6
  pytest-mock
6
7
  responses
@@ -1,4 +1,4 @@
1
- # SHA1:0cbb82cbf14365738df0c1100a54f7ee5e312452
1
+ # SHA1:e6344ef3b0b270eae651e48034a25b9d9e8faa4a
2
2
  #
3
3
  # This file is autogenerated by pip-compile-multi
4
4
  # To update, run:
@@ -98,6 +98,10 @@ mock==5.0.2 \
98
98
  --hash=sha256:06f18d7d65b44428202b145a9a36e99c2ee00d1eb992df0caf881d4664377891 \
99
99
  --hash=sha256:0e0bc5ba78b8db3667ad636d964eb963dc97a59f04c6f6214c5f0e4a8f726c56
100
100
  # via -r requirements/test.in
101
+ nodeenv==1.8.0 \
102
+ --hash=sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2 \
103
+ --hash=sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec
104
+ # via pyright
101
105
  packaging==23.1 \
102
106
  --hash=sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61 \
103
107
  --hash=sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f
@@ -121,6 +125,10 @@ pyproject-api==1.5.1 \
121
125
  --hash=sha256:435f46547a9ff22cf4208ee274fca3e2869aeb062a4834adfc99a4dd64af3cf9 \
122
126
  --hash=sha256:4698a3777c2e0f6b624f8a4599131e2a25376d90fe8d146d7ac74c67c6f97c43
123
127
  # via tox
128
+ pyright==1.1.337 \
129
+ --hash=sha256:81d81f839d1750385390c4c4a7b84b062ece2f9a078f87055d4d2a5914ef2a08 \
130
+ --hash=sha256:8cbd4ef71797258f816a8393a758c9c91213479f472082d0e3a735ef7ab5f65a
131
+ # via -r requirements/test.in
124
132
  pytest==7.3.1 \
125
133
  --hash=sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362 \
126
134
  --hash=sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3
@@ -154,3 +162,9 @@ virtualenv==20.23.0 \
154
162
  --hash=sha256:6abec7670e5802a528357fdc75b26b9f57d5d92f29c5462ba0fbe45feacc685e \
155
163
  --hash=sha256:a85caa554ced0c0afbd0d638e7e2d7b5f92d23478d05d17a76daeac8f279f924
156
164
  # via tox
165
+
166
+ # The following packages are considered to be unsafe in a requirements file:
167
+ setuptools==68.0.0 \
168
+ --hash=sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f \
169
+ --hash=sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235
170
+ # via nodeenv
@@ -28,7 +28,6 @@ setup(
28
28
  "Development Status :: 5 - Production/Stable",
29
29
  "Environment :: Console",
30
30
  "License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)",
31
- "Programming Language :: Python :: 3.7",
32
31
  "Programming Language :: Python :: 3.8",
33
32
  "Programming Language :: Python :: 3.9",
34
33
  "Programming Language :: Python :: 3.10",
@@ -1,12 +1,11 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: taskcluster-taskgraph
3
- Version: 6.3.0
3
+ Version: 7.0.0
4
4
  Summary: Build taskcluster taskgraphs
5
5
  Home-page: https://github.com/taskcluster/taskgraph
6
6
  Classifier: Development Status :: 5 - Production/Stable
7
7
  Classifier: Environment :: Console
8
8
  Classifier: License :: OSI Approved :: Mozilla Public License 2.0 (MPL 2.0)
9
- Classifier: Programming Language :: Python :: 3.7
10
9
  Classifier: Programming Language :: Python :: 3.8
11
10
  Classifier: Programming Language :: Python :: 3.9
12
11
  Classifier: Programming Language :: Python :: 3.10
@@ -59,16 +59,15 @@ src/taskgraph/transforms/from_deps.py
59
59
  src/taskgraph/transforms/notify.py
60
60
  src/taskgraph/transforms/task.py
61
61
  src/taskgraph/transforms/task_context.py
62
- src/taskgraph/transforms/job/__init__.py
63
- src/taskgraph/transforms/job/common.py
64
- src/taskgraph/transforms/job/index_search.py
65
- src/taskgraph/transforms/job/run_task.py
66
- src/taskgraph/transforms/job/toolchain.py
62
+ src/taskgraph/transforms/run/__init__.py
63
+ src/taskgraph/transforms/run/common.py
64
+ src/taskgraph/transforms/run/index_search.py
65
+ src/taskgraph/transforms/run/run_task.py
66
+ src/taskgraph/transforms/run/toolchain.py
67
67
  src/taskgraph/util/__init__.py
68
68
  src/taskgraph/util/archive.py
69
69
  src/taskgraph/util/attributes.py
70
70
  src/taskgraph/util/cached_tasks.py
71
- src/taskgraph/util/decision.py
72
71
  src/taskgraph/util/dependencies.py
73
72
  src/taskgraph/util/docker.py
74
73
  src/taskgraph/util/hash.py
@@ -111,10 +110,10 @@ test/test_transform_task_context.py
111
110
  test/test_transforms_base.py
112
111
  test/test_transforms_fetch.py
113
112
  test/test_transforms_from_deps.py
114
- test/test_transforms_job.py
115
- test/test_transforms_job_run_task.py
116
- test/test_transforms_job_toolchain.py
117
113
  test/test_transforms_notify.py
114
+ test/test_transforms_run.py
115
+ test/test_transforms_run_run_task.py
116
+ test/test_transforms_run_toolchain.py
118
117
  test/test_transforms_task.py
119
118
  test/test_util_attributes.py
120
119
  test/test_util_dependencies.py
@@ -2,7 +2,7 @@
2
2
  # License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  # file, You can obtain one at http://mozilla.org/MPL/2.0/.
4
4
 
5
- __version__ = "6.3.0"
5
+ __version__ = "7.0.0"
6
6
 
7
7
  # Maximum number of dependencies a single task can have
8
8
  # https://docs.taskcluster.net/reference/platform/taskcluster-queue/references/api#createTask
@@ -102,28 +102,27 @@ class GraphConfig:
102
102
  Add the project's taskgraph directory to the python path, and register
103
103
  any extensions present.
104
104
  """
105
- modify_path = os.path.dirname(self.root_dir)
106
105
  if GraphConfig._PATH_MODIFIED:
107
- if GraphConfig._PATH_MODIFIED == modify_path:
106
+ if GraphConfig._PATH_MODIFIED == self.root_dir:
108
107
  # Already modified path with the same root_dir.
109
108
  # We currently need to do this to enable actions to call
110
109
  # taskgraph_decision, e.g. relpro.
111
110
  return
112
111
  raise Exception("Can't register multiple directories on python path.")
113
- GraphConfig._PATH_MODIFIED = modify_path
114
- sys.path.insert(0, modify_path)
112
+ GraphConfig._PATH_MODIFIED = self.root_dir
113
+ sys.path.insert(0, self.root_dir)
115
114
  register_path = self["taskgraph"].get("register")
116
115
  if register_path:
117
116
  find_object(register_path)(self)
118
117
 
119
118
  @property
120
119
  def vcs_root(self):
121
- if path.split(self.root_dir)[-2:] != ["taskcluster", "ci"]:
120
+ if path.split(self.root_dir)[-1:] != ["taskcluster"]:
122
121
  raise Exception(
123
122
  "Not guessing path to vcs root. "
124
123
  "Graph config in non-standard location."
125
124
  )
126
- return os.path.dirname(os.path.dirname(self.root_dir))
125
+ return os.path.dirname(self.root_dir)
127
126
 
128
127
  @property
129
128
  def taskcluster_yml(self):
@@ -104,7 +104,7 @@ def create_tasks(graph_config, taskgraph, label_to_taskid, params, decision_task
104
104
 
105
105
  def create_task(session, task_id, label, task_def):
106
106
  # create the task using 'http://taskcluster/queue', which is proxied to the queue service
107
- # with credentials appropriate to this job.
107
+ # with credentials appropriate to this task.
108
108
 
109
109
  # Resolve timestamps
110
110
  now = current_json_time(datetime_format=True)
@@ -46,21 +46,21 @@ try_task_config_schema_v2 = Schema(
46
46
  )
47
47
 
48
48
 
49
- def full_task_graph_to_runnable_jobs(full_task_json):
50
- runnable_jobs = {}
49
+ def full_task_graph_to_runnable_tasks(full_task_json):
50
+ runnable_tasks = {}
51
51
  for label, node in full_task_json.items():
52
52
  if not ("extra" in node["task"] and "treeherder" in node["task"]["extra"]):
53
53
  continue
54
54
 
55
55
  th = node["task"]["extra"]["treeherder"]
56
- runnable_jobs[label] = {"symbol": th["symbol"]}
56
+ runnable_tasks[label] = {"symbol": th["symbol"]}
57
57
 
58
58
  for i in ("groupName", "groupSymbol", "collection"):
59
59
  if i in th:
60
- runnable_jobs[label][i] = th[i]
60
+ runnable_tasks[label][i] = th[i]
61
61
  if th.get("machine", {}).get("platform"):
62
- runnable_jobs[label]["platform"] = th["machine"]["platform"]
63
- return runnable_jobs
62
+ runnable_tasks[label]["platform"] = th["machine"]["platform"]
63
+ return runnable_tasks
64
64
 
65
65
 
66
66
  def taskgraph_decision(options, parameters=None):
@@ -104,7 +104,7 @@ def taskgraph_decision(options, parameters=None):
104
104
 
105
105
  # write out the public/runnable-jobs.json file
106
106
  write_artifact(
107
- "runnable-jobs.json", full_task_graph_to_runnable_jobs(full_task_json)
107
+ "runnable-jobs.json", full_task_graph_to_runnable_tasks(full_task_json)
108
108
  )
109
109
 
110
110
  # this is just a test to check whether the from_json() function is working
@@ -34,7 +34,7 @@ def get_image_digest(image_name):
34
34
 
35
35
  def load_image_by_name(image_name, tag=None):
36
36
  from taskgraph.generator import load_tasks_for_kind
37
- from taskgraph.optimize import IndexSearch
37
+ from taskgraph.optimize.strategies import IndexSearch
38
38
  from taskgraph.parameters import Parameters
39
39
 
40
40
  params = Parameters(
@@ -43,8 +43,9 @@ def load_image_by_name(image_name, tag=None):
43
43
  )
44
44
  tasks = load_tasks_for_kind(params, "docker-image")
45
45
  task = tasks[f"build-docker-image-{image_name}"]
46
+ deadline = None
46
47
  task_id = IndexSearch().should_replace_task(
47
- task, {}, task.optimization.get("index-search", [])
48
+ task, {}, deadline, task.optimization.get("index-search", [])
48
49
  )
49
50
 
50
51
  if task_id in (True, False):
@@ -52,8 +53,10 @@ def load_image_by_name(image_name, tag=None):
52
53
  "Could not find artifacts for a docker image "
53
54
  "named `{image_name}`. Local commits and other changes "
54
55
  "in your checkout may cause this error. Try "
55
- "updating to a fresh checkout of mozilla-central "
56
- "to download image.".format(image_name=image_name)
56
+ "updating to a fresh checkout of {project} "
57
+ "to download image.".format(
58
+ image_name=image_name, project=params["project"]
59
+ )
57
60
  )
58
61
  return False
59
62
 
@@ -91,7 +91,7 @@ class Kind:
91
91
 
92
92
  @classmethod
93
93
  def load(cls, root_dir, graph_config, kind_name):
94
- path = os.path.join(root_dir, kind_name)
94
+ path = os.path.join(root_dir, "kinds", kind_name)
95
95
  kind_yml = os.path.join(path, "kind.yml")
96
96
  if not os.path.exists(kind_yml):
97
97
  raise KindNotFound(kind_yml)
@@ -125,13 +125,13 @@ class TaskGraphGenerator:
125
125
  write_artifacts=False,
126
126
  ):
127
127
  """
128
- @param root_dir: root directory, with subdirectories for each kind
128
+ @param root_dir: root directory containing the Taskgraph config.yml file
129
129
  @param parameters: parameters for this task-graph generation, or callable
130
130
  taking a `GraphConfig` and returning parameters
131
131
  @type parameters: Union[Parameters, Callable[[GraphConfig], Parameters]]
132
132
  """
133
133
  if root_dir is None:
134
- root_dir = "taskcluster/ci"
134
+ root_dir = "taskcluster"
135
135
  self.root_dir = root_dir
136
136
  self._parameters = parameters
137
137
  self._decision_task_id = decision_task_id
@@ -243,7 +243,7 @@ class TaskGraphGenerator:
243
243
  yield kind
244
244
  queue.extend(kind.config.get("kind-dependencies", []))
245
245
  else:
246
- for kind_name in os.listdir(self.root_dir):
246
+ for kind_name in os.listdir(os.path.join(self.root_dir, "kinds")):
247
247
  try:
248
248
  yield Kind.load(self.root_dir, graph_config, kind_name)
249
249
  except KindNotFound:
@@ -11,7 +11,7 @@ logger = logging.getLogger(__name__)
11
11
 
12
12
 
13
13
  DEFAULT_TRANSFORMS = [
14
- "taskgraph.transforms.job:transforms",
14
+ "taskgraph.transforms.run:transforms",
15
15
  "taskgraph.transforms.task:transforms",
16
16
  ]
17
17
 
@@ -20,7 +20,7 @@ def loader(kind, path, config, params, loaded_tasks):
20
20
  """
21
21
  This default loader builds on the `transform` loader by providing sensible
22
22
  default transforms that the majority of simple tasks will need.
23
- Specifically, `job` and `task` transforms will be appended to the end of the
23
+ Specifically, `run` and `task` transforms will be appended to the end of the
24
24
  list of transforms in the kind being loaded.
25
25
  """
26
26
  transform_refs = config.setdefault("transforms", [])
@@ -18,6 +18,7 @@ from concurrent.futures import ProcessPoolExecutor, as_completed
18
18
  from pathlib import Path
19
19
  from textwrap import dedent
20
20
  from typing import Any, List
21
+ from urllib.parse import urlparse
21
22
 
22
23
  import appdirs
23
24
  import yaml
@@ -463,6 +464,8 @@ def show_taskgraph(options):
463
464
  f"--label={options['graph_attr']}@{cur_rev}",
464
465
  ]
465
466
 
467
+ non_fatal_failures = []
468
+
466
469
  for spec in parameters:
467
470
  base_path = os.path.join(
468
471
  diffdir, f"{options['graph_attr']}_{base_rev_file}"
@@ -475,7 +478,20 @@ def show_taskgraph(options):
475
478
  base_path += f"_{params_name}"
476
479
  cur_path += f"_{params_name}"
477
480
 
481
+ # If the base or cur files are missing it means that generation
482
+ # failed. If one of them failed but not the other, the failure is
483
+ # likely due to the patch making changes to taskgraph in modules
484
+ # that don't get reloaded (safe to ignore). If both generations
485
+ # failed, there's likely a real issue.
486
+ base_missing = not os.path.isfile(base_path)
487
+ cur_missing = not os.path.isfile(cur_path)
488
+ if base_missing != cur_missing: # != is equivalent to XOR for booleans
489
+ non_fatal_failures.append(os.path.basename(base_path))
490
+ continue
491
+
478
492
  try:
493
+ # If the output file(s) are missing, this command will raise
494
+ # CalledProcessError with a returncode > 1.
479
495
  proc = subprocess.run(
480
496
  diffcmd + [base_path, cur_path],
481
497
  capture_output=True,
@@ -500,6 +516,16 @@ def show_taskgraph(options):
500
516
  params_spec=spec if len(parameters) > 1 else None,
501
517
  )
502
518
 
519
+ if non_fatal_failures:
520
+ failstr = "\n ".join(sorted(non_fatal_failures))
521
+ print(
522
+ "WARNING: Diff skipped for the following generation{s} "
523
+ "due to failures:\n {failstr}".format(
524
+ s="s" if len(non_fatal_failures) > 1 else "", failstr=failstr
525
+ ),
526
+ file=sys.stderr,
527
+ )
528
+
503
529
  if options["format"] != "json":
504
530
  print(
505
531
  "If you were expecting differences in task bodies "
@@ -835,6 +861,8 @@ def init_taskgraph(options):
835
861
  )
836
862
  return 1
837
863
 
864
+ context["repo_name"] = urlparse(repo_url).path.rsplit("/", 1)[-1]
865
+
838
866
  # Generate the project.
839
867
  cookiecutter(
840
868
  options["template"],
@@ -624,6 +624,11 @@ def git_checkout(
624
624
  "Must specify both ssh_key_file and ssh_known_hosts_file, if either are specified",
625
625
  )
626
626
 
627
+ # Bypass Git's "safe directory" feature as the destination could be
628
+ # coming from a cache and therefore cloned by a different user.
629
+ args = ["git", "config", "--global", "--add", "safe.directory", Path(destination_path).as_posix()]
630
+ retry_required_command(b"vcs", args, extra_env=env)
631
+
627
632
  if not os.path.exists(destination_path):
628
633
  # Repository doesn't already exist, needs to be cloned
629
634
  args = [
@@ -782,9 +787,7 @@ def hg_checkout(
782
787
  branch: Optional[str],
783
788
  revision: Optional[str],
784
789
  ):
785
- if IS_MACOSX:
786
- hg_bin = "/tools/python27-mercurial/bin/hg"
787
- elif IS_POSIX:
790
+ if IS_MACOSX or IS_POSIX:
788
791
  hg_bin = "hg"
789
792
  elif IS_WINDOWS:
790
793
  # This is where OCC installs it in the AMIs.
@@ -14,7 +14,7 @@ _target_task_methods = {}
14
14
  _GIT_REFS_HEADS_PREFIX = "refs/heads/"
15
15
 
16
16
 
17
- def _target_task(name):
17
+ def register_target_task(name):
18
18
  def wrap(func):
19
19
  _target_task_methods[name] = func
20
20
  return func
@@ -81,7 +81,7 @@ def standard_filter(task, parameters):
81
81
  )
82
82
 
83
83
 
84
- @_target_task("default")
84
+ @register_target_task("default")
85
85
  def target_tasks_default(full_task_graph, parameters, graph_config):
86
86
  """Target the tasks which have indicated they should be run on this project
87
87
  via the `run_on_projects` attributes."""
@@ -90,7 +90,7 @@ def target_tasks_default(full_task_graph, parameters, graph_config):
90
90
  ]
91
91
 
92
92
 
93
- @_target_task("codereview")
93
+ @register_target_task("codereview")
94
94
  def target_tasks_codereview(full_task_graph, parameters, graph_config):
95
95
  """Target the tasks which have indicated they should be run on this project
96
96
  via the `run_on_projects` attributes."""
@@ -101,7 +101,7 @@ def target_tasks_codereview(full_task_graph, parameters, graph_config):
101
101
  ]
102
102
 
103
103
 
104
- @_target_task("nothing")
104
+ @register_target_task("nothing")
105
105
  def target_tasks_nothing(full_task_graph, parameters, graph_config):
106
106
  """Select nothing, for DONTBUILD pushes"""
107
107
  return []
@@ -147,7 +147,7 @@ class ValidateSchema:
147
147
  kind=config.kind, name=task["name"]
148
148
  )
149
149
  elif "label" in task:
150
- error = "In job {label!r}:".format(label=task["label"])
150
+ error = "In task {label!r}:".format(label=task["label"])
151
151
  elif "primary-dependency" in task:
152
152
  error = "In {kind} kind task for {dependency!r}:".format(
153
153
  kind=config.kind, dependency=task["primary-dependency"].label
@@ -12,12 +12,12 @@ transforms = TransformSequence()
12
12
 
13
13
 
14
14
  @transforms.add
15
- def add_dependencies(config, jobs):
16
- for job in jobs:
17
- job.setdefault("soft-dependencies", [])
18
- job["soft-dependencies"] += [
15
+ def add_dependencies(config, tasks):
16
+ for task in tasks:
17
+ task.setdefault("soft-dependencies", [])
18
+ task["soft-dependencies"] += [
19
19
  dep_task.label
20
20
  for dep_task in config.kind_dependencies_tasks.values()
21
21
  if dep_task.attributes.get("code-review") is True
22
22
  ]
23
- yield job
23
+ yield task