summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--guix/derivations.scm15
1 files changed, 10 insertions, 5 deletions
diff --git a/guix/derivations.scm b/guix/derivations.scm
index a3a4eae6ac..09b7ec079e 100644
--- a/guix/derivations.scm
+++ b/guix/derivations.scm
@@ -435,6 +435,14 @@ that form."
                  port)
      (display ")" port))))
 
+(define derivation->string
+  (memoize
+   (lambda (drv)
+     "Return the external representation of DRV as a string."
+     (with-fluids ((%default-port-encoding "UTF-8"))
+       (call-with-output-string
+        (cut write-derivation drv <>))))))
+
 (define* (derivation->output-path drv #:optional (output "out"))
   "Return the store path of its output OUTPUT."
   (let ((outputs (derivation-outputs drv)))
@@ -517,9 +525,7 @@ in SIZE bytes."
          ;; the SHA256 port's `write' method gets called for every single
          ;; character.
          (sha256
-          (with-fluids ((%default-port-encoding "UTF-8"))
-            (string->utf8 (call-with-output-string
-                           (cut write-derivation drv <>)))))))))))
+          (string->utf8 (derivation->string drv)))))))))
 
 (define (store-path type hash name)               ; makeStorePath
   "Return the store path for NAME/HASH/TYPE."
@@ -685,8 +691,7 @@ derivations where the costs of data transfers would outweigh the benefits."
          (drv        (add-output-paths drv-masked)))
 
     (let ((file (add-text-to-store store (string-append name ".drv")
-                                   (call-with-output-string
-                                    (cut write-derivation drv <>))
+                                   (derivation->string drv)
                                    (map derivation-input-path
                                         inputs))))
       (set-file-name drv file))))