b642ac7b70
An automatic way to do this that scales up and requires little manual intervention is really needed. It works by scraping extensions.gnome.org with a python script, that writes all relevant information into the `extensions.json`. Every attribute of besaid file can be built into a package using `buildShellExtension`. Extensions are grouped by GNOME Shell version for practical reasons. Only extensions for GNOME 40 and 3.38 were added, as we don't support legacy GNOME versions. The extensions are exposed as an attrset, `pkgs.gnome40Extensions` and `pkgs.gnome38Extensions` respectively. The package name of each extensions is generated automatically from its UUID. The attribute `pkgs.gnomeExtensions` contains the officially packaged and supported extensions set. It contains all the automatically packaged extensions for the current GNOME Shell version, which are overwritten by manually packaged ones where needed. Unlike gnomeXYExtensions, the names are not UUIDs, but automatically generated human-friendly names. Naming collisions – which are tracked in collisions.json – need to be manually resolved in the `extensionRenames` attrset.
54 lines
1.8 KiB
Nix
54 lines
1.8 KiB
Nix
{ pkgs, lib, stdenv, fetchzip }:
|
|
|
|
let
|
|
|
|
buildGnomeExtension = {
|
|
# Every gnome extension has a UUID. It's the name of the extension folder once unpacked
|
|
# and can always be found in the metadata.json of every extension.
|
|
uuid,
|
|
name,
|
|
pname,
|
|
description,
|
|
# extensions.gnome.org extension URL
|
|
link,
|
|
# Extension version numbers are integers
|
|
version,
|
|
sha256,
|
|
# Hex-encoded string of JSON bytes
|
|
metadata,
|
|
}:
|
|
|
|
stdenv.mkDerivation {
|
|
inherit pname;
|
|
version = builtins.toString version;
|
|
src = fetchzip {
|
|
url = "https://extensions.gnome.org/extension-data/${
|
|
builtins.replaceStrings [ "@" ] [ "" ] uuid
|
|
}.v${builtins.toString version}.shell-extension.zip";
|
|
inherit sha256;
|
|
stripRoot = false;
|
|
# The download URL may change content over time. This is because the
|
|
# metadata.json is automatically generated, and parts of it can be changed
|
|
# without making a new release. We simply substitute the possibly changed fields
|
|
# with their content from when we last updated, and thus get a deterministic output
|
|
# hash.
|
|
extraPostFetch = ''
|
|
echo "${metadata}" | base64 --decode > $out/metadata.json
|
|
'';
|
|
};
|
|
buildCommand = ''
|
|
mkdir -p $out/share/gnome-shell/extensions/
|
|
cp -r -T $src $out/share/gnome-shell/extensions/${uuid}
|
|
'';
|
|
meta = {
|
|
description = builtins.head (lib.splitString "\n" description);
|
|
longDescription = description;
|
|
homepage = link;
|
|
license = lib.licenses.gpl2Plus; # https://wiki.gnome.org/Projects/GnomeShell/Extensions/Review#Licensing
|
|
maintainers = with lib.maintainers; [ piegames ];
|
|
};
|
|
# Store the extension's UUID, because we might need it at some places
|
|
passthru.extensionUuid = uuid;
|
|
};
|
|
in
|
|
lib.makeOverridable buildGnomeExtension
|