diff options
Diffstat (limited to 'pkgs/build-support/php/builders/v1')
8 files changed, 287 insertions, 13 deletions
diff --git a/pkgs/build-support/php/builders/v1/build-composer-project.nix b/pkgs/build-support/php/builders/v1/build-composer-project.nix index 7e24812d2e768..698391ad1603c 100644 --- a/pkgs/build-support/php/builders/v1/build-composer-project.nix +++ b/pkgs/build-support/php/builders/v1/build-composer-project.nix @@ -1,5 +1,4 @@ { - callPackage, nix-update-script, stdenvNoCC, lib, @@ -12,8 +11,7 @@ let let phpDrv = finalAttrs.php or php; - composer = finalAttrs.composer or phpDrv.packages.composer; - composer-local-repo-plugin = callPackage ../../pkgs/composer-local-repo-plugin.nix { }; + composer = finalAttrs.composer or phpDrv.packages.composer-local-repo-plugin; in { composerLock = previousAttrs.composerLock or null; @@ -24,7 +22,6 @@ let nativeBuildInputs = (previousAttrs.nativeBuildInputs or [ ]) ++ [ composer - composer-local-repo-plugin phpDrv phpDrv.composerHooks.composerInstallHook ]; @@ -74,7 +71,7 @@ let composerRepository = previousAttrs.composerRepository or (phpDrv.mkComposerRepository { - inherit composer composer-local-repo-plugin; + inherit composer; inherit (finalAttrs) patches pname diff --git a/pkgs/build-support/php/builders/v1/build-composer-repository.nix b/pkgs/build-support/php/builders/v1/build-composer-repository.nix index 54944b91d202d..037d8bdeb3eb1 100644 --- a/pkgs/build-support/php/builders/v1/build-composer-repository.nix +++ b/pkgs/build-support/php/builders/v1/build-composer-repository.nix @@ -1,5 +1,4 @@ { - callPackage, stdenvNoCC, lib, php, @@ -23,8 +22,7 @@ let let phpDrv = finalAttrs.php or php; - composer = finalAttrs.composer or phpDrv.packages.composer; - composer-local-repo-plugin = callPackage ../../pkgs/composer-local-repo-plugin.nix { }; + composer = finalAttrs.composer or phpDrv.packages.composer-local-repo-plugin; in assert (lib.assertMsg (previousAttrs ? src) "mkComposerRepository expects src argument."); assert ( @@ -58,7 +56,6 @@ let nativeBuildInputs = (previousAttrs.nativeBuildInputs or [ ]) ++ [ composer - composer-local-repo-plugin phpDrv phpDrv.composerHooks.composerRepositoryHook ]; diff --git a/pkgs/build-support/php/builders/v1/build-composer-with-plugin.nix b/pkgs/build-support/php/builders/v1/build-composer-with-plugin.nix new file mode 100644 index 0000000000000..060b51241e6c8 --- /dev/null +++ b/pkgs/build-support/php/builders/v1/build-composer-with-plugin.nix @@ -0,0 +1,161 @@ +{ + stdenvNoCC, + writeText, + lib, + makeBinaryWrapper, + php, + cacert, + nix-update-script, +}: + +let + composerJsonBuilder = + pluginName: pluginVersion: + writeText "composer.json" ( + builtins.toJSON { + name = "nix/plugin"; + description = "Nix Composer plugin"; + license = "MIT"; + require = { + "${pluginName}" = "${pluginVersion}"; + }; + config = { + "allow-plugins" = { + "${pluginName}" = true; + }; + }; + repositories = [ + { + type = "path"; + url = "./src"; + options = { + versions = { + "${pluginName}" = "${pluginVersion}"; + }; + }; + } + ]; + } + ); + + buildComposerWithPluginOverride = + finalAttrs: previousAttrs: + + let + phpDrv = finalAttrs.php or php; + composer = finalAttrs.composer or phpDrv.packages.composer; + in + { + composerLock = previousAttrs.composerLock or null; + composerNoDev = previousAttrs.composerNoDev or true; + composerNoPlugins = previousAttrs.composerNoPlugins or true; + composerNoScripts = previousAttrs.composerNoScripts or true; + composerStrictValidation = previousAttrs.composerStrictValidation or true; + composerGlobal = true; + + nativeBuildInputs = (previousAttrs.nativeBuildInputs or [ ]) ++ [ + composer + phpDrv + makeBinaryWrapper + ]; + + buildInputs = (previousAttrs.buildInputs or [ ]) ++ [ phpDrv ]; + + patches = previousAttrs.patches or [ ]; + strictDeps = previousAttrs.strictDeps or true; + + # Should we keep these empty phases? + configurePhase = + previousAttrs.configurePhase or '' + runHook preConfigure + + runHook postConfigure + ''; + + buildPhase = + previousAttrs.buildPhase or '' + runHook preBuild + + runHook postBuild + ''; + + doCheck = previousAttrs.doCheck or true; + + checkPhase = + previousAttrs.checkPhase or '' + runHook preCheck + + runHook postCheck + ''; + + installPhase = + previousAttrs.installPhase or '' + runHook preInstall + + makeWrapper ${lib.getExe composer} $out/bin/composer \ + --prefix COMPOSER_HOME : ${finalAttrs.vendor} + + runHook postInstall + ''; + + doInstallCheck = previousAttrs.doInstallCheck or false; + installCheckPhase = + previousAttrs.installCheckPhase or '' + runHook preInstallCheck + + composer global show ${finalAttrs.pname} + + runHook postInstallCheck + ''; + + vendor = previousAttrs.vendor or stdenvNoCC.mkDerivation { + pname = "${finalAttrs.pname}-vendor"; + pluginName = finalAttrs.pname; + + inherit (finalAttrs) version src; + + composerLock = previousAttrs.composerLock or null; + composerNoDev = previousAttrs.composerNoDev or true; + composerNoPlugins = previousAttrs.composerNoPlugins or true; + composerNoScripts = previousAttrs.composerNoScripts or true; + composerStrictValidation = previousAttrs.composerStrictValidation or true; + composerGlobal = true; + composerJson = composerJsonBuilder finalAttrs.pname finalAttrs.version; + + nativeBuildInputs = [ + cacert + composer + phpDrv.composerHooks.composerWithPluginVendorHook + ]; + + dontPatchShebangs = true; + doCheck = true; + doInstallCheck = true; + + env = { + COMPOSER_CACHE_DIR = "/dev/null"; + COMPOSER_HTACCESS_PROTECT = "0"; + }; + + outputHashMode = "recursive"; + outputHashAlgo = "sha256"; + outputHash = finalAttrs.vendorHash; + }; + + # Projects providing a lockfile from upstream can be automatically updated. + passthru = previousAttrs.passthru or { } // { + updateScript = + previousAttrs.passthru.updateScript + or (if finalAttrs.vendor.composerLock == null then nix-update-script { } else null); + }; + + env = { + COMPOSER_CACHE_DIR = "/dev/null"; + COMPOSER_DISABLE_NETWORK = "1"; + COMPOSER_MIRROR_PATH_REPOS = "1"; + }; + + meta = previousAttrs.meta or composer.meta; + }; +in +args: (stdenvNoCC.mkDerivation args).overrideAttrs buildComposerWithPluginOverride diff --git a/pkgs/build-support/php/builders/v1/hooks/composer-install-hook.sh b/pkgs/build-support/php/builders/v1/hooks/composer-install-hook.sh index a91263422bc84..44e87d06d3a53 100644 --- a/pkgs/build-support/php/builders/v1/hooks/composer-install-hook.sh +++ b/pkgs/build-support/php/builders/v1/hooks/composer-install-hook.sh @@ -83,7 +83,7 @@ composerInstallBuildHook() { # Since this file cannot be generated in the composer-repository-hook.sh # because the file contains hardcoded nix store paths, we generate it here. - composer-local-repo-plugin --no-ansi build-local-repo-lock -m "${composerRepository}" . + composer build-local-repo-lock -m "${composerRepository}" . echo "Finished composerInstallBuildHook" } diff --git a/pkgs/build-support/php/builders/v1/hooks/composer-repository-hook.sh b/pkgs/build-support/php/builders/v1/hooks/composer-repository-hook.sh index c4fa0d52126c1..ec9777541fc0f 100644 --- a/pkgs/build-support/php/builders/v1/hooks/composer-repository-hook.sh +++ b/pkgs/build-support/php/builders/v1/hooks/composer-repository-hook.sh @@ -63,7 +63,7 @@ composerRepositoryBuildHook() { # Build the local composer repository # The command 'build-local-repo' is provided by the Composer plugin # nix-community/composer-local-repo-plugin. - composer-local-repo-plugin --no-ansi build-local-repo-lock ${composerNoDev:+--no-dev} -r repository + composer build-local-repo-lock ${composerNoDev:+--no-dev} -r repository echo "Finished composerRepositoryBuildHook" } diff --git a/pkgs/build-support/php/builders/v1/hooks/composer-with-plugin-vendor-hook.sh b/pkgs/build-support/php/builders/v1/hooks/composer-with-plugin-vendor-hook.sh new file mode 100644 index 0000000000000..0d88d14094ad4 --- /dev/null +++ b/pkgs/build-support/php/builders/v1/hooks/composer-with-plugin-vendor-hook.sh @@ -0,0 +1,93 @@ +declare composerLock +declare version +declare composerNoDev +declare composerNoPlugins +declare composerNoScripts +declare composerStrictValidation + +preConfigureHooks+=(composerWithPluginConfigureHook) +preBuildHooks+=(composerWithPluginBuildHook) +preCheckHooks+=(composerWithPluginCheckHook) +preInstallHooks+=(composerWithPluginInstallHook) +preInstallCheckHooks+=(composerWithPluginInstallCheckHook) + +source @phpScriptUtils@ + +composerWithPluginConfigureHook() { + echo "Executing composerWithPluginConfigureHook" + + mkdir -p $out + + export COMPOSER_HOME=$out + + if [[ -e "$composerLock" ]]; then + cp $composerLock $out/composer.lock + fi + + cp $composerJson $out/composer.json + cp -ar $src $out/src + + if [[ ! -f "$out/composer.lock" ]]; then + setComposeRootVersion + + composer \ + global \ + --no-install \ + --no-interaction \ + --no-progress \ + ${composerNoDev:+--no-dev} \ + ${composerNoPlugins:+--no-plugins} \ + ${composerNoScripts:+--no-scripts} \ + update + + echo + echo -e "\e[31mERROR: No composer.lock found\e[0m" + echo + echo -e '\e[31mNo composer.lock file found, consider adding one to your repository to ensure reproducible builds.\e[0m' + echo -e "\e[31mIn the meantime, a composer.lock file has been generated for you in $out/composer.lock\e[0m" + echo + echo -e '\e[31mTo fix the issue:\e[0m' + echo -e "\e[31m1. Copy the composer.lock file from $out/composer.lock to the project's source:\e[0m" + echo -e "\e[31m cp $out/composer.lock <path>\e[0m" + echo -e '\e[31m2. Add the composerLock attribute, pointing to the copied composer.lock file:\e[0m' + echo -e '\e[31m composerLock = ./composer.lock;\e[0m' + echo + + exit 1 + fi + + echo "Finished composerWithPluginConfigureHook" +} + +composerWithPluginBuildHook() { + echo "Executing composerWithPluginBuildHook" + + echo "Finished composerWithPluginBuildHook" +} + +composerWithPluginCheckHook() { + echo "Executing composerWithPluginCheckHook" + + checkComposerValidate + + echo "Finished composerWithPluginCheckHook" +} + +composerWithPluginInstallHook() { + echo "Executing composerWithPluginInstallHook" + + composer \ + global \ + --no-interaction \ + --no-progress \ + ${composerNoDev:+--no-dev} \ + ${composerNoPlugins:+--no-plugins} \ + ${composerNoScripts:+--no-scripts} \ + install + + echo "Finished composerWithPluginInstallHook" +} + +composerWithPluginInstallCheckHook() { + composer global show $pluginName +} diff --git a/pkgs/build-support/php/builders/v1/hooks/default.nix b/pkgs/build-support/php/builders/v1/hooks/default.nix index 4c0ba1b18801c..d10ff78067278 100644 --- a/pkgs/build-support/php/builders/v1/hooks/default.nix +++ b/pkgs/build-support/php/builders/v1/hooks/default.nix @@ -42,4 +42,19 @@ in phpScriptUtils = lib.getExe php-script-utils; }; } ./composer-install-hook.sh; + + composerWithPluginVendorHook = makeSetupHook { + name = "composer-with-plugin-vendor-hook.sh"; + propagatedBuildInputs = [ + jq + moreutils + cacert + ]; + substitutions = { + # Specify the stdenv's `diff` by abspath to ensure that the user's build + # inputs do not cause us to find the wrong `diff`. + cmp = "${lib.getBin buildPackages.diffutils}/bin/cmp"; + phpScriptUtils = lib.getExe php-script-utils; + }; + } ./composer-with-plugin-vendor-hook.sh; } diff --git a/pkgs/build-support/php/builders/v1/hooks/php-script-utils.bash b/pkgs/build-support/php/builders/v1/hooks/php-script-utils.bash index bba0242e65d1e..65c0a3b410f69 100644 --- a/pkgs/build-support/php/builders/v1/hooks/php-script-utils.bash +++ b/pkgs/build-support/php/builders/v1/hooks/php-script-utils.bash @@ -1,5 +1,6 @@ declare version declare composerStrictValidation +declare composerGlobal setComposeRootVersion() { set +e # Disable exit on error @@ -13,7 +14,16 @@ setComposeRootVersion() { } checkComposerValidate() { - if ! composer validate --strict --no-ansi --no-interaction --quiet --no-check-all --no-check-lock; then + setComposeRootVersion + + if [ "1" == "${composerGlobal-}" ]; then + global="global"; + else + global=""; + fi + + command="composer ${global} validate --strict --quiet --no-interaction --no-check-all --no-check-lock" + if ! $command; then if [ "1" == "${composerStrictValidation-}" ]; then echo echo -e "\e[31mERROR: composer files validation failed\e[0m" @@ -42,7 +52,8 @@ checkComposerValidate() { fi fi - if ! composer validate --strict --no-ansi --no-interaction --quiet --no-check-all --check-lock; then + command="composer ${global} validate --strict --no-ansi --no-interaction --quiet --no-check-all --check-lock" + if ! $command; then if [ "1" == "${composerStrictValidation-}" ]; then echo echo -e "\e[31mERROR: composer files validation failed\e[0m" |