Subject: bug#35776: closed (Re: bug#35776: Test guix-pack-localstatedir.sh and guix-pack-relocatable.sh crash when /gnu/store doesn't exist)

From: [email-masked] (GNU bug Tracking System)
Date: Sat, 18 May 2019 10:30:03 +0000

Your bug report

#35776: Test guix-pack-localstatedir.sh and guix-pack-relocatable.sh crash when /gnu/store doesn't exist

which was filed against the guix package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
35776: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=35776
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#35776: Test guix-pack-localstatedir.sh and guix-pack-relocatable.sh crash when /gnu/store doesn't exist
From: Ludovic Courtès <[email-masked]>
To: Ting-Wei Lan <[email-masked]>
Cc: [email-masked]
Date: Sat, 18 May 2019 12:29:18 +0200
List-Id: <debbugs-submit.debbugs.gnu.org>

Ting-Wei Lan <[email-masked]> skribis:

> It seems to me that the reason is that NIX_STORE_DIR is exported by
> test-env script, so the line
> NIX_STORE_DIR="`guile -c '(use-modules (guix config))(display %storedir)'`"
> not only changes the value of shell variable NIX_STORE_DIR but also
> exports it to the environment.
> Therefore, the next line
> localstatedir="`guile -c '(use-modules (guix config))(display
> %localstatedir)'`"
> crashes at guix/config.scm when running the code
> (define %store-directory
>   (or (and=> (getenv "NIX_STORE_DIR") canonicalize-path)
>       %storedir))
> because NIX_STORE_DIR points to a non-existent path /gnu/store.
> I attached a patch to avoid the crash by delaying the modification
> to NIX_STORE_DIR, but I am not sure if it is correct to do so.

Indeed.  Pushed as baab87ac49e3f0f873e17eb16db9781189b1f2d1, thanks!

Ludo’.

Subject: Test guix-pack-localstatedir.sh and guix-pack-relocatable.sh crash when /gnu/store doesn't exist
From: Ting-Wei Lan <[email-masked]>
To: [email-masked]
Date: Fri, 17 May 2019 21:47:17 +0800
List-Id: <debbugs-submit.debbugs.gnu.org>

When running these two tests in a clean environment without having Guix
installed first, they crash when trying to obtain the value of
localstatedir.
+ guix pack --version
guix pack (GNU Guix) 1.0.0.711-f52e8-dirty
Copyright (C) 2019 the Guix authors
License GPLv3+: GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
++ guile2.2 -c '(use-modules (guix config))(display %storedir)'
+ NIX_STORE_DIR=/gnu/store
++ guile2.2 -c '(use-modules (guix config))(display %localstatedir)'
Backtrace:
In ice-9/eval.scm:
    619:8 19 (_ #(#(#<directory (guile-user) 564bef205140>)))
In ice-9/command-line.scm:
   181:18 18 (_ #<input: string 564bef21ca80>)
In unknown file:
          17 (eval (use-modules (guix config)) #<directory (guile-us…>)
In ice-9/eval.scm:
   721:20 16 (primitive-eval (use-modules (guix config)))
In ice-9/psyntax.scm:
  1235:36 15 (expand-top-sequence ((use-modules (guix config))) _ _ # …)
  1182:24 14 (parse _ (("placeholder" placeholder)) ((top) #(# # …)) …)
   285:10 13 (parse _ (("placeholder" placeholder)) (()) _ c&e (eval) …)
In ice-9/boot-9.scm:
  3377:20 12 (process-use-modules _)
   222:17 11 (map1 (((guix config))))
  3378:31 10 (_ ((guix config)))
  2800:17  9 (resolve-interface (guix config) #:select _ #:hide _ # _ …)
In ice-9/threads.scm:
    390:8  8 (_ _)
In ice-9/boot-9.scm:
  2726:13  7 (_)
In ice-9/threads.scm:
    390:8  6 (_ _)
In ice-9/boot-9.scm:
  2994:20  5 (_)
   2312:4  4 (save-module-excursion #<procedure 564bef1bf1b0 at ice-…>)
  3014:26  3 (_)
In unknown file:
           2 (primitive-load-path "guix/config" #<procedure 564bef15…>)
In guix/config.scm:
     71:6  1 (_)
In unknown file:
           0 (canonicalize-path "/gnu/store")
ERROR: In procedure canonicalize-path:
In procedure canonicalize-path: No such file or directory
+ localstatedir=
FAIL tests/guix-pack-localstatedir.sh (exit status: 1)
It seems to me that the reason is that NIX_STORE_DIR is exported by
test-env script, so the line
NIX_STORE_DIR="`guile -c '(use-modules (guix config))(display %storedir)'`"
not only changes the value of shell variable NIX_STORE_DIR but also
exports it to the environment.
Therefore, the next line
localstatedir="`guile -c '(use-modules (guix config))(display
%localstatedir)'`"
crashes at guix/config.scm when running the code
(define %store-directory
  (or (and=> (getenv "NIX_STORE_DIR") canonicalize-path)
      %storedir))
because NIX_STORE_DIR points to a non-existent path /gnu/store.
I attached a patch to avoid the crash by delaying the modification
to NIX_STORE_DIR, but I am not sure if it is correct to do so.
diff --git a/tests/guix-pack-localstatedir.sh b/tests/guix-pack-localstatedir.sh
index b734b0f..41afda1 100644
--- a/tests/guix-pack-localstatedir.sh
+++ b/tests/guix-pack-localstatedir.sh
@@ -27,8 +27,9 @@ guix pack --version
 # the test in the user's global store if possible, on the grounds that
 # binaries may already be there or can be built or downloaded inexpensively.
 
-NIX_STORE_DIR="`guile -c '(use-modules (guix config))(display %storedir)'`"
+nix_store_dir="`guile -c '(use-modules (guix config))(display %storedir)'`"
 localstatedir="`guile -c '(use-modules (guix config))(display %localstatedir)'`"
+NIX_STORE_DIR="$nix_store_dir"
 GUIX_DAEMON_SOCKET="$localstatedir/guix/daemon-socket/socket"
 export NIX_STORE_DIR GUIX_DAEMON_SOCKET
 
diff --git a/tests/guix-pack-relocatable.sh b/tests/guix-pack-relocatable.sh
index 38dcf1e..b276fdc 100644
--- a/tests/guix-pack-relocatable.sh
+++ b/tests/guix-pack-relocatable.sh
@@ -27,8 +27,9 @@ guix pack --version
 # run it on the user's global store if possible, on the grounds that binaries
 # may already be there or can be built or downloaded inexpensively.
 
-NIX_STORE_DIR="`guile -c '(use-modules (guix config))(display %storedir)'`"
+nix_store_dir="`guile -c '(use-modules (guix config))(display %storedir)'`"
 localstatedir="`guile -c '(use-modules (guix config))(display %localstatedir)'`"
+NIX_STORE_DIR="$nix_store_dir"
 GUIX_DAEMON_SOCKET="$localstatedir/guix/daemon-socket/socket"
 export NIX_STORE_DIR GUIX_DAEMON_SOCKET