all messages for Guix-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* [bug#40770] [PATCH 0/5] Add declarative profiles
@ 2020-04-22 15:06 Ludovic Courtès
  2020-04-22 15:08 ` [bug#40770] [PATCH 1/5] profiles: Add lowerable <profile> record type Ludovic Courtès
                   ` (2 more replies)
  0 siblings, 3 replies; 10+ messages in thread
From: Ludovic Courtès @ 2020-04-22 15:06 UTC (permalink / raw)
  To: 40770; +Cc: Ludovic Courtès

Hello Guix!

This patch set introduces “declarative profiles” or, in other words,
a way to declare a profile and use it in a gexp without calling
‘profile-derivation’, fiddling with ‘%store-monad’ and all that.

The goals are:

  1. To provide a simpler programming interface, reducing the need
     to resort to ‘%store-monad’, and making it usable in a wider
     range of contexts (see for example
     <https://git.savannah.gnu.org/cgit/guix.git/tree/gnu/system/hurd.scm?h=core-updates&id=5084fd38541a5fc233f3299e10a33c3a38a7173f>).

  2. To potentially improve high-level caching in the object cache
     as well as “parallelism” (see <https://bugs.gnu.org/40612>).

Feedback welcome!

Ludo’.

Ludovic Courtès (5):
  profiles: Add lowerable <profile> record type.
  system: 'operating-system-directory-base-entries' uses 'profile'.
  services: profile: Use a declarative profile.
  pack: Use a declarative profile.
  services: system: Initial entries are non-monadic.

 gnu/services.scm               | 13 ++++++------
 gnu/system.scm                 | 27 ++++++++++++-------------
 gnu/system/linux-container.scm |  6 ++----
 guix/profiles.scm              | 36 ++++++++++++++++++++++++++++++++++
 guix/scripts/pack.scm          | 33 +++++++++++++++----------------
 tests/profiles.scm             | 13 +++++++++++-
 6 files changed, 84 insertions(+), 44 deletions(-)

-- 
2.26.0

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [bug#40770] [PATCH 1/5] profiles: Add lowerable <profile> record type.
  2020-04-22 15:06 [bug#40770] [PATCH 0/5] Add declarative profiles Ludovic Courtès
@ 2020-04-22 15:08 ` Ludovic Courtès
  2020-04-22 15:08   ` [bug#40770] [PATCH 2/5] system: 'operating-system-directory-base-entries' uses 'profile' Ludovic Courtès
                     ` (3 more replies)
  2020-04-22 17:12 ` [bug#40770] [PATCH 0/5] Add declarative profiles Mathieu Othacehe
  2020-04-22 19:46 ` [bug#40770] " Christopher Baines
  2 siblings, 4 replies; 10+ messages in thread
From: Ludovic Courtès @ 2020-04-22 15:08 UTC (permalink / raw)
  To: 40770; +Cc: Ludovic Courtès

* guix/profiles.scm (<profile>): New record type.
* tests/profiles.scm ("<profile>"): New test.
---
 guix/profiles.scm  | 36 ++++++++++++++++++++++++++++++++++++
 tests/profiles.scm | 13 ++++++++++++-
 2 files changed, 48 insertions(+), 1 deletion(-)

diff --git a/guix/profiles.scm b/guix/profiles.scm
index 88606fa4ce..ab265cce62 100644
--- a/guix/profiles.scm
+++ b/guix/profiles.scm
@@ -125,6 +125,15 @@
             profile-derivation
             profile-search-paths
 
+            profile
+            profile?
+            profile-name
+            profile-content
+            profile-hooks
+            profile-locales?
+            profile-allow-collisions?
+            profile-relative-symlinks?
+
             generation-number
             generation-profile
             generation-numbers
@@ -1656,6 +1665,33 @@ are cross-built for TARGET."
                                        . ,(length
                                            (manifest-entries manifest))))))))
 
+;; Declarative profile.
+(define-record-type* <profile> profile make-profile
+  profile?
+  (name               profile-name (default "profile")) ;string
+  (content            profile-content)                  ;<manifest>
+  (hooks              profile-hooks                     ;list of procedures
+                      (default %default-profile-hooks))
+  (locales?           profile-locales?            ;Boolean
+                      (default #t))
+  (allow-collisions?  profile-allow-collisions?   ;Boolean
+                      (default #f))
+  (relative-symlinks? profile-relative-symlinks?  ;Boolean
+                      (default #f)))
+
+(define-gexp-compiler (profile-compiler (profile <profile>) system target)
+  "Compile PROFILE to a derivation."
+  (match profile
+    (($ <profile> name manifest hooks
+                  locales? allow-collisions? relative-symlinks?)
+     (profile-derivation manifest
+                         #:name name
+                         #:hooks hooks
+                         #:locales? locales?
+                         #:allow-collisions? allow-collisions?
+                         #:relative-symlinks? relative-symlinks?
+                         #:system system #:target target))))
+
 (define* (profile-search-paths profile
                                #:optional (manifest (profile-manifest profile))
                                #:key (getenv (const #f)))
diff --git a/tests/profiles.scm b/tests/profiles.scm
index 21c912a532..055924ba3e 100644
--- a/tests/profiles.scm
+++ b/tests/profiles.scm
@@ -1,5 +1,5 @@
 ;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014 Alex Kost <alezost@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
@@ -223,6 +223,17 @@
                  (string=? (dirname (readlink bindir))
                            (derivation->output-path guile))))))
 
+(test-assertm "<profile>"
+  (mlet* %store-monad
+      ((entry ->   (package->manifest-entry %bootstrap-guile))
+       (profile -> (profile (hooks '()) (locales? #f)
+                            (content (manifest (list entry)))))
+       (drv        (lower-object profile))
+       (profile -> (derivation->output-path drv))
+       (bindir ->  (string-append profile "/bin"))
+       (_          (built-derivations (list drv))))
+    (return (file-exists? (string-append bindir "/guile")))))
+
 (test-assertm "profile-derivation relative symlinks, one entry"
   (mlet* %store-monad
       ((entry ->   (package->manifest-entry %bootstrap-guile))
-- 
2.26.0

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [bug#40770] [PATCH 2/5] system: 'operating-system-directory-base-entries' uses 'profile'.
  2020-04-22 15:08 ` [bug#40770] [PATCH 1/5] profiles: Add lowerable <profile> record type Ludovic Courtès
@ 2020-04-22 15:08   ` Ludovic Courtès
  2020-04-22 15:08   ` [bug#40770] [PATCH 3/5] services: profile: Use a declarative profile Ludovic Courtès
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 10+ messages in thread
From: Ludovic Courtès @ 2020-04-22 15:08 UTC (permalink / raw)
  To: 40770; +Cc: Ludovic Courtès

* gnu/system.scm (operating-system-directory-base-entries): Use a
declarative profile instead of 'profile-derivation'.
---
 gnu/system.scm | 20 +++++++++-----------
 1 file changed, 9 insertions(+), 11 deletions(-)

diff --git a/gnu/system.scm b/gnu/system.scm
index fb48fedd7f..739b629367 100644
--- a/gnu/system.scm
+++ b/gnu/system.scm
@@ -475,17 +475,15 @@ OS."
 (define* (operating-system-directory-base-entries os)
   "Return the basic entries of the 'system' directory of OS for use as the
 value of the SYSTEM-SERVICE-TYPE service."
-  (let ((locale (operating-system-locale-directory os)))
-    (mlet* %store-monad ((kernel -> (operating-system-kernel os))
-                         (modules ->
-                          (operating-system-kernel-loadable-modules os))
-                         (kernel
-                          (profile-derivation
-                           (packages->manifest
-                            (cons kernel modules))
-                           #:hooks (list linux-module-database)))
-                         (initrd -> (operating-system-initrd-file os))
-                         (params -> (operating-system-boot-parameters-file os)))
+  (let* ((locale  (operating-system-locale-directory os))
+         (modules (operating-system-kernel-loadable-modules os))
+         (kernel  (profile
+                   (content (packages->manifest
+                             (cons (operating-system-kernel os) modules)))
+                   (hooks (list linux-module-database))))
+         (initrd  (operating-system-initrd-file os))
+         (params  (operating-system-boot-parameters-file os)))
+    (with-monad %store-monad
       (return `(("kernel" ,kernel)
                 ("parameters" ,params)
                 ("initrd" ,initrd)
-- 
2.26.0

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [bug#40770] [PATCH 3/5] services: profile: Use a declarative profile.
  2020-04-22 15:08 ` [bug#40770] [PATCH 1/5] profiles: Add lowerable <profile> record type Ludovic Courtès
  2020-04-22 15:08   ` [bug#40770] [PATCH 2/5] system: 'operating-system-directory-base-entries' uses 'profile' Ludovic Courtès
@ 2020-04-22 15:08   ` Ludovic Courtès
  2020-04-22 15:08   ` [bug#40770] [PATCH 4/5] pack: " Ludovic Courtès
  2020-04-22 15:08   ` [bug#40770] [PATCH 5/5] services: system: Initial entries are non-monadic Ludovic Courtès
  3 siblings, 0 replies; 10+ messages in thread
From: Ludovic Courtès @ 2020-04-22 15:08 UTC (permalink / raw)
  To: 40770; +Cc: Ludovic Courtès

* gnu/services.scm (packages->profile-entry): Use 'profile' instead of
'profile-derivation'.
---
 gnu/services.scm | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/gnu/services.scm b/gnu/services.scm
index 126e0814eb..ada6268a0b 100644
--- a/gnu/services.scm
+++ b/gnu/services.scm
@@ -691,10 +691,10 @@ executables, making them setuid-root.")))
 
 (define (packages->profile-entry packages)
   "Return a system entry for the profile containing PACKAGES."
-  (mlet %store-monad ((profile (profile-derivation
-                                (packages->manifest
-                                 (delete-duplicates packages eq?)))))
-    (return `(("profile" ,profile)))))
+  (with-monad %store-monad
+    (return `(("profile" ,(profile
+                           (content (packages->manifest
+                                     (delete-duplicates packages eq?)))))))))
 
 (define profile-service-type
   ;; The service that populates the system's profile---i.e.,
-- 
2.26.0

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [bug#40770] [PATCH 4/5] pack: Use a declarative profile.
  2020-04-22 15:08 ` [bug#40770] [PATCH 1/5] profiles: Add lowerable <profile> record type Ludovic Courtès
  2020-04-22 15:08   ` [bug#40770] [PATCH 2/5] system: 'operating-system-directory-base-entries' uses 'profile' Ludovic Courtès
  2020-04-22 15:08   ` [bug#40770] [PATCH 3/5] services: profile: Use a declarative profile Ludovic Courtès
@ 2020-04-22 15:08   ` Ludovic Courtès
  2020-04-22 15:08   ` [bug#40770] [PATCH 5/5] services: system: Initial entries are non-monadic Ludovic Courtès
  3 siblings, 0 replies; 10+ messages in thread
From: Ludovic Courtès @ 2020-04-22 15:08 UTC (permalink / raw)
  To: 40770; +Cc: Ludovic Courtès

* guix/scripts/pack.scm (guix-pack): Use a declarative profile instead
of 'profile-derivation'.
---
 guix/scripts/pack.scm | 33 ++++++++++++++++-----------------
 1 file changed, 16 insertions(+), 17 deletions(-)

diff --git a/guix/scripts/pack.scm b/guix/scripts/pack.scm
index 6d63fb4b90..f3d1b41c6f 100644
--- a/guix/scripts/pack.scm
+++ b/guix/scripts/pack.scm
@@ -1071,7 +1071,21 @@ Create a bundle of PACKAGE.\n"))
                    (localstatedir? (assoc-ref opts 'localstatedir?))
                    (entry-point    (assoc-ref opts 'entry-point))
                    (profile-name   (assoc-ref opts 'profile-name))
-                   (gc-root        (assoc-ref opts 'gc-root)))
+                   (gc-root        (assoc-ref opts 'gc-root))
+                   (profile        (profile
+                                    (content manifest)
+
+                                    ;; Always produce relative symlinks for
+                                    ;; Singularity (see
+                                    ;; <https://bugs.gnu.org/34913>).
+                                    (relative-symlinks?
+                                     (or relocatable?
+                                         (eq? 'squashfs pack-format)))
+
+                                    (hooks (if bootstrap?
+                                               '()
+                                               %default-profile-hooks))
+                                    (locales? (not bootstrap?)))))
               (define (lookup-package package)
                 (manifest-lookup manifest (manifest-pattern (name package))))
 
@@ -1085,22 +1099,7 @@ Create a bundle of PACKAGE.\n"))
 to your package list.")))
 
               (run-with-store store
-                (mlet* %store-monad ((profile (profile-derivation
-                                               manifest
-
-                                               ;; Always produce relative
-                                               ;; symlinks for Singularity (see
-                                               ;; <https://bugs.gnu.org/34913>).
-                                               #:relative-symlinks?
-                                               (or relocatable?
-                                                   (eq? 'squashfs pack-format))
-
-                                               #:hooks (if bootstrap?
-                                                           '()
-                                                           %default-profile-hooks)
-                                               #:locales? (not bootstrap?)
-                                               #:target target))
-                                     (drv (build-image name profile
+                (mlet* %store-monad ((drv (build-image name profile
                                                        #:target
                                                        target
                                                        #:compressor
-- 
2.26.0

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [bug#40770] [PATCH 5/5] services: system: Initial entries are non-monadic.
  2020-04-22 15:08 ` [bug#40770] [PATCH 1/5] profiles: Add lowerable <profile> record type Ludovic Courtès
                     ` (2 preceding siblings ...)
  2020-04-22 15:08   ` [bug#40770] [PATCH 4/5] pack: " Ludovic Courtès
@ 2020-04-22 15:08   ` Ludovic Courtès
  3 siblings, 0 replies; 10+ messages in thread
From: Ludovic Courtès @ 2020-04-22 15:08 UTC (permalink / raw)
  To: 40770; +Cc: Ludovic Courtès

* gnu/system.scm (operating-system-directory-base-entries): Return a
regular, non-monadic value.
* gnu/services.scm (system-derivation): Adjust accordingly.
* gnu/system/linux-container.scm (container-essential-services): Likewise.
---
 gnu/services.scm               | 5 ++---
 gnu/system.scm                 | 9 ++++-----
 gnu/system/linux-container.scm | 6 ++----
 3 files changed, 8 insertions(+), 12 deletions(-)

diff --git a/gnu/services.scm b/gnu/services.scm
index ada6268a0b..2e4648bf78 100644
--- a/gnu/services.scm
+++ b/gnu/services.scm
@@ -318,11 +318,10 @@ This is a shorthand for (map (lambda (svc) ...) %base-services)."
 ;;; Core services.
 ;;;
 
-(define (system-derivation mentries mextensions)
+(define (system-derivation entries mextensions)
   "Return as a monadic value the derivation of the 'system' directory
 containing the given entries."
-  (mlet %store-monad ((entries    mentries)
-                      (extensions (mapm/accumulate-builds identity
+  (mlet %store-monad ((extensions (mapm/accumulate-builds identity
                                                           mextensions)))
     (lower-object
      (file-union "system"
diff --git a/gnu/system.scm b/gnu/system.scm
index 739b629367..1872a2ed61 100644
--- a/gnu/system.scm
+++ b/gnu/system.scm
@@ -483,11 +483,10 @@ value of the SYSTEM-SERVICE-TYPE service."
                    (hooks (list linux-module-database))))
          (initrd  (operating-system-initrd-file os))
          (params  (operating-system-boot-parameters-file os)))
-    (with-monad %store-monad
-      (return `(("kernel" ,kernel)
-                ("parameters" ,params)
-                ("initrd" ,initrd)
-                ("locale" ,locale))))))   ;used by libc
+    `(("kernel" ,kernel)
+      ("parameters" ,params)
+      ("initrd" ,initrd)
+      ("locale" ,locale))))   ;used by libc
 
 (define (operating-system-default-essential-services os)
   "Return the list of essential services for OS.  These are special services
diff --git a/gnu/system/linux-container.scm b/gnu/system/linux-container.scm
index c8807398b3..c5e2e4bf9c 100644
--- a/gnu/system/linux-container.scm
+++ b/gnu/system/linux-container.scm
@@ -1,6 +1,6 @@
 ;;; GNU Guix --- Functional package management for GNU
 ;;; Copyright © 2015 David Thompson <davet@gnu.org>
-;;; Copyright © 2016, 2017, 2019 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2016, 2017, 2019, 2020 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2019 Arun Isaac <arunisaac@systemreboot.net>
 ;;; Copyright © 2020 Efraim Flashner <efraim@flashner.co.il>
 ;;;
@@ -53,9 +53,7 @@ from OS that are needed on the bare metal and not in a container."
             (operating-system-default-essential-services os)))
 
   (cons (service system-service-type
-                 (let ((locale (operating-system-locale-directory os)))
-                   (with-monad %store-monad
-                     (return `(("locale" ,locale))))))
+                 `(("locale" ,(operating-system-locale-directory os))))
         ;; If network is to be shared with the host, remove network
         ;; configuration files from etc-service.
         (if shared-network?
-- 
2.26.0

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [bug#40770] [PATCH 0/5] Add declarative profiles
  2020-04-22 15:06 [bug#40770] [PATCH 0/5] Add declarative profiles Ludovic Courtès
  2020-04-22 15:08 ` [bug#40770] [PATCH 1/5] profiles: Add lowerable <profile> record type Ludovic Courtès
@ 2020-04-22 17:12 ` Mathieu Othacehe
  2020-04-22 19:46   ` Ludovic Courtès
  2020-04-26 20:51   ` bug#40770: " Ludovic Courtès
  2020-04-22 19:46 ` [bug#40770] " Christopher Baines
  2 siblings, 2 replies; 10+ messages in thread
From: Mathieu Othacehe @ 2020-04-22 17:12 UTC (permalink / raw)
  To: Ludovic Courtès; +Cc: 40770


Hey Ludo,

>   2. To potentially improve high-level caching in the object cache
>      as well as “parallelism” (see <https://bugs.gnu.org/40612>).
>
> Feedback welcome!

This is really nice and it all looks good to me. Any reason not to use
it in "package-cache-file" to get rid of the mlet?

Thanks,

Mathieu

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [bug#40770] [PATCH 0/5] Add declarative profiles
  2020-04-22 15:06 [bug#40770] [PATCH 0/5] Add declarative profiles Ludovic Courtès
  2020-04-22 15:08 ` [bug#40770] [PATCH 1/5] profiles: Add lowerable <profile> record type Ludovic Courtès
  2020-04-22 17:12 ` [bug#40770] [PATCH 0/5] Add declarative profiles Mathieu Othacehe
@ 2020-04-22 19:46 ` Christopher Baines
  2 siblings, 0 replies; 10+ messages in thread
From: Christopher Baines @ 2020-04-22 19:46 UTC (permalink / raw)
  To: 40770, Ludovic Courtès

[-- Attachment #1: Type: text/plain, Size: 820 bytes --]


Ludovic Courtès <ludo@gnu.org> writes:

> This patch set introduces “declarative profiles” or, in other words,
> a way to declare a profile and use it in a gexp without calling
> ‘profile-derivation’, fiddling with ‘%store-monad’ and all that.
>
> The goals are:
>
>   1. To provide a simpler programming interface, reducing the need
>      to resort to ‘%store-monad’, and making it usable in a wider
>      range of contexts (see for example
>      <https://git.savannah.gnu.org/cgit/guix.git/tree/gnu/system/hurd.scm?h=core-updates&id=5084fd38541a5fc233f3299e10a33c3a38a7173f>).

This sounds great, I use Emacs in a profile for rending .org files with
cgit, and it took a bit of fiddling to get the profile built
properly. This'll probably make it a lot easier!

Thanks,

Chris

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 962 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [bug#40770] [PATCH 0/5] Add declarative profiles
  2020-04-22 17:12 ` [bug#40770] [PATCH 0/5] Add declarative profiles Mathieu Othacehe
@ 2020-04-22 19:46   ` Ludovic Courtès
  2020-04-26 20:51   ` bug#40770: " Ludovic Courtès
  1 sibling, 0 replies; 10+ messages in thread
From: Ludovic Courtès @ 2020-04-22 19:46 UTC (permalink / raw)
  To: Mathieu Othacehe; +Cc: 40770

Hello,

Mathieu Othacehe <m.othacehe@gmail.com> skribis:

>>   2. To potentially improve high-level caching in the object cache
>>      as well as “parallelism” (see <https://bugs.gnu.org/40612>).
>>
>> Feedback welcome!
>
> This is really nice and it all looks good to me.

Cool, thanks for the quick feedback!

> Any reason not to use it in "package-cache-file" to get rid of the
> mlet?

No good reason, it’s a good candidate.  It’ll still be monadic though,
because of ‘gexp->derivation-in-inferior’, but perhaps we can make that
non-monadic as well eventually.

Thanks,
Ludo’.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* bug#40770: [PATCH 0/5] Add declarative profiles
  2020-04-22 17:12 ` [bug#40770] [PATCH 0/5] Add declarative profiles Mathieu Othacehe
  2020-04-22 19:46   ` Ludovic Courtès
@ 2020-04-26 20:51   ` Ludovic Courtès
  1 sibling, 0 replies; 10+ messages in thread
From: Ludovic Courtès @ 2020-04-26 20:51 UTC (permalink / raw)
  To: Mathieu Othacehe, Christopher Baines; +Cc: 40770-done

Hey!

Mathieu Othacehe <m.othacehe@gmail.com> skribis:

> This is really nice and it all looks good to me. Any reason not to use
> it in "package-cache-file" to get rid of the mlet?

Done and pushed as ccbc427f9ac8f63478f1692686b042a22c4df2c3.

Christopher Baines <mail@cbaines.net> skribis:

> This sounds great, I use Emacs in a profile for rending .org files with
> cgit, and it took a bit of fiddling to get the profile built
> properly. This'll probably make it a lot easier!

Great!  I think there are many cases where being unable to simply insert
a profile in a gexp was a hindrance.

Ludo’.

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2020-04-26 20:53 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-22 15:06 [bug#40770] [PATCH 0/5] Add declarative profiles Ludovic Courtès
2020-04-22 15:08 ` [bug#40770] [PATCH 1/5] profiles: Add lowerable <profile> record type Ludovic Courtès
2020-04-22 15:08   ` [bug#40770] [PATCH 2/5] system: 'operating-system-directory-base-entries' uses 'profile' Ludovic Courtès
2020-04-22 15:08   ` [bug#40770] [PATCH 3/5] services: profile: Use a declarative profile Ludovic Courtès
2020-04-22 15:08   ` [bug#40770] [PATCH 4/5] pack: " Ludovic Courtès
2020-04-22 15:08   ` [bug#40770] [PATCH 5/5] services: system: Initial entries are non-monadic Ludovic Courtès
2020-04-22 17:12 ` [bug#40770] [PATCH 0/5] Add declarative profiles Mathieu Othacehe
2020-04-22 19:46   ` Ludovic Courtès
2020-04-26 20:51   ` bug#40770: " Ludovic Courtès
2020-04-22 19:46 ` [bug#40770] " Christopher Baines

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/guix.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.