taskcluster-taskgraph 18.1.0__tar.gz → 19.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/.pre-commit-config.yaml +3 -3
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/CHANGELOG.md +29 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/PKG-INFO +6 -9
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/README.rst +0 -4
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/concepts/transforms.rst +2 -2
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/conf.py +5 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/howto/resolve-keyed-by.rst +2 -2
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/migrations.rst +31 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/transforms/from_deps.rst +2 -2
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/tutorials/creating-a-task-graph.rst +2 -2
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/packages/pytest-taskgraph/pyproject.toml +3 -2
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/packages/sphinx-taskgraph/pyproject.toml +2 -3
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/pyproject.toml +21 -20
- taskcluster_taskgraph-19.1.0/src/taskgraph/config.py +170 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/decision.py +6 -6
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/docker.py +3 -1
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/chunking.py +18 -37
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/docker_image.py +27 -85
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/fetch.py +85 -116
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/from_deps.py +40 -90
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/matrix.py +30 -47
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/notify.py +84 -61
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/run/__init__.py +91 -140
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/run/common.py +1 -1
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/run/index_search.py +9 -11
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/run/run_task.py +35 -90
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/run/toolchain.py +25 -75
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/task.py +281 -558
- taskcluster_taskgraph-19.1.0/src/taskgraph/transforms/task_context.py +94 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/dependencies.py +1 -2
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/docker.py +4 -0
- taskcluster_taskgraph-19.1.0/src/taskgraph/util/schema.py +421 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/taskcluster.py +5 -14
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/config.yml +1 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/kinds/codecov/kind.yml +1 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/kinds/complete/kind.yml +4 -0
- taskcluster_taskgraph-19.1.0/taskcluster/kinds/test/kind.yml +18 -0
- taskcluster_taskgraph-19.1.0/taskcluster/kinds/test/linux.yml +71 -0
- taskcluster_taskgraph-19.1.0/taskcluster/kinds/test/windows.yml +32 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/template/{{cookiecutter.project_name}}/taskcluster/{{cookiecutter.project_slug}}_taskgraph/transforms/hello.py +2 -2
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/template/{{cookiecutter.project_name}}/taskcluster.github.yml +19 -19
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_docker.py +13 -3
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_transforms_run_run_task.py +5 -4
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_schema.py +53 -46
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_taskcluster.py +8 -1
- taskcluster_taskgraph-19.1.0/uv.lock +3370 -0
- taskcluster_taskgraph-18.1.0/src/taskgraph/config.py +0 -193
- taskcluster_taskgraph-18.1.0/src/taskgraph/transforms/task_context.py +0 -121
- taskcluster_taskgraph-18.1.0/src/taskgraph/util/schema.py +0 -248
- taskcluster_taskgraph-18.1.0/taskcluster/kinds/test/kind.yml +0 -76
- taskcluster_taskgraph-18.1.0/uv.lock +0 -2678
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/.codespell-ignore-words.txt +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/.github/CODEOWNERS +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/.github/dependabot.yml +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/.github/workflows/codeql-analysis.yml +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/.github/workflows/pre-commit-autoupdate.yml +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/.github/workflows/pre-commit.yml +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/.github/workflows/pypi-publish.yml +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/.gitignore +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/.readthedocs.yaml +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/.taskcluster.yml +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/.yamllint +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/CODE_OF_CONDUCT.md +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/CONTRIBUTING.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/LICENSE +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/Makefile +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/concepts/index.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/concepts/kind.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/concepts/loading.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/concepts/optimization.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/concepts/overview.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/concepts/scopes.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/concepts/task-graphs.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/contributing.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/glossary.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/howto/bootstrap-taskgraph.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/howto/create-actions.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/howto/create-tasks.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/howto/debugging.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/howto/docker.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/howto/index.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/howto/load-task-locally.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/howto/run-locally.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/howto/send-notifications.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/howto/use-fetches.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/index.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/cli.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/index.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/optimization-strategies.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/parameters.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/source/modules.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/source/taskgraph.actions.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/source/taskgraph.loader.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/source/taskgraph.optimize.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/source/taskgraph.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/source/taskgraph.transforms.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/source/taskgraph.transforms.run.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/source/taskgraph.util.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/transforms/chunking.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/transforms/index.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/transforms/matrix.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/reference/transforms/task_context.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/tutorials/connecting-taskcluster.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/tutorials/example-taskcluster.yml +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/tutorials/getting-started.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/tutorials/index.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/make.bat +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/packages/pytest-taskgraph/README.md +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/packages/pytest-taskgraph/src/pytest_taskgraph/__init__.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/packages/pytest-taskgraph/src/pytest_taskgraph/fixtures/gen.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/packages/pytest-taskgraph/src/pytest_taskgraph/fixtures/vcs.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/packages/sphinx-taskgraph/README.md +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/packages/sphinx-taskgraph/src/sphinx_taskgraph/__init__.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/packages/sphinx-taskgraph/src/sphinx_taskgraph/autoschema.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/__init__.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/actions/__init__.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/actions/add_new_jobs.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/actions/cancel.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/actions/cancel_all.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/actions/rebuild_cached_tasks.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/actions/registry.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/actions/retrigger.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/actions/util.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/create.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/filter_tasks.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/generator.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/graph.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/loader/__init__.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/loader/default.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/loader/transform.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/main.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/morph.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/optimize/__init__.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/optimize/base.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/optimize/strategies.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/parameters.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/run-task/fetch-content +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/run-task/hgrc +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/run-task/robustcheckout.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/run-task/run-task +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/target_tasks.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/task.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/taskgraph.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/__init__.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/base.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/cached_tasks.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/code_review.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/__init__.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/archive.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/attributes.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/cached_tasks.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/caches.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/copy.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/hash.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/json.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/keyed_by.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/parameterization.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/path.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/python_path.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/readonlydict.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/set_name.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/shell.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/taskgraph.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/templates.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/time.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/treeherder.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/vcs.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/verify.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/workertypes.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/util/yaml.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/REGISTRY +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/decision/Dockerfile +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/decision/HASH +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/decision/README.md +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/decision/VERSION +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/decision/system-setup.sh +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/fetch/Dockerfile +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/image_builder/README.rst +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/index-task/Dockerfile +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/index-task/README +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/index-task/insert-indexes.js +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/index-task/package.json +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/index-task/yarn.lock +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/python/Dockerfile +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/run-task/Dockerfile +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/run-task/system-setup.sh +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/skopeo/Dockerfile +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/skopeo/policy.json +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/docker/skopeo/push_image.sh +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/kinds/check/kind.yml +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/kinds/doc/kind.yml +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/kinds/docker-image/kind.yml +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/kinds/fetch/kind.yml +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/kinds/push-image/kind.yml +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/scripts/codecov-upload.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/scripts/external_tools/tooltool.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/self_taskgraph/__init__.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/self_taskgraph/custom_parameters.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/self_taskgraph/custom_target_tasks.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/self_taskgraph/transforms/add_pr_route.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/self_taskgraph/transforms/push_image.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/test/params/main-repo-pull-request-untrusted.yml +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/test/params/main-repo-pull-request.yml +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/test/params/main-repo-push.yml +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/test/params/main-repo-release-pytest-taskgraph.yml +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/taskcluster/test/params/main-repo-release-taskcluster-taskgraph.yml +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/template/cookiecutter.json +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/template/hooks/post_gen_project.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/template/{{cookiecutter.project_name}}/taskcluster/config.yml +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/template/{{cookiecutter.project_name}}/taskcluster/docker/linux/Dockerfile +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/template/{{cookiecutter.project_name}}/taskcluster/kinds/docker-image/kind.yml +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/template/{{cookiecutter.project_name}}/taskcluster/kinds/hello/kind.yml +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/__init__.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/automationrelevance.json +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/conftest.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/data/task_context.yml +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/data/taskcluster/config.yml +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/data/taskcluster/docker/hello-world/Dockerfile +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/data/taskcluster/docker/hello-world-tag/Dockerfile +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/data/taskcluster/docker/hello-world-tag/REGISTRY +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/data/taskcluster/docker/hello-world-tag/VERSION +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/data/taskcluster/kinds/docker-image/kind.yml +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/data/taskcluster/scripts/toolchain/run.ps1 +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/data/taskcluster/scripts/toolchain/run.sh +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/data/taskcluster/test_taskgraph/transforms/foo.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/data/testmod/thing.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/mockedopen.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_actions_rebuild_cached_tasks.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_actions_registry.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_config.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_create.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_decision.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_generator.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_graph.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_main.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_morph.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_optimize.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_optimize_strategies.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_parameters.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_scripts_fetch_content.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_scripts_run_task.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_target_tasks.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_taskgraph.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_transform_chunking.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_transform_docker_image.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_transform_task_context.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_transforms_base.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_transforms_cached_tasks.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_transforms_fetch.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_transforms_from_deps.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_transforms_matrix.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_transforms_notify.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_transforms_run.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_transforms_run_toolchain.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_transforms_task.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_archive.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_attributes.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_cached_tasks.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_copy.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_dependencies.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_docker.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_json.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_keyed_by.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_parameterization.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_path.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_python_path.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_readonlydict.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_templates.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_time.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_treeherder.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_vcs.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_verify.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_workertypes.py +0 -0
- {taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/test/test_util_yaml.py +0 -0
|
@@ -13,17 +13,17 @@ 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.14.
|
|
16
|
+
rev: v0.14.14
|
|
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.9.
|
|
22
|
+
rev: 0.9.28
|
|
23
23
|
hooks:
|
|
24
24
|
- id: uv-lock
|
|
25
25
|
- repo: https://github.com/adrienverge/yamllint.git
|
|
26
|
-
rev: v1.
|
|
26
|
+
rev: v1.38.0
|
|
27
27
|
hooks:
|
|
28
28
|
- id: yamllint
|
|
29
29
|
exclude: template
|
|
@@ -1,5 +1,34 @@
|
|
|
1
1
|
# Change Log
|
|
2
2
|
|
|
3
|
+
## [19.1.0] - 2026-02-17
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- Converted all remaining voluptuous schemas to msgspec
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- Parent image name lookup in `build-image` now uses task ids
|
|
12
|
+
- Decision task environment now passes full ref names for chain-of-trust verification
|
|
13
|
+
- Exclude `__pycache__` directories when generating docker contexts
|
|
14
|
+
|
|
15
|
+
## [19.0.0] - 2026-02-06
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
|
|
19
|
+
- BREAKING CHANGE: Support for msgspec schemas; voluptuous schemas renamed to `LegacySchema`
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
|
|
23
|
+
- Updated taskcluster dependency to v92; artifact functions now handle redirects manually
|
|
24
|
+
- Updated workerType in template `.taskcluster.yml`
|
|
25
|
+
- Disabled unnecessary `taskcluster-proxy` for Windows tests
|
|
26
|
+
|
|
27
|
+
### Fixed
|
|
28
|
+
|
|
29
|
+
- Race condition in `docker_image` transforms when creating docker-contexts directory
|
|
30
|
+
- Wrong location for `extra` in `.taskcluster.yml` template
|
|
31
|
+
|
|
3
32
|
## [18.1.0] - 2026-01-13
|
|
4
33
|
|
|
5
34
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: taskcluster-taskgraph
|
|
3
|
-
Version:
|
|
3
|
+
Version: 19.1.0
|
|
4
4
|
Summary: Build taskcluster taskgraphs
|
|
5
5
|
Project-URL: Repository, https://github.com/taskcluster/taskgraph
|
|
6
6
|
Project-URL: Issues, https://github.com/taskcluster/taskgraph/issues
|
|
@@ -20,18 +20,19 @@ Requires-Python: >=3.9
|
|
|
20
20
|
Requires-Dist: appdirs>=1.4
|
|
21
21
|
Requires-Dist: cookiecutter~=2.1
|
|
22
22
|
Requires-Dist: json-e>=2.7
|
|
23
|
-
Requires-Dist: mozilla-repo-urls
|
|
23
|
+
Requires-Dist: mozilla-repo-urls>=0.1.1
|
|
24
|
+
Requires-Dist: msgspec>=0.20.0
|
|
24
25
|
Requires-Dist: pyyaml>=5.3.1
|
|
25
26
|
Requires-Dist: redo>=2.0
|
|
26
27
|
Requires-Dist: requests>=2.25
|
|
27
28
|
Requires-Dist: slugid>=2.0
|
|
28
29
|
Requires-Dist: taskcluster-urls>=11.0
|
|
29
|
-
Requires-Dist: taskcluster
|
|
30
|
+
Requires-Dist: taskcluster>=92.0
|
|
30
31
|
Requires-Dist: voluptuous>=0.12.1
|
|
31
32
|
Provides-Extra: load-image
|
|
32
|
-
Requires-Dist: zstandard; extra == 'load-image'
|
|
33
|
+
Requires-Dist: zstandard>=0.23.0; extra == 'load-image'
|
|
33
34
|
Provides-Extra: orjson
|
|
34
|
-
Requires-Dist: orjson; extra == 'orjson'
|
|
35
|
+
Requires-Dist: orjson>=3; extra == 'orjson'
|
|
35
36
|
Description-Content-Type: text/x-rst
|
|
36
37
|
|
|
37
38
|
|
|
@@ -39,10 +40,6 @@ Description-Content-Type: text/x-rst
|
|
|
39
40
|
:target: https://firefox-ci-tc.services.mozilla.com/api/github/v1/repository/taskcluster/taskgraph/main/latest
|
|
40
41
|
:alt: Task Status
|
|
41
42
|
|
|
42
|
-
.. image:: https://results.pre-commit.ci/badge/github/taskcluster/taskgraph/main.svg
|
|
43
|
-
:target: https://results.pre-commit.ci/latest/github/taskcluster/taskgraph/main
|
|
44
|
-
:alt: pre-commit.ci status
|
|
45
|
-
|
|
46
43
|
.. image:: https://codecov.io/gh/taskcluster/taskgraph/branch/main/graph/badge.svg?token=GJIV52ZQNP
|
|
47
44
|
:target: https://codecov.io/gh/taskcluster/taskgraph
|
|
48
45
|
:alt: Code Coverage
|
|
@@ -3,10 +3,6 @@
|
|
|
3
3
|
:target: https://firefox-ci-tc.services.mozilla.com/api/github/v1/repository/taskcluster/taskgraph/main/latest
|
|
4
4
|
:alt: Task Status
|
|
5
5
|
|
|
6
|
-
.. image:: https://results.pre-commit.ci/badge/github/taskcluster/taskgraph/main.svg
|
|
7
|
-
:target: https://results.pre-commit.ci/latest/github/taskcluster/taskgraph/main
|
|
8
|
-
:alt: pre-commit.ci status
|
|
9
|
-
|
|
10
6
|
.. image:: https://codecov.io/gh/taskcluster/taskgraph/branch/main/graph/badge.svg?token=GJIV52ZQNP
|
|
11
7
|
:target: https://codecov.io/gh/taskcluster/taskgraph
|
|
12
8
|
:alt: Code Coverage
|
|
@@ -108,9 +108,9 @@ about the state of the tasks at given points. Here is an example:
|
|
|
108
108
|
from voluptuous import Optional, Required
|
|
109
109
|
|
|
110
110
|
from taskgraph.transforms.base import TransformSequence
|
|
111
|
-
from taskgraph.util.schema import
|
|
111
|
+
from taskgraph.util.schema import LegacySchema
|
|
112
112
|
|
|
113
|
-
my_schema =
|
|
113
|
+
my_schema = LegacySchema({
|
|
114
114
|
Required("foo"): str,
|
|
115
115
|
Optional("bar"): bool,
|
|
116
116
|
})
|
|
@@ -43,6 +43,11 @@ templates_path = ["_templates"]
|
|
|
43
43
|
# This pattern also affects html_static_path and html_extra_path.
|
|
44
44
|
exclude_patterns = ["docs/_build", "Thumbs.db", ".DS_Store"]
|
|
45
45
|
|
|
46
|
+
# Suppress ambiguous cross-reference warnings from autodoc.
|
|
47
|
+
# Multiple Schema classes define fields with the same name (e.g. "path"),
|
|
48
|
+
# which Sphinx can't disambiguate.
|
|
49
|
+
suppress_warnings = ["ref.python"]
|
|
50
|
+
|
|
46
51
|
|
|
47
52
|
# -- Options for HTML output -------------------------------------------------
|
|
48
53
|
|
{taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/docs/howto/resolve-keyed-by.rst
RENAMED
|
@@ -210,10 +210,10 @@ It can be used to generate a valid schema that allows a field to either use
|
|
|
210
210
|
|
|
211
211
|
.. code-block:: python
|
|
212
212
|
|
|
213
|
-
from taskgraph.util.schema import
|
|
213
|
+
from taskgraph.util.schema import LegacySchema, optionally_keyed_by
|
|
214
214
|
|
|
215
215
|
|
|
216
|
-
schema =
|
|
216
|
+
schema = LegacySchema({
|
|
217
217
|
# ...
|
|
218
218
|
Optional("worker"): {
|
|
219
219
|
Optional("max-run-time"): optionally_keyed_by("platform", int),
|
|
@@ -3,6 +3,37 @@ Migration Guide
|
|
|
3
3
|
|
|
4
4
|
This page can help when migrating Taskgraph across major versions.
|
|
5
5
|
|
|
6
|
+
18.x -> 19.x
|
|
7
|
+
------------
|
|
8
|
+
|
|
9
|
+
* The ``Schema`` class in ``taskgraph.util.schema`` is now based on msgspec
|
|
10
|
+
instead of voluptuous. The old voluptuous-based class has been renamed to
|
|
11
|
+
``LegacySchema``. Both will continue to be supported.
|
|
12
|
+
|
|
13
|
+
If you have custom schemas using ``Schema``, you have two options:
|
|
14
|
+
|
|
15
|
+
**Option 1**: Switch to ``LegacySchema`` to keep using voluptuous:
|
|
16
|
+
|
|
17
|
+
.. code-block:: python
|
|
18
|
+
|
|
19
|
+
from taskgraph.util.schema import LegacySchema
|
|
20
|
+
|
|
21
|
+
**Option 2**: Migrate to the new msgspec-based ``Schema``:
|
|
22
|
+
|
|
23
|
+
.. code-block:: python
|
|
24
|
+
|
|
25
|
+
from taskgraph.util.schema import Schema
|
|
26
|
+
|
|
27
|
+
class MySchema(Schema):
|
|
28
|
+
foo: str
|
|
29
|
+
bar: int = 10
|
|
30
|
+
|
|
31
|
+
The new ``Schema`` class uses kebab-case renaming and forbids
|
|
32
|
+
unknown fields by default. See the msgspec documentation for more details.
|
|
33
|
+
|
|
34
|
+
* ``validate_schema`` now supports both voluptuous and msgspec schemas, and
|
|
35
|
+
``optionally_keyed_by`` accepts a ``use_msgspec=True`` flag for msgspec output.
|
|
36
|
+
|
|
6
37
|
17.x -> 18.x
|
|
7
38
|
------------
|
|
8
39
|
|
|
@@ -176,9 +176,9 @@ allows tasks to pass down additional context (such as with the built-in
|
|
|
176
176
|
from taskgraph.task import Task
|
|
177
177
|
from taskgraph.transforms.base import TransformConfig
|
|
178
178
|
from taskgraph.util.dependencies import group_by
|
|
179
|
-
from taskgraph.util.schema import
|
|
179
|
+
from taskgraph.util.schema import LegacySchema
|
|
180
180
|
|
|
181
|
-
@group_by("custom-name", schema=
|
|
181
|
+
@group_by("custom-name", schema=LegacySchema(str))
|
|
182
182
|
def group_by(config: TransformConfig, tasks: List[Task], ctx: str) -> List[List[Task]]:
|
|
183
183
|
pass
|
|
184
184
|
|
|
@@ -139,10 +139,10 @@ comments for explanations):
|
|
|
139
139
|
from voluptuous import Optional, Required
|
|
140
140
|
|
|
141
141
|
from taskgraph.transforms.base import TransformSequence
|
|
142
|
-
from taskgraph.util.schema import
|
|
142
|
+
from taskgraph.util.schema import LegacySchema
|
|
143
143
|
|
|
144
144
|
# Define the schema. We use the `voluptuous` package to handle validation.
|
|
145
|
-
hello_description_schema =
|
|
145
|
+
hello_description_schema = LegacySchema({
|
|
146
146
|
Required("text"): str,
|
|
147
147
|
Optional("description"): str,
|
|
148
148
|
})
|
|
@@ -6,8 +6,9 @@ readme = "README.md"
|
|
|
6
6
|
authors = [
|
|
7
7
|
{ name = "Andrew Halberstadt", email = "ahal@mozilla.com" }
|
|
8
8
|
]
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
dependencies = [
|
|
10
|
+
"pytest>=8.4.2",
|
|
11
|
+
"taskcluster-taskgraph>=12.1.0"]
|
|
11
12
|
|
|
12
13
|
[project.entry-points.pytest11]
|
|
13
14
|
pytest-taskgraph = "pytest_taskgraph"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
### Project
|
|
2
2
|
[project]
|
|
3
3
|
name = "taskcluster-taskgraph"
|
|
4
|
-
version = "
|
|
4
|
+
version = "19.1.0"
|
|
5
5
|
description = "Build taskcluster taskgraphs"
|
|
6
6
|
readme = "README.rst"
|
|
7
7
|
authors = [
|
|
@@ -24,38 +24,39 @@ dependencies = [
|
|
|
24
24
|
"appdirs>=1.4",
|
|
25
25
|
"cookiecutter~=2.1",
|
|
26
26
|
"json-e>=2.7",
|
|
27
|
-
"mozilla-repo-urls",
|
|
27
|
+
"mozilla-repo-urls>=0.1.1",
|
|
28
|
+
"msgspec>=0.20.0",
|
|
28
29
|
"PyYAML>=5.3.1",
|
|
29
30
|
"redo>=2.0",
|
|
30
31
|
"requests>=2.25",
|
|
31
32
|
"slugid>=2.0",
|
|
32
|
-
"taskcluster>=
|
|
33
|
+
"taskcluster>=92.0",
|
|
33
34
|
"taskcluster-urls>=11.0",
|
|
34
35
|
"voluptuous>=0.12.1",
|
|
35
36
|
]
|
|
36
37
|
|
|
37
38
|
[dependency-groups]
|
|
38
39
|
dev = [
|
|
39
|
-
"coverage",
|
|
40
|
-
"mock",
|
|
41
|
-
"pre-commit",
|
|
42
|
-
"pyright",
|
|
43
|
-
"pytest",
|
|
44
|
-
"pytest-mock",
|
|
45
|
-
"pytest-taskgraph",
|
|
46
|
-
"responses",
|
|
47
|
-
"sphinx",
|
|
48
|
-
"sphinx-autobuild",
|
|
49
|
-
"sphinx-argparse",
|
|
50
|
-
"sphinx-book-theme >=1",
|
|
51
|
-
"sphinx-taskgraph",
|
|
52
|
-
"sphinxcontrib-mermaid",
|
|
53
|
-
"zstandard",
|
|
40
|
+
"coverage>=7.10.7",
|
|
41
|
+
"mock>=5.2.0",
|
|
42
|
+
"pre-commit>=4.3.0",
|
|
43
|
+
"pyright>=1.1.406",
|
|
44
|
+
"pytest>=8.4.2",
|
|
45
|
+
"pytest-mock>=3.15.1",
|
|
46
|
+
"pytest-taskgraph>=0.2.0",
|
|
47
|
+
"responses>=0.25.8",
|
|
48
|
+
"sphinx>=7.4.7",
|
|
49
|
+
"sphinx-autobuild>=2024.04.16",
|
|
50
|
+
"sphinx-argparse>=0.4.0",
|
|
51
|
+
"sphinx-book-theme >=1.1.4",
|
|
52
|
+
"sphinx-taskgraph>=0.1.0",
|
|
53
|
+
"sphinxcontrib-mermaid>=1.0.0",
|
|
54
|
+
"zstandard>=0.25.0",
|
|
54
55
|
]
|
|
55
56
|
|
|
56
57
|
[project.optional-dependencies]
|
|
57
|
-
load-image = ["zstandard"]
|
|
58
|
-
orjson = ["orjson"]
|
|
58
|
+
load-image = ["zstandard>=0.23.0"]
|
|
59
|
+
orjson = ["orjson>=3"]
|
|
59
60
|
|
|
60
61
|
[project.scripts]
|
|
61
62
|
taskgraph = "taskgraph.main:main"
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
import logging
|
|
7
|
+
import os
|
|
8
|
+
import sys
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Literal, Optional, Union
|
|
12
|
+
|
|
13
|
+
from .util.python_path import find_object
|
|
14
|
+
from .util.schema import Schema, TaskPriority, optionally_keyed_by, validate_schema
|
|
15
|
+
from .util.vcs import get_repository
|
|
16
|
+
from .util.yaml import load_yaml
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
CacheType = Literal["cargo", "checkout", "npm", "pip", "uv"]
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class WorkerAlias(Schema):
|
|
24
|
+
provisioner: optionally_keyed_by("level", str, use_msgspec=True) # type: ignore
|
|
25
|
+
implementation: str
|
|
26
|
+
os: str
|
|
27
|
+
worker_type: optionally_keyed_by("level", str, use_msgspec=True) # type: ignore
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class WorkersConfig(Schema):
|
|
31
|
+
aliases: dict[str, WorkerAlias]
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class RunConfig(Schema):
|
|
35
|
+
# List of caches to enable, or a boolean to enable/disable all of them.
|
|
36
|
+
use_caches: Optional[Union[bool, list[CacheType]]] = None
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class RepositoryConfig(Schema, forbid_unknown_fields=False, kw_only=True):
|
|
40
|
+
name: str
|
|
41
|
+
project_regex: Optional[str] = None
|
|
42
|
+
ssh_secret_name: Optional[str] = None
|
|
43
|
+
# FIXME: Extra keys allowed via forbid_unknown_fields=False
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class TaskgraphConfig(Schema):
|
|
47
|
+
repositories: dict[str, RepositoryConfig]
|
|
48
|
+
# Python function to call to register extensions.
|
|
49
|
+
register: Optional[str] = None
|
|
50
|
+
decision_parameters: Optional[str] = None
|
|
51
|
+
# The taskcluster index prefix to use for caching tasks.
|
|
52
|
+
# Defaults to `trust-domain`.
|
|
53
|
+
cached_task_prefix: Optional[str] = None
|
|
54
|
+
# Should tasks from pull requests populate the cache
|
|
55
|
+
cache_pull_requests: Optional[bool] = None
|
|
56
|
+
# Regular expressions matching index paths to be summarized.
|
|
57
|
+
index_path_regexes: Optional[list[str]] = None
|
|
58
|
+
# Configuration related to the 'run' transforms.
|
|
59
|
+
run: Optional[RunConfig] = None
|
|
60
|
+
|
|
61
|
+
def __post_init__(self):
|
|
62
|
+
# Validate repositories has at least 1 entry (was All(..., Length(min=1)))
|
|
63
|
+
if not self.repositories:
|
|
64
|
+
raise ValueError("'repositories' must have at least one entry")
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
#: Schema for the graph config
|
|
68
|
+
class GraphConfigSchema(Schema, forbid_unknown_fields=False, kw_only=True):
|
|
69
|
+
# The trust-domain for this graph.
|
|
70
|
+
trust_domain: str
|
|
71
|
+
task_priority: optionally_keyed_by( # type: ignore
|
|
72
|
+
"project", "level", TaskPriority, use_msgspec=True
|
|
73
|
+
)
|
|
74
|
+
workers: WorkersConfig
|
|
75
|
+
taskgraph: TaskgraphConfig
|
|
76
|
+
# Name of the docker image kind (default: docker-image)
|
|
77
|
+
docker_image_kind: Optional[str] = None
|
|
78
|
+
# Default 'deadline' for tasks, in relative date format. Eg: '1 week'
|
|
79
|
+
task_deadline_after: Optional[
|
|
80
|
+
optionally_keyed_by("project", str, use_msgspec=True) # type: ignore
|
|
81
|
+
] = None
|
|
82
|
+
# Default 'expires-after' for level 1 tasks, in relative date format.
|
|
83
|
+
# Eg: '90 days'
|
|
84
|
+
task_expires_after: Optional[str] = None
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
graph_config_schema = GraphConfigSchema
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
@dataclass(frozen=True, eq=False)
|
|
91
|
+
class GraphConfig:
|
|
92
|
+
_config: dict
|
|
93
|
+
root_dir: str
|
|
94
|
+
|
|
95
|
+
_PATH_MODIFIED = False
|
|
96
|
+
|
|
97
|
+
def __post_init__(self):
|
|
98
|
+
# ensure we have an absolute path; this is required for assumptions
|
|
99
|
+
# made later, such as the `vcs_root` being a directory above `root_dir`
|
|
100
|
+
object.__setattr__(self, "root_dir", os.path.abspath(self.root_dir))
|
|
101
|
+
|
|
102
|
+
def __getitem__(self, name):
|
|
103
|
+
return self._config[name]
|
|
104
|
+
|
|
105
|
+
def __contains__(self, name):
|
|
106
|
+
return name in self._config
|
|
107
|
+
|
|
108
|
+
def get(self, name, default=None):
|
|
109
|
+
return self._config.get(name, default)
|
|
110
|
+
|
|
111
|
+
def register(self):
|
|
112
|
+
"""
|
|
113
|
+
Add the project's taskgraph directory to the python path, and register
|
|
114
|
+
any extensions present.
|
|
115
|
+
"""
|
|
116
|
+
if GraphConfig._PATH_MODIFIED:
|
|
117
|
+
if GraphConfig._PATH_MODIFIED == self.root_dir:
|
|
118
|
+
# Already modified path with the same root_dir.
|
|
119
|
+
# We currently need to do this to enable actions to call
|
|
120
|
+
# taskgraph_decision, e.g. relpro.
|
|
121
|
+
return
|
|
122
|
+
raise Exception("Can't register multiple directories on python path.")
|
|
123
|
+
GraphConfig._PATH_MODIFIED = self.root_dir
|
|
124
|
+
sys.path.insert(0, self.root_dir)
|
|
125
|
+
register_path = self["taskgraph"].get("register")
|
|
126
|
+
if register_path:
|
|
127
|
+
register = find_object(register_path)
|
|
128
|
+
assert callable(register)
|
|
129
|
+
register(self)
|
|
130
|
+
|
|
131
|
+
@property
|
|
132
|
+
def vcs_root(self):
|
|
133
|
+
try:
|
|
134
|
+
repo = get_repository(self.root_dir)
|
|
135
|
+
return Path(repo.path)
|
|
136
|
+
except RuntimeError:
|
|
137
|
+
root = Path(self.root_dir)
|
|
138
|
+
if root.parts[-1:] != ("taskcluster",):
|
|
139
|
+
raise Exception(
|
|
140
|
+
"Not guessing path to vcs root. Graph config in non-standard location."
|
|
141
|
+
)
|
|
142
|
+
return root.parent
|
|
143
|
+
|
|
144
|
+
@property
|
|
145
|
+
def taskcluster_yml(self):
|
|
146
|
+
return os.path.join(self.vcs_root, ".taskcluster.yml")
|
|
147
|
+
|
|
148
|
+
@property
|
|
149
|
+
def docker_dir(self):
|
|
150
|
+
return os.path.join(self.root_dir, "docker")
|
|
151
|
+
|
|
152
|
+
@property
|
|
153
|
+
def kinds_dir(self):
|
|
154
|
+
return os.path.join(self.root_dir, "kinds")
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def validate_graph_config(config):
|
|
158
|
+
validate_schema(graph_config_schema, config, "Invalid graph configuration:")
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def load_graph_config(root_dir):
|
|
162
|
+
config_yml = os.path.join(root_dir, "config.yml")
|
|
163
|
+
if not os.path.exists(config_yml):
|
|
164
|
+
raise Exception(f"Couldn't find taskgraph configuration: {config_yml}")
|
|
165
|
+
|
|
166
|
+
logger.debug(f"loading config from `{config_yml}`")
|
|
167
|
+
config = load_yaml(config_yml)
|
|
168
|
+
|
|
169
|
+
validate_graph_config(config)
|
|
170
|
+
return GraphConfig(config, root_dir=root_dir)
|
|
@@ -9,9 +9,9 @@ import pathlib
|
|
|
9
9
|
import shutil
|
|
10
10
|
import time
|
|
11
11
|
from pathlib import Path
|
|
12
|
+
from typing import Optional
|
|
12
13
|
|
|
13
14
|
import yaml
|
|
14
|
-
from voluptuous import Optional
|
|
15
15
|
|
|
16
16
|
from taskgraph.actions import render_actions_json
|
|
17
17
|
from taskgraph.create import create_tasks
|
|
@@ -40,11 +40,11 @@ PER_PROJECT_PARAMETERS = {
|
|
|
40
40
|
|
|
41
41
|
|
|
42
42
|
#: Schema for try_task_config.json version 2
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
43
|
+
class TryTaskConfigSchemaV2(Schema, forbid_unknown_fields=True):
|
|
44
|
+
parameters: Optional[dict[str, object]] = None
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
try_task_config_schema_v2 = TryTaskConfigSchemaV2
|
|
48
48
|
|
|
49
49
|
|
|
50
50
|
def full_task_graph_to_runnable_tasks(full_task_json):
|
|
@@ -211,7 +211,9 @@ def build_image(
|
|
|
211
211
|
raise
|
|
212
212
|
|
|
213
213
|
# Parent id doesn't exist, needs to be re-built as well.
|
|
214
|
-
parent =
|
|
214
|
+
parent = next(
|
|
215
|
+
t for t in image_tasks if image_tasks[t].task_id == parent_id
|
|
216
|
+
).removeprefix("docker-image-")
|
|
215
217
|
parent_tar = temp_dir / "parent.tar"
|
|
216
218
|
build_image(graph_config, parent, save_image=str(parent_tar))
|
|
217
219
|
volumes.append((str(parent_tar), "/workspace/parent.tar"))
|
{taskcluster_taskgraph-18.1.0 → taskcluster_taskgraph-19.1.0}/src/taskgraph/transforms/chunking.py
RENAMED
|
@@ -2,49 +2,30 @@
|
|
|
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
|
import copy
|
|
5
|
-
from
|
|
6
|
-
|
|
7
|
-
from voluptuous import ALLOW_EXTRA, Optional, Required
|
|
5
|
+
from typing import Optional
|
|
8
6
|
|
|
9
7
|
from taskgraph.transforms.base import TransformSequence
|
|
10
8
|
from taskgraph.util.schema import Schema
|
|
11
9
|
from taskgraph.util.templates import substitute
|
|
12
10
|
|
|
11
|
+
|
|
12
|
+
class ChunkConfig(Schema):
|
|
13
|
+
# The total number of chunks to split the task into.
|
|
14
|
+
total_chunks: int
|
|
15
|
+
# A list of fields that need to have `{this_chunk}` and/or
|
|
16
|
+
# `{total_chunks}` replaced in them.
|
|
17
|
+
substitution_fields: list[str] = []
|
|
18
|
+
|
|
19
|
+
|
|
13
20
|
#: Schema for chunking transforms
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
tasks, substituting `this_chunk` and `total_chunks` into any
|
|
23
|
-
fields in `substitution-fields`.
|
|
24
|
-
""".lstrip()
|
|
25
|
-
),
|
|
26
|
-
): {
|
|
27
|
-
Required(
|
|
28
|
-
"total-chunks",
|
|
29
|
-
description=dedent(
|
|
30
|
-
"""
|
|
31
|
-
The total number of chunks to split the task into.
|
|
32
|
-
""".lstrip()
|
|
33
|
-
),
|
|
34
|
-
): int,
|
|
35
|
-
Optional(
|
|
36
|
-
"substitution-fields",
|
|
37
|
-
description=dedent(
|
|
38
|
-
"""
|
|
39
|
-
A list of fields that need to have `{this_chunk}` and/or
|
|
40
|
-
`{total_chunks}` replaced in them.
|
|
41
|
-
""".lstrip()
|
|
42
|
-
),
|
|
43
|
-
): [str],
|
|
44
|
-
}
|
|
45
|
-
},
|
|
46
|
-
extra=ALLOW_EXTRA,
|
|
47
|
-
)
|
|
21
|
+
class ChunkSchema(Schema, forbid_unknown_fields=False, kw_only=True):
|
|
22
|
+
# `chunk` can be used to split one task into `total-chunks`
|
|
23
|
+
# tasks, substituting `this_chunk` and `total_chunks` into any
|
|
24
|
+
# fields in `substitution-fields`.
|
|
25
|
+
chunk: Optional[ChunkConfig] = None
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
CHUNK_SCHEMA = ChunkSchema
|
|
48
29
|
|
|
49
30
|
transforms = TransformSequence()
|
|
50
31
|
transforms.add_validate(CHUNK_SCHEMA)
|