Re: [PATCH 1/2] profiles: Add xdg-desktop-database hook.

2016-02-07 Thread Ludovic Courtès
iyzs...@member.fsf.org (宋文武) skribis:

> l...@gnu.org (Ludovic Courtès) writes:

[...]

>> This is a small dependency, but it still depends on GLib; my
>> understanding is that building any profile would end up pulling in GLib
>> because of this hook.
> Yes.
>>
>> Should we have some heuristic as for the GTK+ and GHC hooks to avoid
>> pulling it in?
>>
>> For instance, we could check whether GLib is already an indirect
>> dependency of at least one of the packages.  WDYT?
> Sure, but I think check on GLib is not sufficient and necessary,
> when the hook run, it will use latest desktop-file-utils which may
> use a different version of glib.

Yes, but that’s not really a problem IMO.

The situation I would want to avoid is this: you have machine with
profiles containing only, say, console programs and development
tools—nothing GLib or GTK+ related; and then, suddently, you end up
pulling GLib even though you don’t care at all about it.

If a GLib-using package is already in the profile, it’s an indication
that the user is fine with pulling in GLib.

Another option would be to use the ‘properties’ field to indicate which
packages depend on accurate desktop or MIME info; we would need annotate
all of them but rather ancestors such as GLib or Qt.  WDYT?

> So, I end up using a simple 'manifest-lookup', which require the
> desktop-file-utils and shared-mime-info to be installed explicitly.

It has the advantage of being a simpler and clearer heuristic.  However,
most people won’t have them in their profile, and thus they’ll end up
with broken or missing MIME and desktop info, right?

Tricky!

Ludo’.



Re: [PATCH 1/2] profiles: Add xdg-desktop-database hook.

2016-02-03 Thread 宋文武
l...@gnu.org (Ludovic Courtès) writes:

> 宋文武  skribis:
>
>> * guix/profiles (xdg-desktop-database): New function.
>> (%default-profile-hooks): Add it.
>
> Nice!
>
>> +   (update-desktop-database (string-append
>> + #+desktop-file-utils
>> + "/bin/update-desktop-database")))
>
> This is a small dependency, but it still depends on GLib; my
> understanding is that building any profile would end up pulling in GLib
> because of this hook.
Yes.
>
> Should we have some heuristic as for the GTK+ and GHC hooks to avoid
> pulling it in?
>
> For instance, we could check whether GLib is already an indirect
> dependency of at least one of the packages.  WDYT?
Sure, but I think check on GLib is not sufficient and necessary,
when the hook run, it will use latest desktop-file-utils which may
use a different version of glib.  Unless I use the desktop-file-utils
package installed from profile, but not like the gtk-icon-themes hook,
where gtk+ is the runtime dependency, desktop-file-utils is only used
to validate the desktop file during build phase, I can't get it from
manifest using the same (and IMO, heavy and ugly) method.

So, I end up using a simple 'manifest-lookup', which require the
desktop-file-utils and shared-mime-info to be installed explicitly.

Updated patches:
>From 9fe7aa4f368def46ddab54bd1347d6cf2ef5832f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=AE=8B=E6=96=87=E6=AD=A6?= 
Date: Thu, 4 Feb 2016 15:33:07 +0800
Subject: [PATCH 1/2] profiles: Add xdg-desktop-database hook.

* guix/profiles.scm (xdg-desktop-database): New function.
(%default-profile-hooks): Add it.
---
 guix/profiles.scm | 38 +-
 1 file changed, 37 insertions(+), 1 deletion(-)

diff --git a/guix/profiles.scm b/guix/profiles.scm
index ce86ff8..a9375e6 100644
--- a/guix/profiles.scm
+++ b/guix/profiles.scm
@@ -684,13 +684,49 @@ creates the GTK+ 'icon-theme.cache' file for each theme."
   #:substitutable? #f)
 (return #f
 
+(define (xdg-desktop-database manifest)
+  "Return a derivation that builds the @file{mimeinfo.cache} database from
+desktop files.  It's used to query what applications can handle a given
+MIME type."
+  (define desktop-file-utils
+(module-ref (resolve-interface '(gnu packages gnome))
+'desktop-file-utils))
+
+  (define build
+#~(begin
+(use-modules (srfi srfi-26)
+ (guix build utils)
+ (guix build union))
+(let* ((destdir (string-append #$output "/share/applications"))
+   (appdirs (filter file-exists?
+(map (cut string-append <>
+  "/share/applications")
+ '#$(manifest-inputs manifest
+   (update-desktop-database (string-append
+ #+desktop-file-utils
+ "/bin/update-desktop-database")))
+  (mkdir-p (string-append #$output "/share"))
+  (union-build destdir appdirs
+   #:log-port (%make-void-port "w"))
+  (zero? (system* update-desktop-database destdir)
+
+  ;; Don't run the hook when 'desktop-file-utils' is not installed.
+  (if (manifest-lookup manifest (manifest-pattern (name "desktop-file-utils")))
+  (gexp->derivation "xdg-desktop-database" build
+#:modules '((guix build utils)
+(guix build union))
+#:local-build? #t
+#:substitutable? #f)
+  (with-monad %store-monad (return #f
+
 (define %default-profile-hooks
   ;; This is the list of derivation-returning procedures that are called by
   ;; default when making a non-empty profile.
   (list info-dir-file
 ghc-package-cache-file
 ca-certificate-bundle
-gtk-icon-themes))
+gtk-icon-themes
+xdg-desktop-database))
 
 (define* (profile-derivation manifest
  #:key
-- 
2.5.0

>From 5e39f976de2ee6854b530a011e036b6ec2018810 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=AE=8B=E6=96=87=E6=AD=A6?= 
Date: Thu, 4 Feb 2016 15:35:03 +0800
Subject: [PATCH 2/2] profiles: Add xdg-mime-database hook.

* guix/profiles.scm (xdg-mime-database): New function.
(%default-profile-hooks): Add it.
---
 guix/profiles.scm | 39 ++-
 1 file changed, 38 insertions(+), 1 deletion(-)

diff --git a/guix/profiles.scm b/guix/profiles.scm
index a9375e6..8f9d617 100644
--- a/guix/profiles.scm
+++ b/guix/profiles.scm
@@ -719,6 +719,42 @@ MIME type."
 #:substitutable? #f)
   (with-monad %store-monad (return #f
 
+(define (xdg-mime-database manifest)
+  "Return a derivation that builds the @file{mime.cache} database from manifest
+entries.  It's used to query the MI

Re: [PATCH 1/2] profiles: Add xdg-desktop-database hook.

2016-02-02 Thread Ludovic Courtès
宋文武  skribis:

> * guix/profiles (xdg-desktop-database): New function.
> (%default-profile-hooks): Add it.

Nice!

> +   (update-desktop-database (string-append
> + #+desktop-file-utils
> + "/bin/update-desktop-database")))

This is a small dependency, but it still depends on GLib; my
understanding is that building any profile would end up pulling in GLib
because of this hook.

Should we have some heuristic as for the GTK+ and GHC hooks to avoid
pulling it in?

For instance, we could check whether GLib is already an indirect
dependency of at least one of the packages.  WDYT?

Thank you!

Ludo’.