~ruther/guix-local

cf8b312d1872aec1f38a179eeb981d79bf7faa03 — Ludovic Courtès 10 years ago 30d4bc0
grafts: Preserve empty directories when grafting.

* guix/build/graft.scm (rewrite-directory)[rewrite-leaf]: Add case for
'directory.
Pass #:directories? #t to 'find-files'.
2 files changed, 28 insertions(+), 1 deletions(-)

M guix/build/graft.scm
M tests/grafts.scm
M guix/build/graft.scm => guix/build/graft.scm +4 -1
@@ 115,6 115,8 @@ file name pairs."
                   (replace-store-references input output mapping
                                             store)
                   (chmod output (stat:perms stat))))))))
        ((directory)
         (mkdir-p dest))
        (else
         (error "unsupported file type" stat)))))



@@ 124,6 126,7 @@ file name pairs."
  (umask #o022)

  (n-par-for-each (parallel-job-count)
                  rewrite-leaf (find-files directory)))
                  rewrite-leaf (find-files directory (const #t)
                                           #:directories? #t)))

;;; graft.scm ends here

M tests/grafts.scm => tests/grafts.scm +24 -0
@@ 127,6 127,30 @@
                       (list one two dep)
                       (references %store dep)))))))

(test-assert "graft-derivation, preserve empty directories"
  (run-with-store %store
    (mlet* %store-monad ((fake    (text-file "bash" "Fake bash."))
                         (graft -> (graft
                                     (origin %bash)
                                     (replacement fake)))
                         (drv     (gexp->derivation
                                   "to-graft"
                                   #~(begin
                                       (use-modules (guix build utils))
                                       (mkdir-p (string-append #$output
                                                               "/a/b/c/d"))
                                       (symlink #$%bash
                                                (string-append #$output
                                                               "/bash")))
                                   #:modules '((guix build utils))))
                         (grafted ((store-lift graft-derivation) drv
                                   (list graft)))
                         (_       (built-derivations (list grafted)))
                         (out ->  (derivation->output-path grafted)))
      (return (and (string=? (readlink (string-append out "/bash"))
                             fake)
                   (file-is-directory? (string-append out "/a/b/c/d")))))))

(test-assert "graft-derivation, no dependencies on grafted output"
  (run-with-store %store
    (mlet* %store-monad ((fake    (text-file "bash" "Fake bash."))