Subject: Re: bug#38838: 'whatis' doesn't work

From: Maxim Cournoyer <[email-masked]>
Date: Wed, 02 Mar 2022 00:26:13 -0500

Hello,

zimoun <[email-masked]> writes:

> Dear,
>
> I confirm that something appears unexpected with the command 'whatis'.
>
> Below, using Guix 3a695c01d7ee18f30f22df53f3c44dfac04017f1, and running
> `guix environment --ad-hoc man-db man-pages --pure` then let output the
> internal debugging information (option '-d'). See below.
>
> Everything seems pointing to the correct path, so maybe it should come
> from the 'index.db' file.

[...]

> I do not know if this report helps and if the index is the culprit.

You were on the right path; the database file was indeed the culprit.
This is the database, in hex, generated by man-db for a single cat.1.gz
man page:

--8<---------------cut here---------------start------------->8---
2476 6572 7369 6f6e 2400 322e 352e 3000  $version$.2.5.0.
00003010: 6361 7400 2d09 3109 3109 3136 3436 3138  cat.-.1.1.164618
00003020: 3834 3934 0939 3333 3430 3030 3430 0941  8494.933400040.A
00003030: 092d 092d 0967 7a09 636f 6e63 6174 656e  .-.-.gz.concaten
00003040: 6174 6520 6669 6c65 7320 616e 6420 7072  ate files and pr
00003050: 696e 7420 6f6e 2074 6865 2073 7461 6e64  int on the stand
00003060: 6172 6420 6f75 7470 7574 0000 0000 0000  ard output......
00003070:
--8<---------------cut here---------------end--------------->8---

while this is what Guix was generating:

--8<---------------cut here---------------start------------->8---
00000600: 2476 6572 7369 6f6e 2400 322e 352e 3000  $version$.2.5.0.
00000610: 2f74 6d70 2f67 7569 782f 6d61 6e2f 6d61  /tmp/guix/man/ma
00000620: 6e31 2f63 6174 2e31 2e67 7a00 6361 7409  n1/cat.1.gz.cat.
00000630: 3109 3109 3009 3009 4109 2d09 2d09 677a  1.1.0.0.A.-.-.gz
00000640: 0963 6f6e 6361 7465 6e61 7465 2066 696c  .concatenate fil
00000650: 6573 2061 6e64 2070 7269 6e74 206f 6e20  es and print on
00000660: 7468 6520 7374 616e 6461 7264 206f 7574  the standard out
00000670: 7075 7400 0000 0000 0000 0000 0000 0000  put.............
--8<---------------cut here---------------end--------------->8---

The entry that comes right after the 2.5.0 version is the key.  Guix was
using the file name, while man-db uses the name of the man page, such as
'cat'.

With the following change:

--8<---------------cut here---------------start------------->8---
modified   guix/man-db.scm
@@ -110,7 +110,12 @@ (define (write-mandb-database file entries)
     ;; Write ENTRIES in sorted order so we get deterministic output.
     (for-each (lambda (entry)
                 (gdbm-set! db
-                           (string-append (mandb-entry-file-name entry)
+                           ;; For the 'whatis' tool to find anything, the key
+                           ;; should match the name of the software,
+                           ;; e.g. 'cat'.  Derive it from the file name, as
+                           ;; the name could technically be #f.
+                           (string-append (abbreviate-file-name
+                                           (mandb-entry-file-name entry))
                                           "\x00")
                            (entry->string entry)))
               (sort entries mandb-entry<?))
--8<---------------cut here---------------end--------------->8---
               
I now get:

--8<---------------cut here---------------start------------->8---
$ ./pre-inst-env guix shell --pure man-db coreutils -- whatis cat
[...]
building database for manual pages...
building profile with 2 packages...
cat (1)              - concatenate files and print on the standard output
--8<---------------cut here---------------end--------------->8---

and apropos, man seem to continue working as expected.

Pushed as deaa322963.

Closing.

Thanks for the report!

Maxim