Files
nixpkgs/pkgs/servers/web-apps/wordpress/packages/default.nix
T
2025-10-26 15:31:36 +09:00

208 lines
5.0 KiB
Nix

# Source: https://git.helsinki.tools/helsinki-systems/wp4nix/-/blob/master/default.nix
# Licensed under: MIT
# Slightly modified
{
lib,
newScope,
plugins,
themes,
languages,
callPackage,
}:
let
packages =
self:
let
generatedJson = {
inherit plugins themes languages;
};
sourceJson = {
plugins = builtins.fromJSON (builtins.readFile ./wordpress-plugins.json);
themes = builtins.fromJSON (builtins.readFile ./wordpress-themes.json);
languages = builtins.fromJSON (builtins.readFile ./wordpress-languages.json);
};
in
{
# Create a generic WordPress package. Most arguments are just passed
# to `mkDerivation`. The version is automatically filtered for weird characters.
mkWordpressDerivation = self.callPackage (
{
stdenvNoCC,
lib,
filterWPString,
gettext,
wp-cli,
}:
{
type,
pname,
version,
license,
...
}@args:
assert lib.elem type [
"plugin"
"theme"
"language"
];
stdenvNoCC.mkDerivation (
{
pname = "wordpress-${type}-${pname}";
version = filterWPString version;
dontConfigure = true;
dontBuild = true;
installPhase = ''
runHook preInstall
cp -R ./. $out
runHook postInstall
'';
passthru = {
wpName = pname;
};
meta = {
license = lib.licenses.${license};
}
// (args.passthru or { });
}
// lib.optionalAttrs (type == "language") {
nativeBuildInputs = [
gettext
wp-cli
];
dontBuild = false;
buildPhase = ''
runHook preBuild
find -name '*.po' -print0 | while IFS= read -d "" -r po; do
msgfmt -o $(basename "$po" .po).mo "$po"
done
wp i18n make-json .
rm *.po
runHook postBuild
'';
}
// removeAttrs args [
"type"
"pname"
"version"
"passthru"
]
)
) { };
# Create a derivation from the official wordpress.org packages.
# This takes the type, the pname and the data generated from the go tool.
mkOfficialWordpressDerivation = self.callPackage (
{ mkWordpressDerivation, fetchWordpress }:
{
type,
pname,
data,
license,
}:
mkWordpressDerivation {
inherit type pname license;
version = data.version;
src = fetchWordpress type data;
}
) { };
# Filter out all characters that might occur in a version string but that that are not allowed
# in store paths.
filterWPString =
builtins.replaceStrings
[
" "
","
"/"
"&"
";"
''"''
"'"
"$"
":"
"("
")"
"["
"]"
"{"
"}"
"|"
"*"
"\t"
]
[
"_"
"."
"."
""
""
""
""
""
""
""
""
""
""
""
""
"-"
""
""
];
# Fetch a package from the official wordpress.org SVN.
# The data supplied is the data straight from the go tool.
fetchWordpress = self.callPackage (
{ fetchsvn }:
type: data:
fetchsvn {
inherit (data) rev sha256;
url =
if type == "plugin" || type == "theme" then
"https://" + type + "s.svn.wordpress.org/" + data.path
else if type == "language" then
"https://i18n.svn.wordpress.org/core/" + data.version + "/" + data.path
else if type == "pluginLanguage" then
"https://i18n.svn.wordpress.org/plugins/" + data.path
else if type == "themeLanguage" then
"https://i18n.svn.wordpress.org/themes/" + data.path
else
throw "fetchWordpress: invalid package type ${type}";
}
) { };
}
// lib.mapAttrs (
type: pkgs:
lib.recurseIntoAttrs (
lib.makeExtensible (
_:
lib.mapAttrs (
pname: data:
self.mkOfficialWordpressDerivation {
type = lib.removeSuffix "s" type;
inherit pname data;
license = sourceJson.${type}.${pname};
}
) pkgs
)
)
) generatedJson;
in
# This creates an extensible scope.
lib.recursiveUpdate ((lib.makeExtensible (_: (lib.makeScope newScope packages))).extend (
selfWP: superWP: { }
)) (callPackage ./thirdparty.nix { })