From 200dc93761d74ec5646603d67176841b602344d4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo@gnu.org>
Date: Mon, 10 Dec 2012 00:44:17 +0100
Subject: [PATCH] derivations: Distinguish direct store paths from files within
 a store path.

* guix/derivations.scm (derivation)[direct-store-path?]: New procedure.
  Use it to determine which inputs must be added to the store.
---
 guix/derivations.scm | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/guix/derivations.scm b/guix/derivations.scm
index b1f54232bca..6fbce14da0d 100644
--- a/guix/derivations.scm
+++ b/guix/derivations.scm
@@ -364,6 +364,15 @@ (define* (derivation store name system builder args env-vars inputs
 store path and <derivation> object.  When HASH, HASH-ALGO, and HASH-MODE
 are given, a fixed-output derivation is created---i.e., one whose result is
 known in advance, such as a file download."
+  (define direct-store-path?
+    (let ((len (+ 1 (string-length (%store-prefix)))))
+      (lambda (p)
+        ;; Return #t if P is a store path, and not a sub-directory of a
+        ;; store path.  This predicate is needed because files *under* a
+        ;; store path are not valid inputs.
+        (and (store-path? p)
+             (not (string-index (substring p len) #\/))))))
+
   (define (add-output-paths drv)
     ;; Return DRV with an actual store path for each of its output and the
     ;; corresponding environment variable.
@@ -411,9 +420,9 @@ (define (env-vars-with-empty-outputs)
                                   (make-derivation-output "" hash-algo hash)))
                           outputs))
          (inputs     (map (match-lambda
-                           (((? store-path? input))
+                           (((? direct-store-path? input))
                             (make-derivation-input input '("out")))
-                           (((? store-path? input) sub-drvs ...)
+                           (((? direct-store-path? input) sub-drvs ...)
                             (make-derivation-input input sub-drvs))
                            ((input . _)
                             (let ((path (add-to-store store
-- 
GitLab