diff --git a/.editorconfig b/.editorconfig index 95b2348..845baae 100644 --- a/.editorconfig +++ b/.editorconfig @@ -19,5 +19,8 @@ indent_size = 2 [Makefile] indent_style = tab +[*.mk] +indent_style = tab + [*.neon] indent_style = tab diff --git a/.gitattributes b/.gitattributes index 86e122e..672fc22 100644 --- a/.gitattributes +++ b/.gitattributes @@ -18,6 +18,7 @@ .github/ export-ignore etc/ci/ export-ignore etc/dev-app/ export-ignore +etc/state/ export-ignore etc/qa/ export-ignore examples/ export-ignore tests/ export-ignore diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index cd15956..e2041ba 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -14,4 +14,4 @@ permissions: jobs: ci: name: Continuous Integration - uses: WyriHaximus/github-workflows/.github/workflows/package.yaml@main + uses: WyriHaximus/github-workflows/.github/workflows/package.yaml@5343944be2a6ef963186b5f413121fcf36980b33 # v1.0.0 diff --git a/.github/workflows/release-management.yaml b/.github/workflows/release-management.yaml index e472b26..9b1dd08 100644 --- a/.github/workflows/release-management.yaml +++ b/.github/workflows/release-management.yaml @@ -17,7 +17,7 @@ permissions: jobs: release-managment: name: Create Release - uses: WyriHaximus/github-workflows/.github/workflows/package-release-management.yaml@main + uses: WyriHaximus/github-workflows/.github/workflows/package-release-management.yaml@5343944be2a6ef963186b5f413121fcf36980b33 # v1.0.0 with: milestone: ${{ github.event.milestone.title }} description: ${{ github.event.milestone.title }} diff --git a/.gitignore b/.gitignore index 03ad991..3d2afd8 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,9 @@ var/* !var/.gitkeep vendor/ etc/qa/.phpunit.result.cache +etc/qa/vale/** +!etc/qa/vale/styles/ +!etc/qa/vale/styles/config/ +!etc/qa/vale/styles/config/vocabularies/ +!etc/qa/vale/styles/config/vocabularies/WyriHaximus/ +!etc/qa/vale/styles/config/vocabularies/WyriHaximus/accept.txt diff --git a/Makefile b/Makefile index e7b1c7a..4414982 100644 --- a/Makefile +++ b/Makefile @@ -3,17 +3,27 @@ SHELL=bash .PHONY: * +ifneq (,$(findstring icrosoft,$(shell cat /proc/version))) + THREADS?=1 +else + THREADS?=$(shell nproc) +endif DOCKER_AVAILABLE=$(shell ((command -v docker >/dev/null 2>&1) && echo 0 || echo 1)) +TTY_AVAILABLE=$(shell (test -t 1 && echo 0) || echo 1) CONTAINER_REGISTRY_REPO="ghcr.io/wyrihaximusnet/php" SLIM_DOCKER_IMAGE="-slim" NTS_OR_ZTS_DOCKER_IMAGE="zts" -OTEL_PHP_FIBERS_ENABLED=false +OTEL_PHP_FIBERS_ENABLED?=false NEEDS_DOCKER_SOCKET=FALSE +HAS_EXTRA_SERVICES=FALSE +ALL_HAS_DIRECT_DOCKER_TASKS=FALSE +CONTRIB_HAS_DIRECT_DOCKER_TASKS=TRUE +ON_INSTALL_OR_UPDATE_HAS_DIRECT_DOCKER_TASKS=FALSE PHP_VERSION="8.4" CONTAINER_NAME=$(shell echo "${CONTAINER_REGISTRY_REPO}:${PHP_VERSION}-${NTS_OR_ZTS_DOCKER_IMAGE}-alpine${SLIM_DOCKER_IMAGE}-dev") CONTAINER_NAME_INTERACTIVE_SHELL=$(shell echo "${CONTAINER_REGISTRY_REPO}:${PHP_VERSION}-zts-alpine-dev") COMPOSER_CACHE_DIR=$(shell (command -v composer >/dev/null 2>&1) && composer config --global cache-dir -q 2>/dev/null || echo ${HOME}/.composer-php/cache) -COMPOSER_CONTAINER_CACHE_DIR=$(shell ((command -v docker >/dev/null 2>&1) && docker run --rm -it ${CONTAINER_NAME} composer config --global cache-dir -q) || echo ${HOME}/.composer-php/cache) +COMPOSER_CONTAINER_CACHE_DIR=$(shell ((command -v docker >/dev/null 2>&1) && docker run --rm $(if $(filter 0,$(TTY_AVAILABLE)),-it,-i) ${CONTAINER_NAME} composer config --global cache-dir -q) || echo ${HOME}/.composer-php/cache) ifneq ("$(wildcard /.you-are-in-a-wyrihaximus.net-php-docker-image)","") IN_DOCKER=TRUE @@ -21,15 +31,34 @@ else IN_DOCKER=FALSE endif +ifeq ("$(GITHUB_ACTIONS)","true") + IN_CI=TRUE +else + IN_CI=FALSE +endif + +ifeq ("$(IN_CI)","TRUE") + MUTATION_THREADS?=1 +else + MUTATION_THREADS?=$(THREADS) +endif + ifeq ("$(IN_DOCKER)","TRUE") DOCKER_RUN:= + DOCKER_RUN_WITHOUT_NETWORK_FOR_COMPOSER:= DOCKER_RUN_WITH_SOCKET:= DOCKER_SHELL:= DOCKER_INTERACTIVE_SHELL:= + DOCKER_DEFAULT_SECURITY_OPS= + DOCKER_WORKSPACE_BIND_OPS=--volumes-from $$(cat /etc/hostname) -w "`pwd`" else ifeq ($(DOCKER_AVAILABLE),0) DOCKER_DEFAULT_SECURITY_OPS=--cap-drop=ALL --security-opt="no-new-privileges=true" --user="`id -u`:`id -g`" - DOCKER_COMMON_OPS:=-v "`pwd`:`pwd`" -w "`pwd`" -v "`pwd`/.git:`pwd`/.git:ro" -v "${COMPOSER_CACHE_DIR}:${COMPOSER_CONTAINER_CACHE_DIR}" --ulimit nofile=1000000 + DOCKER_WORKSPACE_BIND_OPS=-v "`pwd`:`pwd`" -w "`pwd`" + DOCKER_COMMON_OPS:=-v "`pwd`:`pwd`" -w "`pwd`" -v "`pwd`/.git:`pwd`/.git:ro" -v "${COMPOSER_CACHE_DIR}:${COMPOSER_CONTAINER_CACHE_DIR}" --ulimit nofile=1000000 -e THREADS="${THREADS}" -e MUTATION_THREADS="${MUTATION_THREADS}" -e OTEL_PHP_DISABLED_INSTRUMENTATIONS="all" + ifneq ("$(wildcard etc/qa/zzz_disable_otel_attr_hooks.ini)","") + DOCKER_COMMON_OPS:=${DOCKER_COMMON_OPS} -v "`pwd`/etc/qa/zzz_disable_otel_attr_hooks.ini:/usr/local/etc/php/conf.d/zzz_disable_otel_attr_hooks.ini:ro" + endif DOCKER_COMMON_NON_INTERACTIVE_OPS:=-e OTEL_PHP_FIBERS_ENABLED="${OTEL_PHP_FIBERS_ENABLED}" DOCKER_COMMON_INTERACTIVE_OPS:=-e OTEL_PHP_FIBERS_ENABLED="false" ifeq ("$(NEEDS_DOCKER_SOCKET)","TRUE") @@ -48,43 +77,69 @@ else DOCKER_SOCKET_CONTAINER_NAME_SUFFIX:= endif DOCKER_RUN:=docker run --rm -i ${DOCKER_SECURITY_OPS} ${DOCKER_COMMON_NON_INTERACTIVE_OPS} ${DOCKER_COMMON_OPS} "${CONTAINER_NAME}" + DOCKER_RUN_WITHOUT_NETWORK_FOR_COMPOSER:=docker run --rm -i ${DOCKER_SECURITY_OPS} ${DOCKER_COMMON_NON_INTERACTIVE_OPS} -e COMPOSER_DISABLE_NETWORK="1" ${DOCKER_COMMON_OPS} "${CONTAINER_NAME}" DOCKER_RUN_WITH_SOCKET:=docker run --rm -i ${DOCKER_SECURITY_OPS} ${DOCKER_COMMON_NON_INTERACTIVE_OPS} ${DOCKER_COMMON_OPS} ${DOCKER_SOCKET_OPS} "${CONTAINER_NAME}${DOCKER_SOCKET_CONTAINER_NAME_SUFFIX}" - DOCKER_SHELL:=docker run --rm -it ${DOCKER_SECURITY_OPS} ${DOCKER_COMMON_NON_INTERACTIVE_OPS} ${DOCKER_COMMON_OPS} "${CONTAINER_NAME}" - DOCKER_INTERACTIVE_SHELL:=docker run --rm -it ${DOCKER_SECURITY_OPS} ${DOCKER_COMMON_INTERACTIVE_OPS} ${DOCKER_COMMON_OPS} "${CONTAINER_NAME_INTERACTIVE_SHELL}" + ifeq ($(TTY_AVAILABLE),0) + DOCKER_SHELL:=docker run --rm -it ${DOCKER_SECURITY_OPS} ${DOCKER_COMMON_NON_INTERACTIVE_OPS} ${DOCKER_COMMON_OPS} "${CONTAINER_NAME}" + DOCKER_INTERACTIVE_SHELL:=docker run --rm -it ${DOCKER_SECURITY_OPS} ${DOCKER_COMMON_INTERACTIVE_OPS} ${DOCKER_COMMON_OPS} "${CONTAINER_NAME_INTERACTIVE_SHELL}" + else + DOCKER_SHELL:=$(DOCKER_RUN) + DOCKER_INTERACTIVE_SHELL:=docker run --rm -i ${DOCKER_SECURITY_OPS} ${DOCKER_COMMON_INTERACTIVE_OPS} ${DOCKER_COMMON_OPS} "${CONTAINER_NAME_INTERACTIVE_SHELL}" + endif else DOCKER_RUN:= + DOCKER_RUN_WITHOUT_NETWORK_FOR_COMPOSER:= DOCKER_RUN_WITH_SOCKET:= DOCKER_SHELL:= DOCKER_INTERACTIVE_SHELL:= + DOCKER_DEFAULT_SECURITY_OPS= + DOCKER_WORKSPACE_BIND_OPS= endif endif -ifneq (,$(findstring icrosoft,$(shell cat /proc/version))) - THREADS=1 -else - THREADS=$(shell nproc) -endif +DOCKER_RUN_DOCUMENTATION=docker run --rm -i $(DOCKER_DEFAULT_SECURITY_OPS) $(DOCKER_WORKSPACE_BIND_OPS) -## Run everything extra point +## Run everything extra points all: ## Runs everything #### +ifeq ("$(ALL_HAS_DIRECT_DOCKER_TASKS)","TRUE") + $(MAKE) all-raw +else $(DOCKER_RUN_WITH_SOCKET) make all-raw +endif all-raw: ## The real runs everything, but due to sponge it has to be ran inside DOCKER_RUN ##U## - $(MAKE) composer-validate syntax-php backward-compatibility-check ## Count: 3 + $(MAKE) composer-validate syntax-php composer-normalize backward-compatibility-check ## Count: 4 + + +## Run a subset of everything for those that find everything intimidating +contrib: ## Runs a subset of everything (all) #### +ifeq ("$(CONTRIB_HAS_DIRECT_DOCKER_TASKS)","TRUE") + $(MAKE) contrib-raw +else + $(DOCKER_RUN_WITH_SOCKET) make contrib-raw +endif +contrib-raw: ## The real runs everything, but due to sponge it has to be ran inside DOCKER_RUN ##U## + $(MAKE) documentation-qa ## Count: 1 ## Temporary set of migrations to get all my repos in shape -migrations-git-enforce-gitattributes-contents: #### Enforce .gitattributes contents ##*I*## - ($(DOCKER_RUN) php -r 'file_put_contents(".gitattributes", base64_decode("IyBTZXQgdGhlIGRlZmF1bHQgYmVoYXZpb3IsIGluIGNhc2UgcGVvcGxlIGRvbid0IGhhdmUgY29yZS5hdXRvY3JsZiBzZXQuCiogdGV4dCBlb2w9bGYKCiMgVGhlc2UgZmlsZXMgYXJlIGJpbmFyeSBhbmQgc2hvdWxkIGJlIGxlZnQgdW50b3VjaGVkCiMgKGJpbmFyeSBpcyBhIG1hY3JvIGZvciAtdGV4dCAtZGlmZikKKi5wbmcgYmluYXJ5CiouanBnIGJpbmFyeQoqLmpwZWcgYmluYXJ5CiouZ2lmIGJpbmFyeQoqLmljbyBiaW5hcnkKKi53ZWJwIGJpbmFyeQoqLmJtcCBiaW5hcnkKKi50dGYgYmluYXJ5CiouYmxwIGJpbmFyeQoqLmRiMiBiaW5hcnkKCiMgSWdub3JpbmcgZmlsZXMgZm9yIGRpc3RyaWJ1dGlvbiBhcmNoaWV2ZXMKLmdpdGh1Yi8gZXhwb3J0LWlnbm9yZQpldGMvY2kvIGV4cG9ydC1pZ25vcmUKZXRjL2Rldi1hcHAvIGV4cG9ydC1pZ25vcmUKZXRjL3FhLyBleHBvcnQtaWdub3JlCmV4YW1wbGVzLyBleHBvcnQtaWdub3JlCnRlc3RzLyBleHBvcnQtaWdub3JlCnZhci8gZXhwb3J0LWlnbm9yZQouZGV2Y29udGFpbmVyLmpzb24gZXhwb3J0LWlnbm9yZQouZWRpdG9yY29uZmlnIGV4cG9ydC1pZ25vcmUKLmdpdGF0dHJpYnV0ZXMgZXhwb3J0LWlnbm9yZQouZ2l0aWdub3JlIGV4cG9ydC1pZ25vcmUKQ09OVFJJQlVUSU5HLm1kIGV4cG9ydC1pZ25vcmUKY29tcG9zZXIubG9jayBleHBvcnQtaWdub3JlCk1ha2VmaWxlIGV4cG9ydC1pZ25vcmUKUkVBRE1FLm1kIGV4cG9ydC1pZ25vcmUKCiMgRGlmZmluZwoqLnBocCBkaWZmPXBocAo="));' || true) +migrations-git-enforce-gitattributes-contents: #### Enforce `.gitattributes` contents ##*I*## + ($(DOCKER_RUN) php -r 'file_put_contents(".gitattributes", base64_decode("IyBTZXQgdGhlIGRlZmF1bHQgYmVoYXZpb3IsIGluIGNhc2UgcGVvcGxlIGRvbid0IGhhdmUgY29yZS5hdXRvY3JsZiBzZXQuCiogdGV4dCBlb2w9bGYKCiMgVGhlc2UgZmlsZXMgYXJlIGJpbmFyeSBhbmQgc2hvdWxkIGJlIGxlZnQgdW50b3VjaGVkCiMgKGJpbmFyeSBpcyBhIG1hY3JvIGZvciAtdGV4dCAtZGlmZikKKi5wbmcgYmluYXJ5CiouanBnIGJpbmFyeQoqLmpwZWcgYmluYXJ5CiouZ2lmIGJpbmFyeQoqLmljbyBiaW5hcnkKKi53ZWJwIGJpbmFyeQoqLmJtcCBiaW5hcnkKKi50dGYgYmluYXJ5CiouYmxwIGJpbmFyeQoqLmRiMiBiaW5hcnkKCiMgSWdub3JpbmcgZmlsZXMgZm9yIGRpc3RyaWJ1dGlvbiBhcmNoaWV2ZXMKLmdpdGh1Yi8gZXhwb3J0LWlnbm9yZQpldGMvY2kvIGV4cG9ydC1pZ25vcmUKZXRjL2Rldi1hcHAvIGV4cG9ydC1pZ25vcmUKZXRjL3N0YXRlLyBleHBvcnQtaWdub3JlCmV0Yy9xYS8gZXhwb3J0LWlnbm9yZQpleGFtcGxlcy8gZXhwb3J0LWlnbm9yZQp0ZXN0cy8gZXhwb3J0LWlnbm9yZQp2YXIvIGV4cG9ydC1pZ25vcmUKLmRldmNvbnRhaW5lci5qc29uIGV4cG9ydC1pZ25vcmUKLmVkaXRvcmNvbmZpZyBleHBvcnQtaWdub3JlCi5naXRhdHRyaWJ1dGVzIGV4cG9ydC1pZ25vcmUKLmdpdGlnbm9yZSBleHBvcnQtaWdub3JlCkNPTlRSSUJVVElORy5tZCBleHBvcnQtaWdub3JlCmNvbXBvc2VyLmxvY2sgZXhwb3J0LWlnbm9yZQpNYWtlZmlsZSBleHBvcnQtaWdub3JlClJFQURNRS5tZCBleHBvcnQtaWdub3JlCgojIERpZmZpbmcKKi5waHAgZGlmZj1waHAK"));' || true) + +migrations-git-enforce-editorconfig-contents: #### Enforce `.editorconfig` contents ##*I*## + ($(DOCKER_RUN) php -r 'file_put_contents(".editorconfig", base64_decode("cm9vdCA9IHRydWUKClsqXQpjaGFyc2V0ID0gdXRmLTgKaW5kZW50X3N0eWxlID0gc3BhY2UKaW5kZW50X3NpemUgPSA0Cmluc2VydF9maW5hbF9uZXdsaW5lID0gdHJ1ZQp0cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSB0cnVlCgpbKi5qc29uXQppbmRlbnRfc2l6ZSA9IDIKClsqLnltbF0KaW5kZW50X3NpemUgPSAyCgpbKi55YW1sXQppbmRlbnRfc2l6ZSA9IDIKCltNYWtlZmlsZV0KaW5kZW50X3N0eWxlID0gdGFiCgpbKi5ta10KaW5kZW50X3N0eWxlID0gdGFiCgpbKi5uZW9uXQppbmRlbnRfc3R5bGUgPSB0YWIK"));' || true) -migrations-git-make-sure-gitignore-exists: #### Make sure .gitignore exists ##*I*## +migrations-git-make-sure-gitignore-exists: #### Make sure `.gitignore` exists ##*I*## ($(DOCKER_RUN) touch .gitignore || true) -migrations-git-make-sure-gitignore-ignores-var: #### Make sure .gitignore ignores var/* ##*I*## +migrations-git-make-sure-gitignore-ignores-var: #### Make sure `.gitignore` ignores `var/*` ##*I*## ($(DOCKER_RUN) php -r '$$gitignoreFile = ".gitignore"; if (!file_exists($$gitignoreFile)) {exit;} $$txt = file_get_contents($$gitignoreFile); if (!is_string($$txt)) {exit;} if (strpos($$txt, "var/*") !== false) {exit;} file_put_contents($$gitignoreFile, "var/*\n", FILE_APPEND);' || true) -migrations-git-make-sure-gitignore-excludes-var-gitkeep: #### Make sure .gitignore excludes var/.gitkeep ##*I*## +migrations-git-make-sure-gitignore-excludes-var-gitkeep: #### Make sure `.gitignore` excludes `var/.gitkeep` ##*I*## ($(DOCKER_RUN) php -r '$$gitignoreFile = ".gitignore"; if (!file_exists($$gitignoreFile)) {exit;} $$txt = file_get_contents($$gitignoreFile); if (!is_string($$txt)) {exit;} if (strpos($$txt, "!var/.gitkeep") !== false) {exit;} file_put_contents($$gitignoreFile, "!var/.gitkeep\n", FILE_APPEND);' || true) +migrations-git-make-sure-gitignore-ignores-vale-styles-except-vocab: #### Ignore Vale styles except WyriHaximus vocab symlink ##*I*## + ($(DOCKER_RUN) php -r '$$gitignoreFile = ".gitignore"; if (!file_exists($$gitignoreFile)) {exit;} $$txt = file_get_contents($$gitignoreFile); if (!is_string($$txt)) {exit;} if (strpos($$txt, "etc/qa/vale/**") !== false) {exit;} file_put_contents($$gitignoreFile, "etc/qa/vale/**\n!etc/qa/vale/styles/\n!etc/qa/vale/styles/config/\n!etc/qa/vale/styles/config/vocabularies/\n!etc/qa/vale/styles/config/vocabularies/WyriHaximus/\n!etc/qa/vale/styles/config/vocabularies/WyriHaximus/accept.txt\n", FILE_APPEND);' || true) + migrations-docs-update-readme-copyright-c-year-to-current: #### Update readme copyright year to current ##*I*## ($(DOCKER_RUN) php -r '$$readmeFile = "README.md"; $$copyRight = "Copyright (c) "; $$currentYear = date("Y"); if (!file_exists($$readmeFile)) {exit;} $$readmeContents = file_get_contents($$readmeFile); foreach (range(2000, 2100) as $$year) { $$readmeContents = str_replace($$copyRight . $$year, $$copyRight . $$currentYear, $$readmeContents); } file_put_contents($$readmeFile, $$readmeContents); ' || true) @@ -106,6 +161,30 @@ migrations-docs-update-license-copyright-c-year-to-current: #### Update license migrations-docs-update-license-copyright-year-to-current: #### Update license copyright year to current ##*I*## ($(DOCKER_RUN) php -r '$$licenseFile = "LICENSE"; $$copyRight = "Copyright "; $$currentYear = date("Y"); if (!file_exists($$licenseFile)) {exit;} $$licenseContents = file_get_contents($$licenseFile); foreach (range(2000, 2100) as $$year) { $$licenseContents = str_replace($$copyRight . $$year, $$copyRight . $$currentYear, $$licenseContents); } file_put_contents($$licenseFile, $$licenseContents); ' || true) +migrations-docs-enforce-contributing-md-contents: #### Enforce CONTRIBUTING.md contents ##*I*## + ($(DOCKER_RUN) php -r '$$contributingFile = "CONTRIBUTING.md"; $$contributingContents = base64_decode("IyBDb250cmlidXRpbmcKClB1bGwgcmVxdWVzdHMgYXJlIGhpZ2hseSBhcHByZWNpYXRlZC4gSGVyZSdzIGEgcXVpY2sgZ3VpZGUuCgpGb3JrLCB0aGVuIGNsb25lIHRoZSByZXBvOgoKICAgIGdpdCBjbG9uZSBnaXRAZ2l0aHViLmNvbTp5b3VyLXVzZXJuYW1lL1tyZXBvXS5naXQKCkluc3RhbGwgZGVwZW5kZW5jaWVzOgoKICAgIG1ha2UgaW5zdGFsbAoKV29yayBvbiB0aGUgY29udHJpYnV0aW9uIGFuZCBjaGVjayBpZiBpdCBwYXNzZXMgYWxsIFFBIGNoZWNrcyB3aXRoOgoKICAgIG1ha2UKCklmIHNvbWUgb2YgdGhlIFBIUFN0YW4gb3Igb3RoZXIgY2hlY2tzIGFyZSB0byBzdHJpY3Qgb3IgaW50aW1pZGF0aW5nIHRoYXQgaXMgZmluZSwgZmluaXNoIHdoYXQgeW91IHdhbnQgdG8gY29udHJpYnV0ZSBhbmQgSSdsbCBoZWxwIHlvdSB3aXRoIHRob3NlLCBidXQgcGxlYXNlIG1ha2UgdGhlIGZvbGxvd2luZyBjb21tYW5kIHBhc3Nlcy4gSXQgcnVucyBhIHN1YnNldCBvZiBldmVyeXRoaW5nOgoKICAgIG1ha2UgY29udHJpYgoKWW91IGNhbiBsaXN0IGFsbCB0aGUgY29udHJpYiBjb21tYW5kcyB3aXRoOgoKICAgIG1ha2UgaGVscC1jb250cmliCgpQdXNoIHRvIHlvdXIgZm9yayBhbmQgW3N1Ym1pdCBhIHB1bGwgcmVxdWVzdF1bcHJdLgoKW3ByXTogaHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vcHVsbC1yZXF1ZXN0cy9jb2xsYWJvcmF0aW5nLXdpdGgtcHVsbC1yZXF1ZXN0cy9wcm9wb3NpbmctY2hhbmdlcy10by15b3VyLXdvcmstd2l0aC1wdWxsLXJlcXVlc3RzL2NyZWF0aW5nLWEtcHVsbC1yZXF1ZXN0CgpDb250cmlidXRpbmcgd2l0aCBhbiBMTE0/IFRoaXMgcmVwbyBpbmNsdWRlcyBhbiBbYEFHRU5UUy5tZGBdKEFHRU5UUy5tZCkgd2l0aCBndWlkYW5jZSBmb3IgY29kaW5nIGFnZW50czsgcG9pbnRpbmcgeW91ciBhZ2VudCBhdCBpdCBoZWxwcyBhIGxvdC4gQmVmb3JlIHlvdSBvcGVuIGEgUFIsIHNraW0gdGhyb3VnaCB5b3VyIGNoYW5nZXMgc28geW91IGZlZWwgY29tZm9ydGFibGUgd2l0aCBldmVyeXRoaW5nIHlvdSdyZSBzdWJtaXR0aW5nLgo="); file_put_contents($$contributingFile, str_replace(["[repo]"], [basename(__DIR__)], $$contributingContents)); ' || true) + +migrations-docs-create-documentation-markdownlint-config-if-not-exists: #### Create `etc/qa/documentation.markdownlint-cli2.yaml` when missing ##*I*## + ($(DOCKER_RUN) php -r '$$configFile = "etc/qa/documentation.markdownlint-cli2.yaml"; if (file_exists($$configFile)) {exit;} if (!is_dir("etc/qa")) {mkdir("etc/qa", 0777, true);} file_put_contents($$configFile, base64_decode("Z2l0aWdub3JlOiB0cnVlCm5vUHJvZ3Jlc3M6IHRydWUKbm9CYW5uZXI6IHRydWUKZ2xvYnM6CiAgLSAiKiovKi5tZCIKaWdub3JlczoKICAtICJ2YXIvKioiCiAgLSAidmVuZG9yLyoqIgogIC0gIi5naXQvKioiCmNvbmZpZzoKICBNRDAwNDogZmFsc2UKICBNRDAwNzogZmFsc2UKICBNRDAxMjogZmFsc2UKICBNRDAxMzogZmFsc2UKICBNRDAyMjogZmFsc2UKICBNRDAyNTogZmFsc2UKICBNRDAyNjogZmFsc2UKICBNRDAzMjogZmFsc2UKICBNRDAzMzogZmFsc2UKICBNRDA0MDogZmFsc2UKICBNRDA0MTogZmFsc2UK"));' || true) + +migrations-docs-create-lychee-config-if-not-exists: #### Create `etc/qa/lychee.toml` when missing ##*I*## + ($(DOCKER_RUN) php -r '$$configFile = "etc/qa/lychee.toml"; if (file_exists($$configFile)) {exit;} if (!is_dir("etc/qa")) {mkdir("etc/qa", 0777, true);} file_put_contents($$configFile, base64_decode("dmVyYm9zZSA9ICJ3YXJuIgpub19wcm9ncmVzcyA9IHRydWUKZXhjbHVkZV9wYXRoID0gWyJedmFyLyIsICJedmVuZG9yLyIsICJeXFwuZ2l0LyJdCgpbaG9zdHMuImRvY3MuZ2l0aHViLmNvbSJdCmhlYWRlcnMgPSB7IEFjY2VwdC1FbmNvZGluZyA9ICJ6c3RkLCBiciwgZ3ppcCwgZGVmbGF0ZSIgfQo="));' || true) + +migrations-docs-enforce-cspell-config-contents: #### Enforce `etc/qa/cspell.json` contents ##*I*## + ($(DOCKER_RUN) php -r '$$configFile = "etc/qa/cspell.json"; if (!is_dir("etc/qa")) {mkdir("etc/qa", 0777, true);} file_put_contents($$configFile, base64_decode("ewogICAgInZlcnNpb24iOiAiMC4yIiwKICAgICJsYW5ndWFnZSI6ICJlbiIsCiAgICAiYWxsb3dDb21wb3VuZFdvcmRzIjogdHJ1ZSwKICAgICJpZ25vcmVQYXRocyI6IFsKICAgICAgICAidmFyLyoqIiwKICAgICAgICAidmVuZG9yLyoqIiwKICAgICAgICAiLmdpdC8qKiIsCiAgICAgICAgIi5pZGVhLyoqIgogICAgXSwKICAgICJ3b3JkcyI6IFsKICAgICAgICAiQWlUZWxscyIsCiAgICAgICAgIkFzeW5jIiwKICAgICAgICAiQ1NwZWxsIiwKICAgICAgICAiQ2Vlcy1KYW4iLAogICAgICAgICJDb21wb3NlciIsCiAgICAgICAgIkRpYXRheGlzIiwKICAgICAgICAiRmlnbGV0IiwKICAgICAgICAiR0hBIiwKICAgICAgICAiR2l0SHViIiwKICAgICAgICAiSW5mZWN0aW9uUEhQIiwKICAgICAgICAiS2lld2lldCIsCiAgICAgICAgIk1TSSIsCiAgICAgICAgIk1ha2VmaWxlIiwKICAgICAgICAiTWFrZWZpbGVzIiwKICAgICAgICAiTWFtbWF0dXMiLAogICAgICAgICJNYW1tYXR1c1BIUCIsCiAgICAgICAgIk1vbm9sb2ciLAogICAgICAgICJOVFMiLAogICAgICAgICJPVEVMIiwKICAgICAgICAiUEhQQ1MiLAogICAgICAgICJQSFBTdGFuIiwKICAgICAgICAiUEhQVW5pdCIsCiAgICAgICAgIlBTUiIsCiAgICAgICAgIlBhY2thZ2lzdCIsCiAgICAgICAgIlJlbm92YXRlIiwKICAgICAgICAiUmV0cmlhYmxlIiwKICAgICAgICAiUm9hdmUiLAogICAgICAgICJSeFBIUCIsCiAgICAgICAgIlZhbGUiLAogICAgICAgICJXU0wiLAogICAgICAgICJXeXJpSGF4aW11cyIsCiAgICAgICAgIlpUUyIsCiAgICAgICAgImJhY2t0aWNrIiwKICAgICAgICAiYm95c2NvdXQiLAogICAgICAgICJjb2Rlc3BlbGwiLAogICAgICAgICJjb25maWciLAogICAgICAgICJjb25maWdzIiwKICAgICAgICAiZGF0YXByb3ZpZGVyIiwKICAgICAgICAiZGF0YXByb3ZpZGVycyIsCiAgICAgICAgImZyb250bWF0dGVyIiwKICAgICAgICAiZ2hjciIsCiAgICAgICAgImhlYWx0aHoiLAogICAgICAgICJseWNoZWUiLAogICAgICAgICJseWNoZWV2ZXJzZSIsCiAgICAgICAgIm1ha2VmaWxlcyIsCiAgICAgICAgIm1hcmtkb3dubGludCIsCiAgICAgICAgInBocHN0YW4iLAogICAgICAgICJwaHB1bml0IiwKICAgICAgICAicmVwbyIsCiAgICAgICAgInN1YmFnZW50IiwKICAgICAgICAic3ViYWdlbnRzIiwKICAgICAgICAic3VibGljZW5zZSIsCiAgICAgICAgInZob3N0cyIsCiAgICAgICAgInd5cmloYXhpbXVzIiwKICAgICAgICAid3lyaWhheGltdXNuZXQiCiAgICBdCn0K"));' || true) + +migrations-docs-enforce-vale-config-contents: #### Enforce `etc/qa/vale.ini` contents ##*I*## + ($(DOCKER_RUN) php -r '$$configFile = "etc/qa/vale.ini"; if (!is_dir("etc/qa")) {mkdir("etc/qa", 0777, true);} file_put_contents($$configFile, base64_decode("U3R5bGVzUGF0aCA9IHZhbGUvc3R5bGVzCk1pbkFsZXJ0TGV2ZWwgPSB3YXJuaW5nClZvY2FiID0gV3lyaUhheGltdXMKUGFja2FnZXMgPSBodHRwczovL2dpdGh1Yi5jb20vamRrYXRvL2RpYXRheGlzL3JlbGVhc2VzL2Rvd25sb2FkL3YwLjEuMC9EaWF0YXhpcy56aXAsIFwKICAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vdmFsZS1jbGkvd3JpdGUtZ29vZC9yZWxlYXNlcy9kb3dubG9hZC92MC40LjEvd3JpdGUtZ29vZC56aXAsIFwKICAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vdmFsZS1jbGkvcmVhZGFiaWxpdHkvcmVsZWFzZXMvZG93bmxvYWQvdjAuMi4wL1JlYWRhYmlsaXR5LnppcCwgXAogICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS92YWxlLWNsaS9wcm9zZWxpbnQvcmVsZWFzZXMvZG93bmxvYWQvdjAuMy40L3Byb3NlbGludC56aXAsIFwKICAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vdmFsZS1jbGkvYWxleC9yZWxlYXNlcy9kb3dubG9hZC92MC4yLjMvYWxleC56aXAsIFwKICAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vYTExeWZyZWQvbmVpZ2hib3IvcmVsZWFzZXMvZG93bmxvYWQvdjIuMi4wL25laWdoYm9yLnppcCwgXAogICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9qZGthdG8vYTExeS9yZWxlYXNlcy9kb3dubG9hZC92MC4xLjAvQTExeS56aXAsIFwKICAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20va3Jpc2huYXN1bmthbS92YWxlLWFpLXRlbGxzL3JlbGVhc2VzL2Rvd25sb2FkL3YxLjAuMC9BaVRlbGxzLnppcAoKWypdCkJhc2VkT25TdHlsZXMgPSBWYWxlLCB3cml0ZS1nb29kLCBSZWFkYWJpbGl0eSwgcHJvc2VsaW50LCBhbGV4LCBuZWlnaGJvciwgQTExeSwgQWlUZWxscwoKVmFsZS5TcGVsbGluZyA9IE5PClZhbGUuVGVybXMgPSBOTwoKd3JpdGUtZ29vZC5FLVByaW1lID0gTk8Kd3JpdGUtZ29vZC5XZWFzZWwgPSBZRVMKd3JpdGUtZ29vZC5QYXNzaXZlID0gWUVTCndyaXRlLWdvb2QuVG9vV29yZHkgPSBZRVMKClJlYWRhYmlsaXR5ID0gc3VnZ2VzdGlvbgpuZWlnaGJvci5BbGxDYXBzUHJvc2UgPSBOTwpBMTF5LkxpbmtVUkwgPSBOTwp3cml0ZS1nb29kLlBhc3NpdmUgPSBOTwp3cml0ZS1nb29kLlRvb1dvcmR5ID0gTk8Kd3JpdGUtZ29vZC5XZWFzZWwgPSBOTwpwcm9zZWxpbnQuQW5ub3RhdGlvbnMgPSBOTwpwcm9zZWxpbnQuVHlwb2dyYXBoeSA9IE5PCnByb3NlbGludC5IeXBlcmJvbGUgPSBOTwpBaVRlbGxzLkRhc2ggPSBOTwphbGV4LkNvbmRlc2NlbmRpbmcgPSBOTwphbGV4LlByb2Zhbml0eVVubGlrZWx5ID0gTk8KSG93VG8uU3RlcHMgPSBzdWdnZXN0aW9uCkhvd1RvLk9wZW5pbmcgPSBzdWdnZXN0aW9uCgpbUkVBRE1FLm1kXQpCYXNlZE9uU3R5bGVzID0gVmFsZSwgd3JpdGUtZ29vZCwgUmVhZGFiaWxpdHksIHByb3NlbGludCwgYWxleCwgbmVpZ2hib3IsIEExMXksIEFpVGVsbHMsIEV4cGxhbmF0aW9uCgpbQ09OVFJJQlVUSU5HLm1kXQpCYXNlZE9uU3R5bGVzID0gVmFsZSwgd3JpdGUtZ29vZCwgUmVhZGFiaWxpdHksIHByb3NlbGludCwgYWxleCwgbmVpZ2hib3IsIEExMXksIEFpVGVsbHMsIEhvd1RvCgpbZXRjL2FpLyoqLm1kXQpCYXNlZE9uU3R5bGVzID0gVmFsZSwgd3JpdGUtZ29vZCwgUmVhZGFiaWxpdHksIHByb3NlbGludCwgYWxleCwgbmVpZ2hib3IsIEExMXksIEFpVGVsbHMsIFJlZmVyZW5jZQo="));' || true) + +migrations-docs-enforce-vale-vocab-contents: #### Enforce `etc/qa/vale-vocab.txt` contents ##*I*## + ($(DOCKER_RUN) php -r '$$configFile = "etc/qa/vale-vocab.txt"; if (!is_dir("etc/qa")) {mkdir("etc/qa", 0777, true);} file_put_contents($$configFile, base64_decode("QWlUZWxscwpBc3luYwpDU3BlbGwKQ2Vlcy1KYW4KQ29tcG9zZXIKRGlhdGF4aXMKRmlnbGV0CkdIQQpHaXRIdWIKSW5mZWN0aW9uUEhQCktpZXdpZXQKTVNJCk1ha2VmaWxlCk1ha2VmaWxlcwpNYW1tYXR1cwpNYW1tYXR1c1BIUApNb25vbG9nCk5UUwpPVEVMClBIUENTClBIUFN0YW4KUEhQVW5pdApQU1IKUGFja2FnaXN0ClJlbm92YXRlClJldHJpYWJsZQpSb2F2ZQpSeFBIUApWYWxlCldTTApXeXJpSGF4aW11cwpaVFMKYmFja3RpY2sKYm95c2NvdXQKY29kZXNwZWxsCmNvbmZpZwpjb25maWdzCmRhdGFwcm92aWRlcgpkYXRhcHJvdmlkZXJzCmZyb250bWF0dGVyCmdoY3IKaGVhbHRoegpseWNoZWUKbHljaGVldmVyc2UKbWFrZWZpbGVzCm1hcmtkb3dubGludApwaHBzdGFuCnBocHVuaXQKcmVwbwpzdWJhZ2VudApzdWJhZ2VudHMKc3VibGljZW5zZQp2aG9zdHMKd3lyaWhheGltdXMKd3lyaWhheGltdXNuZXQK"));' || true) + +migrations-docs-enrich-qa-wordlists-with-php-symbols: #### Merge PHP symbol names into etc/qa documentation wordlists ##*I*## + ($(DOCKER_RUN) php -r '$$autoload = getcwd() . "/vendor/autoload.php"; if (!is_file($$autoload)) {exit;} require $$autoload; \WyriHaximus\Makefiles\Documentation\WordlistDocumentationConfigSync::enrichQaWordlistsWithPhpSymbols(getcwd());' || true) + +migrations-docs-create-vale-vocab-symlink-if-not-exists: #### Create WyriHaximus Vale vocab symlink when missing ##*I*## + ($(DOCKER_RUN) php -r '$$link = "etc/qa/vale/styles/config/vocabularies/WyriHaximus/accept.txt"; if (is_link($$link)) {exit;} if (!is_dir("etc/qa")) {mkdir("etc/qa", 0777, true);} if (!is_dir(dirname($$link))) {mkdir(dirname($$link), 0777, true);} symlink("../../../../../vale-vocab.txt", $$link);' || true) + migrations-php-make-sure-var-exists: #### Make sure `var/` exists ##*I*## ($(DOCKER_RUN) mkdir var || true) @@ -142,19 +221,28 @@ migrations-php-remove-old-scrutinizer-yml-config: #### Make sure we remove `.scr migrations-php-remove-old-appveyor-yml-config: #### Make sure we remove `appveyor.yml` ##*I*## ($(DOCKER_RUN) rm appveyor.yml || true) -migrations-php-ensure-etc-ci-markdown-link-checker-json-exists: #### Make sure we have etc/ci/markdown-link-checker.json ##*I*## +migrations-php-remove-old-travis-yml-config: #### Make sure we remove `.travis.yml` ##*I*## + ($(DOCKER_RUN) rm .travis.yml || true) + +migrations-php-ensure-etc-ci-markdown-link-checker-json-exists: #### Make sure we have `etc/ci/markdown-link-checker.json` ##*I*## ($(DOCKER_RUN) php -r '$$markdownLinkCheckerFile = "etc/ci/markdown-link-checker.json"; $$json = json_decode("{\"httpHeaders\": [{\"urls\": [\"https://docs.github.com/\"],\"headers\": {\"Accept-Encoding\": \"zstd, br, gzip, deflate\"}}]}"); if (file_exists($$markdownLinkCheckerFile)) {exit;} file_put_contents($$markdownLinkCheckerFile, json_encode($$json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\r\n");' || true) -migrations-php-move-infection-config-to-etc: #### Move infection.json.dist to etc/qa/infection.json5 ##*I*## +migrations-php-ensure-etc-qa-coverage-guard-php-exists: #### Make sure we have `etc/qa/coverage-guard.php` ##*I*## + ($(DOCKER_RUN) php -r '$$coverageGuardFile = "etc/qa/coverage-guard.php"; $$coverageGuardConfig = base64_decode("PD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKdXNlIFNoaXBNb25rXENvdmVyYWdlR3VhcmRcQ29uZmlnOwp1c2UgU2hpcE1vbmtcQ292ZXJhZ2VHdWFyZFxFeGNsdWRlclxJZ25vcmVUaHJvd05ld0V4Y2VwdGlvbkxpbmVFeGNsdWRlcjsKdXNlIFNoaXBNb25rXENvdmVyYWdlR3VhcmRcUnVsZVxFbmZvcmNlQ292ZXJhZ2VGb3JNZXRob2RzUnVsZTsKCnJldHVybiAoc3RhdGljIGZ1bmN0aW9uICgpOiBDb25maWcgewogICAgJGNvbmZpZyA9IG5ldyBDb25maWcoKTsKCiAgICAkY29uZmlnLT5hZGRSdWxlKG5ldyBFbmZvcmNlQ292ZXJhZ2VGb3JNZXRob2RzUnVsZSgKICAgICAgICByZXF1aXJlZENvdmVyYWdlUGVyY2VudGFnZTogODAsCiAgICAgICAgbWluRXhlY3V0YWJsZUxpbmVzOiAxLAogICAgKSk7CgogICAgJGNvbmZpZy0+YWRkRXhlY3V0YWJsZUxpbmVFeGNsdWRlcihuZXcgSWdub3JlVGhyb3dOZXdFeGNlcHRpb25MaW5lRXhjbHVkZXIoWwogICAgICAgIFJ1bnRpbWVFeGNlcHRpb246OmNsYXNzLAogICAgXSkpOwoKICAgIHJldHVybiAkY29uZmlnOwp9KSgpOwo="); if (file_exists($$coverageGuardFile)) {exit;} file_put_contents($$coverageGuardFile, $$coverageGuardConfig);' || true) + +migrations-php-ensure-etc-qa-zzz-disable-otel-attr-hooks-ini-exists: #### Make sure we have `etc/qa/zzz_disable_otel_attr_hooks.ini` ##*I*## + ($(DOCKER_RUN) php -r 'if (in_array("opentelemetry-instrumentation", ["linux","zts"])) {exit;} $$otelAttrHooksIniFile = "etc/qa/zzz_disable_otel_attr_hooks.ini"; $$otelAttrHooksIniContents = base64_decode("OyBBdm9pZCB6ZW5kX21tX2hlYXAgY29ycnVwdGlvbiB3aXRoICNbV2l0aFNwYW5dIChtYW1tYXR1cyB1c2VzIGhvb2soKSBpbnN0ZWFkKS4KOyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuLXRlbGVtZXRyeS9vcGVudGVsZW1ldHJ5LXBocC1pbnN0cnVtZW50YXRpb24vcHVsbC8zMjEKOyBBbHJlYWR5IHNvbHZlZDogaHR0cHM6Ly9naXRodWIuY29tL29wZW4tdGVsZW1ldHJ5L29wZW50ZWxlbWV0cnktcGhwLWluc3RydW1lbnRhdGlvbi9wdWxsLzMxMwpvcGVudGVsZW1ldHJ5LmF0dHJfaG9va3NfZW5hYmxlZD1PZmYK"); if (file_exists($$otelAttrHooksIniFile)) {exit;} file_put_contents($$otelAttrHooksIniFile, $$otelAttrHooksIniContents);' || true) + +migrations-php-move-infection-config-to-etc: #### Move `infection.json.dist` to `etc/qa/infection.json5` ##*I*## ($(DOCKER_RUN) mv infection.json.dist etc/qa/infection.json5 || true) -migrations-php-infection-create-config-if-not-exists: #### Create Infection config file if it doesn't exists at etc/qa/infection.json5 ##*I*## - ($(DOCKER_RUN) php -r '$$infectionFile = "etc/qa/infection.json5"; $$infectionConfig = base64_decode("ewogICAgInRpbWVvdXQiOiAxMjAsCiAgICAic291cmNlIjogewogICAgICAgICJkaXJlY3RvcmllcyI6IFsKICAgICAgICAgICAgInNyYyIKICAgICAgICBdCiAgICB9LAogICAgImxvZ3MiOiB7CiAgICAgICAgInRleHQiOiAiLi4vLi4vdmFyL2luZmVjdGlvbi5sb2ciLAogICAgICAgICJzdW1tYXJ5IjogIi4uLy4uL3Zhci9pbmZlY3Rpb24tc3VtbWFyeS5sb2ciLAogICAgICAgICJqc29uIjogIi4uLy4uL3Zhci9pbmZlY3Rpb24uanNvbiIsCiAgICAgICAgInBlck11dGF0b3IiOiAiLi4vLi4vdmFyL2luZmVjdGlvbi1wZXItbXV0YXRvci5tZCIsCiAgICAgICAgImdpdGh1YiI6IHRydWUKICAgIH0sCiAgICAibWluTXNpIjogMTAwLAogICAgIm1pbkNvdmVyZWRNc2kiOiAxMDAsCiAgICAiaWdub3JlTXNpV2l0aE5vTXV0YXRpb25zIjogdHJ1ZSwKICAgICJtdXRhdG9ycyI6IHsKICAgICAgICAiQGRlZmF1bHQiOiB0cnVlCiAgICB9Cn0K"); if (file_exists($$infectionFile)) {exit;} file_put_contents($$infectionFile, $$infectionConfig);' || true) +migrations-php-infection-create-config-if-not-exists: #### Create Infection config file if it doesn't exists at `etc/qa/infection.json5` ##*I*## + ($(DOCKER_RUN) php -r '$$infectionFile = "etc/qa/infection.json5"; $$infectionConfig = base64_decode("ewogICAgInRocmVhZHMiOiA2NCwKICAgICJ0aW1lb3V0IjogMTIwLAogICAgInNvdXJjZSI6IHsKICAgICAgICAiZGlyZWN0b3JpZXMiOiBbCiAgICAgICAgICAgICJzcmMiCiAgICAgICAgXQogICAgfSwKICAgICJsb2dzIjogewogICAgICAgICJ0ZXh0IjogIi4uLy4uL3Zhci9pbmZlY3Rpb24ubG9nIiwKICAgICAgICAic3VtbWFyeSI6ICIuLi8uLi92YXIvaW5mZWN0aW9uLXN1bW1hcnkubG9nIiwKICAgICAgICAianNvbiI6ICIuLi8uLi92YXIvaW5mZWN0aW9uLmpzb24iLAogICAgICAgICJwZXJNdXRhdG9yIjogIi4uLy4uL3Zhci9pbmZlY3Rpb24tcGVyLW11dGF0b3IubWQiLAogICAgICAgICJnaXRodWIiOiB0cnVlCiAgICB9LAogICAgIm1pbk1zaSI6IDEwMCwKICAgICJtaW5Db3ZlcmVkTXNpIjogMTAwLAogICAgImlnbm9yZU1zaVdpdGhOb011dGF0aW9ucyI6IHRydWUsCiAgICAibXV0YXRvcnMiOiB7CiAgICAgICAgIkBkZWZhdWx0IjogdHJ1ZQogICAgfQp9Cg=="); if (file_exists($$infectionFile)) {exit;} file_put_contents($$infectionFile, $$infectionConfig);' || true) -migrations-php-remove-phpunit-config-dir-from-infection: #### Drop XXX from etc/qa/infection.json5 ##*I*## +migrations-php-remove-phpunit-config-dir-from-infection: #### Drop XXX from `etc/qa/infection.json5` ##*I*## ($(DOCKER_RUN) php -r '$$infectionFile = "etc/qa/infection.json5"; if (!file_exists($$infectionFile)) {exit;} $$json = json_decode(file_get_contents($$infectionFile), true); if (!is_array($$json)) {exit;} if (!array_key_exists("phpUnit", $$json)) {exit;} unset($$json["phpUnit"]); file_put_contents($$infectionFile, json_encode($$json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\r\n");' || true) -migrations-php-fix-logs-relative-paths-for-infection: #### Fix logs paths in etc/qa/infection.json5 ##*I*## +migrations-php-fix-logs-relative-paths-for-infection: #### Fix logs paths in `etc/qa/infection.json5` ##*I*## ($(DOCKER_RUN) php -r '$$infectionFile = "etc/qa/infection.json5"; if (!file_exists($$infectionFile)) {exit;} $$json = json_decode(file_get_contents($$infectionFile), true); if (!is_array($$json)) {exit;} if (!array_key_exists("logs", $$json)) {exit;} foreach ($$json["logs"] as $$logsKey => $$logsPath) { if (is_string($$json["logs"][$$logsKey]) && str_starts_with($$json["logs"][$$logsKey], "./var/infection")) { $$json["logs"][$$logsKey] = str_replace("./var/infection", "../../var/infection", $$json["logs"][$$logsKey]); } } file_put_contents($$infectionFile, json_encode($$json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\r\n");' || true) migrations-php-infection-ensure-log-text-has-the-correct-path: #### Ensure infection's log.text has config directive has the correct path ##*I*## @@ -169,37 +257,40 @@ migrations-php-infection-ensure-log-json-has-the-correct-path: #### Ensure infec migrations-php-infection-ensure-log-per-mutator-has-the-correct-path: #### Ensure infection's log.perMutator has config directive has the correct path ##*I*## ($(DOCKER_RUN) php -r '$$infectionFile = "etc/qa/infection.json5"; if (!file_exists($$infectionFile)) {exit;} $$json = json_decode(file_get_contents($$infectionFile), true); if (!is_array($$json)) {exit;} if (!array_key_exists("logs", $$json)) { $$json["logs"] = []; } $$json["logs"]["perMutator"] = "../../var/infection-per-mutator.md"; file_put_contents($$infectionFile, json_encode($$json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\r\n");' || true) -migrations-php-add-github-true-to-for-infection: #### Ensure we configure infection to emit logs to GitHub in etc/qa/infection.json5 ##*I*## +migrations-php-add-github-true-to-for-infection: #### Ensure we configure infection to emit logs to GitHub in `etc/qa/infection.json5` ##*I*## ($(DOCKER_RUN) php -r '$$infectionFile = "etc/qa/infection.json5"; if (!file_exists($$infectionFile)) {exit;} $$json = json_decode(file_get_contents($$infectionFile), true); if (!is_array($$json)) {exit;} if (!array_key_exists("logs", $$json)) {exit;} if (array_key_exists("github", $$json["logs"])) {exit;} $$json["logs"]["github"] = true; file_put_contents($$infectionFile, json_encode($$json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\r\n");' || true) -migrations-php-make-paths-compatible-with-infection-0-32: #### We update path to be relative to etc/qa/infection.json5 as of 0.32 ##*I*## +migrations-php-infection-add-threads-64-to-config: #### Ensure `threads` is set to `64` in `etc/qa/infection.json5` ##*I*## + ($(DOCKER_RUN) php -r '$$infectionFile = "etc/qa/infection.json5"; if (!file_exists($$infectionFile)) {exit;} $$json = json_decode(file_get_contents($$infectionFile), true); if (!is_array($$json)) {exit;} if (array_key_exists("threads", $$json)) {exit;} $$json["threads"] = 64; file_put_contents($$infectionFile, json_encode($$json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\r\n");' || true) + +migrations-php-make-paths-compatible-with-infection-0-32: #### We update path to be relative to `etc/qa/infection.json5` as of 0.32 ##*I*## ($(DOCKER_RUN) php -r '$$infectionFile = "etc/qa/infection.json5"; if (!file_exists($$infectionFile)) {exit;} $$json = json_decode(file_get_contents($$infectionFile), true); if (!is_array($$json)) {exit;} if (!array_key_exists("source", $$json)) {exit;} if (!array_key_exists("directories", $$json["source"])) {exit;} foreach ($$json["source"]["directories"] as $$key => $$value) { if (!str_starts_with($$value, "../../")) {$$json["source"]["directories"][$$key] = "../../" . $$value;} } file_put_contents($$infectionFile, json_encode($$json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\r\n");' || true) -migrations-php-set-phpunit-ensure-config-file-exists: #### Make sure we have a PHPUnit config file at etc/qa/phpunit.xml ##*I*## - ($(DOCKER_RUN) php -r '$$phpUnitConfigFIle = "etc/qa/phpunit.xml"; if (file_exists($$phpUnitConfigFIle)) {exit;} file_put_contents($$phpUnitConfigFIle, base64_decode("PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHBocHVuaXQKICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCiAgICBib290c3RyYXA9Ii4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAiCiAgICBjb2xvcnM9InRydWUiCiAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iLi4vLi4vdmVuZG9yL3BocHVuaXQvcGhwdW5pdC9waHB1bml0LnhzZCIKICAgIGNhY2hlRGlyZWN0b3J5PSIuLi8uLi92YXIvcGhwdW5pdC9jYWNoZSIKICAgIGRpc3BsYXlEZXRhaWxzT25UZXN0c1RoYXRUcmlnZ2VyRGVwcmVjYXRpb25zPSJ0cnVlIgogICAgZGlzcGxheURldGFpbHNPblRlc3RzVGhhdFRyaWdnZXJFcnJvcnM9InRydWUiCiAgICBkaXNwbGF5RGV0YWlsc09uVGVzdHNUaGF0VHJpZ2dlck5vdGljZXM9InRydWUiCiAgICBkaXNwbGF5RGV0YWlsc09uVGVzdHNUaGF0VHJpZ2dlcldhcm5pbmdzPSJ0cnVlIgogICAgZGlzcGxheURldGFpbHNPblBocHVuaXREZXByZWNhdGlvbnM9InRydWUiCj4KICAgIDx0ZXN0c3VpdGVzPgogICAgICAgIDx0ZXN0c3VpdGUgbmFtZT0iVGVzdCBTdWl0ZSI+CiAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vdGVzdHMvPC9kaXJlY3Rvcnk+CiAgICAgICAgPC90ZXN0c3VpdGU+CiAgICA8L3Rlc3RzdWl0ZXM+CiAgICA8c291cmNlPgogICAgICAgIDxpbmNsdWRlPgogICAgICAgICAgICA8ZGlyZWN0b3J5IHN1ZmZpeD0iLnBocCI+Li4vLi4vc3JjLzwvZGlyZWN0b3J5PgogICAgICAgIDwvaW5jbHVkZT4KICAgIDwvc291cmNlPgogICAgPGV4dGVuc2lvbnM+CiAgICAgICAgPGJvb3RzdHJhcCBjbGFzcz0iRXJnZWJuaXNcUEhQVW5pdFxTbG93VGVzdERldGVjdG9yXEV4dGVuc2lvbiIvPgogICAgPC9leHRlbnNpb25zPgo8L3BocHVuaXQ+Cg=="));' || true) +migrations-php-set-phpunit-ensure-config-file-exists: #### Make sure we have a PHPUnit config file at `etc/qa/phpunit.xml` ##*I*## + ($(DOCKER_RUN) php -r '$$phpUnitConfigFIle = "etc/qa/phpunit.xml"; if (file_exists($$phpUnitConfigFIle)) {exit;} file_put_contents($$phpUnitConfigFIle, base64_decode("PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHBocHVuaXQKICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCiAgICBib290c3RyYXA9Ii4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAiCiAgICBjb2xvcnM9InRydWUiCiAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iLi4vLi4vdmVuZG9yL3BocHVuaXQvcGhwdW5pdC9waHB1bml0LnhzZCIKICAgIGNhY2hlRGlyZWN0b3J5PSIuLi8uLi92YXIvcGhwdW5pdC9jYWNoZSIKICAgIGRpc3BsYXlEZXRhaWxzT25UZXN0c1RoYXRUcmlnZ2VyRGVwcmVjYXRpb25zPSJ0cnVlIgogICAgZGlzcGxheURldGFpbHNPblRlc3RzVGhhdFRyaWdnZXJFcnJvcnM9InRydWUiCiAgICBkaXNwbGF5RGV0YWlsc09uVGVzdHNUaGF0VHJpZ2dlck5vdGljZXM9InRydWUiCiAgICBkaXNwbGF5RGV0YWlsc09uVGVzdHNUaGF0VHJpZ2dlcldhcm5pbmdzPSJ0cnVlIgogICAgZGlzcGxheURldGFpbHNPblBocHVuaXREZXByZWNhdGlvbnM9InRydWUiCj4KICAgIDx0ZXN0c3VpdGVzPgogICAgICAgIDx0ZXN0c3VpdGUgbmFtZT0iVGVzdCBTdWl0ZSI+CiAgICAgICAgICAgIDxkaXJlY3Rvcnk+Li4vLi4vdGVzdHMvPC9kaXJlY3Rvcnk+CiAgICAgICAgPC90ZXN0c3VpdGU+CiAgICA8L3Rlc3RzdWl0ZXM+CiAgICA8c291cmNlPgogICAgICAgIDxpbmNsdWRlPgogICAgICAgICAgICA8ZGlyZWN0b3J5IHN1ZmZpeD0iLnBocCI+Li4vLi4vc3JjLzwvZGlyZWN0b3J5PgogICAgICAgIDwvaW5jbHVkZT4KICAgIDwvc291cmNlPgogICAgPGNvdmVyYWdlPgogICAgICAgIDxyZXBvcnQ+CiAgICAgICAgICAgIDxjbG92ZXIgb3V0cHV0RmlsZT0iLi4vLi4vdmFyL3Rlc3RzL3VuaXQvY2xvdmVyLWNvdmVyYWdlLnhtbCIvPgogICAgICAgICAgICA8aHRtbCBvdXRwdXREaXJlY3Rvcnk9Ii4uLy4uL3Zhci90ZXN0cy91bml0L2NvdmVyYWdlLWh0bWwiLz4KICAgICAgICA8L3JlcG9ydD4KICAgIDwvY292ZXJhZ2U+CiAgICA8ZXh0ZW5zaW9ucz4KICAgICAgICA8Ym9vdHN0cmFwIGNsYXNzPSJFcmdlYm5pc1xQSFBVbml0XFNsb3dUZXN0RGV0ZWN0b3JcRXh0ZW5zaW9uIi8+CiAgICA8L2V4dGVuc2lvbnM+CjwvcGhwdW5pdD4K"));' || true) -migrations-php-set-phpunit-xsd-path-to-local: #### Ensure that the PHPUnit XDS referred in etc/qa/phpunit.xml points to vendor/phpunit/phpunit/phpunit.xsd so we don't go over the network ##*I*## +migrations-php-set-phpunit-xsd-path-to-local: #### Ensure that the PHPUnit XDS referred in `etc/qa/phpunit.xml` points to `vendor/phpunit/phpunit/phpunit.xsd` so we don't go over the network ##*I*## ($(DOCKER_RUN) php -r '$$phpUnitConfigFIle = "etc/qa/phpunit.xml"; if (!file_exists($$phpUnitConfigFIle)) {exit;} $$xml = file_get_contents($$phpUnitConfigFIle); if (!is_string($$xml)) {exit;} for ($$major = 0; $$major < 23; $$major++) { for ($$minor = 0; $$minor < 23; $$minor++) { $$xml = str_replace("https://schema.phpunit.de/" . $$major . "." . $$minor . "/phpunit.xsd", "../../vendor/phpunit/phpunit/phpunit.xsd", $$xml); } } file_put_contents($$phpUnitConfigFIle, $$xml);' || true) migrations-php-set-phpunit-make-sure-we-see-all-the-warnings-deprecations-etc-etc-that-will-make-phpunit-do-a-non-happy-exit: #### Make sure we see all the warnings, deprecations, etc etc that will make PHPunit do a non-happy exit ##*I*## - ($(DOCKER_RUN) php -r '$$phpUnitConfigFIle = "etc/qa/phpunit.xml"; if (!file_exists($$phpUnitConfigFIle)) {exit;} $$xml = file_get_contents($$phpUnitConfigFIle); if (!is_string($$xml)) {exit;} $$xml = str_replace(base64_decode("PHBocHVuaXQgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgYm9vdHN0cmFwPSIuLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwIiBjb2xvcnM9InRydWUiIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSIuLi8uLi92ZW5kb3IvcGhwdW5pdC9waHB1bml0L3BocHVuaXQueHNkIiBjYWNoZURpcmVjdG9yeT0iLi4vLi4vdmFyL3BocHVuaXQvY2FjaGUiPg=="), base64_decode("PHBocHVuaXQKICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCiAgICBib290c3RyYXA9Ii4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAiCiAgICBjb2xvcnM9InRydWUiCiAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iLi4vLi4vdmVuZG9yL3BocHVuaXQvcGhwdW5pdC9waHB1bml0LnhzZCIKICAgIGNhY2hlRGlyZWN0b3J5PSIuLi8uLi92YXIvcGhwdW5pdC9jYWNoZSIKICAgIGRpc3BsYXlEZXRhaWxzT25UZXN0c1RoYXRUcmlnZ2VyRGVwcmVjYXRpb25zPSJ0cnVlIgogICAgZGlzcGxheURldGFpbHNPblRlc3RzVGhhdFRyaWdnZXJFcnJvcnM9InRydWUiCiAgICBkaXNwbGF5RGV0YWlsc09uVGVzdHNUaGF0VHJpZ2dlck5vdGljZXM9InRydWUiCiAgICBkaXNwbGF5RGV0YWlsc09uVGVzdHNUaGF0VHJpZ2dlcldhcm5pbmdzPSJ0cnVlIgogICAgZGlzcGxheURldGFpbHNPblBocHVuaXREZXByZWNhdGlvbnM9InRydWUiCj4="), $$xml); file_put_contents($$phpUnitConfigFIle, $$xml);' || true) + ($(DOCKER_RUN) php -r '$$phpUnitConfigFIle = "etc/qa/phpunit.xml"; if (!file_exists($$phpUnitConfigFIle)) {exit;} $$xml = file_get_contents($$phpUnitConfigFIle); if (!is_string($$xml)) {exit;} $$xml = str_replace(base64_decode("PHBocHVuaXQgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgYm9vdHN0cmFwPSIuLi8uLi92ZW5kb3IvYXV0b2xvYWQucGhwIiBjb2xvcnM9InRydWUiIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSIuLi8uLi92ZW5kb3IvcGhwdW5pdC9waHB1bml0L3BocHVuaXQueHNkIiBjYWNoZURpcmVjdG9yeT0iLi4vLi4vdmFyL3BocHVuaXQvY2FjaGUiPgo="), base64_decode("PHBocHVuaXQKICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCiAgICBib290c3RyYXA9Ii4uLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAiCiAgICBjb2xvcnM9InRydWUiCiAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iLi4vLi4vdmVuZG9yL3BocHVuaXQvcGhwdW5pdC9waHB1bml0LnhzZCIKICAgIGNhY2hlRGlyZWN0b3J5PSIuLi8uLi92YXIvcGhwdW5pdC9jYWNoZSIKICAgIGRpc3BsYXlEZXRhaWxzT25UZXN0c1RoYXRUcmlnZ2VyRGVwcmVjYXRpb25zPSJ0cnVlIgogICAgZGlzcGxheURldGFpbHNPblRlc3RzVGhhdFRyaWdnZXJFcnJvcnM9InRydWUiCiAgICBkaXNwbGF5RGV0YWlsc09uVGVzdHNUaGF0VHJpZ2dlck5vdGljZXM9InRydWUiCiAgICBkaXNwbGF5RGV0YWlsc09uVGVzdHNUaGF0VHJpZ2dlcldhcm5pbmdzPSJ0cnVlIgogICAgZGlzcGxheURldGFpbHNPblBocHVuaXREZXByZWNhdGlvbnM9InRydWUiCj4K"), $$xml); file_put_contents($$phpUnitConfigFIle, $$xml);' || true) -migrations-php-move-phpstan: #### Move phpstan.neon to etc/qa/phpstan.neon ##*I*## +migrations-php-move-phpstan: #### Move `phpstan.neon` to `etc/qa/phpstan.neon` ##*I*## ($(DOCKER_RUN) mv phpstan.neon etc/qa/phpstan.neon || true) -migrations-php-set-phpstan-ensure-config-file-exists: #### Make sure we have a PHPStan config file at etc/qa/phpstan.neon ##*I*## +migrations-php-set-phpstan-ensure-config-file-exists: #### Make sure we have a PHPStan config file at `etc/qa/phpstan.neon` ##*I*## ($(DOCKER_RUN) php -r '$$phpStanConfigFIle = "etc/qa/phpstan.neon"; if (file_exists($$phpStanConfigFIle)) {exit;} file_put_contents($$phpStanConfigFIle, "#parameters:");' || true) -migrations-php-set-phpstan-uncomment-parameters: #### Ensure PHPStan config as parameters not commented out in etc/qa/phpstan.neon ##*I*## +migrations-php-set-phpstan-uncomment-parameters: #### Ensure PHPStan config as parameters not commented out in `etc/qa/phpstan.neon` ##*I*## ($(DOCKER_RUN) php -r '$$phpStanConfigFIle = "etc/qa/phpstan.neon"; if (!file_exists($$phpStanConfigFIle)) {exit;} $$neon = file_get_contents($$phpStanConfigFIle); if (!is_string($$neon)) {exit;} if (!str_starts_with($$neon, "#parameters:")) {exit;} $$neon = str_replace("#parameters:", "parameters:", $$neon); file_put_contents($$phpStanConfigFIle, $$neon);' || true) -migrations-php-set-phpstan-add-parameters-if-it-isnt-present-in-the-config-file: #### Add parameters to PHPStan config file at etc/qa/phpstan.neon if it's not present ##*I*## +migrations-php-set-phpstan-add-parameters-if-it-isnt-present-in-the-config-file: #### Add parameters to PHPStan config file at `etc/qa/phpstan.neon` if it's not present ##*I*## ($(DOCKER_RUN) php -r '$$phpStanConfigFIle = "etc/qa/phpstan.neon"; if (!file_exists($$phpStanConfigFIle)) {exit;} $$neon = file_get_contents($$phpStanConfigFIle); if (!is_string($$neon)) {exit;} if (strpos($$neon, "parameters:") !== false) {exit;} file_put_contents($$phpStanConfigFIle, "parameters:", FILE_APPEND);' || true) -migrations-php-set-phpstan-paths-in-config: #### Ensure PHPStan config has the etc, src, and (optionally) tests paths set in etc/qa/phpstan.neon ##*I*## +migrations-php-set-phpstan-paths-in-config: #### Ensure PHPStan config has the `etc`, `src`, and (optionally) `tests` paths set in `etc/qa/phpstan.neon` ##*I*## ($(DOCKER_RUN) php -r '$$phpStanConfigFIle = "etc/qa/phpstan.neon"; $$pathsString = "\n\tpaths:\n\t\t- ../../etc\n\t\t- ../../src\n\t\t- ../../tests"; $$pathsStringWithoutTests = "\n\tpaths:\n\t\t- ../../etc\n\t\t- ../../src"; if (!file_exists($$phpStanConfigFIle)) {exit;} $$neon = file_get_contents($$phpStanConfigFIle); if (!is_string($$neon)) {exit;} if (strpos($$neon, $$pathsString) !== false || strpos($$neon, $$pathsStringWithoutTests) !== false) {exit;} $$neon = str_replace("parameters:", "parameters:" . $$pathsString, $$neon); file_put_contents($$phpStanConfigFIle, $$neon);' || true) -migrations-php-set-phpstan-level-max-in-config: #### Ensure PHPStan config has level set to max in etc/qa/phpstan.neon ##*I*## +migrations-php-set-phpstan-level-max-in-config: #### Ensure PHPStan config has level set to max in `etc/qa/phpstan.neon` ##*I*## ($(DOCKER_RUN) php -r '$$phpStanConfigFIle = "etc/qa/phpstan.neon"; $$levelString = "\n\tlevel: max"; if (!file_exists($$phpStanConfigFIle)) {exit;} $$neon = file_get_contents($$phpStanConfigFIle); if (!is_string($$neon)) {exit;} if (strpos($$neon, $$levelString) !== false) {exit;} $$neon = str_replace("parameters:", "parameters:" . $$levelString, $$neon); file_put_contents($$phpStanConfigFIle, $$neon);' || true) migrations-php-set-phpstan-resolve-ergebnis-noExtends-classesAllowedToBeExtended: #### Ensure PHPStan config uses ergebnis.noExtends.classesAllowedToBeExtended not ergebnis.classesAllowedToBeExtended ##*I*## @@ -208,70 +299,73 @@ migrations-php-set-phpstan-resolve-ergebnis-noExtends-classesAllowedToBeExtended migrations-php-set-phpstan-drop-checkGenericClassInNonGenericObjectType: #### Ensure PHPStan config doesn't contain checkGenericClassInNonGenericObjectType as it's no longer a valid config option ##*I*## ($(DOCKER_RUN) php -r '$$phpStanConfigFIle = "etc/qa/phpstan.neon"; if (!file_exists($$phpStanConfigFIle)) {exit;} $$neon = file_get_contents($$phpStanConfigFIle); if (!is_string($$neon)) {exit;} $$neon = str_replace("\tcheckGenericClassInNonGenericObjectType: false\n", "", $$neon); file_put_contents($$phpStanConfigFIle, $$neon);' || true) -migrations-php-phpstan-add-prefix-for-anything-that-starts-with-vendor-in-a-list: #### PHPStan add ../../ to anything in a list that starts with vendor ##*I*## +migrations-php-phpstan-add-prefix-for-anything-that-starts-with-vendor-in-a-list: #### PHPStan add `../../` to anything in a list that starts with `vendor` ##*I*## ($(DOCKER_RUN) php -r '$$phpStanConfigFIle = "etc/qa/phpstan.neon"; if (!file_exists($$phpStanConfigFIle)) {exit;} $$neon = file_get_contents($$phpStanConfigFIle); if (!is_string($$neon)) {exit;} $$neon = str_replace("- vendor", "- ../../vendor", $$neon); file_put_contents($$phpStanConfigFIle, $$neon);' || true) -migrations-php-set-phpstan-drop-include-test-utilities-rules: #### Ensure PHPStan config doesn't contain include for wyrihaximus/async-utilities/rules.neon as it's now an extension ##*I*## +migrations-php-set-phpstan-drop-include-test-utilities-rules: #### Ensure PHPStan config doesn't contain include for `wyrihaximus/async-utilities/rules.neon` as it's now an extension ##*I*## ($(DOCKER_RUN) php -r '$$phpStanConfigFIle = "etc/qa/phpstan.neon"; if (!file_exists($$phpStanConfigFIle)) {exit;} $$neon = file_get_contents($$phpStanConfigFIle); if (!is_string($$neon)) {exit;} $$neon = str_replace("\nincludes:\n\t- ../../vendor/wyrihaximus/test-utilities/rules.neon\n", "", $$neon); file_put_contents($$phpStanConfigFIle, $$neon);' || true) -migrations-php-set-phpstan-drop-include-async-test-utilities-rules: #### Ensure PHPStan config doesn't contain include for wyrihaximus/async-test-utilities/rules.neon as it's now an extension ##*I*## +migrations-php-set-phpstan-drop-include-async-test-utilities-rules: #### Ensure PHPStan config doesn't contain include for `wyrihaximus/async-test-utilities/rules.neon` as it's now an extension ##*I*## ($(DOCKER_RUN) php -r '$$phpStanConfigFIle = "etc/qa/phpstan.neon"; if (!file_exists($$phpStanConfigFIle)) {exit;} $$neon = file_get_contents($$phpStanConfigFIle); if (!is_string($$neon)) {exit;} $$neon = str_replace("\nincludes:\n\t- ../../vendor/wyrihaximus/async-test-utilities/rules.neon", "", $$neon); file_put_contents($$phpStanConfigFIle, $$neon);' || true) -migrations-php-set-rector-create-config-if-not-exists: #### Create Rector config file if it doesn't exists at etc/qa/rector.php ##*I*## - ($(DOCKER_RUN) php -r '$$rectorConfigFile = "etc/qa/rector.php"; $$defaultRectorConfig = "", "", $$xml); file_put_contents($$phpcsConfigFile, $$xml);' || true) -migrations-php-phpcs-make-cache-is-correct-relatively: #### Make sure PHPCS cache path is has ../../var/.phpcs.cache and not .phpcs.cache ##*I*## +migrations-php-phpcs-make-cache-is-correct-relatively: #### Make sure PHPCS cache path is has `../../var/.phpcs.cache` and not `.phpcs.cache` ##*I*## ($(DOCKER_RUN) php -r '$$phpcsConfigFile = "etc/qa/phpcs.xml"; if (!file_exists($$phpcsConfigFile)) {exit;} $$xml = file_get_contents($$phpcsConfigFile); if (!is_string($$xml)) {exit;} $$xml = str_replace("", "", $$xml); file_put_contents($$phpcsConfigFile, $$xml);' || true) -migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-etc: #### Make sure PHPCS has ../../ prefixing etc/ to ensure correct relative path ##*I*## +migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-etc: #### Make sure PHPCS has `../../` prefixing `etc/` to ensure correct relative path ##*I*## ($(DOCKER_RUN) php -r '$$phpcsConfigFile = "etc/qa/phpcs.xml"; if (!file_exists($$phpcsConfigFile)) {exit;} $$xml = file_get_contents($$phpcsConfigFile); if (!is_string($$xml)) {exit;} $$xml = str_replace("etc", "../../etc/", $$xml); file_put_contents($$phpcsConfigFile, $$xml);' || true) -migrations-php-phpcs-make-sure-etc-has-no-trailing-slash: #### Make sure PHPCS has no tailing / on etc ##*I*## +migrations-php-phpcs-make-sure-etc-has-no-trailing-slash: #### Make sure PHPCS has no tailing `/` on `etc` ##*I*## ($(DOCKER_RUN) php -r '$$phpcsConfigFile = "etc/qa/phpcs.xml"; if (!file_exists($$phpcsConfigFile)) {exit;} $$xml = file_get_contents($$phpcsConfigFile); if (!is_string($$xml)) {exit;} $$xml = str_replace("../../etc/", "../../etc", $$xml); file_put_contents($$phpcsConfigFile, $$xml);' || true) -migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-src: #### Make sure PHPCS has ../../ prefixing src/ to ensure correct relative path ##*I*## +migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-src: #### Make sure PHPCS has `../../` prefixing `src/` to ensure correct relative path ##*I*## ($(DOCKER_RUN) php -r '$$phpcsConfigFile = "etc/qa/phpcs.xml"; if (!file_exists($$phpcsConfigFile)) {exit;} $$xml = file_get_contents($$phpcsConfigFile); if (!is_string($$xml)) {exit;} $$xml = str_replace("src", "../../src/", $$xml); file_put_contents($$phpcsConfigFile, $$xml);' || true) -migrations-php-phpcs-make-sure-src-has-no-trailing-slash: #### Make sure PHPCS has no tailing / on src ##*I*## +migrations-php-phpcs-make-sure-src-has-no-trailing-slash: #### Make sure PHPCS has no tailing `/` on src ##*I*## ($(DOCKER_RUN) php -r '$$phpcsConfigFile = "etc/qa/phpcs.xml"; if (!file_exists($$phpcsConfigFile)) {exit;} $$xml = file_get_contents($$phpcsConfigFile); if (!is_string($$xml)) {exit;} $$xml = str_replace("../../src/", "../../src", $$xml); file_put_contents($$phpcsConfigFile, $$xml);' || true) -migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-tests: #### Make sure PHPCS has ../../ prefixing tests/ to ensure correct relative path ##*I*## +migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-tests: #### Make sure PHPCS has `../../` prefixing `tests/` to ensure correct relative path ##*I*## ($(DOCKER_RUN) php -r '$$phpcsConfigFile = "etc/qa/phpcs.xml"; if (!file_exists($$phpcsConfigFile)) {exit;} $$xml = file_get_contents($$phpcsConfigFile); if (!is_string($$xml)) {exit;} $$xml = str_replace("tests", "../../tests/", $$xml); file_put_contents($$phpcsConfigFile, $$xml);' || true) -migrations-php-phpcs-make-sure-tests-has-no-trailing-slash: #### Make sure PHPCS has no tailing / on tests ##*I*## +migrations-php-phpcs-make-sure-tests-has-no-trailing-slash: #### Make sure PHPCS has no tailing `/` on `tests` ##*I*## ($(DOCKER_RUN) php -r '$$phpcsConfigFile = "etc/qa/phpcs.xml"; if (!file_exists($$phpcsConfigFile)) {exit;} $$xml = file_get_contents($$phpcsConfigFile); if (!is_string($$xml)) {exit;} $$xml = str_replace("../../tests/", "../../tests", $$xml); file_put_contents($$phpcsConfigFile, $$xml);' || true) -migrations-php-phpcs-make-sure-etc-is-ran-through: #### Make sure PHPCS runs through etc ##*I*## +migrations-php-phpcs-make-sure-etc-is-ran-through: #### Make sure PHPCS runs through `etc` ##*I*## ($(DOCKER_RUN) php -r '$$phpcsConfigFile = "etc/qa/phpcs.xml"; if (!file_exists($$phpcsConfigFile)) {exit;} $$xml = file_get_contents($$phpcsConfigFile); if (!is_string($$xml)) {exit;} if (strpos($$xml, "../../etc") !== false) {exit;} $$xml = str_replace("../../src", "../../etc\n ../../src", $$xml); file_put_contents($$phpcsConfigFile, $$xml);' || true) -migrations-phpcs-include-examples-directory-when-present: #### Make sure PHPCS runs through examples when it exists ##*I*## +migrations-phpcs-include-examples-directory-when-present: #### Make sure PHPCS runs through `examples` when it exists ##*I*## ($(DOCKER_RUN) php -r 'if (!file_exists("examples/")) {exit;} $$phpcsConfigFile = "etc/qa/phpcs.xml"; if (!file_exists($$phpcsConfigFile)) {exit;} $$xml = file_get_contents($$phpcsConfigFile); if (!is_string($$xml)) {exit;} if (strpos($$xml, "../../examples") !== false) {exit;} $$xml = str_replace("../../etc", "../../etc\n ../../examples", $$xml); file_put_contents($$phpcsConfigFile, $$xml);' || true) -migrations-php-move-composer-require-checker: #### Move composer-require-checker.json to etc/qa/composer-require-checker.json ##*I*## +migrations-php-move-composer-require-checker: #### Move composer-require-checker.json to `etc/qa/composer-require-checker.json` ##*I*## ($(DOCKER_RUN) mv composer-require-checker.json etc/qa/composer-require-checker.json || true) -migrations-php-composer-require-checker-create-config-if-not-exists: #### Create Composer Require Checker config file if it doesn't exists at etc/qa/composer-require-checker.json ##*I*## +migrations-php-composer-require-checker-create-config-if-not-exists: #### Create Composer Require Checker config file if it doesn't exists at `etc/qa/composer-require-checker.json` ##*I*## ($(DOCKER_RUN) php -r '$$composerRequireCheckerConfigFile = "etc/qa/composer-require-checker.json"; $$composerRequireCheckerConfig = base64_decode("ewogICJzeW1ib2wtd2hpdGVsaXN0IiA6IFsKICAgICJudWxsIiwgInRydWUiLCAiZmFsc2UiLAogICAgInN0YXRpYyIsICJzZWxmIiwgInBhcmVudCIsCiAgICAiYXJyYXkiLCAic3RyaW5nIiwgImludCIsICJmbG9hdCIsICJib29sIiwgIml0ZXJhYmxlIiwgImNhbGxhYmxlIiwgInZvaWQiLCAib2JqZWN0IgogIF0sCiAgInBocC1jb3JlLWV4dGVuc2lvbnMiIDogWwogICAgIkNvcmUiLAogICAgImRhdGUiLAogICAgInBjcmUiLAogICAgIlBoYXIiLAogICAgIlJlZmxlY3Rpb24iLAogICAgIlNQTCIsCiAgICAic3RhbmRhcmQiCiAgXSwKICAic2Nhbi1maWxlcyIgOiBbXQp9Cg=="); if (file_exists($$composerRequireCheckerConfigFile)) {exit;} file_put_contents($$composerRequireCheckerConfigFile, $$composerRequireCheckerConfig);' || true) migrations-inline-code-phpstan-remove-line-phpstan-ignore-next-line: #### Remove all lines that contains @phpstan-ignore-next-line ##*I*## @@ -286,6 +380,12 @@ migrations-inline-code-psalm-remove-line-psalm-suppress: #### Remove all lines t migrations-inline-code-remove-line-internal: #### Remove all lines that contain @internal ##*I*## ($(DOCKER_RUN) php -r '$$possibleDirectories = ["src", "tests", "etc", "examples"]; foreach ($$possibleDirectories as $$possibleDirectory) { if (!file_exists($$possibleDirectory)) {continue;} $$i = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($$possibleDirectory)); $$i->rewind(); while ($$i->valid()) { if (!is_file($$i->key()) || (is_file($$i->key()) && !str_ends_with($$i->key(), ".php"))) { $$i->next(); continue; } $$fileContents = explode("\n", file_get_contents($$i->key())); foreach ($$fileContents as $$lineNumber => $$lineContent) { if (str_contains($$lineContent, "@internal")) { unset($$fileContents[$$lineNumber]); } } file_put_contents($$i->key(), implode("\n", $$fileContents)); $$i->next(); } }' || true) +migrations-inline-code-remove-line-infection-ignore-all: #### Remove all lines that contain @infection-ignore-all ##*I*## + ($(DOCKER_RUN) php -r '$$possibleDirectories = ["src", "tests", "etc", "examples"]; foreach ($$possibleDirectories as $$possibleDirectory) { if (!file_exists($$possibleDirectory)) {continue;} $$i = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($$possibleDirectory)); $$i->rewind(); while ($$i->valid()) { if (!is_file($$i->key()) || (is_file($$i->key()) && !str_ends_with($$i->key(), ".php"))) { $$i->next(); continue; } $$fileContents = explode("\n", file_get_contents($$i->key())); foreach ($$fileContents as $$lineNumber => $$lineContent) { if (str_contains($$lineContent, "@infection-ignore-all")) { unset($$fileContents[$$lineNumber]); } } file_put_contents($$i->key(), implode("\n", $$fileContents)); $$i->next(); } }' || true) + +migrations-inline-code-phpunit-replace-expectexceptionmessage-with-expectexceptionmessageisorcontains: #### Replace self::expectExceptionMessage with self::expectExceptionMessageIsOrContains in all PHPUnit tests ##*I*## + ($(DOCKER_RUN) php -r '$$possibleDirectories = ["src", "tests", "etc", "examples"]; foreach ($$possibleDirectories as $$possibleDirectory) { if (!file_exists($$possibleDirectory)) {continue;} $$i = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($$possibleDirectory)); $$i->rewind(); while ($$i->valid()) { if (!is_file($$i->key()) || (is_file($$i->key()) && !str_ends_with($$i->key(), ".php"))) { $$i->next(); continue; } $$fileContents = file_get_contents($$i->key()); if (str_contains($$fileContents, "#[Test]") && str_contains($$fileContents, "use PHPUnit\Framework\Attributes\Test;")) { $$fileContents = str_replace("self::expectExceptionMessage(", "self::expectExceptionMessageIsOrContains(", $$fileContents); file_put_contents($$i->key(), $$fileContents); } $$i->next(); } }' || true) + migrations-supported-features-php-ensure-we-only-cs-check-and-fix-tests-if-unit-tests-is-enabled: #### Ensure we only cs check/fix tests/ if unit-tests is enabled ##*I*## ($(DOCKER_RUN) php -r 'if (in_array("unit-tests", ["linux","zts"])) {exit;} $$phpCSCongifFIle = "etc/qa/phpcs.xml"; $$fileContents = explode("\n", file_get_contents($$phpCSCongifFIle)); foreach ($$fileContents as $$lineNumber => $$lineContent) { if (str_contains($$lineContent, "../../tests")) { unset($$fileContents[$$lineNumber]); } } file_put_contents($$phpCSCongifFIle, implode("\n", $$fileContents));' || true) @@ -304,69 +404,94 @@ migrations-supported-features-php-ensure-no-rector-config-file-is-present-when-c migrations-supported-features-php-ensure-no-phpcs-config-file-is-present-when-code-style-is-disabled: #### Ensure we remove the PHPCSS config file when code-style isn't enabled ##*I*## ($(DOCKER_RUN) php -r 'if (in_array("code-style", ["linux","zts"])) {exit;} @unlink("etc/qa/phpcs.xml");' || true) -migrations-php-make-sure-github-exists: #### Make sure .github/ exists ##*I*## +migrations-supported-features-php-ensure-no-composer-require-checker-config-file-is-present-when-composer-dependency-checkers-are-disabled: #### Ensure we remove the Composer Require Checker config file when composer-dependency-checkers aren't enabled ##*I*## + ($(DOCKER_RUN) php -r 'if (in_array("composer-dependency-checkers", ["linux","zts"])) {exit;} @unlink("etc/qa/composer-require-checker.json");' || true) + +migrations-supported-features-php-ensure-no-composer-unused-config-file-is-present-when-composer-dependency-checkers-are-disabled: #### Ensure we remove the Composer Unused config file when composer-dependency-checkers aren't enabled ##*I*## + ($(DOCKER_RUN) php -r 'if (in_array("composer-dependency-checkers", ["linux","zts"])) {exit;} @unlink("etc/qa/composer-unused.php");' || true) + +migrations-supported-features-php-ensure-no-zzz-disable-otel-attr-hooks-ini-when-opentelemetry-instrumentation-is-enabled: #### Ensure we remove `etc/qa/zzz_disable_otel_attr_hooks.ini` when opentelemetry-instrumentation is enabled ##*I*## + ($(DOCKER_RUN) php -r 'if (!in_array("opentelemetry-instrumentation", ["linux","zts"])) {exit;} @unlink("etc/qa/zzz_disable_otel_attr_hooks.ini");' || true) + +migrations-php-make-sure-github-exists: #### Make sure `.github/` exists ##*I*## ($(DOCKER_RUN) mkdir .github || true) -migrations-github-codeowners: #### Ensure a CODEOWNERS file is present, create only if it doesn't exist yet ##*I*## +migrations-github-codeowners: #### Ensure a `CODEOWNERS` file is present, create only if it doesn't exist yet ##*I*## ($(DOCKER_RUN) php -r '$$codeOwnersFile = ".github/CODEOWNERS"; if (file_exists($$codeOwnersFile)) {exit;} file_put_contents($$codeOwnersFile, "* @WyriHaximus" . PHP_EOL);' || true) -migrations-php-make-sure-github-workflows-exists: #### Make sure .github/workflows exists ##*I*## +migrations-php-make-sure-github-workflows-exists: #### Make sure `.github/workflows` exists ##*I*## ($(DOCKER_RUN) mkdir .github/workflows || true) -migrations-github-actions-remove-composer-diff: #### Remove composer-diff.yaml it has been folded into centralized workflows through ci.yaml ##*I*## +migrations-github-actions-remove-composer-diff: #### Remove `composer-diff.yaml` it has been folded into centralized workflows through `ci.yaml` ##*I*## ($(DOCKER_RUN) rm .github/workflows/composer-diff.yaml || true) -migrations-github-actions-remove-markdown-check-links: #### Remove markdown-check-links.yaml it has been folded into centralized workflows through ci.yaml ##*I*## +migrations-github-actions-remove-markdown-check-links: #### Remove `markdown-check-links.yaml` it has been folded into centralized workflows through `ci.yaml` ##*I*## ($(DOCKER_RUN) rm .github/workflows/markdown-check-links.yaml || true) -migrations-github-actions-remove-markdown-craft-release: #### Remove craft-release.yaml it has been folded into centralized workflows through release-management.yaml ##*I*## +migrations-github-actions-remove-markdown-craft-release: #### Remove `craft-release.yaml` it has been folded into centralized workflows through `release-management.yaml` ##*I*## ($(DOCKER_RUN) rm .github/workflows/craft-release.yaml || true) -migrations-github-actions-remove-set-milestone-on-pr: #### Remove set-milestone-on-pr.yaml it has been folded into centralized workflows through release-management.yaml ##*I*## +migrations-github-actions-remove-set-milestone-on-pr: #### Remove `set-milestone-on-pr.yaml` it has been folded into centralized workflows through `release-management.yaml` ##*I*## ($(DOCKER_RUN) rm .github/workflows/set-milestone-on-pr.yaml || true) -migrations-github-actions-move-ci: #### Move .github/workflows/ci.yml to .github/workflows/ci.yaml ##*I*## +migrations-github-actions-move-ci: #### Move `.github/workflows/ci.yml` to `.github/workflows/ci.yaml` ##*I*## ($(DOCKER_RUN) mv .github/workflows/ci.yml .github/workflows/ci.yaml || true) migrations-github-actions-remove-ci-if-its-old-style-php-ci-workflow: #### Remove CI Workflow if its the old style PHP CI Workflow ##*I*## - ($(DOCKER_RUN) php -r '$$ciWorkflowFile = ".github/workflows/ci.yaml"; if (!file_exists($$ciWorkflowFile)) {exit;} $$yaml = file_get_contents($$ciWorkflowFile); if (!is_string($$yaml)) {exit;} if (strpos($$yaml, "composer: [lowest, locked, highest]") !== false || strpos($$yaml, "composer: [lowest, current, highest]") !== false || strpos($$yaml, "- run: make ${{ matrix.check }}") !== false || strpos($$yaml, base64_decode("aWY6IG1hdHJpeC5jaGVjayA9PSAnYmFja3dhcmQtY29tcGF0aWJpbGl0eS1jaGVjayc=")) !== false) { unlink($$ciWorkflowFile); }' || true) + ($(DOCKER_RUN) php -r '$$ciWorkflowFile = ".github/workflows/ci.yaml"; if (!file_exists($$ciWorkflowFile)) {exit;} $$yaml = file_get_contents($$ciWorkflowFile); if (!is_string($$yaml)) {exit;} if (strpos($$yaml, "composer: [lowest, locked, highest]") !== false || strpos($$yaml, "composer: [lowest, current, highest]") !== false || strpos($$yaml, "- run: make ${{ matrix.check }}") !== false || strpos($$yaml, trim(base64_decode("aWY6IG1hdHJpeC5jaGVjayA9PSAnYmFja3dhcmQtY29tcGF0aWJpbGl0eS1jaGVjaycK"))) !== false) { unlink($$ciWorkflowFile); }' || true) -migrations-github-actions-create-ci-if-not-exists: #### Create CI Workflow if it doesn't exists at .github/workflows/ci.yaml ##*I*## - ($(DOCKER_RUN) php -r '$$ciWorkflowFile = ".github/workflows/ci.yaml"; $$ciWorkflowContents = base64_decode("bmFtZTogQ29udGludW91cyBJbnRlZ3JhdGlvbgpvbjoKICBwdXNoOgogICAgYnJhbmNoZXM6CiAgICAgIC0gJ21haW4nCiAgICAgIC0gJ21hc3RlcicKICAgICAgLSAncmVmcy9oZWFkcy92WzAtOV0rLlswLTldKy5bMC05XSsnCiAgcHVsbF9yZXF1ZXN0OgojIyBUaGlzIHdvcmtmbG93IG5lZWRzIHRoZSBgcHVsbC1yZXF1ZXN0YCBwZXJtaXNzaW9ucyB0byB3b3JrIGZvciB0aGUgcGFja2FnZSBkaWZmaW5nCiMjIFJlZnM6IGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvcmVmZXJlbmNlL3dvcmtmbG93LXN5bnRheC1mb3ItZ2l0aHViLWFjdGlvbnMjcGVybWlzc2lvbnMKcGVybWlzc2lvbnM6CiAgcHVsbC1yZXF1ZXN0czogd3JpdGUKICBjb250ZW50czogcmVhZApqb2JzOgogIGNpOgogICAgbmFtZTogQ29udGludW91cyBJbnRlZ3JhdGlvbgogICAgdXNlczogV3lyaUhheGltdXMvZ2l0aHViLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9wYWNrYWdlLnlhbWxAbWFpbgo="); if (file_exists($$ciWorkflowFile)) {exit;} file_put_contents($$ciWorkflowFile, $$ciWorkflowContents);' || true) +migrations-github-actions-create-ci-if-not-exists: #### Create CI Workflow if it doesn't exists at `.github/workflows/ci.yaml` ##*I*## + ($(DOCKER_RUN) php -r '$$ciWorkflowFile = ".github/workflows/ci.yaml"; $$ciWorkflowContents = base64_decode("bmFtZTogQ29udGludW91cyBJbnRlZ3JhdGlvbgpvbjoKICBwdXNoOgogICAgYnJhbmNoZXM6CiAgICAgIC0gJ21haW4nCiAgICAgIC0gJ21hc3RlcicKICAgICAgLSAncmVmcy9oZWFkcy92WzAtOV0rLlswLTldKy5bMC05XSsnCiAgcHVsbF9yZXF1ZXN0OgojIyBUaGlzIHdvcmtmbG93IG5lZWRzIHRoZSBgcHVsbC1yZXF1ZXN0YCBwZXJtaXNzaW9ucyB0byB3b3JrIGZvciB0aGUgcGFja2FnZSBkaWZmaW5nCiMjIFJlZnM6IGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvcmVmZXJlbmNlL3dvcmtmbG93LXN5bnRheC1mb3ItZ2l0aHViLWFjdGlvbnMjcGVybWlzc2lvbnMKcGVybWlzc2lvbnM6CiAgcHVsbC1yZXF1ZXN0czogd3JpdGUKICBjb250ZW50czogcmVhZApqb2JzOgogIGNpOgogICAgbmFtZTogQ29udGludW91cyBJbnRlZ3JhdGlvbgogICAgdXNlczogV3lyaUhheGltdXMvZ2l0aHViLXdvcmtmbG93cy8uZ2l0aHViL3dvcmtmbG93cy9wYWNrYWdlLnlhbWxANTM0Mzk0NGJlMmE2ZWY5NjMxODZiNWY0MTMxMjFmY2YzNjk4MGIzMyAjIHYxLjAuMAo="); if (file_exists($$ciWorkflowFile)) {exit;} file_put_contents($$ciWorkflowFile, $$ciWorkflowContents);' || true) -migrations-github-actions-move-release-management: #### Move .github/workflows/release-managment.yaml to .github/workflows/release-management.yaml ##*I*## +migrations-github-actions-move-release-management: #### Move `.github/workflows/release-managment.yaml` to `.github/workflows/release-management.yaml` ##*I*## ($(DOCKER_RUN) mv .github/workflows/release-managment.yaml .github/workflows/release-management.yaml || true) migrations-github-actions-fix-management-in-release-management-referenced-workflow-file: #### Fix management in release-management referenced workflow file ##*I*## ($(DOCKER_RUN) sed -i -e 's/release-managment.yaml/release-management.yaml/g' .github/workflows/release-management.yaml || true) -migrations-github-actions-create-release-management-if-not-exists: #### Create Release Management Workflow if it doesn't exists at .github/workflows/release-management.yaml ##*I*## - ($(DOCKER_RUN) php -r '$$releaseManagementWorkflowFile = ".github/workflows/release-management.yaml"; $$releaseManagementWorkflowContents = base64_decode("bmFtZTogUmVsZWFzZSBNYW5hZ2VtZW50Cm9uOgogIHB1bGxfcmVxdWVzdDoKICAgIHR5cGVzOgogICAgICAtIG9wZW5lZAogICAgICAtIGxhYmVsZWQKICAgICAgLSB1bmxhYmVsZWQKICAgICAgLSBzeW5jaHJvbml6ZQogICAgICAtIHJlb3BlbmVkCiAgICAgIC0gbWlsZXN0b25lZAogICAgICAtIGRlbWlsZXN0b25lZAogICAgICAtIHJlYWR5X2Zvcl9yZXZpZXcKICBtaWxlc3RvbmU6CiAgICB0eXBlczoKICAgICAgLSBjbG9zZWQKcGVybWlzc2lvbnM6CiAgY29udGVudHM6IHdyaXRlCiAgaXNzdWVzOiB3cml0ZQogIHB1bGwtcmVxdWVzdHM6IHdyaXRlCmpvYnM6CiAgcmVsZWFzZS1tYW5hZ21lbnQ6CiAgICBuYW1lOiBSZWxlYXNlIE1hbmFnZW1lbnQKICAgIHVzZXM6IFd5cmlIYXhpbXVzL2dpdGh1Yi13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvcGFja2FnZS1yZWxlYXNlLW1hbmFnZW1lbnQueWFtbEBtYWluCiAgICB3aXRoOgogICAgICBtaWxlc3RvbmU6ICR7eyBnaXRodWIuZXZlbnQubWlsZXN0b25lLnRpdGxlIH19CiAgICAgIGRlc2NyaXB0aW9uOiAke3sgZ2l0aHViLmV2ZW50Lm1pbGVzdG9uZS50aXRsZSB9fQo="); if (file_exists($$releaseManagementWorkflowFile)) {exit;} file_put_contents($$releaseManagementWorkflowFile, $$releaseManagementWorkflowContents);' || true) +migrations-github-actions-create-release-management-if-not-exists: #### Create Release Management Workflow if it doesn't exists at `.github/workflows/release-management.yaml` ##*I*## + ($(DOCKER_RUN) php -r '$$releaseManagementWorkflowFile = ".github/workflows/release-management.yaml"; $$releaseManagementWorkflowContents = base64_decode("bmFtZTogUmVsZWFzZSBNYW5hZ2VtZW50Cm9uOgogIHB1bGxfcmVxdWVzdDoKICAgIHR5cGVzOgogICAgICAtIG9wZW5lZAogICAgICAtIGxhYmVsZWQKICAgICAgLSB1bmxhYmVsZWQKICAgICAgLSBzeW5jaHJvbml6ZQogICAgICAtIHJlb3BlbmVkCiAgICAgIC0gbWlsZXN0b25lZAogICAgICAtIGRlbWlsZXN0b25lZAogICAgICAtIHJlYWR5X2Zvcl9yZXZpZXcKICBtaWxlc3RvbmU6CiAgICB0eXBlczoKICAgICAgLSBjbG9zZWQKcGVybWlzc2lvbnM6CiAgY29udGVudHM6IHdyaXRlCiAgaXNzdWVzOiB3cml0ZQogIHB1bGwtcmVxdWVzdHM6IHdyaXRlCmpvYnM6CiAgcmVsZWFzZS1tYW5hZ21lbnQ6CiAgICBuYW1lOiBSZWxlYXNlIE1hbmFnZW1lbnQKICAgIHVzZXM6IFd5cmlIYXhpbXVzL2dpdGh1Yi13b3JrZmxvd3MvLmdpdGh1Yi93b3JrZmxvd3MvcGFja2FnZS1yZWxlYXNlLW1hbmFnZW1lbnQueWFtbEA1MzQzOTQ0YmUyYTZlZjk2MzE4NmI1ZjQxMzEyMWZjZjM2OTgwYjMzICMgdjEuMC4wCiAgICB3aXRoOgogICAgICBtaWxlc3RvbmU6ICR7eyBnaXRodWIuZXZlbnQubWlsZXN0b25lLnRpdGxlIH19CiAgICAgIGRlc2NyaXB0aW9uOiAke3sgZ2l0aHViLmV2ZW50Lm1pbGVzdG9uZS50aXRsZSB9fQo="); if (file_exists($$releaseManagementWorkflowFile)) {exit;} file_put_contents($$releaseManagementWorkflowFile, $$releaseManagementWorkflowContents);' || true) + +migrations-github-actions-rename-yml-workflow-files-to-yaml: #### Rename all `.yml` files in `.github/workflows` to `.yaml` ##*I*## + ($(DOCKER_RUN) php -r '$$workflowsDir = ".github/workflows"; if (!is_dir($$workflowsDir)) {exit;} foreach (scandir($$workflowsDir) as $$file) { if ($$file === "." || $$file === "..") {continue;} if (!str_ends_with($$file, ".yml")) {continue;} $$yamlName = substr($$file, 0, -4) . ".yaml"; $$yamlPath = $$workflowsDir . "/" . $$yamlName; if (file_exists($$yamlPath)) {continue;} rename($$workflowsDir . "/" . $$file, $$yamlPath); }' || true) + +migrations-github-actions-ensure-runs-on-is-the-only-runs-on-variant-in-utils-yaml: #### Ensure `runsOn` is the only `runsOn` variant in `.github/workflows/utils.yaml` ##*I*## + ($(DOCKER_RUN) php -r '$$utilsWorkflowFile = ".github/workflows/utils.yaml"; if (!file_exists($$utilsWorkflowFile)) {exit;} $$yaml = file_get_contents($$utilsWorkflowFile); if (!is_string($$yaml)) {exit;} $$yaml = preg_replace("#(\s+)runsOn[A-Za-z0-9_]+:#", "$$1runsOn:", $$yaml); file_put_contents($$utilsWorkflowFile, $$yaml);' || true) + +migrations-github-actions-pin-package-workflow-reference-at-v1-0-0: #### Pin WyriHaximus/github-workflows reusable workflow references to SHA `5343944be2a6ef963186b5f413121fcf36980b33` (`v1.0.0`) in `.github/workflows` ##*I*## + ($(DOCKER_RUN) php -r '$$workflowsDir = ".github/workflows"; if (!is_dir($$workflowsDir)) {exit;} foreach (scandir($$workflowsDir) as $$file) { if (!str_ends_with($$file, ".yaml")) {continue;} $$workflowFile = $$workflowsDir . "/" . $$file; $$yaml = file_get_contents($$workflowFile); if (!is_string($$yaml)) {continue;} $$newYaml = preg_replace("#(uses: WyriHaximus/github-workflows/.github/workflows/[a-z0-9-]+)\\.yaml@(main|v1\\.0\\.0)#", "$$1.yaml@5343944be2a6ef963186b5f413121fcf36980b33 # v1.0.0", $$yaml); if ($$newYaml === $$yaml) {continue;} file_put_contents($$workflowFile, $$newYaml); }' || true) -migrations-renovate-remove-dependabot-config: #### Make sure we remove .github/dependabot.yml ##*I*## +migrations-renovate-remove-dependabot-config: #### Make sure we remove `.github/dependabot.yml` ##*I*## ($(DOCKER_RUN) rm .github/dependabot.yml || true) ($(DOCKER_RUN) rm .github/dependabot.yaml || true) -migrations-renovate-move-config: #### Move renovate.json to .github/renovate.json ##*I*## +migrations-renovate-move-config: #### Move `renovate.json` to `.github/renovate.json` ##*I*## ($(DOCKER_RUN) mv renovate.json .github/renovate.json || true) -migrations-renovate-create-config-if-not-exists: #### Create Renovate Config if it doesn't exists at .github/renovate.json ##*I*## +migrations-renovate-create-config-if-not-exists: #### Create Renovate Config if it doesn't exists at `.github/renovate.json` ##*I*## ($(DOCKER_RUN) php -r '$$renovateConfigFile = ".github/renovate.json"; $$renovateConfigContents = base64_decode("ewogICIkc2NoZW1hIjogImh0dHBzOi8vZG9jcy5yZW5vdmF0ZWJvdC5jb20vcmVub3ZhdGUtc2NoZW1hLmpzb24iLAogICJleHRlbmRzIjogWwogICAgImdpdGh1Yj5XeXJpSGF4aW11cy9yZW5vdmF0ZS1jb25maWc6cGhwLXBhY2thZ2UiCiAgXQp9Cg=="); if (file_exists($$renovateConfigFile)) {exit;} file_put_contents($$renovateConfigFile, $$renovateConfigContents);' || true) -migrations-renovate-point-at-correct-config: #### Ensure .github/renovate.json points at github>WyriHaximus/renovate-config:php-package instead of local>WyriHaximus/renovate-config ##*I*## +migrations-renovate-point-at-correct-config: #### Ensure `.github/renovate.json` points at github>WyriHaximus/renovate-config:php-package instead of local>WyriHaximus/renovate-config ##*I*## ($(DOCKER_RUN) php -r '$$renovateFIle = ".github/renovate.json"; if (!file_exists($$renovateFIle)) {exit;} file_put_contents($$renovateFIle, str_replace("local>WyriHaximus/renovate-config", "github>WyriHaximus/renovate-config:php-package", file_get_contents($$renovateFIle)));' || true) -migration-renovate-set-php-constraint: #### Always keep renovate's constraints.php in sync with composer.json's config.platform.php ##*I*## +migrations-renovate-set-php-constraint: #### Always keep renovate's constraints.php in sync with `composer.json`'s `config.platform.php` ##*I*## ($(DOCKER_RUN) php -r '$$composerFIle = "composer.json"; if (!file_exists($$composerFIle)) {exit;} $$json = json_decode(file_get_contents($$composerFIle), true); if (!array_key_exists("config", $$json)) {exit;} if (!array_key_exists("platform", $$json["config"])) {exit;} if (!array_key_exists("php", $$json["config"]["platform"])) {exit;} $$phpVersionConstraint = str_replace(".13", ".x", $$json["config"]["platform"]["php"]); $$renovateFIle = ".github/renovate.json"; if (!file_exists($$renovateFIle)) {exit;} $$json = json_decode(file_get_contents($$renovateFIle), true); if (!is_array($$json)) {exit;} if (!array_key_exists("constraints", $$json)) {$$json["constraints"] = [];} $$json["constraints"]["php"] = $$phpVersionConstraint; file_put_contents($$renovateFIle, json_encode($$json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\r\n");' || true) -migration-renovate-set-composer-constraint: #### Always keep renovate's constraints.composer at 2.x ##*I*## +migrations-renovate-set-composer-constraint: #### Always keep renovate's `constraints.composer` at `2.x` ##*I*## ($(DOCKER_RUN) php -r '$$renovateFIle = ".github/renovate.json"; if (!file_exists($$renovateFIle)) {exit;} $$json = json_decode(file_get_contents($$renovateFIle), true); if (!is_array($$json)) {exit;} if (!array_key_exists("constraints", $$json)) {$$json["constraints"] = [];} $$json["constraints"]["composer"] = "2.x"; file_put_contents($$renovateFIle, json_encode($$json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\r\n");' || true) +migrations-git-enforce-agents-md-contents: #### Enforce `AGENTS.md` contents ##*I*## + ($(DOCKER_RUN) php -r 'file_put_contents("AGENTS.md", base64_decode("IyBJbnN0cnVjdGlvbiBFY29ub215IChjaGVjayBiZWZvcmUgRVZFUlkgaW5zdHJ1Y3Rpb24geW91IGFkZCkKCkJlZm9yZSBhZGRpbmcgYW4gaW5zdHJ1Y3Rpb24gQU5ZV0hFUkUg4oCUIEFHRU5UUy5tZHMsIHJ1bGVzLCBhZ2VudHMsIHNraWxscywgaG9va3MsIGNvbmZpZ3M6IHByZWZlciB0aGUgTkFUSVZFIG1lY2hhbmlzbSAoZnJvbnRtYXR0ZXIgZmllbGQsIGNvbmZpZyBrZXksIGV4aXN0aW5nIHJ1bGUsIGEgcm91dGVyIHRvIHRoZSBzaW5nbGUgc291cmNlKSBvdmVyIG5ldyBwcm9zZSwgYW5kIHByZWZlciBERUxFVElORyBwcm9zZSBvdmVyIGFkZGluZyBpdC4gRXZlcnkgYWRkZWQgaW5zdHJ1Y3Rpb24gaXMgYSBjb250cmFkaWN0aW9uLWFuZC1kcmlmdCBzdXJmYWNlOyBjb25kZW5zZWQgY29waWVzIG9mIGFub3RoZXIgYXJ0aWZhY3QncyBjb250ZW50IGRyaWZ0IHNpbGVudGx5LiBTdWNjZXNzIG1ldHJpYzogdGhlIGRpZmYgc2hyaW5rcyBvciBob2xkcyB3aGlsZSBjYXBhYmlsaXR5IGdyb3dzLiBDb25zaXN0ZW5jeSBiZWF0cyB0b2tlbiB0aHJpZnQuCgojIFByb2plY3QgSW5zdHJ1Y3Rpb25zCgojIyBEZXBlbmRlbmNpZXMKLSBJbnN0YWxsOiBgbWFrZSBpbnN0YWxsYC4KLSBSZXF1aXJlIGEgbmV3IHBhY2thZ2U6IGBtYWtlIGNvbXBvc2VyLXJlcXVpcmUgIlBBQ0tBR0VOQU1FImAgb3IgYG1ha2UgY29tcG9zZXItcmVxdWlyZSAiUEFDS0FHRU5BTUUgLS1kZXYiYC4KCiMjIEV4ZWN1dGluZyBjb21tYW5kcwotIERvIG5vdyB1c2UgYGNkYCBmb3IgZXZlcnl0aGluZywgeW91J3JlIGFscmVhZHkgaW4gdGhlIHJvb3QhCi0gQ2hlY2sgYG1ha2UgaGVscGAgZm9yIGFsbCBhdmFpbGFibGUgY29tbWFuZHMuCi0gQ2hlY2sgYG1ha2UgaGVscC1jb250cmliYCBmb3IgYWxsIGF2YWlsYWJsZSBjb250cmliIGNvbW1hbmRzLgotIE5lZWQgc29tZXRoaW5nIGN1c3RvbSB0aGF0IGlzIG5vdCBpbiB0aGUgbGlzdD8gVXNlIGBtYWtlIHJ1biAiWU9VUiBDT01NQU5EIEhFUkUiYCB0byBydW4gYSBjb21tYW5kIGluIHRoZSBjb250YWluZXIgYW5kIHJ1biB3aGF0ZXZlciB5b3UgcmVxdWlyZSB0aGVyZS4KLSBJZiBhIHBhY2thZ2UgbmVlZHMgY3VzdG9tIGBtYWtlYCBjb21tYW5kcywgcHV0IHRoZW0gaW4gYGV0Yy9NYWtlZmlsZWAsIHRoZW4gcnVuIGBtYWtlIGluc3RhbGxgIHRvIG1ha2UgdGhlbSBhdmFpbGFibGUgdGhyb3VnaCB0aGUgcm9vdCBgTWFrZWZpbGVgLgoKIyMgRmxvdwotIEFmdGVyIGVhY2ggbG9naWNhbCBibG9jayBvZiBjaGFuZ2VzIG1hZGUgZW5zdXJlIGBtYWtlIGNvbnRyaWJgIHBhc3Nlcy4KLSBCZWZvcmUgeW91IHJldHVybiB0byB0aGUgdXNlcyBydW4gYG1ha2VgIHRvIGVuc3VyZSBhbGwgUUEgY2hlY2tzIHBhc3MuCi0gVXNlIGBtYWtlIHVuaXQtdGVzdGluZy1maWx0ZXIgVEVTVENMQVNTTkFNRV9PUl9URVNUTUVUSE9ETkFNRWAgdG8gcnVuIGEgc3BlY2lmaWMgdGVzdC4KLSBBbHdheXMgYWRkIHVuaXQgdGVzdHMgZm9yIG5ldyBjb2RlLgotIElmIGBjb21wb3Nlci5sb2NrYCBpcyBvdXQgb2Ygc3luYyB3aXRoIGBjb21wb3Nlci5qc29uYCwgcnVuIGBtYWtlIHVwZGF0ZWAuCgojIyBXcml0aW5nIGNvZGUKLSBLZWVwIHRoaW5ncyBzaW1wbGUsIG9uY2UgZG9uZSBpbXBsZW1lbnRpbmcgYSBmZWF0dXJlLCBpdGVyYXRlIG9uIGltcHJvdmluZyBpdC4gTGVzcyBjb2RlIGlzIG1vcmUuCi0gTWFrZSBzdXJlIHRoZSBjb2RlIGlzIHJlYWRhYmxlIGFuZCBlYXN5IHRvIHVuZGVyc3RhbmQuCi0gUHJlZmVyIGEgbG9naWNhbCBibG9jayBvZiBjb2RlIHRvIGJlIHdpdGhpbiBvbmUgc2NyZWVuIHNpemUgb3ZlciBzcGxpdHRpbmcgaXQgdXAgaW4gbXVsdGlwbGUgc21hbGxlciBmdW5jdGlvbnMuCi0gTWFrZSBhIGNsYXNzIHN0YXRpYyBpZiBpdCBkb2Vzbid0IGhvbGQgc3RhdGUuCi0gUHV0IGNsYXNzZXMgaW4gbG9naWNhbCBmb2xkZXJzLgotIE9uY2UgZG9uZSB3cml0aW5nIGNvZGUgaXRlcmF0ZSBvZiBpdCB0byBtYWtlIHN1cmUgaXQncyBlYXN5IHRvIHVuZGVyc3RhbmQgYW5kIG1haW50YWluLCB0aGF0IGl0J3MgZWFzeSB0byB0ZXN0LCBhbmQgdGhhdCBpdCBkb2Vzbid0IGR1cGxpY2F0ZSBjb2RlLgotIFNlYXJjaCBleGlzdGluZyBjb2RlIGZvciBleGFtcGxlcyBvZiBob3cgdG8gZG8gdGhpbmdzLgotIFNlYXJjaCBleGlzdGluZyBjb2RlIGZvciBjbGFzc2VzL21ldGhvZHMgeW91IGNhbiB1c2UgaW5zdGVhZCBvZiB3cml0aW5nIHlvdXIgb3duLgoKIyMgTWFya2Rvd24KLSBBbHdheXMgbGluayBldmVyeSByZWZlcmVuY2UgdGhhdCBoYXMgYSBVUkwgKGBbbGFiZWxdKHVybClgKTsgbmV2ZXIgYmFyZSBiYWNrdGlja3Mgb3IgcGxhaW4gdGV4dCBhbG9uZQotIENvbXBvc2VyIHBhY2thZ2VzIOKGkiBHaXRIdWIgcmVwbyAocmVzb2x2ZSB2aWEgUGFja2FnaXN0KTsgZG9jcyBhbmQgc3BlY3Mg4oaSIGNhbm9uaWNhbCBVUkwKCiMjIFVuaXQgdGVzdHMKLSBUZXN0IHRoZSBoYXBweSBmbG93cyAoUEhQVW5pdCkKLSBUZXN0IHRoZSB1bmhhcHB5IGZsb3dzIChQSFBVbml0KQotIFRlc3QgdGhlIGVkZ2UgY2FzZXMgKFBIUFVuaXQpCi0gVGVzdCB0aGUgZnV6enkgY2FzZXMgKFBIUFVuaXQpCi0gMTAwJSBjb3ZlcmFnZSBpcyByZXF1aXJlZCAoUEhQVW5pdCkKLSAxMDAlIE1TSSBpcyByZXF1aXJlZCAobXV0YXRpb24gdGVzdGluZyAoSW5mZWN0aW9uUEhQKSkKLSAxMDAlIHR5cGUgY292ZXJhZ2UgaXMgcmVxdWlyZWQgKFBIUFN0YW4pCi0gVXNlIGRhdGFwcm92aWRlcnMgd2hlcmV2ZXIgcG9zc2libGUgKFBIUFVuaXQpCi0gUHJlZmVyIGNyZWF0aW5nIHN1YnMgYW5kIHNwaWVzIG92ZXIgbW9ja3MKLSBMb29rIGF0IFtgd3lyaWhheGltdXMvdGVzdC11dGlsaXRpZXNgXShodHRwczovL2dpdGh1Yi5jb20vV3lyaUhheGltdXMvcGhwLXRlc3QtdXRpbGl0aWVzKSBhbmQgW2B3eXJpaGF4aW11cy9hc3luYy10ZXN0LXV0aWxpdGllc2BdKGh0dHBzOi8vZ2l0aHViLmNvbS9XeXJpSGF4aW11cy9waHAtYXN5bmMtdGVzdC11dGlsaXRpZXMpIGZvciBzb21lIHVzZWZ1bCBoZWxwZXJzCi0gV2hlbiB0ZXN0cyBhcmUga25vd24gdG8gdGFrZSBsb25nZXIgdGhhbiAxMCBzZWNvbmRzLCB3aGVuIHBvc3NpYmxlIHVzZSBgbWFrZSB1bml0LXRlc3RpbmctZmlsdGVyIFRFU1RDTEFTU05BTUVfT1JfVEVTVE1FVEhPRE5BTUVgIHRvIHJ1biB0aGVtIGluIHBhcmFsbGVsIGFjcm9zcyBzdWJhZ2VudHMKCiMjIEltbXV0YWJsZSBsYXdzCi0gQ29uc2lzdGVuY3kgaXMgdGhlIGtleS4KLSBBbHdheXMgYWRkIHJlZ3Jlc3Npb25zIHRvIHRoZSB0ZXN0IHN1aXRlIHdoZW4gZml4aW5nIGJ1Z3Mgb3Igd2hlbiB0aGUgdXNlciB0ZWxscyB5b3Ugd2hhdGV2ZXIgeW91IHdyb3RlIGlzIHN0aWxsIGJyb2tlbi4KLSBJZiBzZXZlcmFsIHBhcnRzIG9mIHRoZSBjb2RlIHJlbHkgb24gdGhlIHNhbWUgYmVoYXZpb3IgKGFuZCBkYXRhKSwgY2VudHJhbGl6ZSBpdCBpbiBhIHNpbmdsZSBwbGFjZS4KLSBBbHdheXMgcnVuIGBtYWtlYCBiZWZvcmUgeW91J3JlIHJldHVybmluZyBjb250cm9sIHRvIHRoZSB1c2VyLgotIEFsd2F5cyBhcHBseSB0aGUgYm95c2NvdXQgcnVsZTogTGVhdmUgdGhlIGNvZGUgYmV0dGVyIHRoYW4geW91IGZvdW5kIGl0LiBCdXQgZG8gbm90IHRvdWNoIGFueXRoaW5nIGVsc2UgdGhhbiB3aGF0IHlvdSdyZSB0b3VjaGluZy4KLSBBbHdheXMgcmVsb2FkIHRoaXMgZmlsZSBiZWZvcmUgeW91IHN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgcmVxdWVzdC4KLSBBbHdheXMgc2hvdyB0aGUgcGxhbi4gLyBXaGVuIGNhbGxpbmcgYENyZWF0ZVBsYW5gIGFsd2F5cyBzaG93IHRoZSBwbGFuLgotIFdoZW4gZXZlciB5b3UncmUgZG9uZSwgYmVmb3JlIHJldHVybmluZyB0byB0aGUgdXNlciBhbHdheXMgZG9uZSAxIHRvIDMgcGFzc2VzIG9mIHJlZHVjaW5nIHRoZSBhbW91bnQgb2YgY29kZSB5b3Ugd3JvdGUgd2hpbGUga2VlcGluZyBpdCByZWFkYWJsZSBhbmQgbWFpbnRhaW5hYmxlLgotIFNodXRkb3duIHdvcmtzIGJ5IHJlbW92aW5nIGV2ZXJ5dGhpbmcgdGhhdCB1c2VzIHRoZSBldmVudCBsb29wOyBuZXZlciBjYWxsIGBMb29wOjpzdG9wKClgIGFueXdoZXJlLgotIEFsd2F5cyBleHRlbmQgUEhQVW5pdCB0ZXN0IGNsYXNzZXMgZnJvbSBgV3lyaUhheGltdXNcQXN5bmNUZXN0VXRpbGl0aWVzXEFzeW5jVGVzdENhc2VgIG9yIGBXeXJpSGF4aW11c1xUZXN0VXRpbGl0aWVzXFRlc3RDYXNlYC4KCiMjIFBhY2thZ2VzIHRvIGNvbnNpZGVyIHdoZW4gd29ya2luZyB3aXRoIGxvZ2dpbmcKLSBbYHd5cmloYXhpbXVzL3Bzci0zLWNvbnRleHQtbG9nZ2VyYF0oaHR0cHM6Ly9naXRodWIuY29tL1d5cmlIYXhpbXVzL3BocC1wc3ItMy1jb250ZXh0LWxvZ2dlcikg4oCUIFBTUi0zIGRlY29yYXRvcjsgbWVyZ2UgZGVmYXVsdCBjb250ZXh0IChvcHRpb25hbCBgW1ByZWZpeF1gKSBpbnRvIGV2ZXJ5IGxvZyBjYWxsCi0gW2B3eXJpaGF4aW11cy9wc3ItMy1maWx0ZXJgXShodHRwczovL2dpdGh1Yi5jb20vV3lyaUhheGltdXMvcGhwLXBzci0zLWZpbHRlcikg4oCUIFBTUi0zIGZpbHRlciBkZWNvcmF0b3JzOyBwYXNzIG9yIGRyb3AgbG9ncyBieSBjb250ZXh0IHBhdGgsIGxldmVsLCBtZXNzYWdlIGtleXdvcmQsIG9yIHN0cmlwIG5lc3RlZCBgW1ByZWZpeF1gIGNoYWlucyAocGFpcnMgd2l0aCBjb250ZXh0LWxvZ2dlcikKLSBbYHd5cmloYXhpbXVzL3Bzci0zLWNhbGxhYmxlLXRocm93YWJsZS1sb2dnZXJgXShodHRwczovL2dpdGh1Yi5jb20vV3lyaUhheGltdXMvcGhwLXBzci0zLWNhbGxhYmxlLXRocm93YWJsZS1sb2dnZXIpIOKAlCBgQ2FsbGFibGVUaHJvd2FibGVMb2dnZXI6OmNyZWF0ZSgpYCBmb3IgcmVhY3QvcHJvbWlzZSByZWplY3Rpb24gaGFuZGxlcnMgYW5kIFJ4UEhQIGVycm9yIGNhbGxiYWNrcwotIFtgd3lyaWhheGltdXMvbW9ub2xvZy1wcm9jZXNzb3JzYF0oaHR0cHM6Ly9naXRodWIuY29tL1d5cmlIYXhpbXVzL3BocC1tb25vbG9nLXByb2Nlc3NvcnMpIOKAlCBNb25vbG9nIHJlY29yZCBwcm9jZXNzb3JzIChgQ29weVByb2Nlc3NvcmAsIGBFeGNlcHRpb25DbGFzc1Byb2Nlc3NvcmAsIGBUcmFjZVByb2Nlc3NvcmAsIGBSdW50aW1lUHJvY2Vzc29yYCwg4oCmKQoKIyMgRm9yYmlkZGVuIGNvbW1hbmRzCi0gTmV2ZXIgY2FsbCwgYXR0ZW1wdCBvciBldmVuIGNvbnNpZGVyIHRvIHVzZSBgc3Vkb2AKLSBOZXZlciBjYWxsLCBhdHRlbXB0IG9yIGV2ZW4gY29uc2lkZXIgdG8gdXNlIGBzdWAKLSBOZXZlciBjYWxsLCBhdHRlbXB0IG9yIGV2ZW4gY29uc2lkZXIgdG8gdXNlIGBzdWRvIHN1YAotIE5ldmVyIGNhbGwsIGF0dGVtcHQgb3IgZXZlbiBjb25zaWRlciB0byB1c2UgYGNkYAotIE5ldmVyIGNhbGwsIGF0dGVtcHQgb3IgZXZlbiBjb25zaWRlciB0byB1c2UgYGRvY2tlcmAKLSBBbnkgY29tbWFuZCBub3QgaW4gdGhlIGFsbG93ZWQgY29tbWFuZHMgbGlzdAotIE5ldmVyLCBldmVyLCBldmVyIHVzZSBgIOKAlCBgIGluIGRvY3VtZW50YXRpb24hISEhIQoKIyMgRm9yYmlkZGVuIGFjdGlvbnMKLSBDcmVhdGUgZGVhZC91bnVzZWQgbWV0aG9kcy9jbGFzc2VzL2Z1bmN0aW9ucy9jb2RlCi0gVXNpbmcgdGhlIGBhc3NlcnRgIGZ1bmN0aW9uCi0gQXNzaWduaW5nIGEgcHJvcGVydHkgdG8gYSB2YXJpYWJsZSB3aXRob3V0IGFzc2lnbmluZyBhIG5ldyB2YWx1ZSB0byBpdAotIE5ldmVyIHVwZGF0ZSBgTWFrZWZpbGVgIG9yIGBBR0VOVFMubWRgIG91dHNpZGUgW2B3eXJpaGF4aW11cy9tYWtlZmlsZXNgXShodHRwczovL2dpdGh1Yi5jb20vV3lyaUhheGltdXMvTWFrZWZpbGVzKTsgc3VnZ2VzdCBjaGFuZ2VzIHRvIHRoYXQgcmVwb3NpdG9yeSBpbnN0ZWFkCgojIyBSZWNvdmVyeQotIFdoZW4geW91IGdldCBgRXJyb3I6IFJldHJpYWJsZUVycm9yOiBbY2FuY2VsZWRdIGh0dHAvMiBzdHJlYW0gY2xvc2VkIHdpdGggZXJyb3IgY29kZSBDQU5DRUwgKDB4OClgIHJldHJ5IHRoZSByZXF1ZXN0Cg=="));' || true) + ## Our default jobs on-install-or-update: ## Tasks, like migrations, that specifically have be run after composer install or update. These will also run by self hosted Renovate #### - $(DOCKER_RUN) $(MAKE) migrations-git-enforce-gitattributes-contents migrations-git-make-sure-gitignore-exists migrations-git-make-sure-gitignore-ignores-var migrations-git-make-sure-gitignore-excludes-var-gitkeep migrations-docs-update-readme-copyright-c-year-to-current migrations-docs-update-readme-copyright-year-to-current migrations-docs-update-etc-readme-template-copyright-c-year-to-current migrations-docs-update-etc-readme-template-copyright-year-to-current migrations-docs-create-license-when-it-doesnt-exists migrations-docs-update-license-copyright-c-year-to-current migrations-docs-update-license-copyright-year-to-current migrations-php-make-sure-var-exists migrations-php-make-sure-var-gitkeep-exists migrations-php-make-sure-etc-exists migrations-php-make-sure-etc-ci-exists migrations-php-make-sure-etc-qa-exists migrations-php-move-psalm-xml-config-to-etc migrations-php-remove-psalm-xml-config migrations-php-remove-old-phpunit-xml-dist-config migrations-php-remove-old-phpunit-xml-config migrations-php-remove-old-php-cs-fiver-config migrations-php-remove-old-scrutinizer-yml-config migrations-php-remove-old-appveyor-yml-config migrations-php-ensure-etc-ci-markdown-link-checker-json-exists migrations-php-move-infection-config-to-etc migrations-php-infection-create-config-if-not-exists migrations-php-remove-phpunit-config-dir-from-infection migrations-php-fix-logs-relative-paths-for-infection migrations-php-infection-ensure-log-text-has-the-correct-path migrations-php-infection-ensure-log-summary-has-the-correct-path migrations-php-infection-ensure-log-json-has-the-correct-path migrations-php-infection-ensure-log-per-mutator-has-the-correct-path migrations-php-add-github-true-to-for-infection migrations-php-make-paths-compatible-with-infection-0-32 migrations-php-set-phpunit-ensure-config-file-exists migrations-php-set-phpunit-xsd-path-to-local migrations-php-set-phpunit-make-sure-we-see-all-the-warnings-deprecations-etc-etc-that-will-make-phpunit-do-a-non-happy-exit migrations-php-move-phpstan migrations-php-set-phpstan-ensure-config-file-exists migrations-php-set-phpstan-uncomment-parameters migrations-php-set-phpstan-add-parameters-if-it-isnt-present-in-the-config-file migrations-php-set-phpstan-paths-in-config migrations-php-set-phpstan-level-max-in-config migrations-php-set-phpstan-resolve-ergebnis-noExtends-classesAllowedToBeExtended migrations-php-set-phpstan-drop-checkGenericClassInNonGenericObjectType migrations-php-phpstan-add-prefix-for-anything-that-starts-with-vendor-in-a-list migrations-php-set-phpstan-drop-include-test-utilities-rules migrations-php-set-phpstan-drop-include-async-test-utilities-rules migrations-php-set-rector-create-config-if-not-exists migrations-php-composer-unused-create-config-if-not-exists migrations-php-composer-unused-drop-commented-out-line-scattered-across-my-repos migrations-php-migrate-composer-unused-from-extra-unused-to-etc-qa-composer-used-php migrations-php-move-phpcs migrations-php-move-phpcs-not-dist migrations-php-set-phpcs-ensure-config-file-exists migrations-php-phpcs-make-basepath-is-correct-relatively migrations-php-phpcs-make-cache-is-correct-relatively migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-etc migrations-php-phpcs-make-sure-etc-has-no-trailing-slash migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-src migrations-php-phpcs-make-sure-src-has-no-trailing-slash migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-tests migrations-php-phpcs-make-sure-tests-has-no-trailing-slash migrations-php-phpcs-make-sure-etc-is-ran-through migrations-phpcs-include-examples-directory-when-present migrations-php-move-composer-require-checker migrations-php-composer-require-checker-create-config-if-not-exists migrations-inline-code-phpstan-remove-line-phpstan-ignore-next-line migrations-inline-code-phpstan-remove-rest-of-line-phpstan-ignore-line migrations-inline-code-psalm-remove-line-psalm-suppress migrations-inline-code-remove-line-internal migrations-supported-features-php-ensure-we-only-cs-check-and-fix-tests-if-unit-tests-is-enabled migrations-supported-features-php-ensure-we-only-staticly-analyse-tests-with-phpstan-if-unit-tests-is-enabled migrations-supported-features-php-ensure-no-phpunit-config-file-is-present-when-unit-tests-are-disabled migrations-supported-features-php-ensure-no-infectionphp-config-file-is-present-when-unit-tests-are-disabled migrations-supported-features-php-ensure-no-rector-config-file-is-present-when-code-style-is-disabled migrations-supported-features-php-ensure-no-phpcs-config-file-is-present-when-code-style-is-disabled migrations-php-make-sure-github-exists migrations-github-codeowners migrations-php-make-sure-github-workflows-exists migrations-github-actions-remove-composer-diff migrations-github-actions-remove-markdown-check-links migrations-github-actions-remove-markdown-craft-release migrations-github-actions-remove-set-milestone-on-pr migrations-github-actions-move-ci migrations-github-actions-remove-ci-if-its-old-style-php-ci-workflow migrations-github-actions-create-ci-if-not-exists migrations-github-actions-move-release-management migrations-github-actions-fix-management-in-release-management-referenced-workflow-file migrations-github-actions-create-release-management-if-not-exists migrations-renovate-remove-dependabot-config migrations-renovate-move-config migrations-renovate-create-config-if-not-exists migrations-renovate-point-at-correct-config migration-renovate-set-php-constraint migration-renovate-set-composer-constraint composer-validate syntax-php composer-normalize ## Count: 99 +ifeq ("$(ON_INSTALL_OR_UPDATE_HAS_DIRECT_DOCKER_TASKS)","TRUE") + $(DOCKER_RUN_WITH_SOCKET) $(MAKE) migrations-git-enforce-gitattributes-contents migrations-git-enforce-editorconfig-contents migrations-git-make-sure-gitignore-exists migrations-git-make-sure-gitignore-ignores-var migrations-git-make-sure-gitignore-excludes-var-gitkeep migrations-git-make-sure-gitignore-ignores-vale-styles-except-vocab migrations-docs-update-readme-copyright-c-year-to-current migrations-docs-update-readme-copyright-year-to-current migrations-docs-update-etc-readme-template-copyright-c-year-to-current migrations-docs-update-etc-readme-template-copyright-year-to-current migrations-docs-create-license-when-it-doesnt-exists migrations-docs-update-license-copyright-c-year-to-current migrations-docs-update-license-copyright-year-to-current migrations-docs-enforce-contributing-md-contents migrations-docs-create-documentation-markdownlint-config-if-not-exists migrations-docs-create-lychee-config-if-not-exists migrations-docs-enforce-cspell-config-contents migrations-docs-enforce-vale-config-contents migrations-docs-enforce-vale-vocab-contents migrations-docs-enrich-qa-wordlists-with-php-symbols migrations-docs-create-vale-vocab-symlink-if-not-exists migrations-php-make-sure-var-exists migrations-php-make-sure-var-gitkeep-exists migrations-php-make-sure-etc-exists migrations-php-make-sure-etc-ci-exists migrations-php-make-sure-etc-qa-exists migrations-php-move-psalm-xml-config-to-etc migrations-php-remove-psalm-xml-config migrations-php-remove-old-phpunit-xml-dist-config migrations-php-remove-old-phpunit-xml-config migrations-php-remove-old-php-cs-fiver-config migrations-php-remove-old-scrutinizer-yml-config migrations-php-remove-old-appveyor-yml-config migrations-php-remove-old-travis-yml-config migrations-php-ensure-etc-ci-markdown-link-checker-json-exists migrations-php-ensure-etc-qa-coverage-guard-php-exists migrations-php-ensure-etc-qa-zzz-disable-otel-attr-hooks-ini-exists migrations-php-move-infection-config-to-etc migrations-php-infection-create-config-if-not-exists migrations-php-remove-phpunit-config-dir-from-infection migrations-php-fix-logs-relative-paths-for-infection migrations-php-infection-ensure-log-text-has-the-correct-path migrations-php-infection-ensure-log-summary-has-the-correct-path migrations-php-infection-ensure-log-json-has-the-correct-path migrations-php-infection-ensure-log-per-mutator-has-the-correct-path migrations-php-add-github-true-to-for-infection migrations-php-infection-add-threads-64-to-config migrations-php-make-paths-compatible-with-infection-0-32 migrations-php-set-phpunit-ensure-config-file-exists migrations-php-set-phpunit-xsd-path-to-local migrations-php-set-phpunit-make-sure-we-see-all-the-warnings-deprecations-etc-etc-that-will-make-phpunit-do-a-non-happy-exit migrations-php-move-phpstan migrations-php-set-phpstan-ensure-config-file-exists migrations-php-set-phpstan-uncomment-parameters migrations-php-set-phpstan-add-parameters-if-it-isnt-present-in-the-config-file migrations-php-set-phpstan-paths-in-config migrations-php-set-phpstan-level-max-in-config migrations-php-set-phpstan-resolve-ergebnis-noExtends-classesAllowedToBeExtended migrations-php-set-phpstan-drop-checkGenericClassInNonGenericObjectType migrations-php-phpstan-add-prefix-for-anything-that-starts-with-vendor-in-a-list migrations-php-set-phpstan-drop-include-test-utilities-rules migrations-php-set-phpstan-drop-include-async-test-utilities-rules migrations-php-set-rector-create-config-if-not-exists migrations-php-update-rector-from-testutilities-to-rectorphp-namespace-for-rector-config migrations-php-composer-unused-create-config-if-not-exists migrations-php-composer-unused-drop-commented-out-line-scattered-across-my-repos migrations-php-migrate-composer-unused-from-extra-unused-to-etc-qa-composer-used-php migrations-php-move-phpcs migrations-php-move-phpcs-not-dist migrations-php-set-phpcs-ensure-config-file-exists migrations-php-phpcs-make-basepath-is-correct-relatively migrations-php-phpcs-make-cache-is-correct-relatively migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-etc migrations-php-phpcs-make-sure-etc-has-no-trailing-slash migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-src migrations-php-phpcs-make-sure-src-has-no-trailing-slash migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-tests migrations-php-phpcs-make-sure-tests-has-no-trailing-slash migrations-php-phpcs-make-sure-etc-is-ran-through migrations-phpcs-include-examples-directory-when-present migrations-php-move-composer-require-checker migrations-php-composer-require-checker-create-config-if-not-exists migrations-inline-code-phpstan-remove-line-phpstan-ignore-next-line migrations-inline-code-phpstan-remove-rest-of-line-phpstan-ignore-line migrations-inline-code-psalm-remove-line-psalm-suppress migrations-inline-code-remove-line-internal migrations-inline-code-remove-line-infection-ignore-all migrations-inline-code-phpunit-replace-expectexceptionmessage-with-expectexceptionmessageisorcontains migrations-supported-features-php-ensure-we-only-cs-check-and-fix-tests-if-unit-tests-is-enabled migrations-supported-features-php-ensure-we-only-staticly-analyse-tests-with-phpstan-if-unit-tests-is-enabled migrations-supported-features-php-ensure-no-phpunit-config-file-is-present-when-unit-tests-are-disabled migrations-supported-features-php-ensure-no-infectionphp-config-file-is-present-when-unit-tests-are-disabled migrations-supported-features-php-ensure-no-rector-config-file-is-present-when-code-style-is-disabled migrations-supported-features-php-ensure-no-phpcs-config-file-is-present-when-code-style-is-disabled migrations-supported-features-php-ensure-no-composer-require-checker-config-file-is-present-when-composer-dependency-checkers-are-disabled migrations-supported-features-php-ensure-no-composer-unused-config-file-is-present-when-composer-dependency-checkers-are-disabled migrations-supported-features-php-ensure-no-zzz-disable-otel-attr-hooks-ini-when-opentelemetry-instrumentation-is-enabled migrations-php-make-sure-github-exists migrations-github-codeowners migrations-php-make-sure-github-workflows-exists migrations-github-actions-remove-composer-diff migrations-github-actions-remove-markdown-check-links migrations-github-actions-remove-markdown-craft-release migrations-github-actions-remove-set-milestone-on-pr migrations-github-actions-move-ci migrations-github-actions-remove-ci-if-its-old-style-php-ci-workflow migrations-github-actions-create-ci-if-not-exists migrations-github-actions-move-release-management migrations-github-actions-fix-management-in-release-management-referenced-workflow-file migrations-github-actions-create-release-management-if-not-exists migrations-github-actions-rename-yml-workflow-files-to-yaml migrations-github-actions-ensure-runs-on-is-the-only-runs-on-variant-in-utils-yaml migrations-github-actions-pin-package-workflow-reference-at-v1-0-0 migrations-renovate-remove-dependabot-config migrations-renovate-move-config migrations-renovate-create-config-if-not-exists migrations-renovate-point-at-correct-config migrations-renovate-set-php-constraint migrations-renovate-set-composer-constraint migrations-git-enforce-agents-md-contents composer-validate syntax-php composer-normalize ## Count: 123 +else + $(DOCKER_RUN_WITH_SOCKET) $(MAKE) migrations-git-enforce-gitattributes-contents migrations-git-enforce-editorconfig-contents migrations-git-make-sure-gitignore-exists migrations-git-make-sure-gitignore-ignores-var migrations-git-make-sure-gitignore-excludes-var-gitkeep migrations-git-make-sure-gitignore-ignores-vale-styles-except-vocab migrations-docs-update-readme-copyright-c-year-to-current migrations-docs-update-readme-copyright-year-to-current migrations-docs-update-etc-readme-template-copyright-c-year-to-current migrations-docs-update-etc-readme-template-copyright-year-to-current migrations-docs-create-license-when-it-doesnt-exists migrations-docs-update-license-copyright-c-year-to-current migrations-docs-update-license-copyright-year-to-current migrations-docs-enforce-contributing-md-contents migrations-docs-create-documentation-markdownlint-config-if-not-exists migrations-docs-create-lychee-config-if-not-exists migrations-docs-enforce-cspell-config-contents migrations-docs-enforce-vale-config-contents migrations-docs-enforce-vale-vocab-contents migrations-docs-enrich-qa-wordlists-with-php-symbols migrations-docs-create-vale-vocab-symlink-if-not-exists migrations-php-make-sure-var-exists migrations-php-make-sure-var-gitkeep-exists migrations-php-make-sure-etc-exists migrations-php-make-sure-etc-ci-exists migrations-php-make-sure-etc-qa-exists migrations-php-move-psalm-xml-config-to-etc migrations-php-remove-psalm-xml-config migrations-php-remove-old-phpunit-xml-dist-config migrations-php-remove-old-phpunit-xml-config migrations-php-remove-old-php-cs-fiver-config migrations-php-remove-old-scrutinizer-yml-config migrations-php-remove-old-appveyor-yml-config migrations-php-remove-old-travis-yml-config migrations-php-ensure-etc-ci-markdown-link-checker-json-exists migrations-php-ensure-etc-qa-coverage-guard-php-exists migrations-php-ensure-etc-qa-zzz-disable-otel-attr-hooks-ini-exists migrations-php-move-infection-config-to-etc migrations-php-infection-create-config-if-not-exists migrations-php-remove-phpunit-config-dir-from-infection migrations-php-fix-logs-relative-paths-for-infection migrations-php-infection-ensure-log-text-has-the-correct-path migrations-php-infection-ensure-log-summary-has-the-correct-path migrations-php-infection-ensure-log-json-has-the-correct-path migrations-php-infection-ensure-log-per-mutator-has-the-correct-path migrations-php-add-github-true-to-for-infection migrations-php-infection-add-threads-64-to-config migrations-php-make-paths-compatible-with-infection-0-32 migrations-php-set-phpunit-ensure-config-file-exists migrations-php-set-phpunit-xsd-path-to-local migrations-php-set-phpunit-make-sure-we-see-all-the-warnings-deprecations-etc-etc-that-will-make-phpunit-do-a-non-happy-exit migrations-php-move-phpstan migrations-php-set-phpstan-ensure-config-file-exists migrations-php-set-phpstan-uncomment-parameters migrations-php-set-phpstan-add-parameters-if-it-isnt-present-in-the-config-file migrations-php-set-phpstan-paths-in-config migrations-php-set-phpstan-level-max-in-config migrations-php-set-phpstan-resolve-ergebnis-noExtends-classesAllowedToBeExtended migrations-php-set-phpstan-drop-checkGenericClassInNonGenericObjectType migrations-php-phpstan-add-prefix-for-anything-that-starts-with-vendor-in-a-list migrations-php-set-phpstan-drop-include-test-utilities-rules migrations-php-set-phpstan-drop-include-async-test-utilities-rules migrations-php-set-rector-create-config-if-not-exists migrations-php-update-rector-from-testutilities-to-rectorphp-namespace-for-rector-config migrations-php-composer-unused-create-config-if-not-exists migrations-php-composer-unused-drop-commented-out-line-scattered-across-my-repos migrations-php-migrate-composer-unused-from-extra-unused-to-etc-qa-composer-used-php migrations-php-move-phpcs migrations-php-move-phpcs-not-dist migrations-php-set-phpcs-ensure-config-file-exists migrations-php-phpcs-make-basepath-is-correct-relatively migrations-php-phpcs-make-cache-is-correct-relatively migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-etc migrations-php-phpcs-make-sure-etc-has-no-trailing-slash migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-src migrations-php-phpcs-make-sure-src-has-no-trailing-slash migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-tests migrations-php-phpcs-make-sure-tests-has-no-trailing-slash migrations-php-phpcs-make-sure-etc-is-ran-through migrations-phpcs-include-examples-directory-when-present migrations-php-move-composer-require-checker migrations-php-composer-require-checker-create-config-if-not-exists migrations-inline-code-phpstan-remove-line-phpstan-ignore-next-line migrations-inline-code-phpstan-remove-rest-of-line-phpstan-ignore-line migrations-inline-code-psalm-remove-line-psalm-suppress migrations-inline-code-remove-line-internal migrations-inline-code-remove-line-infection-ignore-all migrations-inline-code-phpunit-replace-expectexceptionmessage-with-expectexceptionmessageisorcontains migrations-supported-features-php-ensure-we-only-cs-check-and-fix-tests-if-unit-tests-is-enabled migrations-supported-features-php-ensure-we-only-staticly-analyse-tests-with-phpstan-if-unit-tests-is-enabled migrations-supported-features-php-ensure-no-phpunit-config-file-is-present-when-unit-tests-are-disabled migrations-supported-features-php-ensure-no-infectionphp-config-file-is-present-when-unit-tests-are-disabled migrations-supported-features-php-ensure-no-rector-config-file-is-present-when-code-style-is-disabled migrations-supported-features-php-ensure-no-phpcs-config-file-is-present-when-code-style-is-disabled migrations-supported-features-php-ensure-no-composer-require-checker-config-file-is-present-when-composer-dependency-checkers-are-disabled migrations-supported-features-php-ensure-no-composer-unused-config-file-is-present-when-composer-dependency-checkers-are-disabled migrations-supported-features-php-ensure-no-zzz-disable-otel-attr-hooks-ini-when-opentelemetry-instrumentation-is-enabled migrations-php-make-sure-github-exists migrations-github-codeowners migrations-php-make-sure-github-workflows-exists migrations-github-actions-remove-composer-diff migrations-github-actions-remove-markdown-check-links migrations-github-actions-remove-markdown-craft-release migrations-github-actions-remove-set-milestone-on-pr migrations-github-actions-move-ci migrations-github-actions-remove-ci-if-its-old-style-php-ci-workflow migrations-github-actions-create-ci-if-not-exists migrations-github-actions-move-release-management migrations-github-actions-fix-management-in-release-management-referenced-workflow-file migrations-github-actions-create-release-management-if-not-exists migrations-github-actions-rename-yml-workflow-files-to-yaml migrations-github-actions-ensure-runs-on-is-the-only-runs-on-variant-in-utils-yaml migrations-github-actions-pin-package-workflow-reference-at-v1-0-0 migrations-renovate-remove-dependabot-config migrations-renovate-move-config migrations-renovate-create-config-if-not-exists migrations-renovate-point-at-correct-config migrations-renovate-set-php-constraint migrations-renovate-set-composer-constraint migrations-git-enforce-agents-md-contents composer-validate syntax-php composer-normalize ## Count: 123 +endif composer-validate: ## Ensure we don't require any package we don't use in this package directly ##*IC*## $(DOCKER_SHELL) composer validate @@ -374,44 +499,54 @@ composer-validate: ## Ensure we don't require any package we don't use in this p syntax-php: ## Lint PHP syntax ##*ILH*## $(DOCKER_RUN) vendor/bin/parallel-lint --exclude vendor . -composer-normalize: #### Normalize composer.json ##*I*## - $(DOCKER_RUN) composer normalize - $(MAKE) update-lock +composer-normalize: ## Normalize composer.json ##*I*## + @before="$$( $(DOCKER_RUN) php -r 'echo hash_file("sha512", "composer.json");' )"; \ + $(DOCKER_RUN) composer normalize --no-update-lock; \ + after="$$( $(DOCKER_RUN) php -r 'echo hash_file("sha512", "composer.json");' )"; \ + [ "$$before" = "$$after" ] || $(MAKE) update-lock rector-upgrade: ## Upgrade any automatically upgradable old code ##*I*##^code-style^## $(DOCKER_RUN) vendor/bin/rector -c ./etc/qa/rector.php -cs-fix: ## Fix any automatically fixable code style issues ##*I*##^code-style^## +cs-fix: ## Fix any automatically fixable code style issues ##*EI*##^code-style^## $(DOCKER_RUN) vendor/bin/phpcbf --parallel=1 --cache=./var/.phpcs.cache.json --standard=./etc/qa/phpcs.xml || $(MAKE) cs cs-fix-debug: ## Fix any automatically fixable code style issues, but with debugging output ####^code-style^## $(DOCKER_RUN) vendor/bin/phpcbf --parallel=1 --cache=./var/.phpcs.cache.json --standard=./etc/qa/phpcs.xml -vvvv -cs: ## Check the code for code style issues ##*LCH*##^code-style^## +cs: ## Check the code for code style issues ##*ELCH*##^code-style^## $(DOCKER_SHELL) vendor/bin/phpcs --parallel=1 --cache=./var/.phpcs.cache.json --standard=./etc/qa/phpcs.xml stan: ## Run static analysis (PHPStan) ##*LCH*##^static-analysis^## $(DOCKER_SHELL) vendor/bin/phpstan analyse --ansi --configuration=./etc/qa/phpstan.neon -unit-testing: ## Run tests ##*A*##^unit-tests^## - $(DOCKER_RUN_WITH_SOCKET) vendor/bin/phpunit --colors=always -c ./etc/qa/phpunit.xml $(shell $(DOCKER_SHELL) php -r 'if (function_exists("xdebug_get_code_coverage")) { echo " --coverage-text --coverage-html ./var/tests-unit-coverage-html --coverage-clover ./var/tests-unit-clover-coverage.xml"; }') +unit-testing: ## Run tests ##*AE*##^unit-tests^## + $(DOCKER_RUN_WITH_SOCKET) bash -ec 'rm -rf var/phpunit/cache && vendor/bin/phpunit --colors=always -c ./etc/qa/phpunit.xml --coverage-text --coverage-html ./var/phpunit/coverage --coverage-clover ./var/phpunit/coverage/clover.xml' + $(MAKE) coverage-guard + +unit-testing-filter: ## Run tests with specified filter ####^unit-tests^## + $(DOCKER_RUN_WITH_SOCKET) vendor/bin/phpunit --colors=always --filter=$(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS)) -c ./etc/qa/phpunit.xml --coverage-text --coverage-html ./var/phpunit/coverage --coverage-clover ./var/phpunit/coverage/clover.xml unit-testing-raw: ## Run tests ##*D*##^unit-tests^## - php vendor/phpunit/phpunit/phpunit --colors=always -c ./etc/qa/phpunit.xml $(shell php -r 'if (function_exists("xdebug_get_code_coverage")) { echo " --coverage-text --coverage-html ./var/tests-unit-coverage-html --coverage-clover ./var/tests-unit-clover-coverage.xml"; }') + bash -ec 'rm -rf var/phpunit/cache && php vendor/phpunit/phpunit/phpunit --colors=always -c ./etc/qa/phpunit.xml --coverage-text --coverage-html ./var/phpunit/coverage --coverage-clover ./var/phpunit/coverage/clover.xml' + $(MAKE) coverage-guard-raw -unit-testing-filter: ## Run tests with specified filter ####^unit-tests^## - $(DOCKER_RUN_WITH_SOCKET) vendor/bin/phpunit --colors=always --filter=$(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS)) -c ./etc/qa/phpunit.xml $(shell $(DOCKER_SHELL) php -r 'if (function_exists("xdebug_get_code_coverage")) { echo " --coverage-text --coverage-html ./var/tests-unit-coverage-html --coverage-clover ./var/tests-unit-clover-coverage.xml"; }') +coverage-guard: ## Enforce code coverage rules #### + $(DOCKER_RUN) vendor/bin/coverage-guard check ./var/phpunit/coverage/clover.xml --config=./etc/qa/coverage-guard.php + +coverage-guard-raw: ## Enforce code coverage rules #### + php vendor/bin/coverage-guard check ./var/phpunit/coverage/clover.xml --config=./etc/qa/coverage-guard.php mutation-testing: ## Run mutation testing ##*LCH*##^static-analysis|unit-tests^## - $(DOCKER_RUN_WITH_SOCKET) vendor/bin/infection --ansi --log-verbosity=all --ignore-msi-with-no-mutations --configuration=./etc/qa/infection.json5 --static-analysis-tool=phpstan --static-analysis-tool-options="--memory-limit=-1" --threads=$(THREADS) + $(DOCKER_RUN_WITH_SOCKET) bash -ec 'rm -rf /tmp/phpstan var/phpunit/cache && vendor/bin/infection --ansi --log-verbosity=all --ignore-msi-with-no-mutations --configuration=./etc/qa/infection.json5 --static-analysis-tool=phpstan --static-analysis-tool-options="--memory-limit=-1" --threads=$(MUTATION_THREADS)' mutation-testing-raw: ## Run mutation testing ####^static-analysis|unit-tests^## - vendor/bin/infection --ansi --log-verbosity=all --ignore-msi-with-no-mutations --configuration=./etc/qa/infection.json5 --static-analysis-tool=phpstan --static-analysis-tool-options="--memory-limit=-1" --threads=$(THREADS) + bash -ec 'rm -rf /tmp/phpstan var/phpunit/cache && vendor/bin/infection --ansi --log-verbosity=all --ignore-msi-with-no-mutations --configuration=./etc/qa/infection.json5 --static-analysis-tool=phpstan --static-analysis-tool-options="--memory-limit=-1" --threads=$(MUTATION_THREADS)' -composer-require-checker: ## Ensure we require every package used in this package directly ##*C*##^composer-dependency-checkers^## +composer-require-checker: ## Ensure we require every package used in this package directly ##*EC*##^composer-dependency-checkers^## $(DOCKER_SHELL) vendor/bin/composer-require-checker --ignore-parse-errors --ansi -vvv --config-file=./etc/qa/composer-require-checker.json -composer-unused: ## Ensure we don't require any package we don't use in this package directly ##*C*##^composer-dependency-checkers^## +composer-unused: ## Ensure we don't require any package we don't use in this package directly ##*EC*##^composer-dependency-checkers^## $(DOCKER_SHELL) vendor/bin/composer-unused --ansi --configuration=./etc/qa/composer-unused.php backward-compatibility-check: ## Check code for backwards incompatible changes ##*C*## @@ -421,7 +556,12 @@ backward-compatibility-check-raw: ## Check code for backwards incompatible chang $(DOCKER_SHELL) vendor/bin/roave-backward-compatibility-check install: ### Install dependencies #### +ifeq ("$(ON_INSTALL_OR_UPDATE_HAS_DIRECT_DOCKER_TASKS)","TRUE") + $(DOCKER_SHELL) composer install --no-scripts + $(MAKE) on-install-or-update +else $(DOCKER_SHELL) composer install +endif composer-require: ### Require passed dependencies #### $(DOCKER_INTERACTIVE_SHELL) composer require -W $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS)) @@ -433,10 +573,15 @@ composer-outdated: ### Show outdated packages #### $(DOCKER_SHELL) composer outdated update: ### Update dependencies #### +ifeq ("$(ON_INSTALL_OR_UPDATE_HAS_DIRECT_DOCKER_TASKS)","TRUE") + $(DOCKER_SHELL) composer update -W --no-scripts + $(MAKE) on-install-or-update +else $(DOCKER_SHELL) composer update -W +endif update-lock: ### Update lockfile #### - $(DOCKER_RUN) COMPOSER_DISABLE_NETWORK=1 composer update --lock --no-scripts || $(DOCKER_RUN) composer update --lock --no-scripts + $(DOCKER_RUN_WITHOUT_NETWORK_FOR_COMPOSER) composer update --lock --no-scripts || $(DOCKER_RUN) composer update --lock --no-scripts outdated: ### Show outdated dependencies #### $(DOCKER_SHELL) composer outdated @@ -444,12 +589,239 @@ outdated: ### Show outdated dependencies #### composer-show: ### Show dependencies #### $(DOCKER_SHELL) composer show +IMAGE_MARKDOWNLINT := davidanson/markdownlint-cli2:v0.17.2 +IMAGE_LYCHEE := lycheeverse/lychee:0.24.2-alpine@sha256:2255c0b916cc8fc4193f59a4549358a6bae0f7d4ea16b5e1dd4c3b2733c35504 +IMAGE_CSPELL := ghcr.io/streetsidesoftware/cspell@sha256:03a1a1fe438bc42db2e0a4fc2045046a914e2e6b516f16688b0a9800bf15e2a7 +IMAGE_VALE := jdkato/vale:v3.23.0@sha256:d87d6355dc8992f92ec39c4c862a388e56e30302a771fd4512c02660fb25cdf3 + +documentation-markdownlint: ## Lint markdown structure ##*K*## + $(DOCKER_RUN_DOCUMENTATION) $(IMAGE_MARKDOWNLINT) --config etc/qa/documentation.markdownlint-cli2.yaml + +documentation-links: ## Check documentation links ##*K*## + $(DOCKER_RUN_DOCUMENTATION) $(IMAGE_LYCHEE) --config etc/qa/lychee.toml . + +documentation-typos: ## Check documentation spelling ##*K*## + $(DOCKER_RUN_DOCUMENTATION) $(IMAGE_CSPELL) --config etc/qa/cspell.json --no-progress --no-must-find-files $$(find . -name "*.md" -not -path "./var/*" -not -path "./vendor/*" -not -path "./.git/*" -not -path "./.idea/*" -not -path "./etc/qa/vale/*") + +documentation-vale: ## Lint documentation prose (Vale) ##*K*## + $(DOCKER_RUN_DOCUMENTATION) $(IMAGE_VALE) sync --config etc/qa/vale.ini + $(DOCKER_RUN_DOCUMENTATION) $(IMAGE_VALE) --config etc/qa/vale.ini --no-global README.md AGENTS.md CONTRIBUTING.md $$(find etc/ai -name '*.md' 2>/dev/null) + +documentation-qa: documentation-markdownlint documentation-links documentation-typos documentation-vale ## Run all documentation QA checks ##*E*## + shell: ## Provides Shell access in the expected environment #### $(DOCKER_INTERACTIVE_SHELL) bash +run: ## Provides access in the expected environment to run a single command and then return #### + $(DOCKER_RUN) $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS)) + help: ## Show this help #### - @printf "\033[33mUsage:\033[0m\n make [target]\n\n\033[33mTargets:\033[0m\n" - @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | grep -v "##U##" | sort | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[32m%-32s\033[0m %s\n", $$1, $$2}' | tr -d '#' + @printf "%s\n" '' + @printf "%s\n" ' ._ _ _. _ _|_ __ ._ _. ._ _. | | _ | / _ _|_ |_ _' + @printf "%s\n" ' | (/_ (_| (_ |_ |_) (_| | (_| | | (/_ | / _> |_ |_| |_) _>' + @printf "%s\n" ' |' + @printf "\n" + @printf "\033[33mUsage:\033[0m\n" + @printf " make [target]\n" + @printf "\n" + @printf "\033[33mTargets:\033[0m\n" + @printf " \033[32m%-32s\033[0m %s\n" 'all' 'Runs everything' + @printf " \033[32m%-32s\033[0m %s\n" 'backward-compatibility-check' 'Check code for backwards incompatible changes' + @printf " \033[32m%-32s\033[0m %s\n" 'backward-compatibility-check-raw' 'Check code for backwards incompatible changes, doesn'\''t ignore the failure' + @printf " \033[32m%-32s\033[0m %s\n" 'composer-normalize' 'Normalize composer.json' + @printf " \033[32m%-32s\033[0m %s\n" 'composer-outdated' 'Show outdated packages' + @printf " \033[32m%-32s\033[0m %s\n" 'composer-require' 'Require passed dependencies' + @printf " \033[32m%-32s\033[0m %s\n" 'composer-require-checker' 'Ensure we require every package used in this package directly' + @printf " \033[32m%-32s\033[0m %s\n" 'composer-show' 'Show dependencies' + @printf " \033[32m%-32s\033[0m %s\n" 'composer-unused' 'Ensure we don'\''t require any package we don'\''t use in this package directly' + @printf " \033[32m%-32s\033[0m %s\n" 'composer-validate' 'Ensure we don'\''t require any package we don'\''t use in this package directly' + @printf " \033[32m%-32s\033[0m %s\n" 'composer-why' 'Show why a specific dependency is loaded' + @printf " \033[32m%-32s\033[0m %s\n" 'contrib' 'Runs a subset of everything (all)' + @printf " \033[32m%-32s\033[0m %s\n" 'coverage-guard' 'Enforce code coverage rules' + @printf " \033[32m%-32s\033[0m %s\n" 'coverage-guard-raw' 'Enforce code coverage rules' + @printf " \033[32m%-32s\033[0m %s\n" 'cs' 'Check the code for code style issues' + @printf " \033[32m%-32s\033[0m %s\n" 'cs-fix' 'Fix any automatically fixable code style issues' + @printf " \033[32m%-32s\033[0m %s\n" 'cs-fix-debug' 'Fix any automatically fixable code style issues, but with debugging output' + @printf " \033[32m%-32s\033[0m %s\n" 'documentation-links' 'Check documentation links' + @printf " \033[32m%-32s\033[0m %s\n" 'documentation-markdownlint' 'Lint markdown structure' + @printf " \033[32m%-32s\033[0m %s\n" 'documentation-qa' 'Run all documentation QA checks' + @printf " \033[32m%-32s\033[0m %s\n" 'documentation-typos' 'Check documentation spelling' + @printf " \033[32m%-32s\033[0m %s\n" 'documentation-vale' 'Lint documentation prose (Vale)' + @printf " \033[32m%-32s\033[0m %s\n" 'help' 'Show this help' + @printf " \033[32m%-32s\033[0m %s\n" 'help-contrib' 'Show the migrations help' + @printf " \033[32m%-32s\033[0m %s\n" 'help-migrations' 'Show the migrations help' + @printf " \033[32m%-32s\033[0m %s\n" 'install' 'Install dependencies' + @printf " \033[32m%-32s\033[0m %s\n" 'mutation-testing' 'Run mutation testing' + @printf " \033[32m%-32s\033[0m %s\n" 'mutation-testing-raw' 'Run mutation testing' + @printf " \033[32m%-32s\033[0m %s\n" 'on-install-or-update' 'Tasks, like migrations, that specifically have be run after composer install or update. These will also run by self hosted Renovate' + @printf " \033[32m%-32s\033[0m %s\n" 'outdated' 'Show outdated dependencies' + @printf " \033[32m%-32s\033[0m %s\n" 'rector-upgrade' 'Upgrade any automatically upgradable old code' + @printf " \033[32m%-32s\033[0m %s\n" 'run' 'Provides access in the expected environment to run a single command and then return' + @printf " \033[32m%-32s\033[0m %s\n" 'shell' 'Provides Shell access in the expected environment' + @printf " \033[32m%-32s\033[0m %s\n" 'stan' 'Run static analysis (PHPStan)' + @printf " \033[32m%-32s\033[0m %s\n" 'supported-features' 'CI: List the features this package supports' + @printf " \033[32m%-32s\033[0m %s\n" 'syntax-php' 'Lint PHP syntax' + @printf " \033[32m%-32s\033[0m %s\n" 'task-list-ci-all' 'CI: Generate a JSON array of jobs to run on all variations' + @printf " \033[32m%-32s\033[0m %s\n" 'task-list-ci-dos' 'CI: Generate a JSON array of jobs to run Directly on the OS variations' + @printf " \033[32m%-32s\033[0m %s\n" 'task-list-ci-high' 'CI: Generate a JSON array of jobs to run against the highest dependencies on the primary threading target' + @printf " \033[32m%-32s\033[0m %s\n" 'task-list-ci-locked' 'CI: Generate a JSON array of jobs to run against the locked dependencies on the primary threading target' + @printf " \033[32m%-32s\033[0m %s\n" 'task-list-ci-low' 'CI: Generate a JSON array of jobs to run against the lowest dependencies on the primary threading target' + @printf " \033[32m%-32s\033[0m %s\n" 'unit-testing' 'Run tests' + @printf " \033[32m%-32s\033[0m %s\n" 'unit-testing-filter' 'Run tests with specified filter' + @printf " \033[32m%-32s\033[0m %s\n" 'unit-testing-raw' 'Run tests' + @printf " \033[32m%-32s\033[0m %s\n" 'update' 'Update dependencies' + @printf " \033[32m%-32s\033[0m %s\n" 'update-lock' 'Update lockfile' + +help-migrations: ## Show the migrations help #### + @printf "%s\n" '' + @printf "%s\n" ' ._ _ o _ ._ _. _|_ o _ ._ _' + @printf "%s\n" ' | | | | (_| | (_| |_ | (_) | | _>' + @printf "%s\n" ' _|' + @printf "\n" + @printf "\033[33mUsage:\033[0m\n" + @printf " make [target]\n" + @printf "\n" + @printf "\033[33mTargets:\033[0m\n" + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-create-documentation-markdownlint-config-if-not-exists' 'Create `etc/qa/documentation.markdownlint-cli2.yaml` when missing' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-create-license-when-it-doesnt-exists' 'Create license when it doesn'\''t exists' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-create-lychee-config-if-not-exists' 'Create `etc/qa/lychee.toml` when missing' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-create-vale-vocab-symlink-if-not-exists' 'Create WyriHaximus Vale vocab symlink when missing' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-enforce-contributing-md-contents' 'Enforce CONTRIBUTING.md contents' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-enforce-cspell-config-contents' 'Enforce `etc/qa/cspell.json` contents' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-enforce-vale-config-contents' 'Enforce `etc/qa/vale.ini` contents' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-enforce-vale-vocab-contents' 'Enforce `etc/qa/vale-vocab.txt` contents' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-enrich-qa-wordlists-with-php-symbols' 'Merge PHP symbol names into etc/qa documentation wordlists' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-update-etc-readme-template-copyright-c-year-to-current' 'Update readme template in etc/ copyright year to current' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-update-etc-readme-template-copyright-year-to-current' 'Update readme template in etc/ copyright year to current' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-update-license-copyright-c-year-to-current' 'Update license copyright year to current' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-update-license-copyright-year-to-current' 'Update license copyright year to current' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-update-readme-copyright-c-year-to-current' 'Update readme copyright year to current' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-docs-update-readme-copyright-year-to-current' 'Update readme copyright year to current' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-git-enforce-agents-md-contents' 'Enforce `AGENTS.md` contents' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-git-enforce-editorconfig-contents' 'Enforce `.editorconfig` contents' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-git-enforce-gitattributes-contents' 'Enforce `.gitattributes` contents' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-git-make-sure-gitignore-excludes-var-gitkeep' 'Make sure `.gitignore` excludes `var/.gitkeep`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-git-make-sure-gitignore-exists' 'Make sure `.gitignore` exists' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-git-make-sure-gitignore-ignores-vale-styles-except-vocab' 'Ignore Vale styles except WyriHaximus vocab symlink' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-git-make-sure-gitignore-ignores-var' 'Make sure `.gitignore` ignores `var/*`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-actions-create-ci-if-not-exists' 'Create CI Workflow if it doesn'\''t exists at `.github/workflows/ci.yaml`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-actions-create-release-management-if-not-exists' 'Create Release Management Workflow if it doesn'\''t exists at `.github/workflows/release-management.yaml`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-actions-ensure-runs-on-is-the-only-runs-on-variant-in-utils-yaml' 'Ensure `runsOn` is the only `runsOn` variant in `.github/workflows/utils.yaml`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-actions-fix-management-in-release-management-referenced-workflow-file' 'Fix management in release-management referenced workflow file' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-actions-move-ci' 'Move `.github/workflows/ci.yml` to `.github/workflows/ci.yaml`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-actions-move-release-management' 'Move `.github/workflows/release-managment.yaml` to `.github/workflows/release-management.yaml`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-actions-pin-package-workflow-reference-at-v1-0-0' 'Pin WyriHaximus/github-workflows reusable workflow references to SHA `5343944be2a6ef963186b5f413121fcf36980b33` (`v1.0.0`) in `.github/workflows`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-actions-remove-ci-if-its-old-style-php-ci-workflow' 'Remove CI Workflow if its the old style PHP CI Workflow' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-actions-remove-composer-diff' 'Remove `composer-diff.yaml` it has been folded into centralized workflows through `ci.yaml`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-actions-remove-markdown-check-links' 'Remove `markdown-check-links.yaml` it has been folded into centralized workflows through `ci.yaml`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-actions-remove-markdown-craft-release' 'Remove `craft-release.yaml` it has been folded into centralized workflows through `release-management.yaml`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-actions-remove-set-milestone-on-pr' 'Remove `set-milestone-on-pr.yaml` it has been folded into centralized workflows through `release-management.yaml`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-actions-rename-yml-workflow-files-to-yaml' 'Rename all `.yml` files in `.github/workflows` to `.yaml`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-github-codeowners' 'Ensure a `CODEOWNERS` file is present, create only if it doesn'\''t exist yet' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-inline-code-phpstan-remove-line-phpstan-ignore-next-line' 'Remove all lines that contains @phpstan-ignore-next-line' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-inline-code-phpstan-remove-rest-of-line-phpstan-ignore-line' 'Remove rest of line for all lines that contain @phpstan-ignore-line' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-inline-code-phpunit-replace-expectexceptionmessage-with-expectexceptionmessageisorcontains' 'Replace self::expectExceptionMessage with self::expectExceptionMessageIsOrContains in all PHPUnit tests' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-inline-code-psalm-remove-line-psalm-suppress' 'Remove all lines that contain @psalm-suppress' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-inline-code-remove-line-infection-ignore-all' 'Remove all lines that contain @infection-ignore-all' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-inline-code-remove-line-internal' 'Remove all lines that contain @internal' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-add-github-true-to-for-infection' 'Ensure we configure infection to emit logs to GitHub in `etc/qa/infection.json5`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-composer-require-checker-create-config-if-not-exists' 'Create Composer Require Checker config file if it doesn'\''t exists at `etc/qa/composer-require-checker.json`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-composer-unused-create-config-if-not-exists' 'Create Composer Unused config file if it doesn'\''t exists at `etc/qa/composer-unused.php`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-composer-unused-drop-commented-out-line-scattered-across-my-repos' 'Update Composer Unused config file dropping a commented out line that is scattered cross my repos' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-ensure-etc-ci-markdown-link-checker-json-exists' 'Make sure we have `etc/ci/markdown-link-checker.json`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-ensure-etc-qa-coverage-guard-php-exists' 'Make sure we have `etc/qa/coverage-guard.php`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-ensure-etc-qa-zzz-disable-otel-attr-hooks-ini-exists' 'Make sure we have `etc/qa/zzz_disable_otel_attr_hooks.ini`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-fix-logs-relative-paths-for-infection' 'Fix logs paths in `etc/qa/infection.json5`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-infection-add-threads-64-to-config' 'Ensure `threads` is set to `64` in `etc/qa/infection.json5`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-infection-create-config-if-not-exists' 'Create Infection config file if it doesn'\''t exists at `etc/qa/infection.json5`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-infection-ensure-log-json-has-the-correct-path' 'Ensure infection'\''s log.json has config directive has the correct path' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-infection-ensure-log-per-mutator-has-the-correct-path' 'Ensure infection'\''s log.perMutator has config directive has the correct path' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-infection-ensure-log-summary-has-the-correct-path' 'Ensure infection'\''s log.summary has config directive has the correct path' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-infection-ensure-log-text-has-the-correct-path' 'Ensure infection'\''s log.text has config directive has the correct path' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-make-paths-compatible-with-infection-0-32' 'We update path to be relative to `etc/qa/infection.json5` as of 0.32' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-make-sure-etc-ci-exists' 'Make sure `etc/ci/` exists' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-make-sure-etc-exists' 'Make sure `etc/` exists' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-make-sure-etc-qa-exists' 'Make sure `etc/qa/` exists' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-make-sure-github-exists' 'Make sure `.github/` exists' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-make-sure-github-workflows-exists' 'Make sure `.github/workflows` exists' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-make-sure-var-exists' 'Make sure `var/` exists' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-make-sure-var-gitkeep-exists' 'Make sure `var/.gitkeep` exists' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-migrate-composer-unused-from-extra-unused-to-etc-qa-composer-used-php' 'Migrate Compose Unused from `composer.json` extra unused to `etc/qa/composer-unused.php`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-move-composer-require-checker' 'Move composer-require-checker.json to `etc/qa/composer-require-checker.json`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-move-infection-config-to-etc' 'Move `infection.json.dist` to `etc/qa/infection.json5`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-move-phpcs' 'Move `phpcs.xml.dist` to `etc/qa/phpcs.xml`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-move-phpcs-not-dist' 'Move `phpcs.xml` to `etc/qa/phpcs.xml`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-move-phpstan' 'Move `phpstan.neon` to `etc/qa/phpstan.neon`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-move-psalm-xml-config-to-etc' 'Move `psalm.xml` to `etc/qa/psalm.xml`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-phpcs-make-basepath-is-correct-relatively' 'Make sure PHPCS base path is has `../../` and not `.`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-phpcs-make-cache-is-correct-relatively' 'Make sure PHPCS cache path is has `../../var/.phpcs.cache` and not `.phpcs.cache`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-etc' 'Make sure PHPCS has `../../` prefixing `etc/` to ensure correct relative path' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-src' 'Make sure PHPCS has `../../` prefixing `src/` to ensure correct relative path' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-phpcs-make-sure-config-has-correct-relative-path-for-tests' 'Make sure PHPCS has `../../` prefixing `tests/` to ensure correct relative path' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-phpcs-make-sure-etc-has-no-trailing-slash' 'Make sure PHPCS has no tailing `/` on `etc`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-phpcs-make-sure-etc-is-ran-through' 'Make sure PHPCS runs through `etc`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-phpcs-make-sure-src-has-no-trailing-slash' 'Make sure PHPCS has no tailing `/` on src' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-phpcs-make-sure-tests-has-no-trailing-slash' 'Make sure PHPCS has no tailing `/` on `tests`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-phpstan-add-prefix-for-anything-that-starts-with-vendor-in-a-list' 'PHPStan add `../../` to anything in a list that starts with `vendor`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-remove-old-appveyor-yml-config' 'Make sure we remove `appveyor.yml`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-remove-old-php-cs-fiver-config' 'Make sure we remove `.php_cs`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-remove-old-phpunit-xml-config' 'Make sure we remove `phpunit.xml`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-remove-old-phpunit-xml-dist-config' 'Make sure we remove `phpunit.xml.dist`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-remove-old-scrutinizer-yml-config' 'Make sure we remove `.scrutinizer.yml`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-remove-old-travis-yml-config' 'Make sure we remove `.travis.yml`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-remove-phpunit-config-dir-from-infection' 'Drop XXX from `etc/qa/infection.json5`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-remove-psalm-xml-config' 'Make sure we remove `etc/qa/psalm.xml`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-set-phpcs-ensure-config-file-exists' 'Make sure we have a PHPCS config file at `etc/qa/phpcs.xml`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-set-phpstan-add-parameters-if-it-isnt-present-in-the-config-file' 'Add parameters to PHPStan config file at `etc/qa/phpstan.neon` if it'\''s not present' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-set-phpstan-drop-checkGenericClassInNonGenericObjectType' 'Ensure PHPStan config doesn'\''t contain checkGenericClassInNonGenericObjectType as it'\''s no longer a valid config option' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-set-phpstan-drop-include-async-test-utilities-rules' 'Ensure PHPStan config doesn'\''t contain include for `wyrihaximus/async-test-utilities/rules.neon` as it'\''s now an extension' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-set-phpstan-drop-include-test-utilities-rules' 'Ensure PHPStan config doesn'\''t contain include for `wyrihaximus/async-utilities/rules.neon` as it'\''s now an extension' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-set-phpstan-ensure-config-file-exists' 'Make sure we have a PHPStan config file at `etc/qa/phpstan.neon`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-set-phpstan-level-max-in-config' 'Ensure PHPStan config has level set to max in `etc/qa/phpstan.neon`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-set-phpstan-paths-in-config' 'Ensure PHPStan config has the `etc`, `src`, and (optionally) `tests` paths set in `etc/qa/phpstan.neon`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-set-phpstan-resolve-ergebnis-noExtends-classesAllowedToBeExtended' 'Ensure PHPStan config uses ergebnis.noExtends.classesAllowedToBeExtended not ergebnis.classesAllowedToBeExtended' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-set-phpstan-uncomment-parameters' 'Ensure PHPStan config as parameters not commented out in `etc/qa/phpstan.neon`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-set-phpunit-ensure-config-file-exists' 'Make sure we have a PHPUnit config file at `etc/qa/phpunit.xml`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-set-phpunit-make-sure-we-see-all-the-warnings-deprecations-etc-etc-that-will-make-phpunit-do-a-non-happy-exit' 'Make sure we see all the warnings, deprecations, etc etc that will make PHPunit do a non-happy exit' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-set-phpunit-xsd-path-to-local' 'Ensure that the PHPUnit XDS referred in `etc/qa/phpunit.xml` points to `vendor/phpunit/phpunit/phpunit.xsd` so we don'\''t go over the network' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-set-rector-create-config-if-not-exists' 'Create Rector config file if it doesn'\''t exists at `etc/qa/rector.php`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-php-update-rector-from-testutilities-to-rectorphp-namespace-for-rector-config' 'Update RectorPHP config file `etc/qa/rector.php` from `TestUtilities` to `RectorPHP` namespace' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-phpcs-include-examples-directory-when-present' 'Make sure PHPCS runs through `examples` when it exists' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-renovate-create-config-if-not-exists' 'Create Renovate Config if it doesn'\''t exists at `.github/renovate.json`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-renovate-move-config' 'Move `renovate.json` to `.github/renovate.json`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-renovate-point-at-correct-config' 'Ensure `.github/renovate.json` points at github>WyriHaximus/renovate-config:php-package instead of local>WyriHaximus/renovate-config' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-renovate-remove-dependabot-config' 'Make sure we remove `.github/dependabot.yml`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-renovate-set-composer-constraint' 'Always keep renovate'\''s `constraints.composer` at `2.x`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-renovate-set-php-constraint' 'Always keep renovate'\''s constraints.php in sync with `composer.json`'\''s `config.platform.php`' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-supported-features-php-ensure-no-composer-require-checker-config-file-is-present-when-composer-dependency-checkers-are-disabled' 'Ensure we remove the Composer Require Checker config file when composer-dependency-checkers aren'\''t enabled' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-supported-features-php-ensure-no-composer-unused-config-file-is-present-when-composer-dependency-checkers-are-disabled' 'Ensure we remove the Composer Unused config file when composer-dependency-checkers aren'\''t enabled' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-supported-features-php-ensure-no-infectionphp-config-file-is-present-when-unit-tests-are-disabled' 'Ensure we remove the InfectionPHP config file when unit-tests aren'\''t enabled' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-supported-features-php-ensure-no-phpcs-config-file-is-present-when-code-style-is-disabled' 'Ensure we remove the PHPCSS config file when code-style isn'\''t enabled' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-supported-features-php-ensure-no-phpunit-config-file-is-present-when-unit-tests-are-disabled' 'Ensure we remove the PHPUnit config file when unit-tests aren'\''t enabled' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-supported-features-php-ensure-no-rector-config-file-is-present-when-code-style-is-disabled' 'Ensure we remove the RectorPHP config file when code-style isn'\''t enabled' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-supported-features-php-ensure-no-zzz-disable-otel-attr-hooks-ini-when-opentelemetry-instrumentation-is-enabled' 'Ensure we remove `etc/qa/zzz_disable_otel_attr_hooks.ini` when opentelemetry-instrumentation is enabled' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-supported-features-php-ensure-we-only-cs-check-and-fix-tests-if-unit-tests-is-enabled' 'Ensure we only cs check/fix tests/ if unit-tests is enabled' + @printf " \033[32m%-32s\033[0m %s\n" 'migrations-supported-features-php-ensure-we-only-staticly-analyse-tests-with-phpstan-if-unit-tests-is-enabled' 'Ensure we only staticly analyse tests/ with PHPStan if unit-tests is enabled' + +help-contrib: ## Show the migrations help #### + @printf "%s\n" '' + @printf "%s\n" ' _ _ ._ _|_ ._ o |_' + @printf "%s\n" ' (_ (_) | | |_ | | |_)' + @printf "%s\n" '' + @printf "\n" + @printf "\033[33mUsage:\033[0m\n" + @printf " make [target]\n" + @printf "\n" + @printf "\033[33mTargets:\033[0m\n" + @printf " \033[32m%-32s\033[0m %s\n" 'composer-require-checker' 'Ensure we require every package used in this package directly' + @printf " \033[32m%-32s\033[0m %s\n" 'composer-unused' 'Ensure we don'\''t require any package we don'\''t use in this package directly' + @printf " \033[32m%-32s\033[0m %s\n" 'cs' 'Check the code for code style issues' + @printf " \033[32m%-32s\033[0m %s\n" 'cs-fix' 'Fix any automatically fixable code style issues' + @printf " \033[32m%-32s\033[0m %s\n" 'documentation-qa' 'Run all documentation QA checks' + @printf " \033[32m%-32s\033[0m %s\n" 'unit-testing' 'Run tests' + +task-list-ci: + @echo "[]" task-list-ci-all: ## CI: Generate a JSON array of jobs to run on all variations @echo "[\"composer-validate\",\"syntax-php\",\"backward-compatibility-check\"]" ## Count: 3 @@ -461,7 +833,7 @@ task-list-ci-low: ## CI: Generate a JSON array of jobs to run against the lowest @echo "[\"syntax-php\"]" ## Count: 1 task-list-ci-locked: ## CI: Generate a JSON array of jobs to run against the locked dependencies on the primary threading target - @echo "[\"composer-validate\",\"backward-compatibility-check\"]" ## Count: 2 + @echo "[\"composer-validate\",\"backward-compatibility-check\",\"documentation-markdownlint\",\"documentation-links\",\"documentation-typos\",\"documentation-vale\"]" ## Count: 6 task-list-ci-high: ## CI: Generate a JSON array of jobs to run against the highest dependencies on the primary threading target @echo "[\"syntax-php\"]" ## Count: 1 @@ -469,3 +841,8 @@ task-list-ci-high: ## CI: Generate a JSON array of jobs to run against the highe supported-features: ## CI: List the features this package supports @echo "[\"linux\",\"zts\"]" ## Count: 2 + +## Catch-all for targets that pass through extra arguments (e.g. `make run ls`) +%: + @: + diff --git a/composer.json b/composer.json index cfadddd..06634c2 100644 --- a/composer.json +++ b/composer.json @@ -15,8 +15,8 @@ "ext-parallel": "*" }, "require-dev": { - "wyrihaximus/async-test-utilities": "^13.3.0", - "wyrihaximus/makefiles": "^0.12.3" + "wyrihaximus/async-test-utilities": "^13.5.2", + "wyrihaximus/makefiles": "^0.15.1" }, "config": { "allow-plugins": { diff --git a/composer.lock b/composer.lock index 74a4df8..383fc50 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d0cac4cb99fc27c9fa97a70cba580ead", + "content-hash": "025e42ae1a08010148d045a2c58b112e", "packages": [], "packages-dev": [ { @@ -500,16 +500,16 @@ }, { "name": "composer/composer", - "version": "2.10.1", + "version": "2.10.3", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "4120703b9bda8795075047b40361d7ec4d2abe49" + "reference": "f0de0bf90226853b841672f086d8b58b02332504" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/4120703b9bda8795075047b40361d7ec4d2abe49", - "reference": "4120703b9bda8795075047b40361d7ec4d2abe49", + "url": "https://api.github.com/repos/composer/composer/zipball/f0de0bf90226853b841672f086d8b58b02332504", + "reference": "f0de0bf90226853b841672f086d8b58b02332504", "shasum": "" }, "require": { @@ -520,6 +520,8 @@ "composer/semver": "^3.3", "composer/spdx-licenses": "^1.5.7", "composer/xdebug-handler": "^2.0.2 || ^3.0.3", + "ext-filter": "*", + "ext-hash": "*", "ext-json": "*", "justinrainbow/json-schema": "^6.5.1", "php": "^7.2.5 || ^8.0", @@ -597,7 +599,7 @@ "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", "security": "https://github.com/composer/composer/security/policy", - "source": "https://github.com/composer/composer/tree/2.10.1" + "source": "https://github.com/composer/composer/tree/2.10.3" }, "funding": [ { @@ -609,7 +611,7 @@ "type": "github" } ], - "time": "2026-06-04T08:25:59+00:00" + "time": "2026-08-27T11:34:23+00:00" }, { "name": "composer/metadata-minifier", @@ -2133,16 +2135,16 @@ }, { "name": "infection/infection", - "version": "0.33.3", + "version": "0.34.2", "source": { "type": "git", "url": "https://github.com/infection/infection.git", - "reference": "cc789bb58df7c649c4533ab860d98283fe270215" + "reference": "18d9bef39fae250f202920d1453ab96e793e6637" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/infection/infection/zipball/cc789bb58df7c649c4533ab860d98283fe270215", - "reference": "cc789bb58df7c649c4533ab860d98283fe270215", + "url": "https://api.github.com/repos/infection/infection/zipball/18d9bef39fae250f202920d1453ab96e793e6637", + "reference": "18d9bef39fae250f202920d1453ab96e793e6637", "shasum": "" }, "require": { @@ -2167,7 +2169,7 @@ "sanmai/duoclock": "^0.1.0", "sanmai/later": "^0.1.7", "sanmai/pipeline": "^7.2", - "sebastian/diff": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0", "symfony/console": "^6.4 || ^7.4 || ^8.0", "symfony/filesystem": "^6.4 || ^7.4 || ^8.0", "symfony/finder": "^6.4 || ^7.4 || ^8.0", @@ -2189,12 +2191,13 @@ "phpbench/phpbench": "^1.4", "phpstan/extension-installer": "^1.4", "phpstan/phpstan": "^2.1", + "phpstan/phpstan-deprecation-rules": "^2.0", "phpstan/phpstan-phpunit": "^2.0", "phpstan/phpstan-strict-rules": "^2.0", "phpstan/phpstan-webmozart-assert": "^2.0", - "phpunit/phpunit": "^11.5.27", + "phpunit/phpunit": "^12.5.29", "rector/rector": "^2.2.4", - "shipmonk/dead-code-detector": "^0.15", + "shipmonk/dead-code-detector": "^1.3", "shipmonk/name-collision-detector": "^2.1", "sidz/phpstan-rules": "^0.5.1", "symfony/yaml": "^6.4 || ^7.4 || ^8.0", @@ -2255,7 +2258,7 @@ ], "support": { "issues": "https://github.com/infection/infection/issues", - "source": "https://github.com/infection/infection/tree/0.33.3" + "source": "https://github.com/infection/infection/tree/0.34.2" }, "funding": [ { @@ -2267,7 +2270,7 @@ "type": "open_collective" } ], - "time": "2026-06-18T07:45:54+00:00" + "time": "2026-08-07T12:59:47+00:00" }, { "name": "infection/mutator", @@ -2740,20 +2743,20 @@ }, { "name": "myclabs/deep-copy", - "version": "1.13.4", + "version": "1.14.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a" + "reference": "8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/07d290f0c47959fd5eed98c95ee5602db07e0b6a", - "reference": "07d290f0c47959fd5eed98c95ee5602db07e0b6a", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae", + "reference": "8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae", "shasum": "" }, "require": { - "php": "^7.1 || ^8.0" + "php": "^8.0" }, "conflict": { "doctrine/collections": "<1.6.8", @@ -2788,32 +2791,31 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.4" + "source": "https://github.com/myclabs/DeepCopy/tree/1.14.0" }, "funding": [ { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" + "url": "https://github.com/mnapoli", + "type": "github" } ], - "time": "2025-08-01T08:46:24+00:00" + "time": "2026-08-11T10:17:44+00:00" }, { "name": "nikic/php-parser", - "version": "v5.7.0", + "version": "v5.9.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82" + "reference": "9e33da9553fe7786f0962b35f4e4ecf01be89def" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/dca41cd15c2ac9d055ad70dbfd011130757d1f82", - "reference": "dca41cd15c2ac9d055ad70dbfd011130757d1f82", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/9e33da9553fe7786f0962b35f4e4ecf01be89def", + "reference": "9e33da9553fe7786f0962b35f4e4ecf01be89def", "shasum": "" }, "require": { - "ext-ctype": "*", "ext-json": "*", "ext-tokenizer": "*", "php": ">=7.4" @@ -2852,9 +2854,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.7.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.9.0" }, - "time": "2025-12-06T11:56:16+00:00" + "time": "2026-09-13T18:51:52+00:00" }, { "name": "nikolaposa/version", @@ -3388,16 +3390,16 @@ }, { "name": "phpstan/phpdoc-parser", - "version": "2.3.2", + "version": "2.3.6", "source": { "type": "git", "url": "https://github.com/phpstan/phpdoc-parser.git", - "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a" + "reference": "1427af4647235b4a73b13940b1f1258d3584f36e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/a004701b11273a26cd7955a61d67a7f1e525a45a", - "reference": "a004701b11273a26cd7955a61d67a7f1e525a45a", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/1427af4647235b4a73b13940b1f1258d3584f36e", + "reference": "1427af4647235b4a73b13940b1f1258d3584f36e", "shasum": "" }, "require": { @@ -3429,17 +3431,17 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https://github.com/phpstan/phpdoc-parser/issues", - "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.2" + "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.6" }, - "time": "2026-01-25T14:56:51+00:00" + "time": "2026-09-27T20:07:45+00:00" }, { "name": "phpstan/phpstan", - "version": "2.2.2", + "version": "2.2.16", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e5cc34d491a90e79c216d824f60fe21fd4d93bd6", - "reference": "e5cc34d491a90e79c216d824f60fe21fd4d93bd6", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/46a6d9060e5a7763adfcc21ebcb8b504ebdbcb92", + "reference": "46a6d9060e5a7763adfcc21ebcb8b504ebdbcb92", "shasum": "" }, "require": { @@ -3495,20 +3497,20 @@ "type": "github" } ], - "time": "2026-06-05T09:00:01+00:00" + "time": "2026-09-25T09:31:51+00:00" }, { "name": "phpstan/phpstan-deprecation-rules", - "version": "2.0.4", + "version": "2.0.5", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-deprecation-rules.git", - "reference": "6b5571001a7f04fa0422254c30a0017ec2f2cacc" + "reference": "67bedd65c24bc72840afc45aed48b1059dd44bec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/6b5571001a7f04fa0422254c30a0017ec2f2cacc", - "reference": "6b5571001a7f04fa0422254c30a0017ec2f2cacc", + "url": "https://api.github.com/repos/phpstan/phpstan-deprecation-rules/zipball/67bedd65c24bc72840afc45aed48b1059dd44bec", + "reference": "67bedd65c24bc72840afc45aed48b1059dd44bec", "shasum": "" }, "require": { @@ -3518,7 +3520,8 @@ "require-dev": { "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/phpstan-phpunit": "^2.0", - "phpunit/phpunit": "^9.6" + "phpunit/phpunit": "^9.6", + "shipmonk/name-collision-detector": "^2.1" }, "type": "phpstan-extension", "extra": { @@ -3543,9 +3546,9 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan-deprecation-rules/issues", - "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/2.0.4" + "source": "https://github.com/phpstan/phpstan-deprecation-rules/tree/2.0.5" }, - "time": "2026-02-09T13:21:14+00:00" + "time": "2026-07-22T06:50:43+00:00" }, { "name": "phpstan/phpstan-mockery", @@ -3598,21 +3601,22 @@ }, { "name": "phpstan/phpstan-phpunit", - "version": "2.0.16", + "version": "2.0.21", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-phpunit.git", - "reference": "6ab598e1bc106e6827fd346ae4a12b4a5d634c32" + "reference": "8dbdc3a3e2d7c5dfea655d20ecca5bc9b1b1e441" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/6ab598e1bc106e6827fd346ae4a12b4a5d634c32", - "reference": "6ab598e1bc106e6827fd346ae4a12b4a5d634c32", + "url": "https://api.github.com/repos/phpstan/phpstan-phpunit/zipball/8dbdc3a3e2d7c5dfea655d20ecca5bc9b1b1e441", + "reference": "8dbdc3a3e2d7c5dfea655d20ecca5bc9b1b1e441", "shasum": "" }, "require": { + "phar-io/version": "^3.2", "php": "^7.4 || ^8.0", - "phpstan/phpstan": "^2.1.32" + "phpstan/phpstan": "^2.2.6" }, "conflict": { "phpunit/phpunit": "<7.0" @@ -3622,7 +3626,8 @@ "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/phpstan-deprecation-rules": "^2.0", "phpstan/phpstan-strict-rules": "^2.0", - "phpunit/phpunit": "^9.6" + "phpunit/phpunit": "^9.6", + "shipmonk/name-collision-detector": "^2.1" }, "type": "phpstan-extension", "extra": { @@ -3648,33 +3653,34 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan-phpunit/issues", - "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.16" + "source": "https://github.com/phpstan/phpstan-phpunit/tree/2.0.21" }, - "time": "2026-02-14T09:05:21+00:00" + "time": "2026-10-01T11:59:29+00:00" }, { "name": "phpstan/phpstan-strict-rules", - "version": "2.0.11", + "version": "2.0.12", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-strict-rules.git", - "reference": "9b000a578b85b32945b358b172c7b20e91189024" + "reference": "2bc5ae19ae965663b62ac907ee6342c3903ec93b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/9b000a578b85b32945b358b172c7b20e91189024", - "reference": "9b000a578b85b32945b358b172c7b20e91189024", + "url": "https://api.github.com/repos/phpstan/phpstan-strict-rules/zipball/2bc5ae19ae965663b62ac907ee6342c3903ec93b", + "reference": "2bc5ae19ae965663b62ac907ee6342c3903ec93b", "shasum": "" }, "require": { "php": "^7.4 || ^8.0", - "phpstan/phpstan": "^2.1.39" + "phpstan/phpstan": "^2.1.52" }, "require-dev": { "php-parallel-lint/php-parallel-lint": "^1.2", "phpstan/phpstan-deprecation-rules": "^2.0", "phpstan/phpstan-phpunit": "^2.0", - "phpunit/phpunit": "^9.6" + "phpunit/phpunit": "^9.6", + "shipmonk/name-collision-detector": "^2.1" }, "type": "phpstan-extension", "extra": { @@ -3699,22 +3705,22 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan-strict-rules/issues", - "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.11" + "source": "https://github.com/phpstan/phpstan-strict-rules/tree/2.0.12" }, - "time": "2026-05-02T06:54:10+00:00" + "time": "2026-07-19T07:24:06+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "14.2.2", + "version": "14.4.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "10d7da3628a99289cdf4c662dd7f0d73f1baec83" + "reference": "f1e54f06b6b4cea73cd6104ba3c0cfa0efa6d73f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/10d7da3628a99289cdf4c662dd7f0d73f1baec83", - "reference": "10d7da3628a99289cdf4c662dd7f0d73f1baec83", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f1e54f06b6b4cea73cd6104ba3c0cfa0efa6d73f", + "reference": "f1e54f06b6b4cea73cd6104ba3c0cfa0efa6d73f", "shasum": "" }, "require": { @@ -3722,18 +3728,18 @@ "ext-libxml": "*", "ext-mbstring": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^5.7.0", + "nikic/php-parser": "^5.9.0", "php": ">=8.4", - "phpunit/php-text-template": "^6.0", + "phpunit/php-text-template": "^6.0.1", "sebastian/complexity": "^6.0", - "sebastian/environment": "^9.3.2", + "sebastian/environment": "^9.3.3", "sebastian/git-state": "^1.0", - "sebastian/lines-of-code": "^5.0.1", + "sebastian/lines-of-code": "^5.0.2", "sebastian/version": "^7.0", "theseer/tokenizer": "^2.0.1" }, "require-dev": { - "phpunit/phpunit": "^13.2.0" + "phpunit/phpunit": "^13.3.6" }, "suggest": { "ext-pcov": "PHP extension that provides line coverage", @@ -3742,7 +3748,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "14.2.x-dev" + "dev-main": "14.4.x-dev" } }, "autoload": { @@ -3771,7 +3777,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/14.2.2" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/14.4.1" }, "funding": [ { @@ -3791,27 +3797,27 @@ "type": "tidelift" } ], - "time": "2026-06-08T11:50:38+00:00" + "time": "2026-10-03T14:05:38+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "7.0.0", + "version": "7.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "6e5aa1fb0a95b1703d83e721299ee18bb4e2de50" + "reference": "9bb4e6c58b62c1e043be995c66abec7c97307aae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6e5aa1fb0a95b1703d83e721299ee18bb4e2de50", - "reference": "6e5aa1fb0a95b1703d83e721299ee18bb4e2de50", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/9bb4e6c58b62c1e043be995c66abec7c97307aae", + "reference": "9bb4e6c58b62c1e043be995c66abec7c97307aae", "shasum": "" }, "require": { "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^13.0" + "phpunit/phpunit": "^13.3.1" }, "type": "library", "extra": { @@ -3844,7 +3850,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/7.0.0" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/7.0.2" }, "funding": [ { @@ -3864,7 +3870,7 @@ "type": "tidelift" } ], - "time": "2026-02-06T04:33:26+00:00" + "time": "2026-08-25T14:47:43+00:00" }, { "name": "phpunit/php-invoker", @@ -3944,23 +3950,23 @@ }, { "name": "phpunit/php-text-template", - "version": "6.0.0", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "a47af19f93f76aa3368303d752aa5272ca3299f4" + "reference": "97107691cb2b6c743b5e0c44be19e983cb337a02" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/a47af19f93f76aa3368303d752aa5272ca3299f4", - "reference": "a47af19f93f76aa3368303d752aa5272ca3299f4", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/97107691cb2b6c743b5e0c44be19e983cb337a02", + "reference": "97107691cb2b6c743b5e0c44be19e983cb337a02", "shasum": "" }, "require": { "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^13.0" + "phpunit/phpunit": "^13.3.6" }, "type": "library", "extra": { @@ -3992,7 +3998,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/6.0.0" + "source": "https://github.com/sebastianbergmann/php-text-template/tree/6.0.1" }, "funding": [ { @@ -4012,7 +4018,7 @@ "type": "tidelift" } ], - "time": "2026-02-06T04:36:37+00:00" + "time": "2026-10-03T04:54:24+00:00" }, { "name": "phpunit/php-timer", @@ -4088,44 +4094,45 @@ }, { "name": "phpunit/phpunit", - "version": "13.1.14", + "version": "13.4.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "cdd419c33c040c6b570e51dba8ecbe81d399da53" + "reference": "ef714df238ae4d050e74efaa23f7c428bd01034e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/cdd419c33c040c6b570e51dba8ecbe81d399da53", - "reference": "cdd419c33c040c6b570e51dba8ecbe81d399da53", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/ef714df238ae4d050e74efaa23f7c428bd01034e", + "reference": "ef714df238ae4d050e74efaa23f7c428bd01034e", "shasum": "" }, "require": { "ext-dom": "*", + "ext-filter": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", - "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.4", + "myclabs/deep-copy": "^1.14.0", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=8.4.1", - "phpunit/php-code-coverage": "^14.1.10", - "phpunit/php-file-iterator": "^7.0.0", + "phpunit/php-code-coverage": "^14.4", + "phpunit/php-file-iterator": "^7.0.2", "phpunit/php-invoker": "^7.0.0", "phpunit/php-text-template": "^6.0.0", "phpunit/php-timer": "^9.0.0", - "sebastian/cli-parser": "^5.0.0", - "sebastian/comparator": "^8.2.1", - "sebastian/diff": "^8.3.0", - "sebastian/environment": "^9.3.2", - "sebastian/exporter": "^8.1.0", + "sebastian/cli-parser": "^5.0.1", + "sebastian/comparator": "^8.4", + "sebastian/diff": "^9.0.1", + "sebastian/environment": "^9.3.3", + "sebastian/exporter": "^8.2.1", + "sebastian/file-filter": "^1.0", "sebastian/git-state": "^1.0", "sebastian/global-state": "^9.0.1", - "sebastian/object-enumerator": "^8.0.0", - "sebastian/recursion-context": "^8.0.0", - "sebastian/type": "^7.0.1", + "sebastian/object-enumerator": "^8.1.0", + "sebastian/recursion-context": "^8.0.1", + "sebastian/type": "^7.0.2", "sebastian/version": "^7.0.0", "staabm/side-effects-detector": "^1.0.5" }, @@ -4135,7 +4142,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "13.1-dev" + "dev-main": "13.4-dev" } }, "autoload": { @@ -4167,7 +4174,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/13.1.14" + "source": "https://github.com/sebastianbergmann/phpunit/tree/13.4.0" }, "funding": [ { @@ -4175,7 +4182,7 @@ "type": "other" } ], - "time": "2026-06-04T06:16:42+00:00" + "time": "2026-10-02T03:20:44+00:00" }, { "name": "psr/clock", @@ -4550,21 +4557,21 @@ }, { "name": "rector/rector", - "version": "2.5.2", + "version": "2.6.7", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "49ff6339174bdbdf50b0b35ecbcff14a05ac9e24" + "reference": "f4aa224edb9b0630fb43826d4cb6a49b62e48d4c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/49ff6339174bdbdf50b0b35ecbcff14a05ac9e24", - "reference": "49ff6339174bdbdf50b0b35ecbcff14a05ac9e24", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/f4aa224edb9b0630fb43826d4cb6a49b62e48d4c", + "reference": "f4aa224edb9b0630fb43826d4cb6a49b62e48d4c", "shasum": "" }, "require": { "php": "^7.4|^8.0", - "phpstan/phpstan": "^2.2.2" + "phpstan/phpstan": "^2.2.14" }, "conflict": { "rector/rector-doctrine": "*", @@ -4572,9 +4579,6 @@ "rector/rector-phpunit": "*", "rector/rector-symfony": "*" }, - "suggest": { - "ext-dom": "To manipulate phpunit.xml via the custom-rule command" - }, "bin": [ "bin/rector" ], @@ -4598,7 +4602,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/2.5.2" + "source": "https://github.com/rectorphp/rector/tree/2.6.7" }, "funding": [ { @@ -4606,7 +4610,7 @@ "type": "github" } ], - "time": "2026-06-22T11:39:33+00:00" + "time": "2026-09-13T20:17:44+00:00" }, { "name": "revolt/event-loop", @@ -5099,23 +5103,23 @@ }, { "name": "sebastian/cli-parser", - "version": "5.0.0", + "version": "5.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "48a4654fa5e48c1c81214e9930048a572d4b23ca" + "reference": "eeb759ad3146b7096fb59c3195d39e071cd409e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/48a4654fa5e48c1c81214e9930048a572d4b23ca", - "reference": "48a4654fa5e48c1c81214e9930048a572d4b23ca", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/eeb759ad3146b7096fb59c3195d39e071cd409e3", + "reference": "eeb759ad3146b7096fb59c3195d39e071cd409e3", "shasum": "" }, "require": { "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^13.0" + "phpunit/phpunit": "^13.2.6" }, "type": "library", "extra": { @@ -5144,7 +5148,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/cli-parser/issues", "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/5.0.0" + "source": "https://github.com/sebastianbergmann/cli-parser/tree/5.0.1" }, "funding": [ { @@ -5164,31 +5168,31 @@ "type": "tidelift" } ], - "time": "2026-02-06T04:39:44+00:00" + "time": "2026-08-01T04:27:14+00:00" }, { "name": "sebastian/comparator", - "version": "8.2.1", + "version": "8.4.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "ce999bf08b2c387a5423fe56961c32eed3f88089" + "reference": "3b070e608146cba00fd6fd1f0ffba89e5a8897fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/ce999bf08b2c387a5423fe56961c32eed3f88089", - "reference": "ce999bf08b2c387a5423fe56961c32eed3f88089", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/3b070e608146cba00fd6fd1f0ffba89e5a8897fb", + "reference": "3b070e608146cba00fd6fd1f0ffba89e5a8897fb", "shasum": "" }, "require": { "ext-dom": "*", "ext-mbstring": "*", "php": ">=8.4", - "sebastian/diff": "^8.3", - "sebastian/exporter": "^8.0.3" + "sebastian/diff": "^9.0", + "sebastian/exporter": "^8.2" }, "require-dev": { - "phpunit/phpunit": "^13.1.10" + "phpunit/phpunit": "^13.3" }, "suggest": { "ext-bcmath": "For comparing BcMath\\Number objects" @@ -5196,7 +5200,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "8.2-dev" + "dev-main": "8.4-dev" } }, "autoload": { @@ -5236,7 +5240,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/8.2.1" + "source": "https://github.com/sebastianbergmann/comparator/tree/8.4.0" }, "funding": [ { @@ -5256,7 +5260,7 @@ "type": "tidelift" } ], - "time": "2026-05-21T04:46:40+00:00" + "time": "2026-08-07T07:23:13+00:00" }, { "name": "sebastian/complexity", @@ -5330,29 +5334,29 @@ }, { "name": "sebastian/diff", - "version": "8.3.0", + "version": "9.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "b36d33b6e796513de7cb7df053afb3f55eefcd47" + "reference": "a2df6626c1baf31d5a88674882a3072f151b5a26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b36d33b6e796513de7cb7df053afb3f55eefcd47", - "reference": "b36d33b6e796513de7cb7df053afb3f55eefcd47", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/a2df6626c1baf31d5a88674882a3072f151b5a26", + "reference": "a2df6626c1baf31d5a88674882a3072f151b5a26", "shasum": "" }, "require": { "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^13.0", - "symfony/process": "^7.2" + "phpunit/phpunit": "^13.3.1", + "symfony/process": "^7.4.17" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "8.3-dev" + "dev-main": "9.0-dev" } }, "autoload": { @@ -5385,7 +5389,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/8.3.0" + "source": "https://github.com/sebastianbergmann/diff/tree/9.0.1" }, "funding": [ { @@ -5405,27 +5409,27 @@ "type": "tidelift" } ], - "time": "2026-05-15T04:58:09+00:00" + "time": "2026-08-25T15:38:55+00:00" }, { "name": "sebastian/environment", - "version": "9.3.2", + "version": "9.3.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e" + "reference": "d4dd10267a11055066a2a78ae04583d8ddd4f595" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e", - "reference": "6c9e487c9eb706a8d258102a1c0b0a3e53e86c2e", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d4dd10267a11055066a2a78ae04583d8ddd4f595", + "reference": "d4dd10267a11055066a2a78ae04583d8ddd4f595", "shasum": "" }, "require": { "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^13.1.11" + "phpunit/phpunit": "^13.3.6" }, "suggest": { "ext-posix": "*" @@ -5461,7 +5465,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/9.3.2" + "source": "https://github.com/sebastianbergmann/environment/tree/9.3.3" }, "funding": [ { @@ -5481,34 +5485,34 @@ "type": "tidelift" } ], - "time": "2026-05-25T13:41:38+00:00" + "time": "2026-10-01T12:37:56+00:00" }, { "name": "sebastian/exporter", - "version": "8.1.0", + "version": "8.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "c0d29a945f8cf82f300a05e69874508e307ca4c6" + "reference": "24a3b69bba4a12ab615fca9d34680c5598d9ab7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c0d29a945f8cf82f300a05e69874508e307ca4c6", - "reference": "c0d29a945f8cf82f300a05e69874508e307ca4c6", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/24a3b69bba4a12ab615fca9d34680c5598d9ab7a", + "reference": "24a3b69bba4a12ab615fca9d34680c5598d9ab7a", "shasum": "" }, "require": { "ext-mbstring": "*", "php": ">=8.4", - "sebastian/recursion-context": "^8.0" + "sebastian/recursion-context": "^8.0.1" }, "require-dev": { - "phpunit/phpunit": "^13.1.10" + "phpunit/phpunit": "^13.3" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "8.1-dev" + "dev-main": "8.2-dev" } }, "autoload": { @@ -5551,7 +5555,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/8.1.0" + "source": "https://github.com/sebastianbergmann/exporter/tree/8.2.1" }, "funding": [ { @@ -5571,7 +5575,76 @@ "type": "tidelift" } ], - "time": "2026-05-21T11:50:56+00:00" + "time": "2026-08-07T07:22:06+00:00" + }, + { + "name": "sebastian/file-filter", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/file-filter.git", + "reference": "33a26f394330f6faa7684bb9cc73afb7727aae93" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/file-filter/zipball/33a26f394330f6faa7684bb9cc73afb7727aae93", + "reference": "33a26f394330f6faa7684bb9cc73afb7727aae93", + "shasum": "" + }, + "require": { + "php": ">=8.4" + }, + "require-dev": { + "phpunit/phpunit": "^13.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for filtering files", + "homepage": "https://github.com/sebastianbergmann/file-filter", + "support": { + "issues": "https://github.com/sebastianbergmann/file-filter/issues", + "security": "https://github.com/sebastianbergmann/file-filter/security/policy", + "source": "https://github.com/sebastianbergmann/file-filter/tree/1.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/file-filter", + "type": "tidelift" + } + ], + "time": "2026-04-22T07:20:04+00:00" }, { "name": "sebastian/git-state", @@ -5718,24 +5791,24 @@ }, { "name": "sebastian/lines-of-code", - "version": "5.0.1", + "version": "5.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "d2cff273a90c79b0eb590baa682d4b5c318bdbb7" + "reference": "d1b6f8fce682505dbd048977f1abedf1b8ad3ff8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d2cff273a90c79b0eb590baa682d4b5c318bdbb7", - "reference": "d2cff273a90c79b0eb590baa682d4b5c318bdbb7", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d1b6f8fce682505dbd048977f1abedf1b8ad3ff8", + "reference": "d1b6f8fce682505dbd048977f1abedf1b8ad3ff8", "shasum": "" }, "require": { - "nikic/php-parser": "^5.7.0", + "nikic/php-parser": "^5.8.0", "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^13.1.10" + "phpunit/phpunit": "^13.2.4" }, "type": "library", "extra": { @@ -5764,7 +5837,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/5.0.1" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/5.0.2" }, "funding": [ { @@ -5784,34 +5857,33 @@ "type": "tidelift" } ], - "time": "2026-05-19T16:23:37+00:00" + "time": "2026-07-09T08:42:34+00:00" }, { "name": "sebastian/object-enumerator", - "version": "8.0.0", + "version": "8.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "b39ab125fd9a7434b0ecbc4202eebce11a98cfc5" + "reference": "511064ecde82bd747e2ba2fab3dda8d977b59576" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/b39ab125fd9a7434b0ecbc4202eebce11a98cfc5", - "reference": "b39ab125fd9a7434b0ecbc4202eebce11a98cfc5", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/511064ecde82bd747e2ba2fab3dda8d977b59576", + "reference": "511064ecde82bd747e2ba2fab3dda8d977b59576", "shasum": "" }, "require": { "php": ">=8.4", - "sebastian/object-reflector": "^6.0", - "sebastian/recursion-context": "^8.0" + "sebastian/recursion-context": "^8.0.1" }, "require-dev": { - "phpunit/phpunit": "^13.0" + "phpunit/phpunit": "^13.3.0" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "8.0-dev" + "dev-main": "8.1-dev" } }, "autoload": { @@ -5834,7 +5906,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/8.0.0" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/8.1.0" }, "funding": [ { @@ -5854,7 +5926,7 @@ "type": "tidelift" } ], - "time": "2026-02-06T04:46:36+00:00" + "time": "2026-08-13T07:05:05+00:00" }, { "name": "sebastian/object-reflector", @@ -5926,23 +5998,23 @@ }, { "name": "sebastian/recursion-context", - "version": "8.0.0", + "version": "8.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "74c5af21f6a5833e91767ca068c4d3dfec15317e" + "reference": "32dba72f2b4642d6a93db22d6c0a9280ff2e3ca0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/74c5af21f6a5833e91767ca068c4d3dfec15317e", - "reference": "74c5af21f6a5833e91767ca068c4d3dfec15317e", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/32dba72f2b4642d6a93db22d6c0a9280ff2e3ca0", + "reference": "32dba72f2b4642d6a93db22d6c0a9280ff2e3ca0", "shasum": "" }, "require": { "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^13.0" + "phpunit/phpunit": "^13.2.6" }, "type": "library", "extra": { @@ -5978,7 +6050,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/8.0.0" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/8.0.1" }, "funding": [ { @@ -5998,27 +6070,27 @@ "type": "tidelift" } ], - "time": "2026-02-06T04:51:28+00:00" + "time": "2026-08-03T05:58:12+00:00" }, { "name": "sebastian/type", - "version": "7.0.1", + "version": "7.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "fee0309275847fefd7636167085e379c1dbf6990" + "reference": "bd1df467864cb95140414059a535b2d906173fcf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fee0309275847fefd7636167085e379c1dbf6990", - "reference": "fee0309275847fefd7636167085e379c1dbf6990", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/bd1df467864cb95140414059a535b2d906173fcf", + "reference": "bd1df467864cb95140414059a535b2d906173fcf", "shasum": "" }, "require": { "php": ">=8.4" }, "require-dev": { - "phpunit/phpunit": "^13.1.10" + "phpunit/phpunit": "^13.3.0" }, "type": "library", "extra": { @@ -6047,7 +6119,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/type/issues", "security": "https://github.com/sebastianbergmann/type/security/policy", - "source": "https://github.com/sebastianbergmann/type/tree/7.0.1" + "source": "https://github.com/sebastianbergmann/type/tree/7.0.2" }, "funding": [ { @@ -6067,7 +6139,7 @@ "type": "tidelift" } ], - "time": "2026-05-20T06:49:11+00:00" + "time": "2026-08-10T08:00:57+00:00" }, { "name": "sebastian/version", @@ -6310,16 +6382,16 @@ }, { "name": "shipmonk/dead-code-detector", - "version": "1.2.1", + "version": "1.4.2", "source": { "type": "git", "url": "https://github.com/shipmonk-rnd/dead-code-detector.git", - "reference": "b2f49bbcf6246c2058b2b7c6770bc6db06def5b2" + "reference": "431c13453eeb1790e15c8674ad4d6318218849bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/shipmonk-rnd/dead-code-detector/zipball/b2f49bbcf6246c2058b2b7c6770bc6db06def5b2", - "reference": "b2f49bbcf6246c2058b2b7c6770bc6db06def5b2", + "url": "https://api.github.com/repos/shipmonk-rnd/dead-code-detector/zipball/431c13453eeb1790e15c8674ad4d6318218849bc", + "reference": "431c13453eeb1790e15c8674ad4d6318218849bc", "shasum": "" }, "require": { @@ -6340,15 +6412,16 @@ "nette/tester": "^2.4", "nette/utils": "^3.0 || ^4.0", "nikic/php-parser": "^5.4.0", + "phpat/phpat": "^0.12", "phpbench/phpbench": "^1.2", "phpstan/phpstan-phpunit": "^2.0.16", "phpstan/phpstan-strict-rules": "^2.0.10", "phpstan/phpstan-symfony": "^2.0.15", "phpunit/phpcov": "^9.0.2", "phpunit/phpunit": "^10.5.46", - "shipmonk/coding-standard": "^0.2.2", + "shipmonk/coding-standard": "^0.3.0", "shipmonk/composer-dependency-analyser": "^1.8.4", - "shipmonk/coverage-guard": "^1.0.2", + "shipmonk/coverage-guard": "^1.1.0", "shipmonk/name-collision-detector": "^2.1.1", "shipmonk/phpstan-dev": "^0.1.6", "shipmonk/phpstan-rules": "^4.3.6", @@ -6392,9 +6465,9 @@ ], "support": { "issues": "https://github.com/shipmonk-rnd/dead-code-detector/issues", - "source": "https://github.com/shipmonk-rnd/dead-code-detector/tree/1.2.1" + "source": "https://github.com/shipmonk-rnd/dead-code-detector/tree/1.4.2" }, - "time": "2026-06-12T07:26:41+00:00" + "time": "2026-09-18T07:50:08+00:00" }, { "name": "shipmonk/phpstan-rules", @@ -6458,32 +6531,32 @@ }, { "name": "slevomat/coding-standard", - "version": "8.30.1", + "version": "8.31.1", "source": { "type": "git", "url": "https://github.com/slevomat/coding-standard.git", - "reference": "70a3b2150600122f87c59cae1c1b5902ba73798b" + "reference": "0a40807a48873948bfa7ffce2a4e69ba40cf5e76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/70a3b2150600122f87c59cae1c1b5902ba73798b", - "reference": "70a3b2150600122f87c59cae1c1b5902ba73798b", + "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/0a40807a48873948bfa7ffce2a4e69ba40cf5e76", + "reference": "0a40807a48873948bfa7ffce2a4e69ba40cf5e76", "shasum": "" }, "require": { "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || ^1.2.1", "php": "^7.4 || ^8.0", - "phpstan/phpdoc-parser": "^2.3.2", + "phpstan/phpdoc-parser": "^2.3.3", "squizlabs/php_codesniffer": "^4.0.1" }, "require-dev": { "phing/phing": "3.0.1|3.1.2", "php-parallel-lint/php-parallel-lint": "1.4.0", - "phpstan/phpstan": "2.2.2", - "phpstan/phpstan-deprecation-rules": "2.0.4", - "phpstan/phpstan-phpunit": "2.0.16", - "phpstan/phpstan-strict-rules": "2.0.11", - "phpunit/phpunit": "9.6.34|10.5.63|11.4.4|11.5.55|12.5.30" + "phpstan/phpstan": "2.2.7", + "phpstan/phpstan-deprecation-rules": "2.0.5", + "phpstan/phpstan-phpunit": "2.0.18", + "phpstan/phpstan-strict-rules": "2.0.12", + "phpunit/phpunit": "9.6.34|10.5.63|11.4.4|11.5.56|12.5.33" }, "type": "phpcodesniffer-standard", "extra": { @@ -6507,7 +6580,7 @@ ], "support": { "issues": "https://github.com/slevomat/coding-standard/issues", - "source": "https://github.com/slevomat/coding-standard/tree/8.30.1" + "source": "https://github.com/slevomat/coding-standard/tree/8.31.1" }, "funding": [ { @@ -6519,23 +6592,24 @@ "type": "tidelift" } ], - "time": "2026-06-27T11:26:35+00:00" + "time": "2026-07-31T10:42:43+00:00" }, { "name": "squizlabs/php_codesniffer", - "version": "4.0.1", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "0525c73950de35ded110cffafb9892946d7771b5" + "reference": "bbdc3d0532623e21838b7041a4364383a8126f96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/0525c73950de35ded110cffafb9892946d7771b5", - "reference": "0525c73950de35ded110cffafb9892946d7771b5", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/bbdc3d0532623e21838b7041a4364383a8126f96", + "reference": "bbdc3d0532623e21838b7041a4364383a8126f96", "shasum": "" }, "require": { + "ext-libxml": "*", "ext-simplexml": "*", "ext-tokenizer": "*", "ext-xmlwriter": "*", @@ -6544,6 +6618,10 @@ "require-dev": { "phpunit/phpunit": "^8.4.0 || ^9.3.4 || ^10.5.32 || 11.3.3 - 11.5.28 || ^11.5.31" }, + "suggest": { + "ext-iconv": "For accurate character length calculation when the checked files contain multi-byte characters.", + "ext-pcntl": "For parallel processing support via the --parallel CLI option." + }, "bin": [ "bin/phpcbf", "bin/phpcs" @@ -6598,7 +6676,7 @@ "type": "thanks_dev" } ], - "time": "2025-11-10T16:43:36+00:00" + "time": "2026-08-06T02:45:27+00:00" }, { "name": "staabm/phpstan-psr3", @@ -8941,29 +9019,33 @@ }, { "name": "tomasvotruba/type-coverage", - "version": "2.2.2", + "version": "2.4.1", "source": { "type": "git", "url": "https://github.com/TomasVotruba/type-coverage.git", - "reference": "25f298265c823e8fb0505169135855e1e6a91021" + "reference": "2876326f2d1946df983da6feb2903e3797df5918" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/TomasVotruba/type-coverage/zipball/25f298265c823e8fb0505169135855e1e6a91021", - "reference": "25f298265c823e8fb0505169135855e1e6a91021", + "url": "https://api.github.com/repos/TomasVotruba/type-coverage/zipball/2876326f2d1946df983da6feb2903e3797df5918", + "reference": "2876326f2d1946df983da6feb2903e3797df5918", "shasum": "" }, "require": { "php": "^8.4", - "phpstan/phpstan": "^2.2" + "phpstan/phpstan": "^2.2", + "webmozart/assert": "^1.11 || ^2.1" }, "require-dev": { + "doctrine/collections": "^2.3", "phpstan/extension-installer": "^1.4", - "phpunit/phpunit": "^12.5", - "rector/jack": "^1.0", - "rector/rector": "^2.4", + "phpunit/phpunit": "^13.2", + "rector/jack": "^1.1", + "rector/rector": "^2.5", "shipmonk/composer-dependency-analyser": "^1.8", - "symplify/easy-coding-standard": "^13.1", + "symfony/dom-crawler": "^8.1", + "symfony/form": "^8.1", + "symplify/easy-coding-standard": "^13.2", "tomasvotruba/unused-public": "^2.2", "tracy/tracy": "^2.12" }, @@ -8977,6 +9059,7 @@ }, "autoload": { "psr-4": { + "Rector\\TypePerfect\\": "packages/type-perfect/src", "TomasVotruba\\TypeCoverage\\": "src" } }, @@ -8991,7 +9074,7 @@ ], "support": { "issues": "https://github.com/TomasVotruba/type-coverage/issues", - "source": "https://github.com/TomasVotruba/type-coverage/tree/2.2.2" + "source": "https://github.com/TomasVotruba/type-coverage/tree/2.4.1" }, "funding": [ { @@ -9003,7 +9086,7 @@ "type": "github" } ], - "time": "2026-06-07T12:35:00+00:00" + "time": "2026-10-03T05:13:37+00:00" }, { "name": "webmozart/assert", @@ -9122,34 +9205,34 @@ }, { "name": "wyrihaximus/async-test-utilities", - "version": "13.3.0", + "version": "13.5.2", "source": { "type": "git", "url": "https://github.com/WyriHaximus/php-async-test-utilities.git", - "reference": "4c9f02bf271bc6ff615a6a1b85f2839f811b2274" + "reference": "89036249981c3d860510ad98748f5862b21574d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WyriHaximus/php-async-test-utilities/zipball/4c9f02bf271bc6ff615a6a1b85f2839f811b2274", - "reference": "4c9f02bf271bc6ff615a6a1b85f2839f811b2274", + "url": "https://api.github.com/repos/WyriHaximus/php-async-test-utilities/zipball/89036249981c3d860510ad98748f5862b21574d4", + "reference": "89036249981c3d860510ad98748f5862b21574d4", "shasum": "" }, "require": { "php": "^8.4", - "phpunit/phpunit": "^13.1.14", + "phpunit/phpunit": "^13.2.6", "react/async": "^4.3.0", "react/event-loop": "^1.6.0", "react/promise": "^3.3.0", "wyrihaximus/phpstan-react": "^2.0.0", "wyrihaximus/react-phpunit-run-tests-in-fiber": "^4.0.0", - "wyrihaximus/test-utilities": "^13.3.0" + "wyrihaximus/test-utilities": "^13.5.2" }, "conflict": { "composer/compoer": "<2.6.0" }, "require-dev": { "react/promise-timer": "^1.11.0", - "wyrihaximus/makefiles": "^0.12.1" + "wyrihaximus/makefiles": "^0.13.3" }, "type": "library", "extra": { @@ -9177,7 +9260,7 @@ "description": "Test utilities for api-clients packages", "support": { "issues": "https://github.com/WyriHaximus/php-async-test-utilities/issues", - "source": "https://github.com/WyriHaximus/php-async-test-utilities/tree/13.3.0" + "source": "https://github.com/WyriHaximus/php-async-test-utilities/tree/13.5.2" }, "funding": [ { @@ -9185,31 +9268,31 @@ "type": "github" } ], - "time": "2026-06-27T22:10:23+00:00" + "time": "2026-08-07T17:36:53+00:00" }, { "name": "wyrihaximus/coding-standard", - "version": "4.2.0", + "version": "4.3.0", "source": { "type": "git", "url": "https://github.com/WyriHaximus/php-coding-standard.git", - "reference": "15de1c4e2be8857b2c086810659eac158dfe7531" + "reference": "6efccf79994a0a4fc3692a47a5b72448900fdc38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WyriHaximus/php-coding-standard/zipball/15de1c4e2be8857b2c086810659eac158dfe7531", - "reference": "15de1c4e2be8857b2c086810659eac158dfe7531", + "url": "https://api.github.com/repos/WyriHaximus/php-coding-standard/zipball/6efccf79994a0a4fc3692a47a5b72448900fdc38", + "reference": "6efccf79994a0a4fc3692a47a5b72448900fdc38", "shasum": "" }, "require": { "dealerdirect/phpcodesniffer-composer-installer": "^1.2.1", "doctrine/coding-standard": "^14.0.0", "php": "^8.4", - "slevomat/coding-standard": "^8.30.1", - "squizlabs/php_codesniffer": "^4.0.1" + "slevomat/coding-standard": "^8.31.1", + "squizlabs/php_codesniffer": "^4.0.4" }, "require-dev": { - "wyrihaximus/makefiles": "^0.12.1" + "wyrihaximus/makefiles": "^0.13.3" }, "type": "phpcodesniffer-standard", "extra": { @@ -9229,7 +9312,7 @@ "description": "WyriHaximus Coding Standard", "support": { "issues": "https://github.com/WyriHaximus/php-coding-standard/issues", - "source": "https://github.com/WyriHaximus/php-coding-standard/tree/4.2.0" + "source": "https://github.com/WyriHaximus/php-coding-standard/tree/4.3.0" }, "funding": [ { @@ -9237,20 +9320,20 @@ "type": "github" } ], - "time": "2026-06-27T19:56:09+00:00" + "time": "2026-08-06T23:29:46+00:00" }, { "name": "wyrihaximus/makefiles", - "version": "0.12.3", + "version": "0.15.1", "source": { "type": "git", "url": "https://github.com/WyriHaximus/Makefiles.git", - "reference": "cbb98ce358e8886a3c5d982b01fc478677ba8ef2" + "reference": "6caf17e8ac1fcfa8152311da7c2c005d7498a828" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WyriHaximus/Makefiles/zipball/cbb98ce358e8886a3c5d982b01fc478677ba8ef2", - "reference": "cbb98ce358e8886a3c5d982b01fc478677ba8ef2", + "url": "https://api.github.com/repos/WyriHaximus/Makefiles/zipball/6caf17e8ac1fcfa8152311da7c2c005d7498a828", + "reference": "6caf17e8ac1fcfa8152311da7c2c005d7498a828", "shasum": "" }, "require": { @@ -9262,7 +9345,7 @@ "infection/infection": "<0.32.0" }, "require-dev": { - "wyrihaximus/test-utilities": "^13.3.0" + "wyrihaximus/test-utilities": "^14.4.0" }, "type": "composer-plugin", "extra": { @@ -9291,7 +9374,7 @@ "description": "🧱 Makefile building blocks", "support": { "issues": "https://github.com/WyriHaximus/Makefiles/issues", - "source": "https://github.com/WyriHaximus/Makefiles/tree/0.12.3" + "source": "https://github.com/WyriHaximus/Makefiles/tree/0.15.1" }, "funding": [ { @@ -9299,20 +9382,20 @@ "type": "github" } ], - "time": "2026-07-02T10:01:48+00:00" + "time": "2026-10-03T15:29:24+00:00" }, { "name": "wyrihaximus/phpstan-no-safe", - "version": "1.0.0", + "version": "1.1.0", "source": { "type": "git", "url": "https://github.com/WyriHaximus/phpstan-no-safe.git", - "reference": "f9bed3bbba6cf617e25b3753ecbb09ad4d2c4813" + "reference": "7f31edbca02397aa6297ba96906962f01d15c911" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WyriHaximus/phpstan-no-safe/zipball/f9bed3bbba6cf617e25b3753ecbb09ad4d2c4813", - "reference": "f9bed3bbba6cf617e25b3753ecbb09ad4d2c4813", + "url": "https://api.github.com/repos/WyriHaximus/phpstan-no-safe/zipball/7f31edbca02397aa6297ba96906962f01d15c911", + "reference": "7f31edbca02397aa6297ba96906962f01d15c911", "shasum": "" }, "require": { @@ -9322,7 +9405,7 @@ "jawira/case-converter": "^3.6", "nikic/php-parser": "^5.6.1", "phpstan/phpdoc-parser": "^2.2.0", - "wyrihaximus/makefiles": "^0.11.1", + "wyrihaximus/makefiles": "^0.13.3", "wyrihaximus/test-utilities": "^13.1.0" }, "type": "library", @@ -9345,7 +9428,7 @@ "description": "⛔🔐 PHPStan extension that detects and blocks any usage of `thecodingmachine/safe`", "support": { "issues": "https://github.com/WyriHaximus/phpstan-no-safe/issues", - "source": "https://github.com/WyriHaximus/phpstan-no-safe/tree/1.0.0" + "source": "https://github.com/WyriHaximus/phpstan-no-safe/tree/1.1.0" }, "funding": [ { @@ -9353,7 +9436,7 @@ "type": "github" } ], - "time": "2026-06-19T23:15:39+00:00" + "time": "2026-08-07T14:23:53+00:00" }, { "name": "wyrihaximus/phpstan-react", @@ -9411,34 +9494,34 @@ }, { "name": "wyrihaximus/phpstan-rules-wrapper", - "version": "14.0.0", + "version": "14.8.0", "source": { "type": "git", "url": "https://github.com/WyriHaximus/php-phpstan-rules-wrapper.git", - "reference": "a06a7d45b26704dc422db617e696267441e9d69b" + "reference": "dd68b2b81217fe5717ee25156c39f40514831c74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WyriHaximus/php-phpstan-rules-wrapper/zipball/a06a7d45b26704dc422db617e696267441e9d69b", - "reference": "a06a7d45b26704dc422db617e696267441e9d69b", + "url": "https://api.github.com/repos/WyriHaximus/php-phpstan-rules-wrapper/zipball/dd68b2b81217fe5717ee25156c39f40514831c74", + "reference": "dd68b2b81217fe5717ee25156c39f40514831c74", "shasum": "" }, "require": { "ergebnis/phpstan-rules": "^2.13.1", "php": "^8.4", "phpstan/extension-installer": "^1.4.3", - "phpstan/phpstan": "^2.2.2", - "phpstan/phpstan-deprecation-rules": "^2.0.4", + "phpstan/phpstan": "^2.2.14", + "phpstan/phpstan-deprecation-rules": "^2.0.5", "phpstan/phpstan-mockery": "^2.0.0", - "phpstan/phpstan-phpunit": "^2.0.16", - "phpstan/phpstan-strict-rules": "^2.0.11", - "shipmonk/dead-code-detector": "^1.2.1", + "phpstan/phpstan-phpunit": "^2.0.18", + "phpstan/phpstan-strict-rules": "^2.0.12", + "shipmonk/dead-code-detector": "^1.4.1", "shipmonk/phpstan-rules": "^4.4.0", "staabm/phpstan-psr3": "^1.0.3", "symplify/phpstan-extensions": "^12.0.2", - "tomasvotruba/type-coverage": "^2.2.2", - "wyrihaximus/phpstan-no-safe": "^1.0.0", - "yamadashy/phpstan-friendly-formatter": "^1.4.0" + "tomasvotruba/type-coverage": "^2.3.6", + "wyrihaximus/phpstan-no-safe": "^1.1.0", + "yamadashy/phpstan-friendly-formatter": "^1.5.0" }, "type": "library", "extra": { @@ -9461,7 +9544,7 @@ "description": "🌯 PHPStan rules wrapper", "support": { "issues": "https://github.com/WyriHaximus/php-phpstan-rules-wrapper/issues", - "source": "https://github.com/WyriHaximus/php-phpstan-rules-wrapper/tree/14.0.0" + "source": "https://github.com/WyriHaximus/php-phpstan-rules-wrapper/tree/14.8.0" }, "funding": [ { @@ -9469,7 +9552,7 @@ "type": "github" } ], - "time": "2026-06-19T23:25:20+00:00" + "time": "2026-09-20T13:35:19+00:00" }, { "name": "wyrihaximus/react-phpunit-run-tests-in-fiber", @@ -9530,16 +9613,16 @@ }, { "name": "wyrihaximus/test-utilities", - "version": "13.3.0", + "version": "13.5.2", "source": { "type": "git", "url": "https://github.com/WyriHaximus/php-test-utilities.git", - "reference": "ed71de5364fbf676c30110ee1c9e7e26e24aee03" + "reference": "e87f761d9ac480fba66e94913ec5879716a87e64" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WyriHaximus/php-test-utilities/zipball/ed71de5364fbf676c30110ee1c9e7e26e24aee03", - "reference": "ed71de5364fbf676c30110ee1c9e7e26e24aee03", + "url": "https://api.github.com/repos/WyriHaximus/php-test-utilities/zipball/e87f761d9ac480fba66e94913ec5879716a87e64", + "reference": "e87f761d9ac480fba66e94913ec5879716a87e64", "shasum": "" }, "require": { @@ -9549,27 +9632,30 @@ "ext-hash": "^8.4", "ext-json": "^8.4", "icanhazstring/composer-unused": "^0.9.6", - "infection/infection": "^0.33.3", + "infection/infection": "^0.34.2", "maglnet/composer-require-checker": "^4.20.0", "mockery/mockery": "^1.6.12", "php": "^8.4", "php-parallel-lint/php-console-highlighter": "^1.0.0", "php-parallel-lint/php-parallel-lint": "^1.4.0", - "phpstan/phpstan": "^2.2.2", - "phpunit/phpunit": "^13.1.13", - "rector/rector": "^2.5.2", + "phpstan/phpstan": "^2.2.8", + "phpunit/phpunit": "^13.3.0", + "rector/rector": "^2.6.1", "roave/backward-compatibility-check": "^8.19.0", - "squizlabs/php_codesniffer": "^4.0.1", - "wyrihaximus/coding-standard": "^4.2.0", - "wyrihaximus/phpstan-rules-wrapper": "^14.0.0" + "squizlabs/php_codesniffer": "^4.0.4", + "wyrihaximus/coding-standard": "^4.3.0", + "wyrihaximus/phpstan-rules-wrapper": "^14.4.0" }, "conflict": { "composer-unused/symbol-parser": "<0.3.3", + "composer/composer": "<2.10.2", "composer/pcre": "<3.3.2", + "sanmai/di-container": "<0.1.17", + "sanmai/pipeline": "<7.9", "wyrihaximus/makefiles": "<0.5.0" }, "require-dev": { - "wyrihaximus/makefiles": "^0.12.1" + "wyrihaximus/makefiles": "^0.13.3" }, "suggest": { "wyrihaximus/async-test-utilities": "The recommended addition to this package when building ReactPHP packages and projects.", @@ -9602,7 +9688,7 @@ "description": "🛠️ Test utilities for api-clients packages", "support": { "issues": "https://github.com/WyriHaximus/php-test-utilities/issues", - "source": "https://github.com/WyriHaximus/php-test-utilities/tree/13.3.0" + "source": "https://github.com/WyriHaximus/php-test-utilities/tree/13.5.2" }, "funding": [ { @@ -9610,20 +9696,20 @@ "type": "github" } ], - "time": "2026-06-27T20:14:37+00:00" + "time": "2026-08-07T14:59:43+00:00" }, { "name": "yamadashy/phpstan-friendly-formatter", - "version": "v1.4.0", + "version": "v1.5.0", "source": { "type": "git", "url": "https://github.com/yamadashy/phpstan-friendly-formatter.git", - "reference": "cd4882c7293591c13230b5be35e742b33d2ab2ff" + "reference": "c5dfd04146143ddcc297741cda2814975735605b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/yamadashy/phpstan-friendly-formatter/zipball/cd4882c7293591c13230b5be35e742b33d2ab2ff", - "reference": "cd4882c7293591c13230b5be35e742b33d2ab2ff", + "url": "https://api.github.com/repos/yamadashy/phpstan-friendly-formatter/zipball/c5dfd04146143ddcc297741cda2814975735605b", + "reference": "c5dfd04146143ddcc297741cda2814975735605b", "shasum": "" }, "require": { @@ -9632,9 +9718,9 @@ "phpstan/phpstan": "^1.0 || ^2.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.93.0", - "phpstan/phpstan-phpunit": "^2.0.12", - "phpunit/phpunit": "^10.0 || ^11.0" + "friendsofphp/php-cs-fixer": "^3.95.25", + "phpstan/phpstan-phpunit": "^2.0.18", + "phpunit/phpunit": "^10.0 || ^11.0 || ^13.0" }, "type": "phpstan-extension", "extra": { @@ -9668,9 +9754,9 @@ ], "support": { "issues": "https://github.com/yamadashy/phpstan-friendly-formatter/issues", - "source": "https://github.com/yamadashy/phpstan-friendly-formatter/tree/v1.4.0" + "source": "https://github.com/yamadashy/phpstan-friendly-formatter/tree/v1.5.0" }, - "time": "2026-01-26T15:12:47+00:00" + "time": "2026-09-19T13:58:44+00:00" } ], "aliases": [], diff --git a/etc/qa/composer-require-checker.json b/etc/qa/composer-require-checker.json deleted file mode 100644 index 040b1e2..0000000 --- a/etc/qa/composer-require-checker.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "symbol-whitelist" : [ - "null", "true", "false", - "static", "self", "parent", - "array", "string", "int", "float", "bool", "iterable", "callable", "void", "object", "mixed", - "Safe\\json_encode", "futurePromise", "WyriHaximus\\Constants\\ComposerAutoloader\\LOCATION" - ], - "php-core-extensions" : [ - "Core", - "date", - "pcre", - "Phar", - "Reflection", - "SPL", - "standard" - ], - "scan-files" : [] -} diff --git a/etc/qa/composer-unused.php b/etc/qa/composer-unused.php deleted file mode 100644 index 20587fa..0000000 --- a/etc/qa/composer-unused.php +++ /dev/null @@ -1 +0,0 @@ - $config; \ No newline at end of file