aboutsummaryrefslogtreecommitdiff
path: root/guix/inferior.scm
Commit message (Collapse)AuthorAge
* time-machine: Make target commit check cheaper.Ludovic Courtès2023-11-05
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Commit 79ec651a286c71a3d4c72be33a1f80e76a560031 introduced a check to error out when attempting to use ‘time-machine’ to travel to a commit before ‘v1.0.0’. This commit fixes a performance issue with the strategy used in 79ec651a286c71a3d4c72be33a1f80e76a560031 (the repository was opened, updated, and traversed a second time by ‘validate-guix-channel’) as well as a user interface issue (“Updating channel” messages would be printed too late). This patch reimplements the check in terms of the existing #:validate-pull mechanism, which is designed to avoid extra repository operations. Fixes <https://issues.guix.gnu.org/65788>. * guix/inferior.scm (cached-channel-instance): Change default value of #:validate-channels. Remove call to VALIDATE-CHANNELS; pass it as #:validate-pull to ‘latest-channel-instances’. * guix/scripts/time-machine.scm (%reference-channels): New variable. (validate-guix-channel): New procedure, written as a simplification of… (guix-time-machine)[validate-guix-channel]: … this. Remove. Pass #:reference-channels to ‘cached-channel-instance’. Reported-by: Simon Tournier <zimon.toutoune@gmail.com> Change-Id: I9b0ec61fba7354fe08b04a91f4bd32b72a35460c
* scripts: time-machine: Error when attempting to visit too old commits.Maxim Cournoyer2023-08-16
| | | | | | | | | | | | | | | | | * doc/guix.texi (Invoking guix time-machine): Document limitation. * guix/inferior.scm (cached-channel-instance): New VALIDATE-CHANNELS argument. Use it to validate channels when there are no cache hit. * guix/scripts/time-machine.scm (%options): Tag the given reference with 'tag-or-commit instead of 'commit. (%oldest-possible-commit): New variable. (guix-time-machine) <validate-guix-channel>: New nested procedure. Pass it to the 'cached-channel-instance' call. * tests/guix-time-machine.sh: New test. * Makefile.am (SH_TESTS): Register it. Suggested-by: Simon Tournier <zimon.toutoune@gmail.com> Reviewed-by: Ludovic Courtès <ludo@gnu.org> Reviewed-by: Simon Tournier <zimon.toutoune@gmail.com>
* inferior: Use 'spawn' on Guile 3.0.9+.Ludovic Courtès2023-01-26
| | | | | * guix/inferior.scm (open-bidirectional-pipe): When 'spawn' is defined, use it instead of 'primitive-fork'.
* inferior: Raise '&inferior-protocol-error' on invalid response.Ludovic Courtès2022-11-22
| | | | | * guix/inferior.scm (&inferior-protocol-error): New condition type. (read-repl-response): Add default 'match' clause and raise it.
* channels: Interpret the 'commit' field of channel as a tag or commit.Ludovic Courtès2022-10-17
| | | | | | | | | | | | Previously the 'commit' field would always be interpreted as a commit ID. This change adds flexibility, allowing for things like: guix time-machine --commit=v1.2.0 -- describe * guix/channels.scm (channel-reference): Use 'tag-or-commit' rather than 'commit'. * guix/inferior.scm (channel-full-commit): Likewise. * doc/guix.texi (Invoking guix pull): Document it. (Invoking guix time-machine): Likewise.
* git: Factorize 'commit-id?' predicate.Ludovic Courtès2022-10-11
| | | | | | * guix/git.scm (commit-id?): New procedure, copied from (guix swh). (resolve-reference): Use it instead of inline code. * guix/inferior.scm (channel-full-commit): Likewise.
* guix: inferior: Fix the behaviour of open-inferior #:error-port.Christopher Baines2022-07-08
| | | | | | | | | | | I'm looking at this as the Guix Data Service uses this behaviour to record and display logs from inferior processes. * guix/inferior.scm (open-bidirectional-pipe): Call dup2 for file descriptor 2, passing either the file number for the current error port, or a file descriptor for /dev/null. * tests/inferior.scm ("#:error-port stderr", "#:error-port pipe"): Add two new tests that cover some of the #:error-port behaviour.
* inferior: Close duplicate socketpair file descriptor.Ludovic Courtès2022-05-20
| | | | | | * guix/inferior.scm (open-bidirectional-pipe): Pass SOCK_CLOEXEC to 'socketpair'. * tests/inferior.scm ("close-inferior"): Add test.
* inferior: Move initialization bits away from 'inferior-eval-with-store'.Ludovic Courtès2022-01-27
| | | | | | | * guix/inferior.scm (port->inferior): In the inferior, define 'cached-store-connection', 'store-protocol-error?', and 'store-protocol-error-message'. (inferior-eval-with-store): Use them.
* inferior: Inferior caches store connections.Ludovic Courtès2022-01-27
| | | | | | | | | | | | | | | | Fixes <https://issues.guix.gnu.org/48007>. Reported by Ricardo Wurmus <rekado@elephly.net>. Previously, at each 'inferior-eval-with-store' call, the inferior would create a new <store-connection> object with empty caches. Consequently, when repeatedly calling 'inferior-package-derivation', we would not benefit from any caching and instead recompute all the derivations for every package. This patch fixes it by caching <store-connection> objects in the inferior. * guix/inferior.scm (port->inferior): Define '%store-table' in the inferior. (inferior-eval-with-store): Cache store connections in %STORE-TABLE. Remove now unneeded 'dynamic-wind' with 'close-port' call.
* inferior: Keep the store bridge connected.Ludovic Courtès2022-01-27
| | | | | | | | | | | | | | | | | | | | | Previously, each 'inferior-eval-with-store' would lead the inferior to connect to the named socket the parent is listening to. With this change, the connection is established once for all and reused afterwards. * guix/inferior.scm (<inferior>)[bridge-file-name]: Remove. (open-bidirectional-pipe): New procedure. (inferior-pipe): Use it instead of 'open-pipe*' and return two values. (port->inferior): Adjust call to 'inferior'. (open-inferior): Adjust to 'inferior-pipe' changes. (close-inferior): Remove 'inferior-bridge-file-name' handling. (open-store-bridge!): Switch back to 'call-with-temporary-directory'. Define '%bridge-socket' in the inferior, connected to the caller. (proxy): Change first argument to be an inferior. Add 'reponse-port' and call to 'drain-input'. Pass 'reponse-port' to 'select' and use it as a loop termination clause. (inferior-eval-with-store): Remove 'socket' and 'connect' calls from the inferior code, and use '%bridge-socket' instead.
* inferior: Create the store proxy listening socket only once.Ludovic Courtès2022-01-27
| | | | | | | | | | | | | | | Previously, each 'inferior-eval-with-store' call would have the calling process create a temporary directory with a listening socket in there. Now that listening socket is created once and reused in subsequent calls. * guix/inferior.scm (<inferior>)[bridge-file-name, bridge-socket]: New fields. (port->inferior): Adjust accordingly. (close-inferior): Close 'inferior-bridge-socket' and delete 'inferior-bridge-file-name' if set. (open-store-bridge!, ensure-store-bridge!): New procedures. (inferior-eval-with-store): Use them.
* inferior: 'cached-channel-instance' always returns a directory.Ludovic Courtès2022-01-17
| | | | | | | This is a followup to b1fc98d6b063a117fe2bcc19a60c8b9a48301593. * guix/inferior.scm (cached-channel-instance): When AUTHENTICATE? is false, return (derivation->output-path profile).
* inferior: Fix wrong-type-arg error when authentication is disabled.Ludovic Courtès2022-01-13
| | | | | | | | | | | Fixes <https://issues.guix.gnu.org/53230>. Reported by Andrew Tropin <andrew@trop.in>. Fixes a regression introduced in 9f371f23ebfa20f70b3bfd55dc459b683f21ba91. * guix/inferior.scm (cached-channel-instance): Add call to 'derivation->output-path' when AUTHENTICATE? is false.
* inferior: 'cached-channel-instance' does not cache unauthenticated instances.Ludovic Courtès2021-12-01
| | | | | | | | | | The comment saying that caching is fine even when AUTHENTICATE? is false was true in commit 838ac881ec98cb71d4a4e4b20773573f99ecbf25, but it became incorrect in 7cfd789150f448cf5256b88915bae4163cc9db03, which no longer calls 'latest-channel-instances' on cache hits. * guix/inferior.scm (cached-channel-instance): Do not create CACHED when AUTHENTICATE? is false.
* inferior: 'cached-channel-instance' no longer calls 'show-what-to-build'.Ludovic Courtès2021-08-09
| | | | | | | | | | | | | | This allows the user of 'cached-channel-instance' to install the build handler of its choice. In particular, it allows "guix time-machine" to install a build notifier with the right options instead of using the defaults that 'cached-channel-instance' would pass to 'show-what-to-build*'. * guix/inferior.scm (cached-channel-instance): Remove call to 'show-what-to-build*'. (inferior-for-channels): Wrap body in 'with-build-handler'. * guix/scripts/time-machine.scm (guix-time-machine): Use 'with-build-handler'.
* inferior: Support querying package replacements.Christopher Baines2021-05-15
| | | | | | | | I'm looking at this to help with adding support for looking up package replacements to store in the Guix Data Service. * guix/inferior.scm (inferior-package-replacement): New procedure. * tests/inferior.scm ("inferior-package-replacement"): New test.
* inferior: Add <inferior> printer.Ludovic Courtès2021-03-13
| | | | | | | This avoids printing the whole package table in backtraces and such. * guix/inferior.scm (write-inferior): New procedure. <top level>: Call 'set-record-type-printer!'.
* inferior: Use a safe symlink monadic procedure.Mathieu Othacehe2021-03-10
| | | | | | | This is a follow-up of 6ee7e3d26b8f5d2a234518cc2ab1bfeba7cd7c18. * guix/inferior.scm (cached-channel-instance): Introduce "symlink/safe" and use it instead of symlink. Remove the duplicated "file-exists?" call.
* Revert "inferior: Break cached-channel-instance into two procedures."Mathieu Othacehe2021-03-10
| | | | | | This reverts commit 7d63b775513e7049047222dbe403a4181f63828d because it raises some concerns, see: https://lists.gnu.org/archive/html/guix-devel/2021-03/msg00124.html.
* inferior: Fix concurrent cached-profile calls.Mathieu Othacehe2021-03-10
| | | | | * guix/inferior.scm (cached-profile): Do not create the profile symlink if it already exists.
* inferior: Break cached-channel-instance into two procedures.Mathieu Othacehe2021-03-10
| | | | | | | | | | | Break cached-channel-instance into two different procedures: channels->cached-profile and instances->cached-profile operating respectively on channels and channels instances. * guix/inferior.scm (cached-channel-instance): Rename it into ... (cached-profile): ... this new procedure. (channels->cached-profile, instances->cached-profile): New procedures. * guix/scripts/time-machine.scm (guix-time-machine): Adapt accordingly.
* inferior: Speed up 'cached-channel-instance' for cache hits.Ludovic Courtès2021-01-29
| | | | | | | | | | | | | | That way a command like: guix time-machine --commit=5aeee07cc9 -- describe goes from 3.4s to 0.5s on a cache hit, even slightly less when passing the full commit ID. * guix/inferior.scm (channel-full-commit): New procedure. (cached-channel-instance): Remove 'instances' top-level variable. Add 'commits' and use it for 'key'. Move 'latest-channel-instances' call to the cache miss case.
* guix: Fix typo.Ricardo Wurmus2021-01-28
| | | | | * guix/inferior.scm (inferior-available-packages): Remove extra word in docstring.
* inferior: Memoize entries in 'inferior-package->manifest-entry'.Ludovic Courtès2021-01-27
| | | | | | | | | | Fixes a performance issue as reported by Ricardo Wurmus in <https://bugs.gnu.org/46100>. * guix/inferior.scm (inferior-package->manifest-entry): Remove #:parent parameter. [cache]: New variable. [memoized]: New macro. [loop]: New procedure.
* maint: Require Guile >= 2.2.6.Ludovic Courtès2020-12-19
| | | | | | | | | | | | * configure.ac: For Guile 2.2, require 2.2.6 or later. * guix/gexp.scm (define-syntax-parameter-once): Remove. Use 'define-syntax-parameter' instead. * guix/mnoads.scm: Likewise. * guix/inferior.scm (proxy)[select*]: Remove. * guix/scripts/publish.scm <top level>: Remove replacement for (@@ (web http) read-header-line). * guix/store/deduplication.scm (counting-wrapper-port): Remove. (nar-sha256): Call 'port-position' on PORT to compute SIZE.
* utils: Move <location> and '&error-location' to (guix diagnostics).Ludovic Courtès2020-07-25
| | | | | | | | | | | | | * guix/utils.scm (<location>, source-properties->location) (location->source-properties, &error-location): Move to... * guix/diagnostics.scm: ... here. * gnu.scm: Adjust imports accordingly. * gnu/machine.scm: Likewise. * gnu/system.scm: Likewise. * gnu/tests.scm: Likewise. * guix/inferior.scm: Likewise. * tests/channels.scm: Likewise. * tests/packages.scm: Likewise.
* time-machine: Add '--disable-authentication'.Ludovic Courtès2020-06-16
| | | | | | | | | * guix/inferior.scm (cached-channel-instance): Add #:authenticate? and pass it to 'latest-channel-instances'. * guix/scripts/time-machine.scm (show-help, %options): Add '--disable-authentication'. (%default-options): Add 'authenticate-channels?'. (guix-time-machine): Honor it.
* inferior: '&inferior-exception' includes a stack trace.Ludovic Courtès2020-03-19
| | | | | | | | * guix/inferior.scm (port->inferior): Bump protocol to (0 1 1). (&inferior-exception)[stack]: New field. (read-repl-response): Recognize 'exception' form for protocol (0 1 1). * tests/inferior.scm ("&inferior-exception"): Check the value returned by 'inferior-exception-stack'.
* inferior: Adjust to protocol (0 1).Ludovic Courtès2020-03-19
| | | | | * guix/inferior.scm (port->inferior): For protocol (0 x ...), where x >= 1, send the (() repl-version ...) form.
* inferior: Distinguish inferior exceptions.Ludovic Courtès2020-03-12
| | | | | | | | | | | | This avoids ambiguities when looking at a backtrace where the exception was actually thrown by an inferior in a very different context. * guix/inferior.scm (&inferior-exception): New condition type. (read-repl-response): Add optional 'inferior' parameter. Raise '&inferior-exception' instead of rethrowing to KEY when receiving an 'exception' message. (read-inferior-response): Pass INFERIOR to 'read-repl-response'. * tests/inferior.scm ("&inferior-exception"): New test.
* More module autoload adjustments.Ludovic Courtès2020-01-15
| | | | | | | | This is a followup to 7a0836cffdfe3ab9ee899602f218277646959144. * guix/scripts/package.scm: Adjust binding list of the (guix store roots) autoload. * guix/inferior.scm: Adjust binding list of the (guix cache) autoload.
* inferior: Add 'inferior-package-provenance'.Ludovic Courtès2019-12-29
| | | | * guix/inferior.scm (inferior-package-provenance): New procedure.
* inferior: 'cached-channel-instance' takes an open store connection.Konrad Hinsen2019-11-15
| | | | | | | | | | | * guix/inferior.scm (cached-channel-instance): Take an explicit 'store' argument. (inferior-for-channels): Wrap call to 'cached-channel-instance' in 'with-store'. * guix/time-machine.scm (guix-time-machine): Wrap call to 'cached-channel-instance' in 'with-store'. Signed-off-by: Ludovic Courtès <ludo@gnu.org>
* Add 'guix time-machine'.Konrad Hinsen2019-11-15
| | | | | | | | | | | | * guix/scripts/time-machine.scm: New file. * Makefile.am: (MODULES): Add it. * guix/scripts/pull.scm (channel-list): Export. * guix/inferior.scm (cached-channel-instance): New procedure. (inferior-for-channels): Use it. * doc/guix.texi (Invoking guix time-machine): New section. (Channels): Cross-reference it. Signed-off-by: Ludovic Courtès <ludo@gnu.org>
* inferior: Set the error port when using older Guix versions.Christopher Baines2019-10-15
| | | | | | | This makes the behaviour more consistent. * guix/inferior.scm (inferior-pipe): Wrap the second open-pipe* call with with-error-to-port, to match the first call to open-pipe*.
* inferior: Allow controlling the inferior error port.Christopher Baines2019-10-15
| | | | | | | | | | Previously, stderr for the inferior process would always be sent to /dev/null because the current-output-port when the process is launched is a void port. This change means that it's possible to pass in a different port to use. * guix/inferior.scm (inferior-pipe): Take the error-port as an argument. (open-inferior): Add new error-port keyword argument, with a default of (%make-void-port "w").
* inferior: Change to use the (guix repl) module.Christopher Baines2019-10-01
| | | | | | | | | | Rather than (guix scripts repl), from which the machine-repl procedure was removed in [1]. 1: 92a4087bf4862d5ba9b77111eba3c68c2a1c4679 * guix/inferior.scm (inferior-pipe): Load (guix repl) rather than (guix scripts repl).
* inferior: Fix typo.Vagrant Cascadian2019-09-23
| | | | * guix/inferior: Fix spelling of "specifications".
* inferior: Propagate '&store-protocol-error' error conditions.Ludovic Courtès2019-09-21
| | | | | | | | | | | | | | | | Until now '&store-protocol-error' conditions raised in the inferior would not be correctly propagated because SRFI-35 records lack a read syntax. Reported at <https://bugs.gnu.org/37449> by Carl Dong <contact@carldong.me>. * guix/inferior.scm (port->inferior): Import (srfi srfi-34) in the inferior. (inferior-eval-with-store): Define 'error?' and 'error-message'. Wrap call to PROC in 'guard'. Check the response of INFERIOR for a 'store-protocol-error' or a 'result' tag. * tests/inferior.scm ("inferior-eval-with-store, &store-protocol-error"): New test.
* inferior: Add 'read-repl-response'.Ludovic Courtès2019-07-04
| | | | | * guix/inferior.scm (read-repl-response): New procedure. (read-inferior-response): Use it.
* channels: Do not fail when the inferior lacks 'guix repl'.Ludovic Courtès2019-03-08
| | | | | | | | | | | | | | | Fixes <https://bugs.gnu.org/34637>. Reported by Martin Flack <martin.flack@gmail.com>. Previously we'd fail to build the package cache for old versions of Guix that lack 'guix repl'. Now we simply ignore the issue and keep going without a cache. * guix/inferior.scm (gexp->derivation-in-inferior): Add #:silent-failure? and honor it. [drop-extra-keyword]: New procedure. Use it. * guix/channels.scm (package-cache-file): Pass #:silent-failure? #t.
* inferior: Add 'inferior-available-packages'.Ludovic Courtès2019-02-12
| | | | | * guix/inferior.scm (inferior-available-packages): New procedure. * tests/inferior.scm ("inferior-available-packages"): New test.
* store: Rename <nix-server> to <store-connection>.Ludovic Courtès2019-01-21
| | | | | | | | | | * guix/store.scm (<nix-server>): Rename to... (<store-connection>): ... this. Adjust users accordingly. (nix-server?, nix-server-major-version) (nix-server-minor-version, nix-server-socket) (nix-server-version): Define as deprecated aliases. * guix/inferior.scm: Adjust accordingly. * guix/ssh.scm: Likewise.
* inferior: 'gexp->derivation-in-inferior' honors EXP's load path.Ludovic Courtès2019-01-20
| | | | | | | | | | | | Previously the imported modules and extensions of EXP would be missing from the load path of 'guix repl'. * guix/inferior.scm (gexp->derivation-in-inferior)[script]: New variable. [trampoline]: Write (primitive-load #$script) to PIPE. Add #$output. * tests/channels.scm ("channel-instances->manifest")[depends?]: Check for requisites rather than direct references. Adjust callers accordingly.
* inferior: Add 'gexp->derivation-in-inferior'.Ludovic Courtès2019-01-15
| | | | * guix/inferior.scm (gexp->derivation-in-inferior): New procedure.
* Remove most uses of the _IO*F constants.Ludovic Courtès2019-01-09
| | | | | | | | | | | | | | | | | | | | | | | | These constants, for use with 'setvbuf', were deprecated in Guile 2.2 and disappeared in Guile 3.0. Here we keep these constants in build-side code where removing them is not feasible. * guix/build/download-nar.scm (download-nar): Adjust 'setvbuf' calls to the Guile 2.2+ API. * guix/build/download.scm (open-socket-for-uri): Likewise. (open-connection-for-uri, url-fetch): Likewise. * guix/build/make-bootstrap.scm (make-stripped-libc): Likewise. * guix/build/union.scm (setvbuf) [guile-2.0]: New conditional wrapper. (union-build): Adjust to new API. * guix/ftp-client.scm (ftp-open, ftp-list, ftp-retr): Likewise. * guix/http-client.scm (http-fetch): Likewise. * guix/inferior.scm (proxy): Likewise. * guix/scripts/substitute.scm (fetch, http-multiple-get): Likewise. * guix/self.scm (compiled-modules): Likewise. * guix/ssh.scm (remote-daemon-channel, store-import-channel) (store-export-channel): Likewise. * guix/ui.scm (initialize-guix): Likewise. * tests/publish.scm (http-get-port): Likewise. * guix/store.scm (%newlines): Adjust comment.
* maint: Remove 'cond-expand' forms for Guile 2.0.Ludovic Courtès2019-01-09
| | | | | | | | | | | | | | | | | | | | | | Note: Leave 'cond-expand' forms used in the build-side modules that can run on %BOOTSTRAP-GUILE, which is currently Guile 2.0. * guix/build/compile.scm: Move 'use-modules' clause from 'cond-expand' to 'define-module' form. (%default-optimizations): Remove 'cond-expand'. * guix/build/download.scm (tls-wrap): Remove 'cond-expand'. * guix/build/syscalls.scm: Remove 'cond-expand' form around '%set-automatic-finalization-enabled?!' and 'without-automatic-finalization'. * guix/inferior.scm (port->inferior): Remove 'cond-expand'. * guix/scripts/pack.scm (wrapped-package)[build]: Remove 'cond-expand'. * guix/status.scm (build-event-output-port): Remove 'cond-expand'. * guix/store.scm (open-inet-socket): Remove 'cond-expand'. * guix/ui.scm (install-locale): Remove 'cond-expand'. * tests/status.scm ("current-build-output-port, UTF-8 + garbage"): Remove 'cond-expand'. * tests/store.scm ("current-build-output-port, UTF-8 + garbage"): Remove 'cond-expand'.
* ssh: Add 'remote-inferior'.Ludovic Courtès2018-12-24
| | | | | | | | | * guix/inferior.scm (<inferior>)[close]: New field. (port->inferior): New procedure. (open-inferior): Rewrite in terms of 'port->inferior'. (close-inferior): Honor INFERIOR's 'close' field. (inferior-eval-with-store): Add FIXME comment. * guix/ssh.scm (remote-inferior): New procedure.
* inferior: Add 'inferior-eval-with-store'.Ludovic Courtès2018-11-28
| | | | | | | | * guix/inferior.scm (inferior-eval-with-store): New procedure, with code formerly in 'inferior-package-derivation'. (inferior-package-derivation): Rewrite in terms of 'inferior-eval-with-store'. * tests/inferior.scm ("inferior-eval-with-store"): New test.