gexp: Allow bytevector as content of `plain-file'.

This allows for using a package source directly from git, doing something like

    (define (command->bytevector command)
      (let ((port (apply open-pipe* OPEN_READ command)))
        (let ((output (get-bytevector-all port)))
          (close-port port)
          output)))

    (define-public hello-git
      (package
        (name "hello")
        (version "git")
        (source (let* ((commit "stable-2.0")
                       (content (command->bytevector
                                 `("git" "archive" "--format" "tar" "--prefix"
                                   ,(string-append commit "/") ,commit)))
                       (file-name (string-append "hello-" commit)))
                  (plain-file file-name content)))
        ...
        ))

* guix/gexp.scm (<plain-file>): Also allow bytevector content.
(plain-file-compiler): Handle bytevector content.
* doc/guix.texi (G-Expressions): Describe plain-file now also taking
bytevectors.
This commit is contained in:
Jan Nieuwenhuizen 2018-07-10 19:06:32 +02:00
parent f3a422511f
commit e8e1f295f1
No known key found for this signature in database
GPG Key ID: F3C1A0D9C1D65273
2 changed files with 8 additions and 4 deletions

View File

@ -5355,7 +5355,7 @@ procedure (@pxref{The Store Monad, @code{interned-file}}).
@deffn {Scheme Procedure} plain-file @var{name} @var{content} @deffn {Scheme Procedure} plain-file @var{name} @var{content}
Return an object representing a text file called @var{name} with the given Return an object representing a text file called @var{name} with the given
@var{content} (a string) to be added to the store. @var{content} (a string or a bytevector) to be added to the store.
This is the declarative counterpart of @code{text-file}. This is the declarative counterpart of @code{text-file}.
@end deffn @end deffn

View File

@ -1,6 +1,7 @@
;;; GNU Guix --- Functional package management for GNU ;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2014, 2015, 2016, 2017, 2018 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2018 Clément Lassieur <clement@lassieur.org> ;;; Copyright © 2018 Clément Lassieur <clement@lassieur.org>
;;; Copyright © 2018 Jan Nieuwenhuizen <janneke@gnu.org>
;;; ;;;
;;; This file is part of GNU Guix. ;;; This file is part of GNU Guix.
;;; ;;;
@ -23,6 +24,7 @@
#:use-module (guix derivations) #:use-module (guix derivations)
#:use-module (guix grafts) #:use-module (guix grafts)
#:use-module (guix utils) #:use-module (guix utils)
#:use-module (rnrs bytevectors)
#:use-module (srfi srfi-1) #:use-module (srfi srfi-1)
#:use-module (srfi srfi-9) #:use-module (srfi srfi-9)
#:use-module (srfi srfi-9 gnu) #:use-module (srfi srfi-9 gnu)
@ -334,7 +336,7 @@ appears."
(%plain-file name content references) (%plain-file name content references)
plain-file? plain-file?
(name plain-file-name) ;string (name plain-file-name) ;string
(content plain-file-content) ;string (content plain-file-content) ;string or bytevector
(references plain-file-references)) ;list (currently unused) (references plain-file-references)) ;list (currently unused)
(define (plain-file name content) (define (plain-file name content)
@ -349,8 +351,10 @@ This is the declarative counterpart of 'text-file'."
(define-gexp-compiler (plain-file-compiler (file <plain-file>) system target) (define-gexp-compiler (plain-file-compiler (file <plain-file>) system target)
;; "Compile" FILE by adding it to the store. ;; "Compile" FILE by adding it to the store.
(match file (match file
(($ <plain-file> name content references) (($ <plain-file> name (and (? string?) content) references)
(text-file name content references)))) (text-file name content references))
(($ <plain-file> name (and (? bytevector?) content) references)
(binary-file name content references))))
(define-record-type <computed-file> (define-record-type <computed-file>
(%computed-file name gexp guile options) (%computed-file name gexp guile options)