1
0
Fork 0
mirror of https://github.com/nix-community/home-manager synced 2024-10-22 04:57:26 +02:00

xdg-mime type package options (#5920)

* xdg-mime: allow overrides to shared-mime-info and desktop-file-utils

The `xdg-mime` module now exposes packages to determine what will be run
for update-mime-database and update-desktop-database. This allows users
to select a different version of these packages if the are incompatible.
This should, in combination with an override to the version of
`shared-mime-info` (can be found here notalltim/home-manager-config#4),
resolve #4955, #5102, #4682, and possibly #4941. The problem seems to stem
from a mismatch in the version of `shared-mime-info` with the host.

I also switched from using `buildPackages` to `pkgs` to improve
cross-compilation compatibility.

* xdg-mime: Add tests for xdg-mime module

The xdg-mime module was missing tests so I added basic test for all the
options and checked the basic behavior. It covers ensuring that the
proper files/folders are created and that the package overrides work.
This commit is contained in:
Timothy Gallion 2024-10-07 17:39:24 -04:00 committed by GitHub
parent 271c83e21e
commit 038630363e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 114 additions and 19 deletions

View file

@ -5,33 +5,50 @@ with lib;
let let
cfg = config.xdg.mime; cfg = config.xdg.mime;
inherit (lib) getExe getExe';
in { in {
options = { options = {
xdg.mime.enable = mkOption { xdg.mime = {
type = types.bool; enable = mkOption {
default = pkgs.stdenv.hostPlatform.isLinux; type = types.bool;
defaultText = default = pkgs.stdenv.hostPlatform.isLinux;
literalExpression "true if host platform is Linux, false otherwise"; defaultText =
description = '' literalExpression "true if host platform is Linux, false otherwise";
Whether to install programs and files to support the description = ''
XDG Shared MIME-info specification and XDG MIME Applications Whether to install programs and files to support the
specification at XDG Shared MIME-info specification and XDG MIME Applications
<https://specifications.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html> specification at
and <https://specifications.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html>
<https://specifications.freedesktop.org/mime-apps-spec/mime-apps-spec-latest.html>, and
respectively. <https://specifications.freedesktop.org/mime-apps-spec/mime-apps-spec-latest.html>,
''; respectively.
'';
};
sharedMimeInfoPackage = mkOption {
type = types.package;
default = pkgs.shared-mime-info;
defaultText = literalExpression "pkgs.shared-mime-info";
description = "The package to use when running update-mime-database.";
};
desktopFileUtilsPackage = mkOption {
type = types.package;
default = pkgs.desktop-file-utils;
defaultText = literalExpression "pkgs.desktop-file-utils";
description =
"The package to use when running update-desktop-database.";
};
}; };
}; };
config = mkIf cfg.enable {
config = mkIf config.xdg.mime.enable {
assertions = assertions =
[ (hm.assertions.assertPlatform "xdg.mime" pkgs platforms.linux) ]; [ (hm.assertions.assertPlatform "xdg.mime" pkgs platforms.linux) ];
home.packages = [ home.packages = [
# Explicitly install package to provide basic mime types. # Explicitly install package to provide basic mime types.
pkgs.shared-mime-info cfg.sharedMimeInfoPackage
# Make sure the target directories will be real directories. # Make sure the target directories will be real directories.
(pkgs.runCommandLocal "dummy-xdg-mime-dirs1" { } '' (pkgs.runCommandLocal "dummy-xdg-mime-dirs1" { } ''
@ -46,12 +63,12 @@ in {
if [[ -w $out/share/mime && -w $out/share/mime/packages && -d $out/share/mime/packages ]]; then if [[ -w $out/share/mime && -w $out/share/mime/packages && -d $out/share/mime/packages ]]; then
XDG_DATA_DIRS=$out/share \ XDG_DATA_DIRS=$out/share \
PKGSYSTEM_ENABLE_FSYNC=0 \ PKGSYSTEM_ENABLE_FSYNC=0 \
${pkgs.buildPackages.shared-mime-info}/bin/update-mime-database \ ${getExe cfg.sharedMimeInfoPackage} \
-V $out/share/mime > /dev/null -V $out/share/mime > /dev/null
fi fi
if [[ -w $out/share/applications ]]; then if [[ -w $out/share/applications ]]; then
${pkgs.buildPackages.desktop-file-utils}/bin/update-desktop-database \ ${getExe' cfg.desktopFileUtilsPackage "update-desktop-database"} \
$out/share/applications $out/share/applications
fi fi
''; '';

View file

@ -6,4 +6,7 @@
xdg-default-locations = ./default-locations.nix; xdg-default-locations = ./default-locations.nix;
xdg-user-dirs-null = ./user-dirs-null.nix; xdg-user-dirs-null = ./user-dirs-null.nix;
xdg-portal = ./portal.nix; xdg-portal = ./portal.nix;
xdg-mime = ./mime.nix;
xdg-mime-disabled = ./mime-disabled.nix;
xdg-mime-package = ./mime-packages.nix;
} }

View file

@ -0,0 +1,10 @@
{ ... }: {
config = {
xdg.mime.enable = false;
nmt.script = ''
# assert that neither application is run
assertPathNotExists home-path/share/applications/mimeinfo.cache
assertPathNotExists home-path/share/applications/mime
'';
};
}

View file

@ -0,0 +1,3 @@
[MIME Cache]
text/html=mime-test.desktop;
text/xml=mime-test.desktop;

View file

@ -0,0 +1,38 @@
{ config, ... }:
let inherit (config.lib.test) mkStubPackage;
in {
config = {
xdg.mime.enable = true;
xdg.mime.sharedMimeInfoPackage = mkStubPackage {
name = "update-mime-database";
buildScript = ''
mkdir -p $out/bin
echo '#!/bin/sh' > $out/bin/update-mime-database
echo 'mkdir -p $out/share/mime && touch $out/share/mime/mime.cache' >> $out/bin/update-mime-database
chmod +x $out/bin/update-mime-database
'';
};
xdg.mime.desktopFileUtilsPackage = mkStubPackage {
name = "desktop-file-utils";
buildScript = ''
mkdir -p $out/bin
echo '#!/bin/sh' > $out/bin/update-desktop-database
echo 'mkdir -p $out/share/applications/ && ln -s ${
./mime-expected.cache
} $out/share/applications/mimeinfo.cache' >> $out/bin/update-desktop-database
chmod +x $out/bin/update-desktop-database
'';
};
nmt.script = ''
assertFileExists home-path/share/applications/mimeinfo.cache # Check that update-desktop-database created file
# Check that update-desktop-database file matches expected
assertFileContent \
home-path/share/applications/mimeinfo.cache \
${./mime-expected.cache}
assertDirectoryExists home-path/share/mime # Check that update-mime-database created directory
assertFileExists home-path/share/mime/mime.cache # Check that update-mime-database created file
'';
};
}

View file

@ -0,0 +1,24 @@
{ ... }: {
config = {
xdg.mime.enable = true;
xdg.desktopEntries = {
mime-test = { # mime info test
name = "mime-test";
mimeType = [ "text/html" "text/xml" ];
};
};
nmt.script = ''
assertFileExists home-path/share/applications/mimeinfo.cache # Check that update-desktop-database created file
# Check that update-desktop-database file matches expected
assertFileContent \
home-path/share/applications/mimeinfo.cache \
${./mime-expected.cache}
assertDirectoryExists home-path/share/mime # Check that update-mime-database created directory
assertDirectoryNotEmpty home-path/share/mime # Check that update-mime-database created files
'';
};
}