psalm check

This commit is contained in:
Robin Appelman 2025-10-25 20:13:34 +02:00
commit 341f512bd5
4 changed files with 85 additions and 8 deletions

31
checks/psalm.nix Normal file
View file

@ -0,0 +1,31 @@
{
composerMeta,
src,
psalm,
vendor,
stdenvNoCC,
}: let
inherit (composerMeta) version name;
in
stdenvNoCC.mkDerivation {
inherit src version;
pname = "${name}-psalm";
nativeBuildInputs = [psalm];
postPatch = ''
ln -s ${vendor}/vendor vendor
'';
buildPhase = ''
runHook preBuild
psalm --no-cache
runHook postBuild
'';
installPhase = ''
touch $out
'';
}

View file

@ -43,5 +43,10 @@ in
phpConstraint = composerJson.require.php; phpConstraint = composerJson.require.php;
matches = matchesConstraint phpConstraint; matches = matchesConstraint phpConstraint;
in { in {
inherit (composerJson) name;
version =
if (composerJson ? version)
then composerJson.version
else "0.0.0";
phpVersions = filter matches allVersions; phpVersions = filter matches allVersions;
} }

View file

@ -6,13 +6,12 @@
src, src,
config, config,
flakelight, flakelight,
inputs,
... ...
}: let }: let
inherit (builtins) elem readFile pathExists match any concatLists fromJSON attrNames head; inherit (builtins) elem readFile pathExists match fromJSON attrNames head;
inherit (lib) getExe map mkDefault mkIf mkMerge mkOption warnIf optionalAttrs types optionalString genAttrs hasInfix makeSearchPathOutput; inherit (lib) getExe mkDefault mkIf mkMerge mkOption warnIf optionalAttrs types;
inherit (lib.fileset) fileFilter toSource unions; inherit (lib.fileset) fileFilter toSource unions;
inherit (flakelight.types) fileset function optFunctionTo; inherit (flakelight.types) fileset function;
phpVersions = { phpVersions = {
"5.6" = pkgs: pkgs.php56; "5.6" = pkgs: pkgs.php56;
@ -80,6 +79,7 @@ in
fileFilter fileFilter
(file: (file:
file.hasExt "php" file.hasExt "php"
|| file.hasExt "phpstub"
|| match "snapshot__.*\.snap" file.name != null || match "snapshot__.*\.snap" file.name != null
|| elem file.name [".php-cs-fixer.dist.php" "psalm.xml" "package.json" "package.lock"]) || elem file.name [".php-cs-fixer.dist.php" "psalm.xml" "package.json" "package.lock"])
src; src;
@ -94,6 +94,9 @@ in
default = pkgs: []; default = pkgs: [];
description = "extra packages to make available in the dev shells"; description = "extra packages to make available in the dev shells";
}; };
vendorHash = mkOption {
type = with types; str;
};
}; };
config = mkMerge [ config = mkMerge [
@ -101,7 +104,13 @@ in
withOverlays = [ withOverlays = [
(final: prev: { (final: prev: {
minPhp = buildPhp final; minPhp = buildPhp final;
inherit (final.minPhp.packages) php-cs-fixer composer; vendor = final.callPackage ./pkgs/vendor.nix {
php = final.minPhp;
inherit (config) composerJson composerLock vendorHash;
};
inherit composerMeta filteredSrc;
inherit (final.minPhp.packages) php-cs-fixer composer psalm;
}) })
]; ];
@ -111,18 +120,27 @@ in
pname = composerMeta.name; pname = composerMeta.name;
outputs = { outputs = {
lib.phpVersions = composerMeta.phpVersions; lib = {
phpVersions = composerMeta.phpVersions;
inherit hasPsalm hasPhpCsFixer;
};
};
packages = {
vendor = pkgs: pkgs.vendor;
}; };
checks = {pkgs, ...}: (optionalAttrs hasPsalm { checks = {pkgs, ...}: (optionalAttrs hasPsalm {
psalm = pkgs.runCommand "psalm-check" {} "exit 1;"; psalm = pkgs.callPackage ./checks/psalm.nix {
src = filteredSrc;
};
}); });
}) })
{ {
devShells = { devShells = {
default = { default = {
packages = pkgs: (config.tools pkgs) ++ (with pkgs; [minPhp php-cs-fixer composer]); packages = pkgs: (config.tools pkgs) ++ (with pkgs; [minPhp php-cs-fixer composer psalm]);
}; };
}; };

23
pkgs/vendor.nix Normal file
View file

@ -0,0 +1,23 @@
{
composerMeta,
vendorHash,
runCommand,
composerJson,
composerLock,
php,
}: let
inherit (composerMeta) version name;
in
php.mkComposerVendor {
src = runCommand "${name}-composer-config" {} ''
mkdir $out
cp ${composerJson} $out/composer.json
cp ${composerLock} $out/composer.lock
'';
pname = name;
inherit php vendorHash name version;
postBuild = ''
rm -rf vendor/*/*/.git
'';
}