~ruther/guix-local

aaa848f3afa81ec79579071f99d9bea5f8456f32 — Ludovic Courtès 13 years ago f39bd08
Optimize `write-derivation' and `derivation-path->output-path'.

* guix/derivations.scm (write-derivation): Explicitly use
  `simple-format'.
  (derivation-path->output-path): Memoize.
1 files changed, 12 insertions(+), 5 deletions(-)

M guix/derivations.scm
M guix/derivations.scm => guix/derivations.scm +12 -5
@@ 200,6 200,10 @@ available in STORE, recursively."
  "Write the ATerm-like serialization of DRV to PORT.  See Section 2.4 of
Eelco Dolstra's PhD dissertation for an overview of a previous version of
that form."

  ;; Make sure we're using the faster implementation.
  (define format simple-format)

  (define (list->string lst)
    (string-append "[" (string-join lst ",") "]"))



@@ 269,12 273,15 @@ that form."
                              (string<? (car e1) (car e2))))))
     (display ")" port))))

(define* (derivation-path->output-path path #:optional (output "out"))
  "Read the derivation from PATH (`/nix/store/xxx.drv'), and return the store
(define derivation-path->output-path
  ;; This procedure is called frequently, so memoize it.
  (memoize
   (lambda* (path #:optional (output "out"))
     "Read the derivation from PATH (`/nix/store/xxx.drv'), and return the store
path of its output OUTPUT."
  (let* ((drv     (call-with-input-file path read-derivation))
         (outputs (derivation-outputs drv)))
    (and=> (assoc-ref outputs output) derivation-output-path)))
     (let* ((drv     (call-with-input-file path read-derivation))
            (outputs (derivation-outputs drv)))
       (and=> (assoc-ref outputs output) derivation-output-path)))))


;;;