From mboxrd@z Thu Jan 1 00:00:00 1970 From: ludo@gnu.org (Ludovic =?UTF-8?Q?Court=C3=A8s?=) Subject: bug#17083: =?UTF-8?Q?=E2=80=98union-build=E2=80=99?= does not handle collisions between a leaf and a sub-tree Date: Mon, 24 Mar 2014 15:15:34 +0100 Message-ID: <87siq7y96h.fsf@gnu.org> References: <87ior4ku41.fsf@yeeloong.lan> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Return-path: Sender: "Debbugs-submit" Resent-Message-ID: In-Reply-To: <87ior4ku41.fsf@yeeloong.lan> (Mark H. Weaver's message of "Mon, 24 Mar 2014 02:07:10 -0400") List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-guix-bounces+gcggb-bug-guix=m.gmane.org@gnu.org Sender: bug-guix-bounces+gcggb-bug-guix=m.gmane.org@gnu.org To: mhw@netris.org, 17083@debbugs.gnu.org Cc: guix-devel@gnu.org List-Id: guix-devel.gnu.org (Adding bug-guix.) Mark H Weaver skribis: > On the Loongson 3A machine, I finished building all the packages from > core-updates that I use in my profile, and then tried installing them. > I got this: > > In /gnu/store/9sqx55rgygyrcyg350cfqwy8wqb4fr69-module-import/guix/build/u= nion.scm: > 226: 1 [loop # #] > In unknown file: > ?: 0 [mkdir "/gnu/store/c30bsax58scw5qwcnbma16k6z88s1lh3-profile/./inc= lude" ...] > > ERROR: In procedure mkdir: > ERROR: In procedure mkdir: File exists > builder for `/gnu/store/17w6kggffh79drmmrdnxy1yhgr6p2in5-profile.drv' fai= led with exit code 1 > > The problem turns out to be that 'libffi' makes 'include' a symlink to > 'lib/libffi-3.0.13/include', and union.scm cannot cope with conflicts > between a directory and a symlink. Ouch, good catch. I=E2=80=99ve come up with a test that reproduces it: --8<---------------cut here---------------start------------->8--- (test-assert "union-build with symlink to directory" (let* ((builder '(begin (use-modules (guix build union) (guix build utils) (srfi srfi-26)) (mkdir-p "one/foo") (call-with-output-file "one/foo/one" (cut display "one" <>)) (mkdir-p "two/bar") (symlink "bar" "two/foo") (call-with-output-file "two/foo/two" (cut display "two" <>)) (union-build (assoc-ref %outputs "out") '("one" "two")= ))) (drv (build-expression->derivation %store "union-collision-symlink" builder #:modules '((guix build union) (guix build utils))))) (and (build-derivations %store (list drv)) (with-directory-excursion (derivation->output-path drv) (and (file-exists? "one/foo/one") (file-exists? "two/foo/two") (file-exists? "two/bar/two")))))) --8<---------------cut here---------------end--------------->8--- Actually union.scm cannot handle collisions between a leaf and a directory in general, which should be fixed. I can think of these cases: 1. If the leaf is a regular file, error out. 2. If the leaf is a symlink: a. If it points to a directory, union the directories. b. Otherwise, error out. Does that make sense? Do you think you could come up with a patch? Alternately we could apply Sree=E2=80=99s proposed workaround as a stopgap measure. Thanks, Ludo=E2=80=99.