Package: guix;
Reported by: Christopher Baines <mail <at> cbaines.net>
Date: Sat, 2 May 2020 15:48:01 UTC
Severity: important
Done: Ludovic Courtès <ludo <at> gnu.org>
Bug is archived. No further changes may be made.
To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 41028 in the body.
You can then email your comments to 41028 AT debbugs.gnu.org in the normal way.
Toggle the display of automated, internal messages from the tracker.
View this report as an mbox folder, status mbox, maintainer mbox
bug-guix <at> gnu.org
:bug#41028
; Package guix
.
(Sat, 02 May 2020 15:48:02 GMT) Full text and rfc822 format available.Christopher Baines <mail <at> cbaines.net>
:bug-guix <at> gnu.org
.
(Sat, 02 May 2020 15:48:02 GMT) Full text and rfc822 format available.Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):
From: Christopher Baines <mail <at> cbaines.net> To: bug-guix <at> gnu.org Subject: Channel/inferior error with core-updates: Unbound variable: call-with-new-thread Date: Sat, 02 May 2020 16:47:49 +0100
[Message part 1 (text/plain, inline)]
Noticed this when testing guix system build with core-updates. Here's a small example which reproduces the issue: (use-modules (guix channels) (guix inferior)) (define channels (list (channel (name 'guix) (url "https://git.savannah.gnu.org/git/guix.git") (commit "e02c2f85b36ce1c733bd908a210ce1182bdd2560")))) (define inferior (inferior-for-channels channels)) (first (lookup-inferior-packages inferior "linux-libre" "5.2.21")) If you save that as a file then attempt to build it: → guix build -f test.scm Updating channel 'guix' from Git repository at 'https://git.savannah.gnu.org/git/guix.git'... Backtrace: 4 (primitive-load "/gnu/store/8mv5bpjgxg9c369xnbb5rf1kv9r?") In ice-9/eval.scm: 619:8 3 (_ #(#(#(#(#(#(#(#(#(#(#(?) ?) ?) ?) ?) ?) ?) ?) ?) ?) ?)) 182:19 2 (proc #(#(#(#(#(#(#(#(#(#(# ?) ?) ?) ?) ?) ?) ?) ?) ?) ?)) 142:16 1 (compile-top-call #<directory (guile-user) 7f1e0abc1f00> ?) In unknown file: 0 (%resolve-variable (7 . call-with-new-thread) #<directo?>) ERROR: In procedure %resolve-variable: Unbound variable: call-with-new-thread guix build: error: You found a bug: the program '/gnu/store/8mv5bpjgxg9c369xnbb5rf1kv9r6z5hw-compute-guix-derivation' failed to compute the derivation for Guix (version: "e02c2f85b36ce1c733bd908a210ce1182bdd2560"; system: "x86_64-linux"; host version: "a8cb1e72ef351330d1521833c1b270dcc0da593f"; pull-version: 1). Please report it by email to <bug-guix <at> gnu.org>.
[signature.asc (application/pgp-signature, inline)]
Ludovic Courtès <ludo <at> gnu.org>
to control <at> debbugs.gnu.org
.
(Tue, 05 May 2020 19:35:02 GMT) Full text and rfc822 format available.bug-guix <at> gnu.org
:bug#41028
; Package guix
.
(Tue, 05 May 2020 21:25:01 GMT) Full text and rfc822 format available.Message #10 received at 41028 <at> debbugs.gnu.org (full text, mbox):
From: Ludovic Courtès <ludo <at> gnu.org> To: Christopher Baines <mail <at> cbaines.net> Cc: 41028 <at> debbugs.gnu.org Subject: Re: bug#41028: Channel/inferior error with core-updates: Unbound variable: call-with-new-thread Date: Tue, 05 May 2020 23:24:22 +0200
[Message part 1 (text/plain, inline)]
Hey! Christopher Baines <mail <at> cbaines.net> skribis: > → guix build -f test.scm > Updating channel 'guix' from Git repository at 'https://git.savannah.gnu.org/git/guix.git'... > Backtrace: > 4 (primitive-load "/gnu/store/8mv5bpjgxg9c369xnbb5rf1kv9r?") > In ice-9/eval.scm: > 619:8 3 (_ #(#(#(#(#(#(#(#(#(#(#(?) ?) ?) ?) ?) ?) ?) ?) ?) ?) ?)) > 182:19 2 (proc #(#(#(#(#(#(#(#(#(#(# ?) ?) ?) ?) ?) ?) ?) ?) ?) ?)) > 142:16 1 (compile-top-call #<directory (guile-user) 7f1e0abc1f00> ?) > In unknown file: > 0 (%resolve-variable (7 . call-with-new-thread) #<directo?>) > > ERROR: In procedure %resolve-variable: > Unbound variable: call-with-new-thread > guix build: error: You found a bug: the program '/gnu/store/8mv5bpjgxg9c369xnbb5rf1kv9r6z5hw-compute-guix-derivation' > failed to compute the derivation for Guix (version: "e02c2f85b36ce1c733bd908a210ce1182bdd2560"; system: "x86_64-linux"; > host version: "a8cb1e72ef351330d1521833c1b270dcc0da593f"; pull-version: 1). A summary of the IRC discussion and experiments: 1. The underlying problem is a missing (ice-9 threads) import in the ‘compute-guix-derivation’ script, fixed in 05e783871c2c69b402e088863d46f5be7915ac74. 2. The ‘%quirks’ mechanism in (guix channels) doesn’t work as is here because what we would need to change is the #:guile parameter passed to ‘gexp->script’ (the one defined in build-self.scm). Attached a patch to add a quirk but that doesn’t solve the problem. Possible solutions include: a. Changing the value returned by ‘default-guile’ as used by ‘gexp->script’. b. Supporting the definition of quirks that patch the code. Thanks, Ludo’.
[Message part 2 (text/x-patch, inline)]
diff --git a/guix/channels.scm b/guix/channels.scm index 041fae2a9c..cbb0a97546 100644 --- a/guix/channels.scm +++ b/guix/channels.scm @@ -328,16 +328,34 @@ to '%package-module-path'." #f (apply throw args))))) +(define (missing-ice-9-threads-import? source) + "Return true of %SELF-BUILD-FILE is missing an (ice-9 threads) import as +described at <https://bugs.gnu.org/41028>." + (define content + (call-with-input-file (string-append source "/" %self-build-file) + read-string)) + + ;; The faulty code uses 'call-with-new-thread' without importing (ice-9 + ;; threads). However, the 'call-with-new-thread' binding is no longer + ;; available in the default name space on Guile 3.0. + (and (string-contains content "(call-with-new-thread") + (not (string-contains content "(ice-9 threads)")))) + (define (guile-2.2.4) (module-ref (resolve-interface '(gnu packages guile)) 'guile-2.2.4)) +(define (guile-2.2) + (module-ref (resolve-interface '(gnu packages guile)) + 'guile-2.2)) + (define %quirks ;; List of predicate/package pairs. This allows us provide information ;; about specific Guile versions that old Guix revisions might need to use ;; just to be able to build and run the trampoline in %SELF-BUILD-FILE. See ;; <https://bugs.gnu.org/37506> - `((,syscalls-reexports-local-variables? . ,guile-2.2.4))) + `((,syscalls-reexports-local-variables? . ,guile-2.2.4) + (,missing-ice-9-threads-import? . ,guile-2.2))) (define* (guile-for-source source #:optional (quirks %quirks)) "Return the Guile package to use when building SOURCE or #f if the default @@ -372,32 +390,32 @@ package modules under SOURCE using CORE, an instance of Guix." (string-append source "/" %self-build-file)) (if (file-exists? script) - (let ((build (save-module-excursion - (lambda () - ;; Disable deprecation warnings; it's OK for SCRIPT to - ;; use deprecated APIs and the user doesn't have to know - ;; about it. - (parameterize ((guix-warning-port - (%make-void-port "w"))) - (primitive-load script))))) - (guile (guile-for-source source))) + (mlet* %store-monad ((guile -> (guile-for-source source)) + (_ (mwhen guile + (set-guile-for-build (pk 'G guile)))) + (build -> (save-module-excursion + (lambda () + ;; Disable deprecation warnings; it's + ;; OK for SCRIPT to use deprecated + ;; APIs and the user doesn't have to + ;; know about it. + (parameterize ((guix-warning-port + (%make-void-port "w"))) + (primitive-load script)))))) ;; BUILD must be a monadic procedure of at least one argument: the ;; source tree. ;; ;; Note: BUILD can return #f if it does not support %PULL-VERSION. In ;; the future we'll fall back to a previous version of the protocol ;; when that happens. - (mbegin %store-monad - (mwhen guile - (set-guile-for-build guile)) - ;; BUILD is usually quite costly. Install a "trivial" build handler - ;; so we don't bounce an outer build-accumulator handler that could - ;; cause us to redo half of the BUILD computation several times just - ;; to realize it gives the same result. - (with-trivial-build-handler - (build source #:verbose? verbose? #:version commit - #:pull-version %pull-version)))) + ;; BUILD is usually quite costly. Install a "trivial" build handler + ;; so we don't bounce an outer build-accumulator handler that could + ;; cause us to redo half of the BUILD computation several times just + ;; to realize it gives the same result. + (with-trivial-build-handler + (build source #:verbose? verbose? #:version commit + #:pull-version %pull-version))) ;; Build a set of modules that extend Guix using the standard method. (standard-module-derivation name source core dependencies)))
bug-guix <at> gnu.org
:bug#41028
; Package guix
.
(Wed, 06 May 2020 21:43:02 GMT) Full text and rfc822 format available.Message #13 received at 41028 <at> debbugs.gnu.org (full text, mbox):
From: Ludovic Courtès <ludo <at> gnu.org> To: Christopher Baines <mail <at> cbaines.net>, Marius Bakke <mbakke <at> fastmail.com> Cc: 41028 <at> debbugs.gnu.org Subject: Re: bug#41028: Channel/inferior error with core-updates: Unbound variable: call-with-new-thread Date: Wed, 06 May 2020 23:42:02 +0200
[Message part 1 (text/plain, inline)]
Comrades, Christopher Baines <mail <at> cbaines.net> skribis: > (use-modules (guix channels) > (guix inferior)) > > (define channels > (list (channel > (name 'guix) > (url "https://git.savannah.gnu.org/git/guix.git") > (commit > "e02c2f85b36ce1c733bd908a210ce1182bdd2560")))) > > (define inferior > (inferior-for-channels channels)) > > (first (lookup-inferior-packages inferior "linux-libre" "5.2.21")) > > > If you save that as a file then attempt to build it: > > > → guix build -f test.scm > Updating channel 'guix' from Git repository at 'https://git.savannah.gnu.org/git/guix.git'... > Backtrace: > 4 (primitive-load "/gnu/store/8mv5bpjgxg9c369xnbb5rf1kv9r?") > In ice-9/eval.scm: > 619:8 3 (_ #(#(#(#(#(#(#(#(#(#(#(?) ?) ?) ?) ?) ?) ?) ?) ?) ?) ?)) > 182:19 2 (proc #(#(#(#(#(#(#(#(#(#(# ?) ?) ?) ?) ?) ?) ?) ?) ?) ?)) > 142:16 1 (compile-top-call #<directory (guile-user) 7f1e0abc1f00> ?) > In unknown file: > 0 (%resolve-variable (7 . call-with-new-thread) #<directo?>) > > ERROR: In procedure %resolve-variable: > Unbound variable: call-with-new-thread The attached patches add a mechanism to patch the Guix source tree, and then use that mechanism to add the missing (ice-9 threads) import. With this I can do: ./pre-inst-env guix time-machine \ --commit=e02c2f85b36ce1c733bd908a210ce1182bdd2560 -- build linux-libre … which is a simple way to do what the manifest above was about. If we think a bit long-term, I think the %quirks and %patches mechanisms are a necessary evil. The goal is for ‘build-self.scm’ to use as little of the Guix API, as well as Guile APIs that are presumably here to stay. But as we’re already seeing, there are unavoidably incompatibilities that arise here and there. The good news is that we know today how to modify yesterday’s code to work well, or which Guile version to use to get it to run. Thoughts? Thanks, Ludo’.
[0001-channels-Add-latest-channel-instance.patch (text/x-patch, inline)]
From 4ec2c3b5527b2189b3f767a980f80dee3c6717ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo <at> gnu.org> Date: Wed, 6 May 2020 22:18:52 +0200 Subject: [PATCH 1/3] channels: Add 'latest-channel-instance'. * guix/channels.scm (latest-channel-instance): New procedure. (latest-channel-instances): Use it. --- guix/channels.scm | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/guix/channels.scm b/guix/channels.scm index 041fae2a9c..4ffc366d6a 100644 --- a/guix/channels.scm +++ b/guix/channels.scm @@ -199,6 +199,14 @@ description file or its default value." channel INSTANCE." (channel-metadata-dependencies (channel-instance-metadata instance))) +(define (latest-channel-instance store channel) + "Return the latest channel instance for CHANNEL." + (let-values (((checkout commit) + (latest-repository-commit store (channel-url channel) + #:ref (channel-reference + channel)))) + (channel-instance channel commit checkout))) + (define* (latest-channel-instances store channels #:optional (previous-channels '())) "Return a list of channel instances corresponding to the latest checkouts of CHANNELS and the channels on which they depend. PREVIOUS-CHANNELS is a list @@ -224,20 +232,16 @@ of previously processed channels." (G_ "Updating channel '~a' from Git repository at '~a'...~%") (channel-name channel) (channel-url channel)) - (let-values (((checkout commit) - (latest-repository-commit store (channel-url channel) - #:ref (channel-reference - channel)))) - (let ((instance (channel-instance channel commit checkout))) - (let-values (((new-instances new-channels) - (latest-channel-instances - store - (channel-instance-dependencies instance) - previous-channels))) - (values (append (cons channel new-channels) - previous-channels) - (append (cons instance new-instances) - instances)))))))) + (let ((instance (latest-channel-instance store channel))) + (let-values (((new-instances new-channels) + (latest-channel-instances + store + (channel-instance-dependencies instance) + previous-channels))) + (values (append (cons channel new-channels) + previous-channels) + (append (cons instance new-instances) + instances))))))) previous-channels '() ;instances channels)) -- 2.26.2
[0002-channels-Add-mechanism-to-patch-checkouts-of-the-gui.patch (text/x-patch, inline)]
From 18f2efd43b824f87b3d3a5dbcba9e8c363798f5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo <at> gnu.org> Date: Wed, 6 May 2020 22:45:31 +0200 Subject: [PATCH 2/3] channels: Add mechanism to patch checkouts of the 'guix channel. * guix/channels.scm (<patch>): New record type. (apply-patches): New procedure. (latest-channel-instance)[dot-git?]: New procedure. Use 'update-cached-checkout' and 'add-to-store' instead of 'latest-repository-commit'. Call 'apply-patches' when CHANNEL is the 'guix channel. (%patches): New variable. * guix/git.scm (url+commit->name): Make public. * tests/channels.scm ("latest-channel-instances includes channel dependencies") ("latest-channel-instances excludes duplicate channel dependencies"): Mock 'update-cached-checkout' instead of 'latest-repository-commit'. Wrap body in 'with-store' and pass the store to 'latest-channel-instances'. --- guix/channels.scm | 50 +++++++++++++++++++++++++++++++----- guix/git.scm | 1 + tests/channels.scm | 64 ++++++++++++++++++++++++---------------------- 3 files changed, 79 insertions(+), 36 deletions(-) diff --git a/guix/channels.scm b/guix/channels.scm index 4ffc366d6a..75b53c3a8e 100644 --- a/guix/channels.scm +++ b/guix/channels.scm @@ -199,13 +199,45 @@ description file or its default value." channel INSTANCE." (channel-metadata-dependencies (channel-instance-metadata instance))) -(define (latest-channel-instance store channel) +;; Patch to apply to a source tree. +(define-record-type <patch> + (patch predicate application) + patch? + (predicate patch-predicate) ;procedure + (application patch-application)) ;procedure + +(define (apply-patches checkout commit patches) + "Apply the matching PATCHES to CHECKOUT, modifying files in place. The +result is unspecified." + (let loop ((patches patches)) + (match patches + (() #t) + ((($ <patch> predicate modify) rest ...) + ;; PREDICATE is passed COMMIT so that it can choose to only apply to + ;; ancestors. + (when (predicate checkout commit) + (modify checkout)) + (loop rest))))) + +(define* (latest-channel-instance store channel + #:key (patches %patches)) "Return the latest channel instance for CHANNEL." + (define (dot-git? file stat) + (and (string=? (basename file) ".git") + (eq? 'directory (stat:type stat)))) + (let-values (((checkout commit) - (latest-repository-commit store (channel-url channel) - #:ref (channel-reference - channel)))) - (channel-instance channel commit checkout))) + (update-cached-checkout (channel-url channel) + #:ref (channel-reference channel)))) + (when (guix-channel? channel) + ;; Apply the relevant subset of PATCHES directly in CHECKOUT. This is + ;; safe to do because 'switch-to-ref' eventually does a hard reset. + (apply-patches checkout commit patches)) + + (let* ((name (url+commit->name (channel-url channel) commit)) + (checkout (add-to-store store name #t "sha256" checkout + #:select? (negate dot-git?)))) + (channel-instance channel commit checkout)))) (define* (latest-channel-instances store channels #:optional (previous-channels '())) "Return a list of channel instances corresponding to the latest checkouts of @@ -337,12 +369,18 @@ to '%package-module-path'." 'guile-2.2.4)) (define %quirks - ;; List of predicate/package pairs. This allows us provide information + ;; List of predicate/package pairs. This allows us to provide information ;; about specific Guile versions that old Guix revisions might need to use ;; just to be able to build and run the trampoline in %SELF-BUILD-FILE. See ;; <https://bugs.gnu.org/37506> `((,syscalls-reexports-local-variables? . ,guile-2.2.4))) +(define %patches + ;; Bits of past Guix revisions can become incompatible with newer Guix and + ;; Guile. This variable lists <patch> records for the Guix source tree that + ;; apply to the Guix source. + '()) + (define* (guile-for-source source #:optional (quirks %quirks)) "Return the Guile package to use when building SOURCE or #f if the default '%guile-for-build' should be good enough." diff --git a/guix/git.scm b/guix/git.scm index 5fffd429bd..92121156cf 100644 --- a/guix/git.scm +++ b/guix/git.scm @@ -40,6 +40,7 @@ with-repository update-cached-checkout + url+commit->name latest-repository-commit commit-difference diff --git a/tests/channels.scm b/tests/channels.scm index f5a7955483..910088ba15 100644 --- a/tests/channels.scm +++ b/tests/channels.scm @@ -135,44 +135,48 @@ (name 'test) (url "test"))) (test-dir (channel-instance-checkout instance--simple))) - (mock ((guix git) latest-repository-commit - (lambda* (store url #:key ref) + (mock ((guix git) update-cached-checkout + (lambda* (url #:key ref) (match url - ("test" (values test-dir 'whatever)) - (_ (values "/not-important" 'not-important))))) - (let ((instances (latest-channel-instances #f (list channel)))) - (and (eq? 2 (length instances)) - (lset= eq? - '(test test-channel) - (map (compose channel-name channel-instance-channel) - instances))))))) + ("test" (values test-dir "caf3cabba9e")) + (_ (values (channel-instance-checkout instance--no-deps) + "abcde1234"))))) + (with-store store + (let ((instances (latest-channel-instances store (list channel)))) + (and (eq? 2 (length instances)) + (lset= eq? + '(test test-channel) + (map (compose channel-name channel-instance-channel) + instances)))))))) (test-assert "latest-channel-instances excludes duplicate channel dependencies" (let* ((channel (channel (name 'test) (url "test"))) (test-dir (channel-instance-checkout instance--with-dupes))) - (mock ((guix git) latest-repository-commit - (lambda* (store url #:key ref) + (mock ((guix git) update-cached-checkout + (lambda* (url #:key ref) (match url - ("test" (values test-dir 'whatever)) - (_ (values "/not-important" 'not-important))))) - (let ((instances (latest-channel-instances #f (list channel)))) - (and (= 2 (length instances)) - (lset= eq? - '(test test-channel) - (map (compose channel-name channel-instance-channel) - instances)) - ;; only the most specific channel dependency should remain, - ;; i.e. the one with a specified commit. - (find (lambda (instance) - (and (eq? (channel-name - (channel-instance-channel instance)) - 'test-channel) - (string=? (channel-commit - (channel-instance-channel instance)) - "abc1234"))) - instances)))))) + ("test" (values test-dir "caf3cabba9e")) + (_ (values (channel-instance-checkout instance--no-deps) + "abcde1234"))))) + (with-store store + (let ((instances (latest-channel-instances store (list channel)))) + (and (= 2 (length instances)) + (lset= eq? + '(test test-channel) + (map (compose channel-name channel-instance-channel) + instances)) + ;; only the most specific channel dependency should remain, + ;; i.e. the one with a specified commit. + (find (lambda (instance) + (and (eq? (channel-name + (channel-instance-channel instance)) + 'test-channel) + (string=? (channel-commit + (channel-instance-channel instance)) + "abc1234"))) + instances))))))) (test-assert "channel-instances->manifest" ;; Compute the manifest for a graph of instances and make sure we get a -- 2.26.2
[0003-channels-Add-patch-for-https-bugs.gnu.org-41028.patch (text/x-patch, inline)]
From 66e2ef6ae0958fa45e14c3528c767cd84e24a480 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= <ludo <at> gnu.org> Date: Wed, 6 May 2020 23:17:47 +0200 Subject: [PATCH 3/3] channels: Add patch for <https://bugs.gnu.org/41028>. Without this patch, we couldn't jump from here to commits before 05e783871c2c69b402e088863d46f5be7915ac74 because the 'compute-guix-derivation' script would crash with an unbound-variable error for 'call-with-new-thread'. Fixes <https://bugs.gnu.org/41028>. Reported by Christopher Baines <mail <at> cbaines.net>. * guix/channels.scm (%bug-41028-patch): New variable. (%patches): Add it. --- guix/channels.scm | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/guix/channels.scm b/guix/channels.scm index 75b53c3a8e..0fa036446c 100644 --- a/guix/channels.scm +++ b/guix/channels.scm @@ -38,6 +38,7 @@ #:select (source-properties->location &error-location &fix-hint)) + #:use-module ((guix build utils) #:select (substitute*)) #:use-module (srfi srfi-1) #:use-module (srfi srfi-2) #:use-module (srfi srfi-9) @@ -375,11 +376,35 @@ to '%package-module-path'." ;; <https://bugs.gnu.org/37506> `((,syscalls-reexports-local-variables? . ,guile-2.2.4))) + +(define %bug-41028-patch + ;; Patch for <https://bugs.gnu.org/41028>. The faulty code is the + ;; 'compute-guix-derivation' body, which uses 'call-with-new-thread' without + ;; importing (ice-9 threads). However, the 'call-with-new-thread' binding + ;; is no longer available in the default name space on Guile 3.0. + (let () + (define (missing-ice-9-threads-import? source commit) + ;; Return true if %SELF-BUILD-FILE is missing an (ice-9 threads) import. + (define content + (call-with-input-file (string-append source "/" %self-build-file) + read-string)) + + (and (string-contains content "(call-with-new-thread") + (not (string-contains content "(ice-9 threads)")))) + + (define (add-missing-ice-9-threads-import source) + ;; Add (ice-9 threads) import in the gexp of 'compute-guix-derivation'. + (substitute* (string-append source "/" %self-build-file) + (("^ +\\(use-modules \\(ice-9 match\\)\\)") + (object->string '(use-modules (ice-9 match) (ice-9 threads)))))) + + (patch missing-ice-9-threads-import? add-missing-ice-9-threads-import))) + (define %patches ;; Bits of past Guix revisions can become incompatible with newer Guix and ;; Guile. This variable lists <patch> records for the Guix source tree that ;; apply to the Guix source. - '()) + (list %bug-41028-patch)) (define* (guile-for-source source #:optional (quirks %quirks)) "Return the Guile package to use when building SOURCE or #f if the default -- 2.26.2
Ludovic Courtès <ludo <at> gnu.org>
to control <at> debbugs.gnu.org
.
(Wed, 06 May 2020 21:44:02 GMT) Full text and rfc822 format available.Ludovic Courtès <ludo <at> gnu.org>
:Christopher Baines <mail <at> cbaines.net>
:Message #20 received at 41028-done <at> debbugs.gnu.org (full text, mbox):
From: Ludovic Courtès <ludo <at> gnu.org> To: Christopher Baines <mail <at> cbaines.net> Cc: Marius Bakke <mbakke <at> fastmail.com>, 41028-done <at> debbugs.gnu.org Subject: Re: bug#41028: Channel/inferior error with core-updates: Unbound variable: call-with-new-thread Date: Thu, 07 May 2020 10:12:02 +0200
Hey! Ludovic Courtès <ludo <at> gnu.org> skribis: > The attached patches add a mechanism to patch the Guix source tree, and > then use that mechanism to add the missing (ice-9 threads) import. With > this I can do: > > ./pre-inst-env guix time-machine \ > --commit=e02c2f85b36ce1c733bd908a210ce1182bdd2560 -- build linux-libre > > … which is a simple way to do what the manifest above was about. Given the enthusiasm expressed on IRC, I went ahead and pushed. :-) ff3ca7979e channels: Add patch for <https://bugs.gnu.org/41028>. 053b10c3ef channels: Add mechanism to patch checkouts of the 'guix channel. 4ba425060a channels: Add 'latest-channel-instance'. So… it might be that today is merge day? Ludo’.
bug-guix <at> gnu.org
:bug#41028
; Package guix
.
(Thu, 07 May 2020 10:06:02 GMT) Full text and rfc822 format available.Message #23 received at 41028 <at> debbugs.gnu.org (full text, mbox):
From: zimoun <zimon.toutoune <at> gmail.com> To: 41028 <at> debbugs.gnu.org, Ludovic Courtès <ludo <at> gnu.org>, Christopher Baines <mail <at> cbaines.net> Cc: 41028-done <at> debbugs.gnu.org Subject: Re: bug#41028: Channel/inferior error with core-updates: Unbound variable: call-with-new-thread Date: Thu, 7 May 2020 12:05:03 +0200
Hi Ludo, On Thu, 7 May 2020 at 10:13, Ludovic Courtès <ludo <at> gnu.org> wrote: > Given the enthusiasm expressed on IRC, I went ahead and pushed. :-) > > ff3ca7979e channels: Add patch for <https://bugs.gnu.org/41028>. > 053b10c3ef channels: Add mechanism to patch checkouts of the 'guix channel. > 4ba425060a channels: Add 'latest-channel-instance'. Just to be sure to well-understand: the versions before 05e783 were broken (guix build failed) and the proposed in-place mechanism is a way to fix them, right? If yes, that's awesome! Cheers, simon
bug-guix <at> gnu.org
:bug#41028
; Package guix
.
(Thu, 07 May 2020 10:06:02 GMT) Full text and rfc822 format available.bug-guix <at> gnu.org
:bug#41028
; Package guix
.
(Fri, 08 May 2020 09:38:01 GMT) Full text and rfc822 format available.Message #29 received at 41028-done <at> debbugs.gnu.org (full text, mbox):
From: Christopher Baines <mail <at> cbaines.net> To: Ludovic Courtès <ludo <at> gnu.org> Cc: Marius Bakke <mbakke <at> fastmail.com>, 41028-done <at> debbugs.gnu.org Subject: Re: bug#41028: Channel/inferior error with core-updates: Unbound variable: call-with-new-thread Date: Fri, 08 May 2020 10:37:45 +0100
[Message part 1 (text/plain, inline)]
Ludovic Courtès <ludo <at> gnu.org> writes: > Ludovic Courtès <ludo <at> gnu.org> skribis: > >> The attached patches add a mechanism to patch the Guix source tree, and >> then use that mechanism to add the missing (ice-9 threads) import. With >> this I can do: >> >> ./pre-inst-env guix time-machine \ >> --commit=e02c2f85b36ce1c733bd908a210ce1182bdd2560 -- build linux-libre >> >> … which is a simple way to do what the manifest above was about. > > Given the enthusiasm expressed on IRC, I went ahead and pushed. :-) > > ff3ca7979e channels: Add patch for <https://bugs.gnu.org/41028>. > 053b10c3ef channels: Add mechanism to patch checkouts of the 'guix channel. > 4ba425060a channels: Add 'latest-channel-instance'. > > So… it might be that today is merge day? Wonderful :) I've had a chance to try this out now, and it works. I was able to reconfigure my system. One even more niche issue is that because I'm using this channel in my system configuration, the patching happens as root, but it's the cached channel in my users home directory that's patched. This means that build-self.scm becomes owned by root. I noticed this when I went to pull: → guix pull --branch=core-updates Updating channel 'guix' from Git repository at 'https://git.savannah.gnu.org/git/guix.git'... guix pull: error: Git error: could not open '/home/chris/.cache/guix/checkouts/pjmkglp4t7znuugeurpurzikxq3tnlaywmisyr27shj7apsnalwq/build-aux/build-self.scm' for writing: Permission denied I'm not sure what the neat way of addressing this is, but maybe the file ownership can be recorded prior to patching, and reset afterwards if it's changed. Thanks again for looking at the original issue Ludo, Chris
[signature.asc (application/pgp-signature, inline)]
bug-guix <at> gnu.org
:bug#41028
; Package guix
.
(Fri, 08 May 2020 14:36:01 GMT) Full text and rfc822 format available.Message #32 received at 41028-done <at> debbugs.gnu.org (full text, mbox):
From: Marius Bakke <mbakke <at> fastmail.com> To: Christopher Baines <mail <at> cbaines.net>, Ludovic Courtès <ludo <at> gnu.org> Cc: 41028-done <at> debbugs.gnu.org Subject: Re: bug#41028: Channel/inferior error with core-updates: Unbound variable: call-with-new-thread Date: Fri, 08 May 2020 16:35:16 +0200
[Message part 1 (text/plain, inline)]
Christopher Baines <mail <at> cbaines.net> writes: > Ludovic Courtès <ludo <at> gnu.org> writes: > >> Ludovic Courtès <ludo <at> gnu.org> skribis: >> >>> The attached patches add a mechanism to patch the Guix source tree, and >>> then use that mechanism to add the missing (ice-9 threads) import. With >>> this I can do: >>> >>> ./pre-inst-env guix time-machine \ >>> --commit=e02c2f85b36ce1c733bd908a210ce1182bdd2560 -- build linux-libre >>> >>> … which is a simple way to do what the manifest above was about. >> >> Given the enthusiasm expressed on IRC, I went ahead and pushed. :-) >> >> ff3ca7979e channels: Add patch for <https://bugs.gnu.org/41028>. >> 053b10c3ef channels: Add mechanism to patch checkouts of the 'guix channel. >> 4ba425060a channels: Add 'latest-channel-instance'. >> >> So… it might be that today is merge day? > > Wonderful :) I've had a chance to try this out now, and it works. I was > able to reconfigure my system. > > One even more niche issue is that because I'm using this channel in my > system configuration, the patching happens as root, but it's the cached > channel in my users home directory that's patched. This means that > build-self.scm becomes owned by root. > > I noticed this when I went to pull: > > → guix pull --branch=core-updates > Updating channel 'guix' from Git repository at 'https://git.savannah.gnu.org/git/guix.git'... > guix pull: error: Git error: could not open '/home/chris/.cache/guix/checkouts/pjmkglp4t7znuugeurpurzikxq3tnlaywmisyr27shj7apsnalwq/build-aux/build-self.scm' for writing: Permission denied > > > I'm not sure what the neat way of addressing this is, but maybe the file > ownership can be recorded prior to patching, and reset afterwards if > it's changed. I took a stab at exactly this:
[0001-channels-Preserve-permissions-when-patching-https-bu.patch (text/x-patch, inline)]
From 993dd0d36ba8e67af5c60d73cb1f9d60741f5418 Mon Sep 17 00:00:00 2001 From: Marius Bakke <mbakke <at> fastmail.com> Date: Fri, 8 May 2020 16:23:55 +0200 Subject: [PATCH] channels: Preserve permissions when patching <https://bugs.gnu.org/41028>. * guix/channels.scm (%bug-41028-patch): Record permissions before invoking SUBSTITUTE* and reset afterwards if file permissions differ from the current user. --- guix/channels.scm | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/guix/channels.scm b/guix/channels.scm index 0fa036446c..a102d5bc35 100644 --- a/guix/channels.scm +++ b/guix/channels.scm @@ -393,10 +393,21 @@ to '%package-module-path'." (not (string-contains content "(ice-9 threads)")))) (define (add-missing-ice-9-threads-import source) - ;; Add (ice-9 threads) import in the gexp of 'compute-guix-derivation'. - (substitute* (string-append source "/" %self-build-file) - (("^ +\\(use-modules \\(ice-9 match\\)\\)") - (object->string '(use-modules (ice-9 match) (ice-9 threads)))))) + (let* ((self-build-file (string-append source "/" %self-build-file)) + ;; Record permissions so that we can reset it afterwards in case + ;; we run this as the root user (see <https://bugs.gnu.org/41028#29>). + ;; TODO: Ideally SUBSTITUTE* would preserve permissions itself. + (stat (stat self-build-file)) + (owner (stat:uid stat)) + (group (stat:gid stat))) + + ;; Add (ice-9 threads) import in the gexp of 'compute-guix-derivation'. + (substitute* self-build-file + (("^ +\\(use-modules \\(ice-9 match\\)\\)") + (object->string '(use-modules (ice-9 match) (ice-9 threads))))) + + (unless (and (eq? (getuid) owner) (eq? (getgid) group)) + (chown self-build-file owner group)))) (patch missing-ice-9-threads-import? add-missing-ice-9-threads-import))) -- 2.26.2
[Message part 3 (text/plain, inline)]
WDYT? Currently in the process of testing it locally, feedback appreciated.
[signature.asc (application/pgp-signature, inline)]
bug-guix <at> gnu.org
:bug#41028
; Package guix
.
(Fri, 08 May 2020 14:48:01 GMT) Full text and rfc822 format available.Message #35 received at 41028-done <at> debbugs.gnu.org (full text, mbox):
From: Christopher Baines <mail <at> cbaines.net> To: Marius Bakke <mbakke <at> fastmail.com> Cc: Ludovic Courtès <ludo <at> gnu.org>, 41028-done <at> debbugs.gnu.org Subject: Re: bug#41028: Channel/inferior error with core-updates: Unbound variable: call-with-new-thread Date: Fri, 08 May 2020 15:47:10 +0100
[Message part 1 (text/plain, inline)]
Marius Bakke <mbakke <at> fastmail.com> writes: > Christopher Baines <mail <at> cbaines.net> writes: > >> Ludovic Courtès <ludo <at> gnu.org> writes: >> >>> Ludovic Courtès <ludo <at> gnu.org> skribis: >>> >>>> The attached patches add a mechanism to patch the Guix source tree, and >>>> then use that mechanism to add the missing (ice-9 threads) import. With >>>> this I can do: >>>> >>>> ./pre-inst-env guix time-machine \ >>>> --commit=e02c2f85b36ce1c733bd908a210ce1182bdd2560 -- build linux-libre >>>> >>>> … which is a simple way to do what the manifest above was about. >>> >>> Given the enthusiasm expressed on IRC, I went ahead and pushed. :-) >>> >>> ff3ca7979e channels: Add patch for <https://bugs.gnu.org/41028>. >>> 053b10c3ef channels: Add mechanism to patch checkouts of the 'guix channel. >>> 4ba425060a channels: Add 'latest-channel-instance'. >>> >>> So… it might be that today is merge day? >> >> Wonderful :) I've had a chance to try this out now, and it works. I was >> able to reconfigure my system. >> >> One even more niche issue is that because I'm using this channel in my >> system configuration, the patching happens as root, but it's the cached >> channel in my users home directory that's patched. This means that >> build-self.scm becomes owned by root. >> >> I noticed this when I went to pull: >> >> → guix pull --branch=core-updates >> Updating channel 'guix' from Git repository at 'https://git.savannah.gnu.org/git/guix.git'... >> guix pull: error: Git error: could not open '/home/chris/.cache/guix/checkouts/pjmkglp4t7znuugeurpurzikxq3tnlaywmisyr27shj7apsnalwq/build-aux/build-self.scm' for writing: Permission denied >> >> >> I'm not sure what the neat way of addressing this is, but maybe the file >> ownership can be recorded prior to patching, and reset afterwards if >> it's changed. > > I took a stab at exactly this: Awesome, thanks. I haven't tried it, but it looks good :)
[signature.asc (application/pgp-signature, inline)]
bug-guix <at> gnu.org
:bug#41028
; Package guix
.
(Fri, 08 May 2020 18:20:02 GMT) Full text and rfc822 format available.Message #38 received at 41028-done <at> debbugs.gnu.org (full text, mbox):
From: Marius Bakke <mbakke <at> fastmail.com> To: Christopher Baines <mail <at> cbaines.net>, Ludovic Courtès <ludo <at> gnu.org> Cc: 41028-done <at> debbugs.gnu.org Subject: Re: bug#41028: Channel/inferior error with core-updates: Unbound variable: call-with-new-thread Date: Fri, 08 May 2020 20:19:03 +0200
[Message part 1 (text/plain, inline)]
Marius Bakke <mbakke <at> fastmail.com> writes: > Christopher Baines <mail <at> cbaines.net> writes: > >> One even more niche issue is that because I'm using this channel in my >> system configuration, the patching happens as root, but it's the cached >> channel in my users home directory that's patched. This means that >> build-self.scm becomes owned by root. >> >> I noticed this when I went to pull: >> >> → guix pull --branch=core-updates >> Updating channel 'guix' from Git repository at 'https://git.savannah.gnu.org/git/guix.git'... >> guix pull: error: Git error: could not open '/home/chris/.cache/guix/checkouts/pjmkglp4t7znuugeurpurzikxq3tnlaywmisyr27shj7apsnalwq/build-aux/build-self.scm' for writing: Permission denied >> >> >> I'm not sure what the neat way of addressing this is, but maybe the file >> ownership can be recorded prior to patching, and reset afterwards if >> it's changed. > > I took a stab at exactly this: > > From 993dd0d36ba8e67af5c60d73cb1f9d60741f5418 Mon Sep 17 00:00:00 2001 > From: Marius Bakke <mbakke <at> fastmail.com> > Date: Fri, 8 May 2020 16:23:55 +0200 > Subject: [PATCH] channels: Preserve permissions when patching > <https://bugs.gnu.org/41028>. > > * guix/channels.scm (%bug-41028-patch): Record permissions before invoking > SUBSTITUTE* and reset afterwards if file permissions differ from the current user. > --- > guix/channels.scm | 19 +++++++++++++++---- > 1 file changed, 15 insertions(+), 4 deletions(-) > > diff --git a/guix/channels.scm b/guix/channels.scm > index 0fa036446c..a102d5bc35 100644 > --- a/guix/channels.scm > +++ b/guix/channels.scm > @@ -393,10 +393,21 @@ to '%package-module-path'." > (not (string-contains content "(ice-9 threads)")))) > > (define (add-missing-ice-9-threads-import source) > - ;; Add (ice-9 threads) import in the gexp of 'compute-guix-derivation'. > - (substitute* (string-append source "/" %self-build-file) > - (("^ +\\(use-modules \\(ice-9 match\\)\\)") > - (object->string '(use-modules (ice-9 match) (ice-9 threads)))))) > + (let* ((self-build-file (string-append source "/" %self-build-file)) > + ;; Record permissions so that we can reset it afterwards in case > + ;; we run this as the root user (see <https://bugs.gnu.org/41028#29>). > + ;; TODO: Ideally SUBSTITUTE* would preserve permissions itself. > + (stat (stat self-build-file)) > + (owner (stat:uid stat)) > + (group (stat:gid stat))) > + > + ;; Add (ice-9 threads) import in the gexp of 'compute-guix-derivation'. > + (substitute* self-build-file > + (("^ +\\(use-modules \\(ice-9 match\\)\\)") > + (object->string '(use-modules (ice-9 match) (ice-9 threads))))) > + > + (unless (and (eq? (getuid) owner) (eq? (getgid) group)) > + (chown self-build-file owner group)))) > > (patch missing-ice-9-threads-import? add-missing-ice-9-threads-import))) Ludovic pointed out on IRC that 'sudo guix system build foo.scm' with an inferior will update the cached checkout (typically ~/.cache/guix/checkouts/pjmkglp4t7znuugeurpurzikxq3tnlaywmisyr27shj7apsnalwq) as root, and break subsequent unprivileged 'guix pull' operations anyway. Which is partially correct: .git/index and .git/refs/heads/master will be owned by root in that case, but you are still allowed to unlink() and rename() such files as long as you own the directory, so libgit2 will successfully reset permissions on the checkout even after pulling as root! It fails to do that for build-self.scm because it does not know it has changed, and tries opening it directly with O_WRONLY (which fails). I can confirm that this patch solves that problem, and unprivileged 'guix pull' works again even after previously using sudo. Now, users are likely to run into other issues when using inferiors with sudo (e.g. if new directories are added), so I'm not sure if this patch is worth the effort. Perhaps the Guix git cache should be per-uid, but that requires more intrusive changes. Thoughts?
[signature.asc (application/pgp-signature, inline)]
Debbugs Internal Request <help-debbugs <at> gnu.org>
to internal_control <at> debbugs.gnu.org
.
(Sat, 06 Jun 2020 11:24:05 GMT) Full text and rfc822 format available.
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.