taskcluster-taskgraph 20.0.0__tar.gz → 22.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.
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/.pre-commit-config.yaml +4 -5
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/.taskcluster.yml +7 -1
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/CHANGELOG.md +30 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/PKG-INFO +1 -1
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/howto/bootstrap-taskgraph.rst +1 -1
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/reference/migrations.rst +17 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/pyproject.toml +1 -2
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/decision.py +14 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/main.py +6 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/transforms/task.py +4 -24
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/vcs.py +52 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/verify.py +12 -6
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/docker/run-task/Dockerfile +1 -1
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/conftest.py +15 -2
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_decision.py +61 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_util_vcs.py +23 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_util_verify.py +33 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/uv.lock +1 -1
- taskcluster_taskgraph-20.0.0/taskcluster/scripts/external_tools/tooltool.py +0 -1502
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/.codespell-ignore-words.txt +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/.github/CODEOWNERS +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/.github/dependabot.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/.github/workflows/codeql-analysis.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/.github/workflows/pre-commit-autoupdate.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/.github/workflows/pre-commit.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/.github/workflows/pypi-publish.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/.gitignore +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/.readthedocs.yaml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/.yamllint +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/CODE_OF_CONDUCT.md +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/CONTRIBUTING.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/LICENSE +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/Makefile +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/README.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/concepts/index.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/concepts/kind.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/concepts/loading.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/concepts/optimization.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/concepts/overview.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/concepts/scopes.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/concepts/task-graphs.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/concepts/transforms.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/conf.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/contributing.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/glossary.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/howto/create-actions.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/howto/create-tasks.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/howto/debugging.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/howto/docker.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/howto/index.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/howto/load-task-locally.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/howto/resolve-keyed-by.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/howto/run-locally.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/howto/send-notifications.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/howto/use-fetches.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/index.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/reference/cli.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/reference/index.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/reference/optimization-strategies.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/reference/parameters.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/reference/source/modules.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/reference/source/taskgraph.actions.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/reference/source/taskgraph.loader.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/reference/source/taskgraph.optimize.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/reference/source/taskgraph.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/reference/source/taskgraph.transforms.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/reference/source/taskgraph.transforms.run.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/reference/source/taskgraph.util.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/reference/transforms/chunking.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/reference/transforms/from_deps.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/reference/transforms/index.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/reference/transforms/matrix.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/reference/transforms/task_context.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/tutorials/connecting-taskcluster.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/tutorials/creating-a-task-graph.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/tutorials/example-taskcluster.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/tutorials/getting-started.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/tutorials/index.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/make.bat +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/packages/pytest-taskgraph/README.md +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/packages/pytest-taskgraph/pyproject.toml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/packages/pytest-taskgraph/src/pytest_taskgraph/__init__.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/packages/pytest-taskgraph/src/pytest_taskgraph/fixtures/gen.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/packages/pytest-taskgraph/src/pytest_taskgraph/fixtures/vcs.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/packages/sphinx-taskgraph/README.md +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/packages/sphinx-taskgraph/pyproject.toml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/packages/sphinx-taskgraph/src/sphinx_taskgraph/__init__.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/packages/sphinx-taskgraph/src/sphinx_taskgraph/autoschema.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/__init__.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/actions/__init__.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/actions/add_new_jobs.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/actions/cancel.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/actions/cancel_all.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/actions/rebuild_cached_tasks.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/actions/registry.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/actions/retrigger.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/actions/util.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/config.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/create.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/docker.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/filter_tasks.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/generator.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/graph.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/loader/__init__.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/loader/default.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/loader/transform.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/morph.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/optimize/__init__.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/optimize/base.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/optimize/strategies.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/parameters.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/run-task/fetch-content +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/run-task/hgrc +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/run-task/robustcheckout.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/run-task/run-task +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/target_tasks.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/task.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/taskgraph.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/transforms/__init__.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/transforms/base.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/transforms/cached_tasks.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/transforms/chunking.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/transforms/code_review.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/transforms/docker_image.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/transforms/fetch.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/transforms/from_deps.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/transforms/matrix.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/transforms/notify.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/transforms/run/__init__.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/transforms/run/common.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/transforms/run/index_search.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/transforms/run/run_task.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/transforms/run/toolchain.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/transforms/task_context.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/__init__.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/archive.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/attributes.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/cached_tasks.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/caches.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/copy.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/dependencies.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/docker.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/hash.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/json.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/keyed_by.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/parameterization.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/path.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/python_path.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/readonlydict.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/schema.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/set_name.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/shell.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/taskcluster.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/taskgraph.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/templates.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/time.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/treeherder.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/workertypes.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/util/yaml.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/config.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/docker/REGISTRY +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/docker/decision/Dockerfile +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/docker/decision/HASH +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/docker/decision/README.md +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/docker/decision/VERSION +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/docker/decision/system-setup.sh +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/docker/fetch/Dockerfile +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/docker/image_builder/README.rst +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/docker/index-task/Dockerfile +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/docker/index-task/README +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/docker/index-task/insert-indexes.js +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/docker/index-task/package.json +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/docker/index-task/yarn.lock +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/docker/python/Dockerfile +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/docker/run-task/system-setup.sh +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/docker/skopeo/Dockerfile +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/docker/skopeo/policy.json +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/docker/skopeo/push_image.sh +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/kinds/check/kind.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/kinds/codecov/kind.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/kinds/complete/kind.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/kinds/doc/kind.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/kinds/docker-image/kind.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/kinds/fetch/kind.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/kinds/push-image/kind.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/kinds/test/kind.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/kinds/test/linux.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/kinds/test/windows.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/scripts/codecov-upload.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/self_taskgraph/__init__.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/self_taskgraph/custom_parameters.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/self_taskgraph/custom_target_tasks.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/self_taskgraph/transforms/add_pr_route.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/self_taskgraph/transforms/push_image.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/test/params/main-repo-pull-request-untrusted.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/test/params/main-repo-pull-request.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/test/params/main-repo-push.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/test/params/main-repo-release-pytest-taskgraph.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/taskcluster/test/params/main-repo-release-taskcluster-taskgraph.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/template/cookiecutter.json +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/template/hooks/post_gen_project.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/template/{{cookiecutter.project_name}}/taskcluster/config.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/template/{{cookiecutter.project_name}}/taskcluster/docker/linux/Dockerfile +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/template/{{cookiecutter.project_name}}/taskcluster/kinds/docker-image/kind.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/template/{{cookiecutter.project_name}}/taskcluster/kinds/hello/kind.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/template/{{cookiecutter.project_name}}/taskcluster/{{cookiecutter.project_slug}}_taskgraph/transforms/hello.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/template/{{cookiecutter.project_name}}/taskcluster.github.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/__init__.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/automationrelevance.json +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/data/task_context.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/data/taskcluster/config.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/data/taskcluster/docker/hello-world/Dockerfile +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/data/taskcluster/docker/hello-world-tag/Dockerfile +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/data/taskcluster/docker/hello-world-tag/REGISTRY +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/data/taskcluster/docker/hello-world-tag/VERSION +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/data/taskcluster/kinds/docker-image/kind.yml +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/data/taskcluster/scripts/toolchain/run.ps1 +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/data/taskcluster/scripts/toolchain/run.sh +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/data/taskcluster/test_taskgraph/transforms/foo.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/data/testmod/thing.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/mockedopen.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_actions_rebuild_cached_tasks.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_actions_registry.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_config.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_create.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_docker.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_generator.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_graph.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_main.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_morph.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_optimize.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_optimize_strategies.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_parameters.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_scripts_fetch_content.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_scripts_run_task.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_target_tasks.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_taskgraph.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_transform_chunking.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_transform_docker_image.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_transform_task_context.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_transforms_base.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_transforms_cached_tasks.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_transforms_fetch.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_transforms_from_deps.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_transforms_matrix.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_transforms_notify.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_transforms_run.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_transforms_run_run_task.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_transforms_run_toolchain.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_transforms_task.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_util_archive.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_util_attributes.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_util_cached_tasks.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_util_copy.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_util_dependencies.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_util_docker.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_util_json.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_util_keyed_by.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_util_parameterization.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_util_path.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_util_python_path.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_util_readonlydict.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_util_schema.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_util_taskcluster.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_util_templates.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_util_time.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_util_treeherder.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/test/test_util_workertypes.py +0 -0
- {taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.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.
|
|
16
|
+
rev: v0.15.8
|
|
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.
|
|
22
|
+
rev: 0.11.2
|
|
23
23
|
hooks:
|
|
24
24
|
- id: uv-lock
|
|
25
25
|
- repo: https://github.com/adrienverge/yamllint.git
|
|
@@ -28,7 +28,7 @@ repos:
|
|
|
28
28
|
- id: yamllint
|
|
29
29
|
exclude: template
|
|
30
30
|
- repo: https://github.com/codespell-project/codespell
|
|
31
|
-
rev: v2.4.
|
|
31
|
+
rev: v2.4.2
|
|
32
32
|
hooks:
|
|
33
33
|
- id: codespell
|
|
34
34
|
entry: codespell -I .codespell-ignore-words.txt
|
|
@@ -48,6 +48,5 @@ exclude: |
|
|
|
48
48
|
(?x)^(
|
|
49
49
|
src/taskgraph/run-task/fetch-content |
|
|
50
50
|
src/taskgraph/run-task/robustcheckout.py |
|
|
51
|
-
src/taskgraph/run-task/run-task
|
|
52
|
-
taskcluster/scripts/external_tools
|
|
51
|
+
src/taskgraph/run-task/run-task
|
|
53
52
|
)
|
|
@@ -251,7 +251,13 @@ tasks:
|
|
|
251
251
|
- bash
|
|
252
252
|
- -cx
|
|
253
253
|
- $let:
|
|
254
|
-
extraArgs:
|
|
254
|
+
extraArgs:
|
|
255
|
+
$if: 'tasks_for == "cron"'
|
|
256
|
+
then: '${cron.quoted_args}'
|
|
257
|
+
else:
|
|
258
|
+
$if: 'tasks_for == "github-pull-request"'
|
|
259
|
+
then: '--allow-parameter-override'
|
|
260
|
+
else: ''
|
|
255
261
|
in:
|
|
256
262
|
$if: 'tasks_for == "action" || tasks_for == "pr-action"'
|
|
257
263
|
then: >
|
|
@@ -1,5 +1,35 @@
|
|
|
1
1
|
# Change Log
|
|
2
2
|
|
|
3
|
+
## [22.0.0] - 2026-04-16
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- Decision task now fetches `refs/notes/decision-parameters` itself
|
|
8
|
+
|
|
9
|
+
### Removed
|
|
10
|
+
|
|
11
|
+
- BREAKING CHANGE: Removed ability for `run-task` to fetch arbitrary extra refs
|
|
12
|
+
- BREAKING CHANGE: Removed docker-worker feature: relengapi-proxy
|
|
13
|
+
|
|
14
|
+
## [21.0.0] - 2026-04-13
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- Ability for `run-task` to fetch arbitrary extra refs
|
|
19
|
+
- Ability for Decision task to override params via Git notes
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
|
|
23
|
+
- Improved index route verification
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
|
|
27
|
+
- BREAKING CHANGE: run-task and decision images now use Debian 13
|
|
28
|
+
|
|
29
|
+
### Removed
|
|
30
|
+
|
|
31
|
+
- BREAKING CHANGE: Removed docker-worker features: dind, privileged, loopback-audio
|
|
32
|
+
|
|
3
33
|
## [20.0.0] - 2026-03-17
|
|
4
34
|
|
|
5
35
|
### Added
|
{taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/docs/howto/bootstrap-taskgraph.rst
RENAMED
|
@@ -101,7 +101,7 @@ in addition to ``taskcluster-taskgraph`` we also want to depend on
|
|
|
101
101
|
EOF
|
|
102
102
|
|
|
103
103
|
# This works best if you use the same Python as the one used in the Decision
|
|
104
|
-
# image (currently 3.
|
|
104
|
+
# image (currently 3.13).
|
|
105
105
|
pip-compile --generate-hashes --output-file requirements.txt requirements.in
|
|
106
106
|
|
|
107
107
|
.. note::
|
|
@@ -3,6 +3,23 @@ Migration Guide
|
|
|
3
3
|
|
|
4
4
|
This page can help when migrating Taskgraph across major versions.
|
|
5
5
|
|
|
6
|
+
21.x -> 22.x
|
|
7
|
+
------------
|
|
8
|
+
|
|
9
|
+
* If you have tasks using `docker-worker`'s `relengapi-proxy` feature, it is no
|
|
10
|
+
longer supported. Remove all references to it in your task definitions.
|
|
11
|
+
* Remove references to `<REPO>_EXTRA_REFS` in all `run-task` based tasks. These
|
|
12
|
+
refs must now be fetched as part of the task payload.
|
|
13
|
+
|
|
14
|
+
20.x -> 21.x
|
|
15
|
+
------------
|
|
16
|
+
|
|
17
|
+
* If you have tasks using `docker-worker`'s `dind`, `privileged` or `loopback-audio`
|
|
18
|
+
features, they are no longer supported. Either avoid using these features or migrate
|
|
19
|
+
to a `generic-worker` pool with D2G payloads enabled.
|
|
20
|
+
* Ensure any task's using the `run-task` or `decision` images work with the new
|
|
21
|
+
Debian 13 base.
|
|
22
|
+
|
|
6
23
|
19.x -> 20.x
|
|
7
24
|
------------
|
|
8
25
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
### Project
|
|
2
2
|
[project]
|
|
3
3
|
name = "taskcluster-taskgraph"
|
|
4
|
-
version = "
|
|
4
|
+
version = "22.0.0"
|
|
5
5
|
description = "Build taskcluster taskgraphs"
|
|
6
6
|
readme = "README.rst"
|
|
7
7
|
authors = [
|
|
@@ -94,7 +94,6 @@ source = ["src/taskgraph/", "src/taskgraph/run-task/", "packages", "test"]
|
|
|
94
94
|
### Lint and Format
|
|
95
95
|
[tool.ruff]
|
|
96
96
|
extend-exclude = [
|
|
97
|
-
"taskcluster/scripts/external_tools",
|
|
98
97
|
"src/taskgraph/run-task/robustcheckout.py"
|
|
99
98
|
]
|
|
100
99
|
line-length = 88
|
|
@@ -264,6 +264,20 @@ def get_decision_parameters(graph_config, options):
|
|
|
264
264
|
] == "github-pull-request":
|
|
265
265
|
set_try_config(parameters, task_config_file)
|
|
266
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
|
|
280
|
+
|
|
267
281
|
result = Parameters(**parameters)
|
|
268
282
|
result.check()
|
|
269
283
|
return result
|
|
@@ -933,6 +933,12 @@ def load_task(args):
|
|
|
933
933
|
@argument(
|
|
934
934
|
"--verbose", "-v", action="store_true", help="include debug-level logging output"
|
|
935
935
|
)
|
|
936
|
+
@argument(
|
|
937
|
+
"--allow-parameter-override",
|
|
938
|
+
default=False,
|
|
939
|
+
action="store_true",
|
|
940
|
+
help="Allow user to override computed decision task parameters.",
|
|
941
|
+
)
|
|
936
942
|
def decision(options):
|
|
937
943
|
from taskgraph.decision import taskgraph_decision # noqa: PLC0415
|
|
938
944
|
|
{taskcluster_taskgraph-20.0.0 → taskcluster_taskgraph-22.0.0}/src/taskgraph/transforms/task.py
RENAMED
|
@@ -268,14 +268,10 @@ class DockerWorkerPayloadSchema(Schema, forbid_unknown_fields=False, kw_only=Tru
|
|
|
268
268
|
# image or in-tree docker image to run the task in.
|
|
269
269
|
docker_image: DockerImage
|
|
270
270
|
# worker features that should be enabled
|
|
271
|
-
relengapi_proxy: bool
|
|
272
271
|
chain_of_trust: bool
|
|
273
272
|
taskcluster_proxy: bool
|
|
274
273
|
allow_ptrace: bool
|
|
275
274
|
loopback_video: bool
|
|
276
|
-
loopback_audio: bool
|
|
277
|
-
docker_in_docker: bool # (aka 'dind')
|
|
278
|
-
privileged: bool
|
|
279
275
|
# environment variables
|
|
280
276
|
env: dict[str, taskref_or_string_msgspec]
|
|
281
277
|
# the maximum time to run, in seconds
|
|
@@ -343,9 +339,6 @@ def build_docker_worker_payload(config, task, task_def):
|
|
|
343
339
|
|
|
344
340
|
features = {}
|
|
345
341
|
|
|
346
|
-
if worker.get("relengapi-proxy"):
|
|
347
|
-
features["relengAPIProxy"] = True
|
|
348
|
-
|
|
349
342
|
if worker.get("taskcluster-proxy"):
|
|
350
343
|
features["taskclusterProxy"] = True
|
|
351
344
|
|
|
@@ -356,9 +349,6 @@ def build_docker_worker_payload(config, task, task_def):
|
|
|
356
349
|
if worker.get("chain-of-trust"):
|
|
357
350
|
features["chainOfTrust"] = True
|
|
358
351
|
|
|
359
|
-
if worker.get("docker-in-docker"):
|
|
360
|
-
features["dind"] = True
|
|
361
|
-
|
|
362
352
|
if task.get("needs-sccache"):
|
|
363
353
|
features["taskclusterProxy"] = True
|
|
364
354
|
task_def["scopes"].append(
|
|
@@ -375,16 +365,10 @@ def build_docker_worker_payload(config, task, task_def):
|
|
|
375
365
|
|
|
376
366
|
capabilities = {}
|
|
377
367
|
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
devices[capitalized] = True
|
|
383
|
-
task_def["scopes"].append("docker-worker:capability:device:" + capitalized)
|
|
384
|
-
|
|
385
|
-
if worker.get("privileged"):
|
|
386
|
-
capabilities["privileged"] = True
|
|
387
|
-
task_def["scopes"].append("docker-worker:capability:privileged")
|
|
368
|
+
if worker.get("loopback-video"):
|
|
369
|
+
devices = capabilities.setdefault("devices", {})
|
|
370
|
+
devices["loopbackVideo"] = True
|
|
371
|
+
task_def["scopes"].append("docker-worker:capability:device:loopbackVideo")
|
|
388
372
|
|
|
389
373
|
task_def["payload"] = payload = {
|
|
390
374
|
"image": image,
|
|
@@ -810,14 +794,10 @@ def set_defaults(config, tasks):
|
|
|
810
794
|
|
|
811
795
|
worker = task["worker"]
|
|
812
796
|
if worker["implementation"] in ("docker-worker",):
|
|
813
|
-
worker.setdefault("relengapi-proxy", False)
|
|
814
797
|
worker.setdefault("chain-of-trust", False)
|
|
815
798
|
worker.setdefault("taskcluster-proxy", False)
|
|
816
799
|
worker.setdefault("allow-ptrace", False)
|
|
817
800
|
worker.setdefault("loopback-video", False)
|
|
818
|
-
worker.setdefault("loopback-audio", False)
|
|
819
|
-
worker.setdefault("docker-in-docker", False)
|
|
820
|
-
worker.setdefault("privileged", False)
|
|
821
801
|
worker.setdefault("volumes", [])
|
|
822
802
|
worker.setdefault("env", {})
|
|
823
803
|
if "caches" in worker:
|
|
@@ -215,6 +215,22 @@ class Repository(ABC):
|
|
|
215
215
|
If this function returns an unexpected value, then make sure
|
|
216
216
|
the revision was fetched from the remote repository."""
|
|
217
217
|
|
|
218
|
+
def get_note(
|
|
219
|
+
self,
|
|
220
|
+
note: str,
|
|
221
|
+
remote: str,
|
|
222
|
+
revision: Optional[str] = None,
|
|
223
|
+
) -> Optional[str]:
|
|
224
|
+
"""Read a note attached to the given revision (defaults to HEAD).
|
|
225
|
+
|
|
226
|
+
The notes ref is fetched from ``remote`` first; a missing ref on the
|
|
227
|
+
remote is tolerated while other fetch failures propagate.
|
|
228
|
+
|
|
229
|
+
Returns the note content as a string, or ``None`` if no note exists.
|
|
230
|
+
Only supported by Git; returns ``None`` for all other VCS types.
|
|
231
|
+
"""
|
|
232
|
+
return None
|
|
233
|
+
|
|
218
234
|
|
|
219
235
|
class HgRepository(Repository):
|
|
220
236
|
@property
|
|
@@ -586,6 +602,42 @@ class GitRepository(Repository):
|
|
|
586
602
|
return False
|
|
587
603
|
raise
|
|
588
604
|
|
|
605
|
+
def get_note(
|
|
606
|
+
self,
|
|
607
|
+
note: str,
|
|
608
|
+
remote: str,
|
|
609
|
+
revision: Optional[str] = None,
|
|
610
|
+
) -> Optional[str]:
|
|
611
|
+
if not note.startswith("refs/notes/"):
|
|
612
|
+
note = f"refs/notes/{note}"
|
|
613
|
+
|
|
614
|
+
try:
|
|
615
|
+
self.run("fetch", remote, f"{note}:{note}", stderr=subprocess.PIPE)
|
|
616
|
+
except subprocess.CalledProcessError:
|
|
617
|
+
ls_output = self.run(
|
|
618
|
+
"ls-remote",
|
|
619
|
+
"--exit-code",
|
|
620
|
+
remote,
|
|
621
|
+
note,
|
|
622
|
+
return_codes=(2,),
|
|
623
|
+
stderr=subprocess.PIPE,
|
|
624
|
+
)
|
|
625
|
+
if not ls_output:
|
|
626
|
+
logger.info(
|
|
627
|
+
"Failed to fetch %s but the remote doesn't have it. Ignoring.", note
|
|
628
|
+
)
|
|
629
|
+
return None
|
|
630
|
+
raise
|
|
631
|
+
|
|
632
|
+
try:
|
|
633
|
+
return self.run(
|
|
634
|
+
"notes", f"--ref={note}", "show", revision or "HEAD"
|
|
635
|
+
).strip()
|
|
636
|
+
except subprocess.CalledProcessError as e:
|
|
637
|
+
if e.returncode == 1:
|
|
638
|
+
return None
|
|
639
|
+
raise
|
|
640
|
+
|
|
589
641
|
|
|
590
642
|
def get_repository(path: str):
|
|
591
643
|
"""Get a repository object for the repository at `path`.
|
|
@@ -235,10 +235,14 @@ def verify_routes_notification_filters(
|
|
|
235
235
|
)
|
|
236
236
|
|
|
237
237
|
|
|
238
|
+
# https://docs.taskcluster.net/docs/reference/core/index#valid-characters
|
|
239
|
+
INDEX_NAMESPACE_RE = re.compile(r"^([a-zA-Z0-9_!~*'()%-]+\.)*[a-zA-Z0-9_!~*'()%-]+$")
|
|
240
|
+
|
|
241
|
+
|
|
238
242
|
@verifications.add("full_task_graph")
|
|
239
243
|
def verify_index_route(task, taskgraph, scratch_pad, graph_config, parameters):
|
|
240
244
|
"""
|
|
241
|
-
This function ensures that routes
|
|
245
|
+
This function ensures that index routes would create valid taskcluster index paths
|
|
242
246
|
"""
|
|
243
247
|
if task is None:
|
|
244
248
|
return
|
|
@@ -247,11 +251,13 @@ def verify_index_route(task, taskgraph, scratch_pad, graph_config, parameters):
|
|
|
247
251
|
route_prefix = "index."
|
|
248
252
|
|
|
249
253
|
for route in routes:
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
254
|
+
if route.startswith(route_prefix):
|
|
255
|
+
namespace = route[len(route_prefix) :]
|
|
256
|
+
if not INDEX_NAMESPACE_RE.match(namespace):
|
|
257
|
+
raise Exception(
|
|
258
|
+
f"{task.label} has invalid index route namespace: {route}. "
|
|
259
|
+
f"Namespace must match {INDEX_NAMESPACE_RE.pattern}"
|
|
260
|
+
)
|
|
255
261
|
|
|
256
262
|
|
|
257
263
|
@verifications.add("full_task_graph")
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import platform
|
|
3
|
+
import tempfile
|
|
3
4
|
from pathlib import Path
|
|
4
5
|
|
|
5
6
|
import pytest
|
|
@@ -13,10 +14,22 @@ pytest_plugins = ("pytest-taskgraph",)
|
|
|
13
14
|
# interference with tests.
|
|
14
15
|
# This ignores ~/.hgrc
|
|
15
16
|
os.environ["HGRCPATH"] = ""
|
|
16
|
-
# This ignores system-level git config (eg: in /etc).
|
|
17
|
-
# no way to ignore ~/.gitconfig other than overriding $HOME, which is overkill.
|
|
17
|
+
# This ignores system-level git config (eg: in /etc).
|
|
18
18
|
os.environ["GIT_CONFIG_NOSYSTEM"] = "1"
|
|
19
19
|
|
|
20
|
+
|
|
21
|
+
@pytest.fixture(scope="session", autouse=True)
|
|
22
|
+
def git_global_config():
|
|
23
|
+
# run-task writes to the global git config, so point it at a real
|
|
24
|
+
# (writable) empty file instead of ~/.gitconfig.
|
|
25
|
+
fd, path = tempfile.mkstemp(prefix="taskgraph-gitconfig-")
|
|
26
|
+
os.close(fd)
|
|
27
|
+
os.environ["GIT_CONFIG_GLOBAL"] = path
|
|
28
|
+
yield
|
|
29
|
+
del os.environ["GIT_CONFIG_GLOBAL"]
|
|
30
|
+
os.unlink(path)
|
|
31
|
+
|
|
32
|
+
|
|
20
33
|
# Some of the tests marked with this may be fixable on Windows; we should
|
|
21
34
|
# look into these in more depth at some point.
|
|
22
35
|
nowin = pytest.mark.skipif(
|
|
@@ -10,6 +10,8 @@ import tempfile
|
|
|
10
10
|
import unittest
|
|
11
11
|
from pathlib import Path
|
|
12
12
|
|
|
13
|
+
import pytest
|
|
14
|
+
|
|
13
15
|
from taskgraph import decision
|
|
14
16
|
from taskgraph.util.vcs import GitRepository, HgRepository
|
|
15
17
|
from taskgraph.util.yaml import load_yaml
|
|
@@ -137,3 +139,62 @@ class TestGetDecisionParameters(unittest.TestCase):
|
|
|
137
139
|
self.options["tasks_for"] = "hg-push"
|
|
138
140
|
params = decision.get_decision_parameters(FAKE_GRAPH_CONFIG, self.options)
|
|
139
141
|
self.assertEqual(params["target_tasks_method"], "nothing")
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
_BASE_OPTIONS = {
|
|
145
|
+
"base_repository": "https://hg.mozilla.org/mozilla-unified",
|
|
146
|
+
"base_rev": "aaaa",
|
|
147
|
+
"head_repository": "https://hg.mozilla.org/mozilla-central",
|
|
148
|
+
"head_rev": "bbbb",
|
|
149
|
+
"head_ref": "default",
|
|
150
|
+
"head_tag": "",
|
|
151
|
+
"project": "mozilla-central",
|
|
152
|
+
"pushlog_id": "1",
|
|
153
|
+
"pushdate": 0,
|
|
154
|
+
"repository_type": "git",
|
|
155
|
+
"owner": "nobody@mozilla.com",
|
|
156
|
+
"tasks_for": "github-push",
|
|
157
|
+
"level": "1",
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
@unittest.mock.patch.object(
|
|
162
|
+
GitRepository,
|
|
163
|
+
"get_note",
|
|
164
|
+
return_value=json.dumps({"build_number": 99}),
|
|
165
|
+
)
|
|
166
|
+
@unittest.mock.patch.object(GitRepository, "get_changed_files", return_value=[])
|
|
167
|
+
def test_decision_parameters_note(mock_files_changed, mock_get_note):
|
|
168
|
+
options = {**_BASE_OPTIONS, "allow_parameter_override": True}
|
|
169
|
+
params = decision.get_decision_parameters(FAKE_GRAPH_CONFIG, options)
|
|
170
|
+
mock_get_note.assert_called_once_with(
|
|
171
|
+
"refs/notes/decision-parameters", _BASE_OPTIONS["head_repository"]
|
|
172
|
+
)
|
|
173
|
+
assert params["build_number"] == 99
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
@unittest.mock.patch.object(
|
|
177
|
+
GitRepository,
|
|
178
|
+
"get_note",
|
|
179
|
+
return_value=json.dumps({"build_number": 99}),
|
|
180
|
+
)
|
|
181
|
+
@unittest.mock.patch.object(GitRepository, "get_changed_files", return_value=[])
|
|
182
|
+
def test_decision_parameters_note_disallow_override(mock_files_changed, mock_get_note):
|
|
183
|
+
options = {**_BASE_OPTIONS, "allow_parameter_override": False}
|
|
184
|
+
params = decision.get_decision_parameters(FAKE_GRAPH_CONFIG, options)
|
|
185
|
+
mock_get_note.assert_not_called()
|
|
186
|
+
assert params["build_number"] == 1
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
@unittest.mock.patch.object(
|
|
190
|
+
GitRepository,
|
|
191
|
+
"get_note",
|
|
192
|
+
return_value="not valid json {",
|
|
193
|
+
)
|
|
194
|
+
@unittest.mock.patch.object(GitRepository, "get_changed_files", return_value=[])
|
|
195
|
+
def test_decision_parameters_note_invalid_json(mock_files_changed, mock_get_note):
|
|
196
|
+
options = {**_BASE_OPTIONS, "allow_parameter_override": True}
|
|
197
|
+
with pytest.raises(
|
|
198
|
+
Exception, match="Failed to parse refs/notes/decision-parameters as JSON"
|
|
199
|
+
):
|
|
200
|
+
decision.get_decision_parameters(FAKE_GRAPH_CONFIG, options)
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
4
4
|
|
|
5
5
|
import os
|
|
6
|
+
import shutil
|
|
6
7
|
import subprocess
|
|
7
8
|
from pathlib import Path
|
|
8
9
|
from textwrap import dedent
|
|
@@ -648,3 +649,25 @@ def test_get_changed_files_with_null_base_revision_shallow_clone(
|
|
|
648
649
|
assert "first_file" in changed_files
|
|
649
650
|
assert "file1.txt" in changed_files
|
|
650
651
|
assert "file2.txt" in changed_files
|
|
652
|
+
|
|
653
|
+
|
|
654
|
+
def test_get_note_git(git_repo, tmpdir):
|
|
655
|
+
"""get_note returns note content when present, None otherwise."""
|
|
656
|
+
src_path = str(tmpdir.join("git-src"))
|
|
657
|
+
dst_path = str(tmpdir.join("git-dst"))
|
|
658
|
+
shutil.copytree(git_repo, src_path)
|
|
659
|
+
shutil.copytree(git_repo, dst_path)
|
|
660
|
+
repo = get_repository(dst_path)
|
|
661
|
+
|
|
662
|
+
# No note yet on the remote
|
|
663
|
+
assert repo.get_note("try-config", src_path) is None
|
|
664
|
+
|
|
665
|
+
rev = repo.head_rev
|
|
666
|
+
subprocess.check_call(
|
|
667
|
+
["git", "notes", "--ref=refs/notes/try-config", "add", "-m", "test note", rev],
|
|
668
|
+
cwd=src_path,
|
|
669
|
+
)
|
|
670
|
+
|
|
671
|
+
assert repo.get_note("try-config", src_path) == "test note"
|
|
672
|
+
assert repo.get_note("try-config", src_path, revision=rev) == "test note"
|
|
673
|
+
assert repo.get_note("other", src_path) is None
|
|
@@ -211,6 +211,17 @@ def make_task_treeherder(label, symbol, platform="linux/opt"):
|
|
|
211
211
|
pytest.raises(DeprecationWarning),
|
|
212
212
|
id="routes_notfication_filter: deprecated",
|
|
213
213
|
),
|
|
214
|
+
pytest.param(
|
|
215
|
+
"verify_index_route",
|
|
216
|
+
make_graph(
|
|
217
|
+
make_task(
|
|
218
|
+
"valid_route",
|
|
219
|
+
task_def={"routes": ["index.example.v2.latest.taskgraph.decision"]},
|
|
220
|
+
),
|
|
221
|
+
),
|
|
222
|
+
does_not_raise(),
|
|
223
|
+
id="verify_index_route: valid route",
|
|
224
|
+
),
|
|
214
225
|
pytest.param(
|
|
215
226
|
"verify_index_route",
|
|
216
227
|
make_graph(
|
|
@@ -226,6 +237,28 @@ def make_task_treeherder(label, symbol, platform="linux/opt"):
|
|
|
226
237
|
pytest.raises(Exception),
|
|
227
238
|
id="verify_index_route: invalid slash in route",
|
|
228
239
|
),
|
|
240
|
+
pytest.param(
|
|
241
|
+
"verify_index_route",
|
|
242
|
+
make_graph(
|
|
243
|
+
make_task(
|
|
244
|
+
"invalid_plus",
|
|
245
|
+
task_def={"routes": ["index.example.1.0+hotfix1.latest"]},
|
|
246
|
+
),
|
|
247
|
+
),
|
|
248
|
+
pytest.raises(Exception),
|
|
249
|
+
id="verify_index_route: invalid plus in route",
|
|
250
|
+
),
|
|
251
|
+
pytest.param(
|
|
252
|
+
"verify_index_route",
|
|
253
|
+
make_graph(
|
|
254
|
+
make_task(
|
|
255
|
+
"invalid_space",
|
|
256
|
+
task_def={"routes": ["index.example.some namespace.latest"]},
|
|
257
|
+
),
|
|
258
|
+
),
|
|
259
|
+
pytest.raises(Exception),
|
|
260
|
+
id="verify_index_route: invalid space in route",
|
|
261
|
+
),
|
|
229
262
|
pytest.param(
|
|
230
263
|
"verify_task_dependencies",
|
|
231
264
|
make_graph(
|