From mboxrd@z Thu Jan 1 00:00:00 1970 From: ludo@gnu.org (Ludovic =?utf-8?Q?Court=C3=A8s?=) Subject: Re: [PATCH] profiles: Generate database file for manpages Date: Thu, 30 Mar 2017 17:53:18 +0200 Message-ID: <87a882wykx.fsf@gnu.org> References: <87fuhvw4a8.fsf@gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:56260) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ctcO5-0007j7-Pn for guix-devel@gnu.org; Thu, 30 Mar 2017 11:53:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ctcO2-0002ND-KW for guix-devel@gnu.org; Thu, 30 Mar 2017 11:53:25 -0400 In-Reply-To: <87fuhvw4a8.fsf@gmail.com> (Maxim Cournoyer's message of "Thu, 30 Mar 2017 01:35:27 -0700") List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org Sender: "Guix-devel" To: Maxim Cournoyer Cc: guix-devel --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hi Maxim, Maxim Cournoyer skribis: > I've managed to finalize a profile hooks which takes care of generating > the manpages database file. This file is used by apropos or man -k to > provide results. Awesome! I=E2=80=99ve been willing to have this for some time. > I've tested and found it to be working for the regular user profile. To > try it, apply the patch and use a guix command that causes a new profile > generation. > > For example: guix package -r git -i git > Then: "apropos git" should return plenty of results. For some reason I have to use =E2=80=9Cman -K=E2=80=9D (capital): --8<---------------cut here---------------start------------->8--- ~$ apropos guile guile: nothing appropriate. ~$ man -k guile guile: nothing appropriate. ~$ man -K guile --Man-- next: skribilo(1) [ view (return) | skip (Ctrl-D) | quit (Ctrl-C) ] --Man-- next: guile(1) [ view (return) | skip (Ctrl-D) | quit (Ctrl-C) ] --Man-- next: guix-pull(1) [ view (return) | skip (Ctrl-D) | quit (Ctrl-C) ] --Man-- next: guix-package(1) [ view (return) | skip (Ctrl-D) | quit (Ctrl-= C) ] --Man-- next: gv(3guile) [ view (return) | skip (Ctrl-D) | quit (Ctrl-C) ] ~$ env | grep MANPATH MANPATH=3D/home/ludo/.guix-profile/share/man:/run/current-system/profile/sh= are/man:/home/ludo/.guix-profile/share/man:/run/current-system/profile/shar= e/man:/home/ludo/.opam/system/man --8<---------------cut here---------------end--------------->8--- Any idea why? > It requires extra processing time to do the work since the complete > database (on my system, there are thousands or manpages being indexed) > is recreated everytime a new profile is generated. On my laptop (with an SSD), I found it to be reasonable: --8<---------------cut here---------------start------------->8--- $ time guix build /gnu/store/rkri628apz2a2i2jvav11ylv2736fvv3-manual-databa= se.drv --check @ build-started /gnu/store/rkri628apz2a2i2jvav11ylv2736fvv3-manual-database= .drv - x86_64-linux /var/log/guix/drvs/rk//ri628apz2a2i2jvav11ylv2736fvv3-m= anual-database.drv.bz2 /gnu/store/g7qxdk1cn7fwkamkaisi4428k6ijg0w2-manual-database real 0m2.647s user 0m0.116s sys 0m0.004s $ guix package -I |wc -l 229 --8<---------------cut here---------------end--------------->8--- > For now it doesn't work for guix environments (yet), but this should be > easy to fix (it seems the $GUIX_ENVIRONMENT/share/man should be merged > with $HOME/.guix-profile/share/man, but I need to look at it more > carefully). It seems to work but only with capital -K: --8<---------------cut here---------------start------------->8--- $ ./pre-inst-env guix environment --ad-hoc guile man-db --pure -- man -K gu= ile man: can't execute cat: No such file or directory man: command exited with status 255: sed -e '/^[[:space:]]*$/{ N; /^[[:spac= e:]]*\n[[:space:]]*$/D; }' | (cd && LESS=3D-ix8RmPm Manual page guil= e(1) ?ltline %lt?L/%L.:byte %bB?s/%s..?e (END):?pB %pB\%.. (press h for hel= p or q to quit)$PM Manual page guile(1) ?ltline %lt?L/%L.:byte %bB?s/%s..?e= (END):?pB %pB\%.. (press h for help or q to quit)$ MAN_PN=3Dguile(1) cat) --8<---------------cut here---------------end--------------->8--- (And we should hard-code the file name of =E2=80=98cat=E2=80=99 in =E2=80= =98man=E2=80=99=E2=80=A6) > From dbbe6894919164cd34572a28bfbbf6d4d681e35b Mon Sep 17 00:00:00 2001 > From: Maxim Cournoyer > Date: Tue, 28 Mar 2017 09:25:21 -0700 > Subject: [PATCH] profiles: Generate database file for manpages > MIME-Version: 1.0 > Content-Type: text/plain; charset=3DUTF-8 > Content-Transfer-Encoding: 8bit > > The mandb database file (index.db) is used by the "apropos" (whatis) or > "man -k" commands. This change introduces a profile hook to generate > such database file. > > Co-authored by Ludovic Court=C3=A8s > > * guix/profiles.scm (manual-database): New procedure. > (%default-profile-hooks): Add it. I made some simplifications to the patch. WDYT? Thanks, Ludo=E2=80=99. --=-=-= Content-Type: text/x-patch; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable diff --git a/guix/profiles.scm b/guix/profiles.scm index 795c9447f..f565f358b 100644 --- a/guix/profiles.scm +++ b/guix/profiles.scm @@ -7,6 +7,7 @@ ;;; Copyright =C2=A9 2016 Ricardo Wurmus ;;; Copyright =C2=A9 2016 Chris Marusich ;;; Copyright =C2=A9 2017 Huang Ying +;;; Copyright =C2=A9 2017 Maxim Cournoyer ;;; ;;; This file is part of GNU Guix. ;;; @@ -946,10 +947,73 @@ files for the fonts of the @var{manifest} entries." #:local-build? #t #:substitutable? #f)) =20 +(define (manual-database manifest) + (define man-db ;lazy reference + (module-ref (resolve-interface '(gnu packages man)) 'man-db)) + + (define build + #~(begin + (use-modules (guix build utils) + (srfi srfi-1)) + + (define entries + (filter-map (lambda (directory) + (let ((man (string-append directory "/share/man"))) + (and (directory-exists? man) + man))) + '#$(manifest-inputs manifest))) + + (define manpages-collection-dir + (string-append (getenv "PWD") "/manpages-collection")) + + (define man-directory + (string-append #$output "/share/man")) + + (define (populate-manpages-collection-dir entries) + (let ((manpages (append-map find-files entries))) + (for-each (lambda (manpage) + (let* ((dest-file (string-append + manpages-collection-dir "/" + (strip-store-file-name manpage)= ))) + (mkdir-p (dirname dest-file)) + (catch 'system-error + (lambda () + (symlink manpage dest-file)) + (lambda args + ;; Different packages may contain the same + ;; manpage. Simply ignore the symlink error. + #t)))) + manpages))) + + (mkdir-p manpages-collection-dir) + (populate-manpages-collection-dir entries) + + ;; Create a mandb config file which contains a custom made + ;; manpath. The associated catpath is the location where the datab= ase + ;; gets generated. + (copy-file #+(file-append man-db "/etc/man_db.conf") + "man_db.conf") + + (substitute* "man_db.conf" + (("MANDB_MAP\\>.*$") + (string-append "MANDB_MAP " manpages-collection-dir " " + man-directory "\n"))) + + (mkdir-p man-directory) + (setenv "MANPATH" (string-join entries ":")) + (zero? (system* #+(file-append man-db "/bin/mandb") + "--quiet" "--create" + "-C" "man_db.conf")))) + + (gexp->derivation "manual-database" build + #:modules '((guix build utils)) + #:local-build? #t)) + (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 + manual-database fonts-dir-file ghc-package-cache-file ca-certificate-bundle --=-=-=--