diff --git a/Makefile b/Makefile index 3194c6f..b683e03 100644 --- a/Makefile +++ b/Makefile @@ -3,15 +3,16 @@ SHELL=bash .PHONY: * +DOCKER_AVAILABLE=$(shell ((command -v docker >/dev/null 2>&1) && echo 0 || echo 1)) CONTAINER_REGISTRY_REPO="ghcr.io/wyrihaximusnet/php" -COMPOSER_SHOW_EXTENSION_LIST_PROD=$(shell ((command -v docker >/dev/null 2>&1) && docker run --rm -v "`pwd`:`pwd`" -w `pwd` ${CONTAINER_REGISTRY_REPO}:8.4-nts-alpine-slim-dev composer show -t) | grep -o "\-\-\(ext-\).\+" | sort | uniq | cut -d- -f4- | tr -d '\n' | grep . | sed '/^$$/d' | xargs | sed -e 's/ /, /g' | tr -cd '[:alnum:],' | sed 's/.$$//') -COMPOSER_SHOW_EXTENSION_LIST_DEV=$(shell ((command -v docker >/dev/null 2>&1) && docker run --rm -v "`pwd`:`pwd`" -w `pwd` ${CONTAINER_REGISTRY_REPO}:8.4-nts-alpine-slim-dev composer show -s) | grep -o "\(ext-\).\+" | sort | uniq | cut -d- -f2- | cut -d" " -f1 | xargs | sed -e 's/ /, /g' | tr -cd '[:alnum:],') +COMPOSER_SHOW_EXTENSION_LIST_PROD=$(shell (((command -v composer >/dev/null 2>&1) && composer show -t --no-plugins) || docker run --rm -v "`pwd`:`pwd`" -w `pwd` ${CONTAINER_REGISTRY_REPO}:8.4-nts-alpine-slim-dev composer show -t --no-plugins) | grep -o "\-\-\(ext-\).\+" | sort | uniq | cut -d- -f4- | tr -d '\n' | grep . | sed '/^$$/d' | xargs | sed -e 's/ /, /g' | tr -cd '[:alnum:],' | sed 's/.$$//') +COMPOSER_SHOW_EXTENSION_LIST_DEV=$(shell (((command -v composer >/dev/null 2>&1) && composer show -s --no-plugins) || docker run --rm -v "`pwd`:`pwd`" -w `pwd` ${CONTAINER_REGISTRY_REPO}:8.4-nts-alpine-slim-dev composer show -s --no-plugins) | grep -o "\(ext-\).\+" | sort | uniq | cut -d- -f2- | cut -d" " -f1 | xargs | sed -e 's/ /, /g' | tr -cd '[:alnum:],') COMPOSER_SHOW_EXTENSION_LIST=$(shell echo "${COMPOSER_SHOW_EXTENSION_LIST_PROD},${COMPOSER_SHOW_EXTENSION_LIST_DEV}") SLIM_DOCKER_IMAGE=$(shell php -r 'echo count(array_intersect(["gd", "vips"], explode(",", "${COMPOSER_SHOW_EXTENSION_LIST}"))) > 0 ? "" : "-slim";') NTS_OR_ZTS_DOCKER_IMAGE=$(shell php -r 'echo count(array_intersect(["parallel"], explode(",", "${COMPOSER_SHOW_EXTENSION_LIST}"))) > 0 ? "zts" : "nts";') PHP_VERSION:=$(shell (((command -v docker >/dev/null 2>&1) && docker run --rm -v "`pwd`:`pwd`" ${CONTAINER_REGISTRY_REPO}:8.4-nts-alpine-slim php -r "echo json_decode(file_get_contents('`pwd`/composer.json'), true)['config']['platform']['php'];") || echo "8.3") | php -r "echo str_replace('|', '.', explode('.', implode('|', explode('.', stream_get_contents(STDIN), 2)), 2)[0]);") CONTAINER_NAME=$(shell echo "${CONTAINER_REGISTRY_REPO}:${PHP_VERSION}-${NTS_OR_ZTS_DOCKER_IMAGE}-alpine${SLIM_DOCKER_IMAGE}-dev") -COMPOSER_CACHE_DIR=$(shell (command -v docker >/dev/null 2>&1) && docker run --rm -v "`pwd`:`pwd`" -w `pwd` ${CONTAINER_REGISTRY_REPO}:8.4-nts-alpine-slim-dev composer config --global cache-dir -q || echo ${HOME}/.composer-php/cache) +COMPOSER_CACHE_DIR=$(shell (command -v composer >/dev/null 2>&1) && 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 -it ${CONTAINER_NAME} composer config --global cache-dir -q) || echo ${HOME}/.composer-php/cache) ifneq ("$(wildcard /.you-are-in-a-wyrihaximus.net-php-docker-image)","") @@ -23,12 +24,16 @@ endif ifeq ("$(IN_DOCKER)","TRUE") DOCKER_RUN:= else - DOCKER_RUN:=docker run --rm -it \ - -v "`pwd`:`pwd`" \ - -v "${COMPOSER_CACHE_DIR}:${COMPOSER_CONTAINER_CACHE_DIR}" \ - -w "`pwd`" \ - -e OTEL_PHP_FIBERS_ENABLED="true" \ - "${CONTAINER_NAME}" + ifeq ($(DOCKER_AVAILABLE),0) + DOCKER_RUN:=docker run --rm -it \ + -v "`pwd`:`pwd`" \ + -v "${COMPOSER_CACHE_DIR}:${COMPOSER_CONTAINER_CACHE_DIR}" \ + -w "`pwd`" \ + -e OTEL_PHP_FIBERS_ENABLED="true" \ + "${CONTAINER_NAME}" + else + DOCKER_RUN:= + endif endif ifneq (,$(findstring icrosoft,$(shell cat /proc/version))) @@ -38,7 +43,7 @@ else endif all: ## Runs everything #### - @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | grep -v "####" | awk 'BEGIN {FS = ":.*?## "}; {printf "%s\n", $$1}' | xargs -o $(MAKE) + @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | grep -v "##*I*##" | grep -v "####" | awk 'BEGIN {FS = ":.*?## "}; {printf "%s\n", $$1}' | xargs -o $(MAKE) on-install-or-update: ## Runs everything #### @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | grep -E "##\*(I|ILH)\*##" | awk 'BEGIN {FS = ":.*?## "}; {printf "%s\n", $$1}' | xargs -o $(MAKE) @@ -69,10 +74,10 @@ unit-testing-raw: ## Run tests ##*D*## #### php vendor/phpunit/phpunit/phpunit --colors=always -c ./etc/qa/phpunit.xml --coverage-text --coverage-html ./var/tests-unit-coverage-html --coverage-clover ./var/tests-unit-clover-coverage.xml mutation-testing: ## Run mutation testing ##*LCH*## - $(DOCKER_RUN) vendor/bin/infection --ansi --log-verbosity=all --ignore-msi-with-no-mutations --threads=$(THREADS) || (cat ./var/infection.log && false) + $(DOCKER_RUN) vendor/bin/infection --ansi --log-verbosity=all --ignore-msi-with-no-mutations --configuration=./etc/qa/infection.json5 --threads=$(THREADS) || (cat ./var/infection.log && false) mutation-testing-raw: ## Run mutation testing #### - vendor/bin/infection --ansi --log-verbosity=all --ignore-msi-with-no-mutations --threads=$(THREADS) || (cat ./var/infection.log && false) + vendor/bin/infection --ansi --log-verbosity=all --ignore-msi-with-no-mutations --configuration=./etc/qa/infection.json5 --threads=$(THREADS) || (cat ./var/infection.log && false) composer-require-checker: ## Ensure we require every package used in this package directly ##*C*## $(DOCKER_RUN) vendor/bin/composer-require-checker --ignore-parse-errors --ansi -vvv --config-file=./etc/qa/composer-require-checker.json @@ -118,3 +123,14 @@ task-list-ci-locked: ## CI: Generate a JSON array of jobs to run against the loc task-list-ci-high: ## CI: Generate a JSON array of jobs to run against the highest dependencies on the primary threading target @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | grep -E "##\*(H|LH|LCH|LC)\*##" | grep -v "###" | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "%s\n", $$1}' | jq --raw-input --slurp -c 'split("\n")| .[0:-1]' + +## Temporary set of migrations to get all my repos in shape +php-migrations-move-infection: #### Move infection.json.dist to etc/qa/infection.json5 ##*I*## + ($(DOCKER_RUN) mv infection.json.dist etc/qa/infection.json5 || true) + +php-migrations-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) + +php-migrations-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) + diff --git a/composer.json b/composer.json index 874da45..9441bd7 100644 --- a/composer.json +++ b/composer.json @@ -20,7 +20,7 @@ "require-dev": { "react-parallel/stubs": "^1.2", "wyrihaximus/async-test-utilities": "^10.1.0", - "wyrihaximus/makefiles": "^0.6.0", + "wyrihaximus/makefiles": "^0.7.5", "wyrihaximus/ticking-promise": "^3.1.0" }, "autoload": { diff --git a/composer.lock b/composer.lock index aded6a9..f0f6e8a 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": "e0150fd025cc2f9fc2952dd5f55e301e", + "content-hash": "9947cbbf66900a87c05156e2b37715a2", "packages": [ { "name": "lcobucci/clock", @@ -9121,16 +9121,16 @@ }, { "name": "wyrihaximus/makefiles", - "version": "0.6.0", + "version": "0.7.5", "source": { "type": "git", "url": "https://github.com/WyriHaximus/Makefiles.git", - "reference": "f29f168198c37cb410b85bf08c2c81aab32e322b" + "reference": "c843ab1522637130075a79de221f3b86118b09f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WyriHaximus/Makefiles/zipball/f29f168198c37cb410b85bf08c2c81aab32e322b", - "reference": "f29f168198c37cb410b85bf08c2c81aab32e322b", + "url": "https://api.github.com/repos/WyriHaximus/Makefiles/zipball/c843ab1522637130075a79de221f3b86118b09f9", + "reference": "c843ab1522637130075a79de221f3b86118b09f9", "shasum": "" }, "require": { @@ -9139,7 +9139,7 @@ "php": "^8.4" }, "require-dev": { - "wyrihaximus/test-utilities": "^8.0.0" + "wyrihaximus/test-utilities": "^8.1.0" }, "type": "composer-plugin", "extra": { @@ -9163,7 +9163,7 @@ "description": "🧱 Makefile building blocks", "support": { "issues": "https://github.com/WyriHaximus/Makefiles/issues", - "source": "https://github.com/WyriHaximus/Makefiles/tree/0.6.0" + "source": "https://github.com/WyriHaximus/Makefiles/tree/0.7.5" }, "funding": [ { @@ -9171,7 +9171,7 @@ "type": "github" } ], - "time": "2025-08-20T07:50:55+00:00" + "time": "2025-09-07T16:20:50+00:00" }, { "name": "wyrihaximus/phpstan-react", diff --git a/etc/qa/infection.json5 b/etc/qa/infection.json5 new file mode 100644 index 0000000..a0982d0 --- /dev/null +++ b/etc/qa/infection.json5 @@ -0,0 +1,17 @@ +{ + "timeout": 120, + "source": { + "directories": [ + "src" + ] + }, + "logs": { + "text": "../../var/infection.log", + "summary": "../../var/infection-summary.log", + "json": "../../var/infection.json", + "perMutator": "../../var/infection-per-mutator.md" + }, + "mutators": { + "@default": true + } +} diff --git a/infection.json.dist b/infection.json.dist deleted file mode 100644 index e31539a..0000000 --- a/infection.json.dist +++ /dev/null @@ -1,20 +0,0 @@ -{ - "timeout": 120, - "source": { - "directories": [ - "src" - ] - }, - "logs": { - "text": "./var/infection.log", - "summary": "./var/infection-summary.log", - "json": "./var/infection.json", - "perMutator": "./var/infection-per-mutator.md" - }, - "mutators": { - "@default": true - }, - "phpUnit": { - "configDir": "./etc/qa/" - } -}