# GNU Guix --- Functional package management for GNU # Copyright © 2015 David Thompson # # This file is part of GNU Guix. # # GNU Guix is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or (at # your option) any later version. # # GNU Guix is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with GNU Guix. If not, see . # # Test 'guix environment'. # set -e guix environment --version if ! guile -c '((@@ (guix scripts environment) assert-container-features))' then # User containers are not supported; skip this test. exit 77 fi tmpdir="t-guix-environment-$$" trap 'rm -r "$tmpdir"' EXIT mkdir "$tmpdir" # Make sure the exit value is preserved. if guix environment --container --ad-hoc --bootstrap guile-bootstrap \ -- guile -c '(exit 42)' then false else test $? = 42 fi # Make sure file-not-found errors in mounts are reported. if guix environment --container --ad-hoc --bootstrap guile-bootstrap \ --expose=/does-not-exist -- guile -c 1 2> "$tmpdir/error" then false else grep "/does-not-exist" "$tmpdir/error" grep "[Nn]o such file" "$tmpdir/error" fi # Make sure that the right directories are mapped. mount_test_code=" (use-modules (ice-9 rdelim) (ice-9 match) (srfi srfi-1)) (define mappings (filter-map (lambda (line) (match (string-split line #\space) ;; Empty line. ((\"\") #f) ;; Ignore the root file system. ((_ \"/\" _ _ _ _) #f) ;; Ignore these types of file systems, except if they ;; correspond to a parent file system. ((_ mount (or \"tmpfs\" \"proc\" \"sysfs\" \"devtmpfs\" \"devpts\" \"cgroup\" \"mqueue\") _ _ _) (and (string-prefix? (getcwd) mount) mount)) ((_ mount _ _ _ _) mount))) (string-split (call-with-input-file \"/proc/mounts\" read-string) #\newline))) (for-each (lambda (mount) (display mount) (newline)) mappings)" guix environment --container --ad-hoc --bootstrap guile-bootstrap \ -- guile -c "$mount_test_code" > $tmpdir/mounts cat "$tmpdir/mounts" test `wc -l < $tmpdir/mounts` -eq 4 current_dir="`cd $PWD; pwd -P`" grep -e "$current_dir$" $tmpdir/mounts # current directory grep $(guix build guile-bootstrap) $tmpdir/mounts grep -e "$NIX_STORE_DIR/.*-bash" $tmpdir/mounts # bootstrap bash rm $tmpdir/mounts # Make sure 'GUIX_ENVIRONMENT' is linked to '~/.guix-profile' when requested # within a container. ( linktest='(exit (string=? (getenv "GUIX_ENVIRONMENT") (readlink (string-append (getenv "HOME") "/.guix-profile"))))' cd "$tmpdir" \ && guix environment --bootstrap --container --link-profile \ --ad-hoc guile-bootstrap --pure \ -- guile -c "$linktest" ) # Test that user can be mocked. usertest='(exit (and (string=? (getenv "HOME") "/home/foognu") (string=? (passwd:name (getpwuid 0)) "foognu") (file-exists? "/home/foognu/umock")))' touch "$tmpdir/umock" HOME="$tmpdir" guix environment --bootstrap --container --user=foognu \ --ad-hoc guile-bootstrap --pure \ --share="$tmpdir/umock" \ -- guile -c "$usertest" # Check the exit code. abnormal_exit_code=" (use-modules (system foreign)) ;; Purposely make Guile crash with a segfault. :) (pointer->string (make-pointer 123) 123)" if guix environment --bootstrap --container \ --ad-hoc guile-bootstrap -- guile -c "$abnormal_exit_code" then false; else test $? -gt 127 fi nMinSize'. * tests/derivations.scm ("identical files are deduplicated"): Produce files bigger than %DEDUPLICATION-MINIMUM-SIZE. * tests/nar.scm ("restore-file-set with directories (signed, valid)"): Likewise. * tests/store-deduplication.scm ("deduplicate, below %deduplication-minimum-size"): New test. ("deduplicate", "deduplicate, ENOSPC"): Produce files bigger than %DEDUPLICATION-MINIMUM-SIZE. * tests/store.scm ("substitute, deduplication"): Likewise. Ludovic Courtès 2020-06-06daemon: Handle EXDEV when moving to trash directory....Fixes <https://bugs.gnu.org/41607>. Reported by Stephen Scheck <singularsyntax@gmail.com>. * nix/libstore/gc.cc (LocalStore::deletePathRecursive): When we try to move a dead directory into the trashDir using rename(2) but it returns an EXDEV error, just delete the directory instead. This can happen in a Docker container when the directory is not on the "top layer". Chris Marusich 2020-02-26daemon: Drop 'AT_STATX_DONT_SYNC' flag upon EINVAL....Fixes <https://bugs.gnu.org/39727>. Reported by Paul Garlick <pgarlick@tourbillion-technology.com>. * nix/libstore/gc.cc (LocalStore::removeUnusedLinks) [HAVE_STATX]: Add 'statx_flags' static variables. Clear 'AT_STATX_DONT_SYNC' flag from 'statx_flags' when 'statx' returns EINVAL. Ludovic Courtès 2020-01-12daemon: Fix the displayed GC estimated progress....* nix/libstore/gc.cc (LocalStore::deletePathRecursive): Fix computation of 'fraction'. Take 'bytesInvalidated' into account. Ludovic Courtès 2020-01-12daemon: Account for deleted store files when deduplication is on....Previously, a store item that is a regular file would not be accounted for in the 'bytesFreed' value computed by 'deletePath' because its 'st_nlink' count would always be >= 2. This commit fixes that. * nix/libutil/util.hh (deletePath): Add optional 'linkThreshold' argument. * nix/libutil/util.cc (_deletePath): Add 'linkThreshold' argument and honor it. Pass it down in recursive call. (deletePath): Add 'linkThreshold' and honor it. * nix/libstore/gc.cc (LocalStore::deleteGarbage): Pass 'linkThreshold' argument to 'deletePath', with a value of 2 when PATH is a store item and deduplication is on. Ludovic Courtès