~ruther/guix-local

71ae6f2a191e715c96b02e876f5e40e4932debd8 — Ludovic Courtès 1 year, 7 months ago f4c832b
services: package-database: Turn into a Shepherd timer.

* gnu/services/admin.scm (package-database-mcron-jobs): Rename to…
(package-database-shepherd-services): … this.  Return a shepherd
service.
(package-database-service-type): Update accordingly.
* doc/guix.texi (File Search Services): Update documentation of the
‘schedule’ field.

Reviewed-by: Maxim Cournoyer <maxim.cournoyer@gmail.com>
Change-Id: Id7b4c5cff95a7117dca7d95af37db7389bb5ca92
2 files changed, 28 insertions(+), 13 deletions(-)

M doc/guix.texi
M gnu/services/admin.scm
M doc/guix.texi => doc/guix.texi +4 -3
@@ 27213,9 27213,10 @@ following fields:
The Guix package to use.

@item @code{schedule} (default: @code{%default-package-database-update-schedule})
String or G-exp denoting an mcron schedule for the periodic
@command{guix locate --update} job (@pxref{Guile Syntax,,, mcron,
GNU@tie{}mcron}).
This is the schedule of the periodic @command{guix locate --update} job,
expressed as a string in traditional cron syntax or as a gexp evaluating
to a Shepherd calendar event (@pxref{Timers,,, shepherd, The GNU
Shepherd Manual}).

@item @code{method} (default: @code{'store})
Indexing method for @command{guix locate}.  The default value,

M gnu/services/admin.scm => gnu/services/admin.scm +24 -10
@@ 529,23 529,37 @@ terms of CPU and input/output.")
            "G-exp denoting the channels to use when updating the database
(@pxref{Channels})."))

(define (package-database-mcron-jobs configuration)
(define (package-database-shepherd-services configuration)
  (match-record configuration <package-database-configuration>
    (package schedule method channels)
    (let ((channels (scheme-file "channels.scm" channels)))
      (list #~(job #$schedule
                   ;; XXX: The whole thing's running as "root" just because it
                   ;; needs write access to /var/cache/guix/locate.
                   (string-append #$(file-append package "/bin/guix")
                                  " time-machine -C " #$channels
                                  " -- locate --update --method="
                                  #$(symbol->string method)))))))
      (list (shepherd-service
             (provision '(package-database-update))
             (requirement '(user-processes guix-daemon))
             (modules '((shepherd service timer)))
             ;; XXX: The whole thing's running as "root" just because it needs
             ;; write access to /var/cache/guix/locate.
             (start #~(make-timer-constructor
                       #$(if (string? schedule)
                             #~(cron-string->calendar-event #$schedule)
                             schedule)
                       (command '(#$(file-append package "/bin/guix")
                                  "time-machine" "-C" #$channels
                                  "--" "locate" "--update"
                                  #$(string-append
                                     "--method=" (symbol->string method))))
                       #:wait-for-termination? #t))
             (stop #~(make-timer-destructor))
             (documentation
              "Periodically update the system-wide package database that can
be queried by the 'guix locate' command.")
             (actions (list shepherd-trigger-action)))))))

(define package-database-service-type
  (service-type
   (name 'package-database)
   (extensions (list (service-extension mcron-service-type
                                        package-database-mcron-jobs)))
   (extensions (list (service-extension shepherd-root-service-type
                                        package-database-shepherd-services)))
   (description
    "Periodically update the package database used by the @code{guix locate} command,
which lets you search for packages that provide a given file.")