Alex Kost <alez...@gmail.com> skribis: > Ludovic Courtès (2016-01-25 18:06 +0300) wrote: > >> Alex Kost <alez...@gmail.com> skribis: >> >>> From f3d21e3ec8a100a966153d03264639ebe48e8872 Mon Sep 17 00:00:00 2001 >>> From: Alex Kost <alez...@gmail.com> >>> Date: Mon, 25 Jan 2016 11:18:00 +0300 >>> Subject: [PATCH] service: Improve 'service-list'. >>> >>> * modules/shepherd/service.scm (service-list): Use >>> 'lookup-canonical-service' on each name instead of removing duplicates >>> from the final list. >> >> [...] >> >>> diff --git a/modules/shepherd/service.scm b/modules/shepherd/service.scm >>> index f84d1dd..94f2aae 100644 >>> --- a/modules/shepherd/service.scm >>> +++ b/modules/shepherd/service.scm >>> @@ -871,12 +871,13 @@ Return #f if service is not found." >>> >>> (define (service-list) >>> "Return the list of services currently defined." >>> - (delete-duplicates >>> - (hash-fold (lambda (key services result) >>> - (append services result)) >>> - '() >>> - %services) >>> - eq?)) >>> + (hash-fold (lambda (name services result) >>> + (let ((service (lookup-canonical-service name services))) >>> + (if service >>> + (cons service result) >>> + result))) >>> + '() >>> + %services)) >> >> OK, except that we know that SERVICE is necessarily true, because the >> canonical service for NAME is necessarily among SERVICES. >> >> So I would remove the ‘if’ and add a comment explaining the above. >> >> OK with this change? > > No, the service is not necessarily true. When a service has several > names (e.g., "root" and "shepherd"), then %services table will contain 2 > entries (with 'root' and 'shepherd' keys and the same (#<<service> …>) > value). So for one of the hash-table entries: > > (lookup-canonical-service 'root (list root-service)) > > returns #t, and for the other: > > (lookup-canonical-service 'shepherd (list root-service)) > > it returns #f.
Indeed, my bad. Then OK to push, thanks! Ludo’.