taskcluster-taskgraph 24.3.0__tar.gz → 24.4.1__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-24.3.0 → taskcluster_taskgraph-24.4.1}/.github/workflows/codeql-analysis.yml +3 -3
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/.github/workflows/codspeed.yml +1 -1
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/.pre-commit-config.yaml +2 -2
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/CHANGELOG.md +34 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/PKG-INFO +1 -1
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/howto/use-fetches.rst +13 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/reference/parameters.rst +11 -3
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/tutorials/connecting-taskcluster.rst +24 -11
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/tutorials/example-taskcluster.yml +16 -11
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/pyproject.toml +2 -1
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/decision.py +0 -4
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/generator.py +20 -11
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/graph.py +11 -2
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/optimize/base.py +16 -9
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/optimize/strategies.py +10 -2
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/run-task/fetch-content +296 -26
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/run-task/run-task +68 -2
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/target_tasks.py +1 -1
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/cached_tasks.py +12 -4
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/parameterization.py +10 -12
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/schema.py +19 -16
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/time.py +2 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/config.yml +1 -1
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/docker/index-task/Dockerfile +1 -1
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/docker/index-task/package.json +1 -1
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/docker/index-task/yarn.lock +13 -13
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/kinds/check/kind.yml +12 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/kinds/docker-image/kind.yml +1 -1
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/template/{{cookiecutter.project_name}}/taskcluster.github.yml +1 -1
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_graph_perf.py +68 -0
- taskcluster_taskgraph-24.4.1/test/test_scripts_fetch_content.py +963 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_scripts_run_task.py +49 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_util_cached_tasks.py +15 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_util_schema.py +46 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/uv.lock +1322 -1009
- taskcluster_taskgraph-24.3.0/test/test_scripts_fetch_content.py +0 -261
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/.codespell-ignore-words.txt +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/.github/CODEOWNERS +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/.github/workflows/pypi-publish.yml +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/.gitignore +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/.readthedocs.yaml +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/.taskcluster.yml +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/.yamllint +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/CODE_OF_CONDUCT.md +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/CONTRIBUTING.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/LICENSE +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/Makefile +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/README.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/concepts/index.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/concepts/kind.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/concepts/loading.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/concepts/optimization.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/concepts/overview.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/concepts/scopes.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/concepts/task-graphs.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/concepts/transforms.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/conf.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/contributing.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/glossary.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/howto/bootstrap-taskgraph.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/howto/create-actions.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/howto/create-tasks.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/howto/debugging.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/howto/define-schemas.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/howto/docker.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/howto/index.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/howto/load-task-locally.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/howto/resolve-keyed-by.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/howto/run-locally.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/howto/send-notifications.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/index.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/reference/cli.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/reference/index.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/reference/migrations.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/reference/optimization-strategies.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/reference/source/modules.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/reference/source/taskgraph.actions.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/reference/source/taskgraph.loader.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/reference/source/taskgraph.optimize.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/reference/source/taskgraph.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/reference/source/taskgraph.transforms.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/reference/source/taskgraph.transforms.run.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/reference/source/taskgraph.util.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/reference/transforms/chunking.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/reference/transforms/from_deps.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/reference/transforms/index.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/reference/transforms/matrix.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/reference/transforms/task_context.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/tutorials/creating-a-task-graph.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/tutorials/getting-started.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/tutorials/index.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/make.bat +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/packages/pytest-taskgraph/README.md +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/packages/pytest-taskgraph/pyproject.toml +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/packages/pytest-taskgraph/src/pytest_taskgraph/__init__.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/packages/pytest-taskgraph/src/pytest_taskgraph/fixtures/gen.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/packages/pytest-taskgraph/src/pytest_taskgraph/fixtures/vcs.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/packages/sphinx-taskgraph/README.md +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/packages/sphinx-taskgraph/pyproject.toml +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/packages/sphinx-taskgraph/src/sphinx_taskgraph/__init__.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/packages/sphinx-taskgraph/src/sphinx_taskgraph/autoschema.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/renovate.json +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/__init__.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/actions/__init__.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/actions/add_new_jobs.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/actions/cancel.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/actions/cancel_all.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/actions/rebuild_cached_tasks.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/actions/registry.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/actions/retrigger.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/actions/util.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/config.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/create.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/docker.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/filter_tasks.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/loader/__init__.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/loader/default.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/loader/transform.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/main.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/morph.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/optimize/__init__.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/parameters.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/run-task/hgrc +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/run-task/robustcheckout.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/task.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/taskgraph.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/transforms/__init__.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/transforms/base.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/transforms/cached_tasks.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/transforms/chunking.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/transforms/code_review.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/transforms/docker_image.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/transforms/fetch.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/transforms/from_deps.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/transforms/matrix.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/transforms/notify.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/transforms/run/__init__.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/transforms/run/common.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/transforms/run/index_search.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/transforms/run/run_task.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/transforms/run/toolchain.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/transforms/task.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/transforms/task_context.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/__init__.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/archive.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/attributes.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/caches.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/copy.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/dependencies.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/docker.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/hash.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/json.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/keyed_by.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/path.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/python_path.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/readonlydict.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/set_name.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/shell.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/task_context.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/taskcluster.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/taskgraph.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/templates.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/treeherder.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/vcs.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/verify.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/workertypes.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/util/yaml.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/docker/REGISTRY +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/docker/decision/Dockerfile +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/docker/decision/HASH +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/docker/decision/README.md +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/docker/decision/VERSION +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/docker/decision/system-setup.sh +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/docker/fetch/Dockerfile +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/docker/image_builder/README.rst +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/docker/index-task/README +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/docker/index-task/insert-indexes.js +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/docker/python/Dockerfile +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/docker/run-task/Dockerfile +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/docker/run-task/system-setup.sh +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/docker/skopeo/Dockerfile +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/docker/skopeo/policy.json +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/docker/skopeo/push_image.sh +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/kinds/codecov/kind.yml +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/kinds/complete/kind.yml +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/kinds/doc/kind.yml +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/kinds/fetch/kind.yml +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/kinds/push-image/kind.yml +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/kinds/test/kind.yml +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/kinds/test/linux.yml +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/kinds/test/windows.yml +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/scripts/codecov-upload.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/self_taskgraph/__init__.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/self_taskgraph/custom_parameters.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/self_taskgraph/custom_target_tasks.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/self_taskgraph/transforms/add_pr_route.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/self_taskgraph/transforms/push_image.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/test/params/main-repo-pull-request-untrusted.yml +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/test/params/main-repo-pull-request.yml +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/test/params/main-repo-push.yml +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/test/params/main-repo-release-pytest-taskgraph.yml +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/taskcluster/test/params/main-repo-release-taskcluster-taskgraph.yml +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/template/cookiecutter.json +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/template/hooks/post_gen_project.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/template/{{cookiecutter.project_name}}/taskcluster/config.yml +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/template/{{cookiecutter.project_name}}/taskcluster/docker/linux/Dockerfile +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/template/{{cookiecutter.project_name}}/taskcluster/kinds/docker-image/kind.yml +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/template/{{cookiecutter.project_name}}/taskcluster/kinds/hello/kind.yml +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/template/{{cookiecutter.project_name}}/taskcluster/{{cookiecutter.project_slug}}_taskgraph/transforms/hello.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/__init__.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/automationrelevance.json +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/conftest.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/data/task_context.yml +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/data/taskcluster/config.yml +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/data/taskcluster/docker/hello-world/Dockerfile +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/data/taskcluster/docker/hello-world-tag/Dockerfile +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/data/taskcluster/docker/hello-world-tag/REGISTRY +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/data/taskcluster/docker/hello-world-tag/VERSION +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/data/taskcluster/kinds/docker-image/kind.yml +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/data/taskcluster/scripts/toolchain/run.ps1 +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/data/taskcluster/scripts/toolchain/run.sh +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/data/taskcluster/test_taskgraph/transforms/foo.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/data/testmod/thing.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/mockedopen.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_actions_rebuild_cached_tasks.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_actions_registry.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_config.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_create.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_decision.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_docker.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_generator.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_graph.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_main.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_morph.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_optimize.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_optimize_strategies.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_parameters.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_target_tasks.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_taskgraph.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_transform_chunking.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_transform_docker_image.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_transform_task_context.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_transforms_base.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_transforms_cached_tasks.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_transforms_fetch.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_transforms_from_deps.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_transforms_matrix.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_transforms_notify.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_transforms_run.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_transforms_run_run_task.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_transforms_run_toolchain.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_transforms_task.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_util_archive.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_util_attributes.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_util_copy.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_util_dependencies.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_util_docker.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_util_json.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_util_keyed_by.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_util_parameterization.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_util_path.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_util_python_path.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_util_readonlydict.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_util_taskcluster.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_util_templates.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_util_time.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_util_treeherder.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_util_vcs.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_util_verify.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_util_workertypes.py +0 -0
- {taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/test/test_util_yaml.py +0 -0
{taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/.github/workflows/codeql-analysis.yml
RENAMED
|
@@ -42,7 +42,7 @@ jobs:
|
|
|
42
42
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
43
43
|
# Initializes the CodeQL tools for scanning.
|
|
44
44
|
- name: Initialize CodeQL
|
|
45
|
-
uses: github/codeql-action/init@
|
|
45
|
+
uses: github/codeql-action/init@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2
|
|
46
46
|
with:
|
|
47
47
|
languages: ${{ matrix.language }}
|
|
48
48
|
# If you wish to specify custom queries, you can do so here or in a config file.
|
|
@@ -55,7 +55,7 @@ jobs:
|
|
|
55
55
|
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
|
56
56
|
# If this step fails, then you should remove it and run the build manually (see below)
|
|
57
57
|
- name: Autobuild
|
|
58
|
-
uses: github/codeql-action/autobuild@
|
|
58
|
+
uses: github/codeql-action/autobuild@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2
|
|
59
59
|
|
|
60
60
|
# ℹ️ Command-line programs to run using the OS shell.
|
|
61
61
|
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
|
@@ -67,4 +67,4 @@ jobs:
|
|
|
67
67
|
# echo "Run, Build Application using script"
|
|
68
68
|
# ./location_of_script_within_repo/buildscript.sh
|
|
69
69
|
- name: Perform CodeQL Analysis
|
|
70
|
-
uses: github/codeql-action/analyze@
|
|
70
|
+
uses: github/codeql-action/analyze@2892aa5e19bbd11bc0cff5427e3b750a04d9e3c2 # v4.38.2
|
{taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/.github/workflows/codspeed.yml
RENAMED
|
@@ -19,7 +19,7 @@ jobs:
|
|
|
19
19
|
id-token: write # required for OIDC authentication with CodSpeed
|
|
20
20
|
steps:
|
|
21
21
|
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
22
|
-
- uses: astral-sh/setup-uv@
|
|
22
|
+
- uses: astral-sh/setup-uv@c18668ad3cf93ea998bef934396af7bb5c839dc7 # v10.2.0
|
|
23
23
|
with:
|
|
24
24
|
python-version: "3.12"
|
|
25
25
|
- name: Install dependencies
|
|
@@ -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.16.
|
|
16
|
+
rev: v0.16.9
|
|
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.12.
|
|
22
|
+
rev: 0.12.19
|
|
23
23
|
hooks:
|
|
24
24
|
- id: uv-lock
|
|
25
25
|
- repo: https://github.com/adrienverge/yamllint.git
|
|
@@ -1,5 +1,39 @@
|
|
|
1
1
|
# Change Log
|
|
2
2
|
|
|
3
|
+
## [24.4.1] - 2026-10-08
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- `github-issue-comment` tasks now use the PR cache namespaces
|
|
8
|
+
- perf: look up kind dependency tasks by kind in the generator (#1054)
|
|
9
|
+
- perf: extract tar archives while they download in `fetch-content` (#1068)
|
|
10
|
+
- perf: let tar decompress zstd archives in `fetch-content` (#1068)
|
|
11
|
+
- perf: read downloads in 1MiB chunks in `fetch-content` (#1068)
|
|
12
|
+
- perf: resolve each dependent's deadline only once in `optimize` (#1056)
|
|
13
|
+
|
|
14
|
+
## [24.4.0] - 2026-10-05
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- Merge concurrently extracted fetches in a fixed order in `fetch-content`
|
|
19
|
+
- Hook point in `run-task` before the task payload
|
|
20
|
+
- Prefix `run_python_script` output in `run-task` with `[script <timestamp>]`
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
|
|
24
|
+
- `taskgraph init` template and tutorial docs now default to the `public_restricted` PR policy
|
|
25
|
+
- BREAKING CHANGE: `run-task` requires Python 3.8
|
|
26
|
+
|
|
27
|
+
### Fixed
|
|
28
|
+
|
|
29
|
+
- `filter_for_git_branch` target task filter now works with untrusted PRs
|
|
30
|
+
- Update `@taskcluster/client` dependency to v110 (#1060)
|
|
31
|
+
- perf: compute `optionally_keyed_by` fields once per Schema class (#1049)
|
|
32
|
+
- perf: speed up resolving task definition references (#1051)
|
|
33
|
+
- perf: cache parsed relative time strings (#1052)
|
|
34
|
+
- perf: cache the visit order of graphs (#1053)
|
|
35
|
+
- perf: stop re-parsing the full task graph in the decision task (#1055)
|
|
36
|
+
|
|
3
37
|
## [24.3.0] - 2026-09-17
|
|
4
38
|
|
|
5
39
|
### Added
|
|
@@ -105,3 +105,16 @@ There are a few differences from the earlier ``build`` examples here:
|
|
|
105
105
|
|
|
106
106
|
It is not possible to configure the ``dest`` or ``extract`` values when using
|
|
107
107
|
``fetch`` or ``toolchain`` kinds.
|
|
108
|
+
|
|
109
|
+
Tuning Download Performance
|
|
110
|
+
---------------------------
|
|
111
|
+
|
|
112
|
+
The following environment variable tunes how ``fetch-content`` downloads
|
|
113
|
+
artifacts.
|
|
114
|
+
|
|
115
|
+
``TASKGRAPH_FETCH_STREAM``
|
|
116
|
+
Tar archives that are extracted are extracted while they download, rather
|
|
117
|
+
than written to disk and read back, into a staging directory that is only
|
|
118
|
+
merged into place once the download is complete and verified. This is on
|
|
119
|
+
by default; set to ``0`` to download to a file first. Zip archives, and
|
|
120
|
+
fetches that aren't extracted, always go through a file.
|
|
@@ -96,9 +96,17 @@ project
|
|
|
96
96
|
|
|
97
97
|
level
|
|
98
98
|
~~~~~
|
|
99
|
-
The
|
|
100
|
-
|
|
101
|
-
|
|
99
|
+
The trust level associated with this task group. Trust levels provide a
|
|
100
|
+
convenient way to segregate resources such as worker-pools, secrets and
|
|
101
|
+
caches based on how the task group was triggered. This creates security
|
|
102
|
+
boundaries between various degrees of trust.
|
|
103
|
+
|
|
104
|
+
The meaning of a trust level can vary from project to project, but typically
|
|
105
|
+
level 1 is the lowest trust and corresponds to pull requests from external
|
|
106
|
+
contributors. Level 2 is a degree higher and denotes pull requests from repo
|
|
107
|
+
collaborators or pushes to unprotected branches. Level 3 is the highest
|
|
108
|
+
degree of trust and is reserved for pushes to protected branches and
|
|
109
|
+
releases.
|
|
102
110
|
|
|
103
111
|
Target Set
|
|
104
112
|
----------
|
|
@@ -79,7 +79,7 @@ here is the recommended method:
|
|
|
79
79
|
version: 1
|
|
80
80
|
reporting: checks-v1
|
|
81
81
|
policy:
|
|
82
|
-
pullRequests:
|
|
82
|
+
pullRequests: public_restricted
|
|
83
83
|
tasks:
|
|
84
84
|
-
|
|
85
85
|
|
|
@@ -109,7 +109,7 @@ here is the recommended method:
|
|
|
109
109
|
$if: 'tasks_for == "github-push"'
|
|
110
110
|
then: '${event.pusher.email}'
|
|
111
111
|
else:
|
|
112
|
-
$if: 'tasks_for == "github-pull-request"'
|
|
112
|
+
$if: 'tasks_for[:19] == "github-pull-request"'
|
|
113
113
|
then: '${event.pull_request.user.login}@users.noreply.github.com'
|
|
114
114
|
else:
|
|
115
115
|
$if: 'tasks_for == "github-release"'
|
|
@@ -118,22 +118,22 @@ here is the recommended method:
|
|
|
118
118
|
$if: 'tasks_for == "github-push"'
|
|
119
119
|
then: '${event.repository.html_url}'
|
|
120
120
|
else:
|
|
121
|
-
$if: 'tasks_for == "github-pull-request"'
|
|
121
|
+
$if: 'tasks_for[:19] == "github-pull-request"'
|
|
122
122
|
then: '${event.pull_request.base.repo.html_url}'
|
|
123
123
|
repoUrl:
|
|
124
124
|
$if: 'tasks_for == "github-push"'
|
|
125
125
|
then: '${event.repository.html_url}'
|
|
126
126
|
else:
|
|
127
|
-
$if: 'tasks_for == "github-pull-request"'
|
|
127
|
+
$if: 'tasks_for[:19] == "github-pull-request"'
|
|
128
128
|
then: '${event.pull_request.head.repo.html_url}'
|
|
129
129
|
project:
|
|
130
130
|
$if: 'tasks_for == "github-push"'
|
|
131
131
|
then: '${event.repository.name}'
|
|
132
132
|
else:
|
|
133
|
-
$if: 'tasks_for == "github-pull-request"'
|
|
133
|
+
$if: 'tasks_for[:19] == "github-pull-request"'
|
|
134
134
|
then: '${event.pull_request.head.repo.name}'
|
|
135
135
|
headBranch:
|
|
136
|
-
$if: 'tasks_for == "github-pull-request"'
|
|
136
|
+
$if: 'tasks_for[:19] == "github-pull-request"'
|
|
137
137
|
then: ${event.pull_request.head.ref}
|
|
138
138
|
else:
|
|
139
139
|
$if: 'tasks_for == "github-push"'
|
|
@@ -142,7 +142,7 @@ here is the recommended method:
|
|
|
142
142
|
$if: 'tasks_for == "github-push"'
|
|
143
143
|
then: '${event.after}'
|
|
144
144
|
else:
|
|
145
|
-
$if: 'tasks_for == "github-pull-request"'
|
|
145
|
+
$if: 'tasks_for[:19] == "github-pull-request"'
|
|
146
146
|
then: '${event.pull_request.head.sha}'
|
|
147
147
|
|
|
148
148
|
This isn't strictly necessary, but the format of the various Github events
|
|
@@ -165,7 +165,7 @@ here is the recommended method:
|
|
|
165
165
|
in:
|
|
166
166
|
$if: >
|
|
167
167
|
tasks_for == "github-push" && headBranch == "main"
|
|
168
|
-
|| (tasks_for == "github-pull-request" && ${event.action} in ["opened", "reopened", "synchronize"])
|
|
168
|
+
|| (tasks_for[:19] == "github-pull-request" && ${event.action} in ["opened", "reopened", "synchronize"])
|
|
169
169
|
then:
|
|
170
170
|
# Task definition goes here. Since there is no "else" clause, if
|
|
171
171
|
# the above if statement evaluates to false, there will be no
|
|
@@ -236,9 +236,11 @@ here is the recommended method:
|
|
|
236
236
|
# while ${headBranch[11:]} strips out 'refs/heads/'
|
|
237
237
|
- 'assume:repo:${repoUrl[8:]}:branch:${headBranch[11:]}'
|
|
238
238
|
else:
|
|
239
|
-
$if: 'tasks_for == "github-pull-request"'
|
|
239
|
+
$if: 'tasks_for[:19] == "github-pull-request"'
|
|
240
240
|
then:
|
|
241
|
-
|
|
241
|
+
# ${tasks_for[7:]} strips the 'github-' prefix, leaving
|
|
242
|
+
# either 'pull-request' or 'pull-request-untrusted'.
|
|
243
|
+
- 'assume:repo:github.com/${event.pull_request.base.repo.full_name}:${tasks_for[7:]}'
|
|
242
244
|
|
|
243
245
|
Notice how we assume different roles depending on whether the task is
|
|
244
246
|
coming from a push or a pull request. This is useful when you have tasks
|
|
@@ -246,6 +248,17 @@ here is the recommended method:
|
|
|
246
248
|
accidentally running on a pull request! By using different scopes, you can
|
|
247
249
|
ensure it won't ever happen.
|
|
248
250
|
|
|
251
|
+
With the ``public_restricted`` policy set above, Github reports pull
|
|
252
|
+
requests from repository collaborators with ``tasks_for ==
|
|
253
|
+
"github-pull-request"`` and pull requests from everyone else with
|
|
254
|
+
``tasks_for == "github-pull-request-untrusted"``. Slicing ``tasks_for[7:]``
|
|
255
|
+
turns those into the role names ``pull-request`` and
|
|
256
|
+
``pull-request-untrusted``, so you can grant non-collaborator pull
|
|
257
|
+
requests a more restricted set of scopes than collaborator ones. This
|
|
258
|
+
matters because collapsing that distinction (e.g. by using the ``public``
|
|
259
|
+
policy) means any external contributor's pull request gets the same
|
|
260
|
+
scopes as a trusted collaborator's.
|
|
261
|
+
|
|
249
262
|
The roles assumed above may vary depending on the Taskcluster
|
|
250
263
|
configuration.
|
|
251
264
|
|
|
@@ -310,7 +323,7 @@ here is the recommended method:
|
|
|
310
323
|
# running your command
|
|
311
324
|
MYREPO_PIP_REQUIREMENTS: taskcluster/requirements.txt
|
|
312
325
|
REPOSITORIES: {$json: {myrepo: "MyRepo"}}
|
|
313
|
-
- $if: 'tasks_for
|
|
326
|
+
- $if: 'tasks_for[:19] == "github-pull-request"'
|
|
314
327
|
then:
|
|
315
328
|
MYREPO_PULL_REQUEST_NUMBER: '${event.pull_request.number}'
|
|
316
329
|
command:
|
{taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/docs/tutorials/example-taskcluster.yml
RENAMED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
version: 1
|
|
3
3
|
reporting: checks-v1
|
|
4
4
|
policy:
|
|
5
|
-
pullRequests:
|
|
5
|
+
pullRequests: public_restricted
|
|
6
6
|
tasks:
|
|
7
7
|
- $let:
|
|
8
8
|
# Variable definitions
|
|
@@ -13,7 +13,7 @@ tasks:
|
|
|
13
13
|
$if: 'tasks_for == "github-push"'
|
|
14
14
|
then: '${event.pusher.email}'
|
|
15
15
|
else:
|
|
16
|
-
$if: 'tasks_for == "github-pull-request"'
|
|
16
|
+
$if: 'tasks_for[:19] == "github-pull-request"'
|
|
17
17
|
then: '${event.pull_request.user.login}@users.noreply.github.com'
|
|
18
18
|
else:
|
|
19
19
|
$if: 'tasks_for == "github-release"'
|
|
@@ -22,22 +22,22 @@ tasks:
|
|
|
22
22
|
$if: 'tasks_for == "github-push"'
|
|
23
23
|
then: '${event.repository.html_url}'
|
|
24
24
|
else:
|
|
25
|
-
$if: 'tasks_for == "github-pull-request"'
|
|
25
|
+
$if: 'tasks_for[:19] == "github-pull-request"'
|
|
26
26
|
then: '${event.pull_request.base.repo.html_url}'
|
|
27
27
|
repoUrl:
|
|
28
28
|
$if: 'tasks_for == "github-push"'
|
|
29
29
|
then: '${event.repository.html_url}'
|
|
30
30
|
else:
|
|
31
|
-
$if: 'tasks_for == "github-pull-request"'
|
|
31
|
+
$if: 'tasks_for[:19] == "github-pull-request"'
|
|
32
32
|
then: '${event.pull_request.head.repo.html_url}'
|
|
33
33
|
project:
|
|
34
34
|
$if: 'tasks_for == "github-push"'
|
|
35
35
|
then: '${event.repository.name}'
|
|
36
36
|
else:
|
|
37
|
-
$if: 'tasks_for == "github-pull-request"'
|
|
37
|
+
$if: 'tasks_for[:19] == "github-pull-request"'
|
|
38
38
|
then: '${event.pull_request.head.repo.name}'
|
|
39
39
|
headBranch:
|
|
40
|
-
$if: 'tasks_for == "github-pull-request"'
|
|
40
|
+
$if: 'tasks_for[:19] == "github-pull-request"'
|
|
41
41
|
then: ${event.pull_request.head.ref}
|
|
42
42
|
else:
|
|
43
43
|
$if: 'tasks_for == "github-push"'
|
|
@@ -46,13 +46,13 @@ tasks:
|
|
|
46
46
|
$if: 'tasks_for == "github-push"'
|
|
47
47
|
then: '${event.after}'
|
|
48
48
|
else:
|
|
49
|
-
$if: 'tasks_for == "github-pull-request"'
|
|
49
|
+
$if: 'tasks_for[:19] == "github-pull-request"'
|
|
50
50
|
then: '${event.pull_request.head.sha}'
|
|
51
51
|
in:
|
|
52
52
|
# Guard that controls when to schedule tasks.
|
|
53
53
|
$if: >
|
|
54
54
|
tasks_for == "github-push" && headBranch == "main"
|
|
55
|
-
|| (tasks_for == "github-pull-request" && ${event.action} in ["opened", "reopened", "synchronize"])
|
|
55
|
+
|| (tasks_for[:19] == "github-pull-request" && ${event.action} in ["opened", "reopened", "synchronize"])
|
|
56
56
|
then:
|
|
57
57
|
# Task Definition
|
|
58
58
|
taskId: '${ownTaskId}'
|
|
@@ -74,9 +74,14 @@ tasks:
|
|
|
74
74
|
# while ${headBranch[11:]} strips out 'refs/heads/'
|
|
75
75
|
- 'assume:repo:${repoUrl[8:]}:branch:${headBranch[11:]}'
|
|
76
76
|
else:
|
|
77
|
-
$if: 'tasks_for == "github-pull-request"'
|
|
77
|
+
$if: 'tasks_for[:19] == "github-pull-request"'
|
|
78
78
|
then:
|
|
79
|
-
|
|
79
|
+
# ${tasks_for[7:]} strips the 'github-' prefix, leaving
|
|
80
|
+
# 'pull-request' or 'pull-request-untrusted'. With the
|
|
81
|
+
# 'public_restricted' policy these map to two separate
|
|
82
|
+
# roles, so pull requests from collaborators get more
|
|
83
|
+
# scopes than those from non-collaborators.
|
|
84
|
+
- 'assume:repo:github.com/${event.pull_request.base.repo.full_name}:${tasks_for[7:]}'
|
|
80
85
|
payload:
|
|
81
86
|
image:
|
|
82
87
|
mozillareleases/taskgraph:decision-cf4b4b4baff57d84c1f9ec8fcd70c9839b70a7d66e6430a6c41ffe67252faa19@sha256:425e07f6813804483bc5a7258288a7684d182617ceeaa0176901ccc7702dfe28
|
|
@@ -97,7 +102,7 @@ tasks:
|
|
|
97
102
|
# bootstrapped
|
|
98
103
|
MYREPO_PIP_REQUIREMENTS: taskcluster/requirements.txt
|
|
99
104
|
REPOSITORIES: {$json: {myrepo: "MyRepo"}}
|
|
100
|
-
- $if: 'tasks_for
|
|
105
|
+
- $if: 'tasks_for[:19] == "github-pull-request"'
|
|
101
106
|
then:
|
|
102
107
|
MYREPO_PULL_REQUEST_NUMBER: '${event.pull_request.number}'
|
|
103
108
|
command:
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
### Project
|
|
2
2
|
[project]
|
|
3
3
|
name = "taskcluster-taskgraph"
|
|
4
|
-
version = "24.
|
|
4
|
+
version = "24.4.1"
|
|
5
5
|
description = "Build taskcluster taskgraphs"
|
|
6
6
|
readme = "README.rst"
|
|
7
7
|
authors = [
|
|
@@ -52,6 +52,7 @@ dev = [
|
|
|
52
52
|
"sphinx-book-theme >=1.1.4",
|
|
53
53
|
"sphinx-taskgraph>=0.1.0",
|
|
54
54
|
"sphinxcontrib-mermaid>=1.0.0",
|
|
55
|
+
"vermin>=1.8.0",
|
|
55
56
|
"zstandard>=0.25.0",
|
|
56
57
|
]
|
|
57
58
|
|
|
@@ -17,7 +17,6 @@ from taskgraph.actions import render_actions_json
|
|
|
17
17
|
from taskgraph.create import create_tasks
|
|
18
18
|
from taskgraph.generator import TaskGraphGenerator
|
|
19
19
|
from taskgraph.parameters import Parameters, get_version
|
|
20
|
-
from taskgraph.taskgraph import TaskGraph
|
|
21
20
|
from taskgraph.util import json
|
|
22
21
|
from taskgraph.util.python_path import find_object
|
|
23
22
|
from taskgraph.util.schema import Schema, validate_schema
|
|
@@ -131,9 +130,6 @@ def taskgraph_decision(options, parameters=None):
|
|
|
131
130
|
"runnable-jobs.json", full_task_graph_to_runnable_tasks(full_task_json)
|
|
132
131
|
)
|
|
133
132
|
|
|
134
|
-
# this is just a test to check whether the from_json() function is working
|
|
135
|
-
_, _ = TaskGraph.from_json(full_task_json)
|
|
136
|
-
|
|
137
133
|
# write out the target task set to allow reproducing this as input
|
|
138
134
|
write_artifact("target-tasks.json", list(tgg.target_task_set.tasks.keys()))
|
|
139
135
|
|
|
@@ -282,8 +282,21 @@ class TaskGraphGenerator:
|
|
|
282
282
|
except KindNotFound:
|
|
283
283
|
continue
|
|
284
284
|
|
|
285
|
+
@staticmethod
|
|
286
|
+
def _get_kind_dependencies_tasks(kind, tasks_by_kind):
|
|
287
|
+
"""Return the tasks of the kinds `kind` depends on, in the order in
|
|
288
|
+
which they were loaded."""
|
|
289
|
+
kind_dependencies = kind.config.get("kind-dependencies", [])
|
|
290
|
+
return {
|
|
291
|
+
label: task
|
|
292
|
+
for kind_name, tasks in tasks_by_kind.items()
|
|
293
|
+
if kind_name in kind_dependencies
|
|
294
|
+
for label, task in tasks.items()
|
|
295
|
+
}
|
|
296
|
+
|
|
285
297
|
def _load_tasks_serial(self, kinds, kind_graph, parameters):
|
|
286
298
|
all_tasks = {}
|
|
299
|
+
tasks_by_kind = {}
|
|
287
300
|
for kind_name in kind_graph.visit_postorder():
|
|
288
301
|
logger.debug(f"Loading tasks for kind {kind_name}")
|
|
289
302
|
|
|
@@ -297,11 +310,7 @@ class TaskGraphGenerator:
|
|
|
297
310
|
try:
|
|
298
311
|
new_tasks = kind.load_tasks(
|
|
299
312
|
parameters,
|
|
300
|
-
|
|
301
|
-
k: t
|
|
302
|
-
for k, t in all_tasks.items()
|
|
303
|
-
if t.kind in kind.config.get("kind-dependencies", [])
|
|
304
|
-
},
|
|
313
|
+
self._get_kind_dependencies_tasks(kind, tasks_by_kind),
|
|
305
314
|
self._write_artifacts,
|
|
306
315
|
)
|
|
307
316
|
except SchemaValidationError as exc:
|
|
@@ -310,15 +319,18 @@ class TaskGraphGenerator:
|
|
|
310
319
|
except Exception:
|
|
311
320
|
logger.exception(f"Error loading tasks for kind {kind_name}:")
|
|
312
321
|
raise
|
|
322
|
+
kind_tasks = tasks_by_kind.setdefault(kind_name, {})
|
|
313
323
|
for task in new_tasks:
|
|
314
324
|
if task.label in all_tasks:
|
|
315
325
|
raise Exception("duplicate tasks with label " + task.label)
|
|
316
326
|
all_tasks[task.label] = task
|
|
327
|
+
kind_tasks[task.label] = task
|
|
317
328
|
|
|
318
329
|
return all_tasks
|
|
319
330
|
|
|
320
331
|
def _load_tasks_parallel(self, kinds, kind_graph, parameters, executor):
|
|
321
332
|
all_tasks = {}
|
|
333
|
+
tasks_by_kind = {}
|
|
322
334
|
futures_to_kind = {}
|
|
323
335
|
futures = set()
|
|
324
336
|
edges = set(kind_graph.edges)
|
|
@@ -328,7 +340,6 @@ class TaskGraphGenerator:
|
|
|
328
340
|
def submit_ready_kinds():
|
|
329
341
|
"""Create the next batch of tasks for kinds without dependencies."""
|
|
330
342
|
nonlocal kinds, edges, futures
|
|
331
|
-
loaded_tasks = all_tasks.copy()
|
|
332
343
|
kinds_with_deps = {edge[0] for edge in edges}
|
|
333
344
|
ready_kinds = (
|
|
334
345
|
set(kinds) - kinds_with_deps - set(futures_to_kind.values())
|
|
@@ -346,11 +357,7 @@ class TaskGraphGenerator:
|
|
|
346
357
|
future = executor.submit(
|
|
347
358
|
kind.load_tasks,
|
|
348
359
|
dict(parameters),
|
|
349
|
-
|
|
350
|
-
k: t
|
|
351
|
-
for k, t in loaded_tasks.items()
|
|
352
|
-
if t.kind in kind.config.get("kind-dependencies", [])
|
|
353
|
-
},
|
|
360
|
+
self._get_kind_dependencies_tasks(kind, tasks_by_kind),
|
|
354
361
|
self._write_artifacts,
|
|
355
362
|
)
|
|
356
363
|
futures.add(future)
|
|
@@ -376,10 +383,12 @@ class TaskGraphGenerator:
|
|
|
376
383
|
kind = futures_to_kind.pop(future)
|
|
377
384
|
futures.remove(future)
|
|
378
385
|
|
|
386
|
+
kind_tasks = tasks_by_kind.setdefault(kind, {})
|
|
379
387
|
for task in future.result():
|
|
380
388
|
if task.label in all_tasks:
|
|
381
389
|
raise Exception("duplicate tasks with label " + task.label)
|
|
382
390
|
all_tasks[task.label] = task
|
|
391
|
+
kind_tasks[task.label] = task
|
|
383
392
|
|
|
384
393
|
# Update state for next batch of futures.
|
|
385
394
|
del kinds[kind]
|
|
@@ -107,6 +107,15 @@ class Graph(_Graph):
|
|
|
107
107
|
f"Dependency loop detected involving the following nodes: {loopy_nodes}"
|
|
108
108
|
)
|
|
109
109
|
|
|
110
|
+
@functools.cache
|
|
111
|
+
def _visit_order(self, reverse):
|
|
112
|
+
"""
|
|
113
|
+
Return the order in which `_visit` yields nodes as a tuple. The graph
|
|
114
|
+
is immutable, so this is cached to avoid sorting it again every time
|
|
115
|
+
it is visited.
|
|
116
|
+
"""
|
|
117
|
+
return tuple(self._visit(reverse))
|
|
118
|
+
|
|
110
119
|
def visit_postorder(self):
|
|
111
120
|
"""
|
|
112
121
|
Generate a sequence of nodes in postorder, such that every node is
|
|
@@ -114,14 +123,14 @@ class Graph(_Graph):
|
|
|
114
123
|
|
|
115
124
|
Raises an exception if the graph contains a cycle.
|
|
116
125
|
"""
|
|
117
|
-
return self.
|
|
126
|
+
return iter(self._visit_order(False))
|
|
118
127
|
|
|
119
128
|
def visit_preorder(self):
|
|
120
129
|
"""
|
|
121
130
|
Like visit_postorder, but in reverse: evrey node is visited *before*
|
|
122
131
|
any nodes it links to.
|
|
123
132
|
"""
|
|
124
|
-
return self.
|
|
133
|
+
return iter(self._visit_order(True))
|
|
125
134
|
|
|
126
135
|
@functools.cache
|
|
127
136
|
def links_and_reverse_links_dict(self):
|
{taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/optimize/base.py
RENAMED
|
@@ -78,7 +78,7 @@ def optimize_task_graph(
|
|
|
78
78
|
|
|
79
79
|
# Gather each relevant task's index
|
|
80
80
|
indexes = set()
|
|
81
|
-
for label in target_task_graph.
|
|
81
|
+
for label in target_task_graph.tasks:
|
|
82
82
|
if label in do_not_optimize:
|
|
83
83
|
continue
|
|
84
84
|
_, strategy, arg = optimizations(label)
|
|
@@ -157,7 +157,7 @@ def remove_tasks(
|
|
|
157
157
|
opt_counts = defaultdict(int)
|
|
158
158
|
opt_reasons = {}
|
|
159
159
|
removed = set()
|
|
160
|
-
dependents_of = target_task_graph.graph.
|
|
160
|
+
_, dependents_of = target_task_graph.graph.links_and_reverse_links_dict()
|
|
161
161
|
tasks = target_task_graph.tasks
|
|
162
162
|
prune_candidates = set()
|
|
163
163
|
|
|
@@ -301,6 +301,18 @@ def replace_tasks(
|
|
|
301
301
|
target_task_graph.graph.links_and_reverse_links_dict()
|
|
302
302
|
)
|
|
303
303
|
|
|
304
|
+
# Many tasks share dependents (e.g. docker images or toolchains), so
|
|
305
|
+
# resolve the deadline of each dependent only once.
|
|
306
|
+
now = datetime.datetime.now(datetime.timezone.utc)
|
|
307
|
+
deadlines = {}
|
|
308
|
+
|
|
309
|
+
def get_deadline(label):
|
|
310
|
+
if label not in deadlines:
|
|
311
|
+
deadlines[label] = resolve_timestamps(
|
|
312
|
+
now, target_task_graph.tasks[label].task["deadline"]
|
|
313
|
+
)
|
|
314
|
+
return deadlines[label]
|
|
315
|
+
|
|
304
316
|
for label in target_task_graph.graph.visit_postorder():
|
|
305
317
|
logger.debug(f"replace_tasks: {label}")
|
|
306
318
|
# if we're not allowed to optimize, that's easy..
|
|
@@ -331,14 +343,9 @@ def replace_tasks(
|
|
|
331
343
|
opt_by, opt, arg = optimizations(label)
|
|
332
344
|
|
|
333
345
|
# compute latest deadline of dependents (if any)
|
|
334
|
-
dependents = [target_task_graph.tasks[l] for l in dependents_of[label]]
|
|
335
346
|
deadline = None
|
|
336
|
-
if
|
|
337
|
-
|
|
338
|
-
deadline = max(
|
|
339
|
-
resolve_timestamps(now, task.task["deadline"])
|
|
340
|
-
for task in dependents # type: ignore
|
|
341
|
-
)
|
|
347
|
+
if dependents_of[label]:
|
|
348
|
+
deadline = max(get_deadline(l) for l in dependents_of[label])
|
|
342
349
|
|
|
343
350
|
if isinstance(opt, IndexSearch):
|
|
344
351
|
arg = arg, index_to_taskid, taskid_to_status
|
{taskcluster_taskgraph-24.3.0 → taskcluster_taskgraph-24.4.1}/src/taskgraph/optimize/strategies.py
RENAMED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import functools
|
|
1
2
|
import logging
|
|
2
3
|
from datetime import datetime
|
|
3
4
|
|
|
@@ -10,6 +11,13 @@ from taskgraph.util.taskcluster import find_task_id, status_task
|
|
|
10
11
|
logger = logging.getLogger("optimization")
|
|
11
12
|
|
|
12
13
|
|
|
14
|
+
@functools.cache
|
|
15
|
+
def _parse_time(timestamp, fmt):
|
|
16
|
+
# Many tasks share the same deadline or replacement task, so avoid parsing
|
|
17
|
+
# the same timestamps over and over.
|
|
18
|
+
return datetime.strptime(timestamp, fmt)
|
|
19
|
+
|
|
20
|
+
|
|
13
21
|
@register_strategy("index-search")
|
|
14
22
|
class IndexSearch(OptimizationStrategy):
|
|
15
23
|
# A task with no dependencies remaining after optimization will be replaced
|
|
@@ -56,10 +64,10 @@ class IndexSearch(OptimizationStrategy):
|
|
|
56
64
|
)
|
|
57
65
|
continue
|
|
58
66
|
|
|
59
|
-
if deadline and
|
|
67
|
+
if deadline and _parse_time(
|
|
60
68
|
status["expires"], # type: ignore
|
|
61
69
|
self.fmt,
|
|
62
|
-
) <
|
|
70
|
+
) < _parse_time(deadline, self.fmt):
|
|
63
71
|
logger.debug(
|
|
64
72
|
f"not replacing {task.label} with {task_id} because it expires before {deadline}"
|
|
65
73
|
)
|