nixpkgs mirror (for testing)
github.com/NixOS/nixpkgs
nix
1{
2 stdenvNoCC,
3 writeText,
4 lib,
5 makeBinaryWrapper,
6 php,
7 cacert,
8 nix-update-script,
9}:
10
11let
12 composerJsonBuilder =
13 pluginName: pluginVersion:
14 writeText "composer.json" (
15 builtins.toJSON {
16 name = "nix/plugin";
17 description = "Nix Composer plugin";
18 license = "MIT";
19 require = {
20 "${pluginName}" = "${pluginVersion}";
21 };
22 config = {
23 "allow-plugins" = {
24 "${pluginName}" = true;
25 };
26 };
27 repositories = [
28 {
29 type = "path";
30 url = "./src";
31 options = {
32 versions = {
33 "${pluginName}" = "${pluginVersion}";
34 };
35 };
36 }
37 ];
38 }
39 );
40
41 buildComposerWithPluginOverride =
42 finalAttrs: previousAttrs:
43
44 let
45 phpDrv = finalAttrs.php or php;
46 composer = finalAttrs.composer or phpDrv.packages.composer;
47 in
48 {
49 composerLock = previousAttrs.composerLock or null;
50 composerNoDev = previousAttrs.composerNoDev or true;
51 composerNoPlugins = previousAttrs.composerNoPlugins or true;
52 composerNoScripts = previousAttrs.composerNoScripts or true;
53 composerStrictValidation = previousAttrs.composerStrictValidation or true;
54 composerGlobal = true;
55
56 nativeBuildInputs = (previousAttrs.nativeBuildInputs or [ ]) ++ [
57 composer
58 phpDrv
59 makeBinaryWrapper
60 ];
61
62 buildInputs = (previousAttrs.buildInputs or [ ]) ++ [ phpDrv ];
63
64 patches = previousAttrs.patches or [ ];
65 strictDeps = previousAttrs.strictDeps or true;
66
67 # Should we keep these empty phases?
68 configurePhase =
69 previousAttrs.configurePhase or ''
70 runHook preConfigure
71
72 runHook postConfigure
73 '';
74
75 buildPhase =
76 previousAttrs.buildPhase or ''
77 runHook preBuild
78
79 runHook postBuild
80 '';
81
82 doCheck = previousAttrs.doCheck or true;
83
84 checkPhase =
85 previousAttrs.checkPhase or ''
86 runHook preCheck
87
88 runHook postCheck
89 '';
90
91 installPhase =
92 previousAttrs.installPhase or ''
93 runHook preInstall
94
95 makeWrapper ${lib.getExe composer} $out/bin/composer \
96 --prefix COMPOSER_HOME : ${finalAttrs.vendor}
97
98 runHook postInstall
99 '';
100
101 doInstallCheck = previousAttrs.doInstallCheck or false;
102 installCheckPhase =
103 previousAttrs.installCheckPhase or ''
104 runHook preInstallCheck
105
106 composer global show ${finalAttrs.pname}
107
108 runHook postInstallCheck
109 '';
110
111 vendor = previousAttrs.vendor or stdenvNoCC.mkDerivation {
112 pname = "${finalAttrs.pname}-vendor";
113 pluginName = finalAttrs.pname;
114
115 inherit (finalAttrs) version src;
116
117 composerLock = previousAttrs.composerLock or null;
118 composerNoDev = previousAttrs.composerNoDev or true;
119 composerNoPlugins = previousAttrs.composerNoPlugins or true;
120 composerNoScripts = previousAttrs.composerNoScripts or true;
121 composerStrictValidation = previousAttrs.composerStrictValidation or true;
122 composerGlobal = true;
123 composerJson = composerJsonBuilder finalAttrs.pname finalAttrs.version;
124
125 nativeBuildInputs = [
126 cacert
127 composer
128 phpDrv.composerHooks.composerWithPluginVendorHook
129 ];
130
131 dontPatchShebangs = true;
132 doCheck = true;
133 doInstallCheck = true;
134
135 env = {
136 COMPOSER_CACHE_DIR = "/dev/null";
137 COMPOSER_HTACCESS_PROTECT = "0";
138 };
139
140 outputHashMode = "recursive";
141 outputHashAlgo = "sha256";
142 outputHash = finalAttrs.vendorHash;
143 };
144
145 # Projects providing a lockfile from upstream can be automatically updated.
146 passthru = previousAttrs.passthru or { } // {
147 updateScript =
148 previousAttrs.passthru.updateScript
149 or (if finalAttrs.vendor.composerLock == null then nix-update-script { } else null);
150 };
151
152 meta = previousAttrs.meta or composer.meta;
153 };
154in
155args: (stdenvNoCC.mkDerivation args).overrideAttrs buildComposerWithPluginOverride