mirror of
https://github.com/nix-community/home-manager
synced 2024-11-23 03:29:45 +01: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:
parent
271c83e21e
commit
038630363e
6 changed files with 114 additions and 19 deletions
|
@ -5,33 +5,50 @@ with lib;
|
|||
let
|
||||
|
||||
cfg = config.xdg.mime;
|
||||
inherit (lib) getExe getExe';
|
||||
|
||||
in {
|
||||
options = {
|
||||
xdg.mime.enable = mkOption {
|
||||
type = types.bool;
|
||||
default = pkgs.stdenv.hostPlatform.isLinux;
|
||||
defaultText =
|
||||
literalExpression "true if host platform is Linux, false otherwise";
|
||||
description = ''
|
||||
Whether to install programs and files to support the
|
||||
XDG Shared MIME-info specification and XDG MIME Applications
|
||||
specification at
|
||||
<https://specifications.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html>
|
||||
and
|
||||
<https://specifications.freedesktop.org/mime-apps-spec/mime-apps-spec-latest.html>,
|
||||
respectively.
|
||||
'';
|
||||
xdg.mime = {
|
||||
enable = mkOption {
|
||||
type = types.bool;
|
||||
default = pkgs.stdenv.hostPlatform.isLinux;
|
||||
defaultText =
|
||||
literalExpression "true if host platform is Linux, false otherwise";
|
||||
description = ''
|
||||
Whether to install programs and files to support the
|
||||
XDG Shared MIME-info specification and XDG MIME Applications
|
||||
specification at
|
||||
<https://specifications.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html>
|
||||
and
|
||||
<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 config.xdg.mime.enable {
|
||||
config = mkIf cfg.enable {
|
||||
assertions =
|
||||
[ (hm.assertions.assertPlatform "xdg.mime" pkgs platforms.linux) ];
|
||||
|
||||
home.packages = [
|
||||
# Explicitly install package to provide basic mime types.
|
||||
pkgs.shared-mime-info
|
||||
cfg.sharedMimeInfoPackage
|
||||
|
||||
# Make sure the target directories will be real directories.
|
||||
(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
|
||||
XDG_DATA_DIRS=$out/share \
|
||||
PKGSYSTEM_ENABLE_FSYNC=0 \
|
||||
${pkgs.buildPackages.shared-mime-info}/bin/update-mime-database \
|
||||
${getExe cfg.sharedMimeInfoPackage} \
|
||||
-V $out/share/mime > /dev/null
|
||||
fi
|
||||
|
||||
if [[ -w $out/share/applications ]]; then
|
||||
${pkgs.buildPackages.desktop-file-utils}/bin/update-desktop-database \
|
||||
${getExe' cfg.desktopFileUtilsPackage "update-desktop-database"} \
|
||||
$out/share/applications
|
||||
fi
|
||||
'';
|
||||
|
|
|
@ -6,4 +6,7 @@
|
|||
xdg-default-locations = ./default-locations.nix;
|
||||
xdg-user-dirs-null = ./user-dirs-null.nix;
|
||||
xdg-portal = ./portal.nix;
|
||||
xdg-mime = ./mime.nix;
|
||||
xdg-mime-disabled = ./mime-disabled.nix;
|
||||
xdg-mime-package = ./mime-packages.nix;
|
||||
}
|
||||
|
|
10
tests/modules/misc/xdg/mime-disabled.nix
Normal file
10
tests/modules/misc/xdg/mime-disabled.nix
Normal 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
|
||||
'';
|
||||
};
|
||||
}
|
3
tests/modules/misc/xdg/mime-expected.cache
Normal file
3
tests/modules/misc/xdg/mime-expected.cache
Normal file
|
@ -0,0 +1,3 @@
|
|||
[MIME Cache]
|
||||
text/html=mime-test.desktop;
|
||||
text/xml=mime-test.desktop;
|
38
tests/modules/misc/xdg/mime-packages.nix
Normal file
38
tests/modules/misc/xdg/mime-packages.nix
Normal 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
|
||||
|
||||
'';
|
||||
};
|
||||
}
|
24
tests/modules/misc/xdg/mime.nix
Normal file
24
tests/modules/misc/xdg/mime.nix
Normal 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
|
||||
|
||||
'';
|
||||
};
|
||||
}
|
Loading…
Reference in a new issue