guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

03/12: gexp: Add 'mixed-text-file'.


From: Ludovic Courtès
Subject: 03/12: gexp: Add 'mixed-text-file'.
Date: Mon, 05 Oct 2015 22:11:56 +0000

civodul pushed a commit to branch wip-service-refactor
in repository guix.

commit 4e8327d7c97c85b05a4049c458ada79246a32f00
Author: Ludovic Courtès <address@hidden>
Date:   Wed Sep 9 09:44:43 2015 +0200

    gexp: Add 'mixed-text-file'.
    
    * guix/gexp.scm (mixed-text-file): New procedure.
    * tests/gexp.scm ("mixed-text-file"): New test.
    * doc/guix.texi (G-Expressions): Document it.
---
 doc/guix.texi  |   13 +++++++++++++
 guix/gexp.scm  |   16 ++++++++++++++++
 tests/gexp.scm |   15 +++++++++++++++
 3 files changed, 44 insertions(+), 0 deletions(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index 3c7f403..e050ef5 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -3463,6 +3463,19 @@ will references @var{coreutils}, @var{grep}, and 
@var{sed}, thereby
 preventing them from being garbage-collected during its lifetime.
 @end deffn
 
address@hidden {Scheme Procedure} mixed-text-file @var{name} @var{text} @dots{}
+Return an object representing store file @var{name} containing
address@hidden  @var{text} is a sequence of strings and file-like objects,
+as in:
+
address@hidden
+(mixed-text-file "profile"
+                 "export PATH=" coreutils "/bin:" grep "/bin")
address@hidden example
+
+This is the declarative counterpart of @code{text-file*}.
address@hidden deffn
+
 Of course, in addition to gexps embedded in ``host'' code, there are
 also modules containing build tools.  To make it clear that they are
 meant to be used in the build stratum, these modules are kept in the
diff --git a/guix/gexp.scm b/guix/gexp.scm
index 10acf2b..f44df9c 100644
--- a/guix/gexp.scm
+++ b/guix/gexp.scm
@@ -61,6 +61,7 @@
             gexp->file
             gexp->script
             text-file*
+            mixed-text-file
             imported-files
             imported-modules
             compiled-modules
@@ -969,6 +970,21 @@ resulting store file holds references to all these."
 
   (gexp->derivation name builder))
 
+(define* (mixed-text-file name #:rest text)
+  "Return an object representing store file NAME containing TEXT.  TEXT is a
+sequence of strings and file-like objects, as in:
+
+  (mixed-text-file \"profile\"
+                   \"export PATH=\" coreutils \"/bin:\" grep \"/bin\")
+
+This is the declarative counterpart of 'text-file*'."
+  (define build
+    (gexp (call-with-output-file (ungexp output "out")
+            (lambda (port)
+              (display (string-append (ungexp-splicing text)) port)))))
+
+  (computed-file name build))
+
 
 ;;;
 ;;; Syntactic sugar.
diff --git a/tests/gexp.scm b/tests/gexp.scm
index 0a8ce65..77439cf 100644
--- a/tests/gexp.scm
+++ b/tests/gexp.scm
@@ -660,6 +660,21 @@
                                             file)))))
       #:guile-for-build (package-derivation %store %bootstrap-guile))))
 
+(test-assertm "mixed-text-file"
+  (mlet* %store-monad ((file ->   (mixed-text-file "mixed"
+                                                   "export PATH="
+                                                   %bootstrap-guile "/bin"))
+                       (drv       (lower-object file))
+                       (out ->    (derivation->output-path drv))
+                       (guile-drv (package->derivation %bootstrap-guile))
+                       (guile ->  (derivation->output-path guile-drv)))
+    (mbegin %store-monad
+      (built-derivations (list drv))
+      (mlet %store-monad ((refs ((store-lift references) out)))
+        (return (and (string=? (string-append "export PATH=" guile "/bin")
+                               (call-with-input-file out get-string-all))
+                     (equal? refs (list guile))))))))
+
 (test-assert "gexp->derivation vs. %current-target-system"
   (let ((mval (gexp->derivation "foo"
                                 #~(begin



reply via email to

[Prev in Thread] Current Thread [Next in Thread]