summaryrefslogtreecommitdiff
path: root/guix/scripts/shell.scm
AgeCommit message (Collapse)Author
2025-12-05shell: Create cached profile directory once connected to the daemon.Ludovic Courtès
Fixes a regression introduced in d12c4452a49b355369636de1dfc766b5bad6437b, where ‘guix shell’, on a fresh installation, would attempt to create the cached profile directory under /var/guix/profiles/per-user/$USER, which only guix-daemon can do, on the user’s first connection. * guix/scripts/shell.scm (options-with-caching): Remove ‘mkdir-p’ call for ROOT’s parent directory. Add ‘create-gc-root-directory?’ key to the result. * guix/scripts/environment.scm (guix-environment*): Honor ‘create-gc-root-directory?’ key. Fixes: guix/guix#126 Reported-by: Maxim Cournoyer <maxim@guixotic.coop> Change-Id: I782461c80c254467108c6b8d676d269866795746
2025-11-24shell: Ensure graft? is used in profile cache key.Rutherther
Fixes #2932. Pass graft? to cache-key functions to not forget about it again, like with the (%graft?) parameter. * guix/scripts/shell.scm (profile-file-cache-key): Accept graft? argument instead of %graft? parameter. (profile-spec-cache-key): Likewise. (profile-cached-gc-root): Pass graft? argument from opts to profile-file-cache-key and profile-spec-cache-key. Change-Id: I9654bb2c59864d39ba7070ea0f19d922513ef024 Signed-off-by: Ludovic Courtès <ludo@gnu.org>
2025-11-03shell: Don’t rely on atime for caching.Ludovic Courtès
Relying on atime was fine even on ‘noatime’ file systems because the atime was explicitly updated. However, on file systems with atime enabled, cache items were potentially retained for too long since scanning the cache directory could update atimes. * guix/scripts/shell.scm (options-with-caching): In ‘utime’ call, change both the mtime and the atime. (guix-shell)[entry-expiration]: Use ‘file-expiration-time’ with ‘stat:mtime’. Change-Id: Ibe2aedae41a1018a95c2efe7f2dcf08bd1caae2a
2025-09-23shell, inferior: Store GC roots under /var/guix/profiles.Ludovic Courtès
Fixes guix/guix#2410. Until now, ‘guix shell’ and ‘guix time-machine’ would store GC roots under ~/.cache/guix. However, this directory is unreadable to guix-daemon when it’s running without root privileges. This commit changes ‘guix shell’ and ‘guix time-machine’ so they store GC roots under /var/guix/profiles/per-user/$USER, in a world-readable directory. An added benefit is that, in cluster setups, user homes no longer need to be mounted on the head node for GC to work (assuming ‘guix build -r’ and similar are not used). * guix/inferior.scm (%inferior-cache-directory): Change default value to be under ‘%profile-directory’. (%legacy-inferior-cache-directory): New variable. (cached-channel-instance): Add ‘maybe-remove-expired-cache-entries’ call. * guix/scripts/environment.scm (launch-environment/container)[nesting-mappings]: Add /inferiors and /profiles sub-directories of ‘%profile-directory’. Call ‘mkdir-p’ for these two directories. * guix/scripts/shell.scm (%profile-cache-directory): Change default value to be under ‘%profile-directory’. (%legacy-cache-directory): New variable. (guix-shell): Add call to ‘maybe-remove-expired-cache-entries’. Change-Id: Ie7d6c16a55b35c7beb18078c967d6fc902bf68d0 Signed-off-by: Ludovic Courtès <ludo@gnu.org>
2024-10-22shell: Enable caching when using deterministic package transformations.Ludovic Courtès
Until now, using any package transformation would disable the automatic GC root creation and caching in ‘guix shell’. This change introduces a finer-grain distinction: a command like: guix shell --tune inkscape is now subject to caching, whereas: guix shell --with-latest=inkscape inkscape remains non-cacheable. * guix/transformations.scm (%transformations-with-external-dependencies): New variable. (cacheable-transformation-option-key?): New procedure. * guix/scripts/shell.scm (profile-cached-gc-root): In the ‘transformation-option-key?’ clause, call ‘loop’ when ‘cacheable-transformation-option-key?’ returns true. Change-Id: I847b661dfea20ecf851db2023a5c7ea8c5b5ca7c
2023-11-22shell: Disable caching for ‘guix shell -f guix.scm’.Ludovic Courtès
Fixes <https://issues.guix.gnu.org/64858>. * guix/scripts/shell.scm (profile-cached-gc-root): Distinguish the two ‘load’ cases; return #f and #f for (load ad-hoc-package _). Reported-by: Pierre-Henry Fröhring <phfrohring@deeplinks.com>. Change-Id: I00282fbd41aeed09fb927690945cf65e1f9efe4d
2023-11-22shell: Correct cache key for ‘guix shell -f guix.scm’.Felix Lechner
Partially fixes <https://issues.guix.gnu.org/64858>. Fixes a bug whereby ‘guix shell -f guix.scm’ would use the same cache key as ‘guix shell’ in an empty directory (meaning: no packages specified) and would ignore the mtime of ‘guix.scm’. * guix/scripts/shell.scm (profile-cached-gc-root): In ‘load’ case, recognize both the ‘package’ and ‘ad-hoc-package’ tags. Co-authored-by: Ludovic Courtès <ludo@gnu.org> Change-Id: Ice6d0ac43e1dc6bb335a17963364c2cc6bcd076d
2023-10-17scripts: shell: Handle EPIPE errors when displaying help.Simon Tournier
* guix/scripts/shell.scm (%options): Handle EPIPE errors when displaying help.
2023-10-12shell: Take grafting into account when caching.Ludovic Courtès
Fixes <https://issues.guix.gnu.org/64856>. * guix/scripts/shell.scm (profile-file-cache-key) (profile-spec-cache-key): Take (%graft?) into account. Reported-by: Maxim Cournoyer <maxim.cournoyer@gmail.com>
2023-09-08guix: shell: Don't whitelist / by typo in `shell-authorized-directories'.Janneke Nieuwenhuizen
Fixes <https://issues.guix.gnu.org/65832>. * guix/scripts/shell.scm (authorized-shell-directory?): After warning, continue LOOP to return valid query result for DIRECTORY.
2023-07-13shell: Really take system into account in the cache key.Ludovic Courtès
Fixes <https://issues.guix.gnu.org/63230>. Previously, when running "guix shell -s X ...", OPTS would contain something like '((system . "X") ... (system . "DEFAULT")). Thus, since 'profile-cached-gc-root' would iterate over it in this order, "DEFAULT" would be passed to 'profile-file-cache-key' and 'profile-spec-cache-key' instead of "X". * guix/scripts/shell.scm (profile-cached-gc-root): Reverse OPTS before entering 'loop'.
2023-04-06environment: Add '--nesting'.Ludovic Courtès
* guix/scripts/environment.scm (show-environment-options-help) (%options): Add '--nesting'. (options/resolve-packages): Handle it. (launch-environment/container): Add #:nesting? and honor it. [nesting-mappings]: New procedure. (guix-environment*): Add support for '--nesting'. * guix/scripts/shell.scm (profile-cached-gc-root): Special-case 'nesting?'. * tests/guix-environment-container.sh: Test it. * doc/guix.texi (Invoking guix shell): Document it.
2023-02-27ui: 'display-hint' quotes extra arguments for Texinfo.Ludovic Courtès
Fixes <https://issues.guix.gnu.org/61201>. Previously, common practice was to splice arbitrary strings (user names, file names, etc.) into Texinfo snippets passed to 'display-hint'. This is unsafe in the general case because at signs and braces need to be escaped to produced valid Texinfo. This commit addresses that. * guix/ui.scm (texinfo-quote): New procedure. (display-hint): When ARGUMENTS is non-empty, pass it to 'texinfo-quote' and call 'format'. (report-unbound-variable-error, check-module-matches-file) (display-collision-resolution-hint, run-guix-command): Remove explicit 'format' call; pass 'format' arguments as extra arguments to 'display-hint'. * gnu/services/monitoring.scm (zabbix-front-end-config): Likewise. * guix/scripts.scm (warn-about-disk-space): Likewise. * guix/scripts/build.scm (%standard-cross-build-options) (%standard-native-build-options): Likewise. * guix/scripts/describe.scm (display-checkout-info): Likewise. * guix/scripts/environment.scm (suggest-command-name): Likewise. * guix/scripts/home.scm (process-command): Likewise. * guix/scripts/home/edit.scm (service-type-not-found): Likewise. * guix/scripts/import.scm (guix-import): Likewise. * guix/scripts/package.scm (display-search-path-hint): Likewise. * guix/scripts/pull.scm (build-and-install): Likewise. * guix/scripts/shell.scm (auto-detect-manifest): Likewise. * guix/scripts/system.scm (check-file-system-availability): Likewise. (guix-system): Likewise. * guix/scripts/system/edit.scm (service-type-not-found): Likewise. * guix/status.scm (print-build-event): Likewise.
2022-12-26shell: Make --help show --system and --list-systems.Yarl Baudig
These options are callable and documented in the manual but not shown by --help. * guix/scripts/shell.scm: Make --help show --system and --list-systems. Signed-off-by: Ludovic Courtès <ludo@gnu.org>
2022-11-15shell: Detect --symlink spec problems early.Maxim Cournoyer
* guix/scripts/pack.scm (symlink-spec-option-parser): Remove extraneous char-set. Raise an exception when the target is an absolute file name. (guix-pack): Move with-error-handler earlier. * guix/scripts/shell.scm (guix-shell): Likewise. * guix/scripts/environment.scm (guix-environment): Wrap the whole guix-environment* call with the with-error-handling handler. * tests/guix-environment-container.sh: Add tests. * tests/guix-pack.sh: Adjust symlink spec.
2022-11-06shell: Fix '--emulate-fhs' sometimes not including 'glibc-for-fhs'.John Kehayias
Fixes <https://issues.guix.gnu.org/58861>. Previously the order of the options giving to 'guix shell' could mean that the 'glibc-for-fhs' package included with the '--emulate-fhs' option would not appear in the container. For example, using the development option with a package using the 'gnu-build-system', e.g. 'guix shell -CFD hello', would include the regular 'glibc' package. The option ordered mattered: 'guix shell -CD hello -F' would include the expected 'glibc-for-fhs'. We fix this by having 'glibc-for-fhs' added to the package list just before calling 'options-with-caching' so the option order given by the user does not matter. * guix/scripts/shell.scm (%options): Move the '--emulate-fhs' (expression . ...) component from here... (parse-args): ... to here. * tests/guix-environment-container.sh: Add a test to check that 'glibc-for-fhs' is in the container even when 'glibc' is included in the 'guix shell' package list. Signed-off-by: Ludovic Courtès <ludo@gnu.org>
2022-10-13shell: Handle '--emulate-fhs' in 'guix shell', not in 'guix environment'.Ludovic Courtès
Previously, using 'guix shell -CF coreutils' twice (such that the profile is cache) would result in: guix shell: error: '--profile' cannot be used with package options This patch fixes it by moving argument handling to (guix scripts shell), before 'options-with-caching' is called. * guix/scripts/environment.scm (show-environment-options-help) (%options): Remove '--emulate-fhs'. (guix-environment*): Pass OPTS as-is to 'options/resolve-packages'. * guix/scripts/shell.scm (show-help, %options): Add '--emulate-fhs'. Add the (expression . ...) component to RESULT right from the argument handler. * tests/guix-environment-container.sh: Change '--emulate-fhs' tests to use 'guix shell' instead of 'guix environment'.
2022-07-15shell: Ignore cached profiles when using '--export-manifest'.Ludovic Courtès
Fixes <https://issues.guix.gnu.org/56539>. Fixes a bug where "guix shell -D pkg --export-manifest" would provide the expansion of PKG's dependencies instead of a call to 'package-development-manifest' if that profile happened to be cached. * guix/scripts/shell.scm (profile-cached-gc-root): Add clause for 'export-manifest?.
2022-06-16shell: Fix '--export-manifest' for cached profiles and when '-p' is used.Ludovic Courtès
Fixes <https://issues.guix.gnu.org/55521>. * guix/scripts/shell.scm (export-manifest): When computing 'manifest', honor the 'profile key. * tests/guix-shell-export-manifest.sh: Add test.
2022-06-16shell: Do not auto-detect manifest when '-p' is used.Ludovic Courtès
Previous, "guix shell -p /path/to/profile" would have manifest/guix.scm auto-detection turned on. * guix/scripts/shell.scm (auto-detect-manifest)[options-contain-payload?]: Return #t for 'profile.
2022-06-01shell: '--export-manifest -D x -D y' generates a valid manifest.Ludovic Courtès
* guix/scripts/shell.scm (manifest->code*): Add missing 'list' in generated 'concatenate-manifests' call. * tests/guix-shell-export-manifest.sh: Add test.
2022-04-04shell: Add '--export-manifest'.Ludovic Courtès
* guix/scripts/shell.scm (show-help, %options): Add '--export-manifest'. (manifest-entry-version-prefix, manifest->code*) (export-manifest): New procedures. (guix-shell): Honor '--export-manifest'. * tests/guix-shell-export-manifest.sh: New file. * Makefile.am (SH_TESTS): Add it. * doc/guix.texi (Invoking guix shell): Document '--export-manifest'. (Invoking guix environment): Link to it. (Invoking guix pack): Likewise.
2022-03-02shell: Disable caching when '-p' is passed.Ludovic Courtès
Fixes <https://issues.guix.gnu.org/53658>. Reported by Guillaume Le Vaillant <glv@posteo.net>. Previously we would wrongfully cache things, by adding a new (profile . _) pair to the option alist, when the user runs: guix shell -p /path/to/profile -q * guix/scripts/shell.scm (profile-cached-gc-root): Add ('profile . _) case.
2022-01-11shell: Cache profiles even when using package specs.Ludovic Courtès
This enables profile caching not just when '-m' or '-f' is used, but also when package specs are passed on the command line, as in: guix shell -D guix git It also changes profile cache keys to include the system type, which was previously ignored. * guix/scripts/shell.scm (options-with-caching)[single-file-for-caching]: Remove. Call 'profile-cached-gc-root' instead; adjust to accept two values. (profile-cache-primary-key): New procedure. (profile-cache-key): Remove. (profile-file-cache-key, profile-spec-cache-key): New procedures. (profile-cached-gc-root): Rewrite to include functionality formally in 'single-file-for-caching', but extend to handle package specs. * gnu/packages.scm (cache-is-authoritative?): Export. * guix/transformations.scm (transformation-option-key?): New procedure. * doc/guix.texi (Invoking guix shell): Move '--rebuild-cache' documentation to the bottom, just above '--root'. Explain caching and how these two options relate to that.
2021-12-10shell: When using '-D -f', '-D' has no effect on remaining packages.Ludovic Courtès
Fixes <https://issues.guix.gnu.org/52093>. Reported by Konrad Hinsen <konrad.hinsen@fastmail.net>. * guix/scripts/shell.scm (%options): In "--file" handler, add call to 'ensure-ad-hoc'. * tests/guix-shell.sh: Add test.
2021-12-10shell: Fix '--file' description in '--help' output.Ludovic Courtès
Reported by pinoaffe on #guix. * guix/scripts/shell.scm (show-help): Fix '--file' description.
2021-11-07shell: Actually clean up the profile cache.Ludovic Courtès
Previously, most actions would leave the cache as-is because 'guix-environment*' would indirectly call 'exit', and thus its continuation was never reached. * guix/scripts/shell.scm (guix-shell): Move call to 'maybe-remove-expired-cache-entries' to EXIT-HOOK.
2021-10-30shell: Error out when an unauthorized guix.scm/manifest.scm is found.Ludovic Courtès
The previous behavior was confusing: a warning would be printed and 'guix shell' would go on starting an empty environment. Reported by Tobias Geerinckx-Rice <me@tobias.gr>. * guix/scripts/shell.scm (auto-detect-manifest): Change "not loading" case from warning to error. * tests/guix-shell.sh: Adjust accordingly.
2021-10-26shell: Suggest running '--check' once for interactive use.Ludovic Courtès
* guix/scripts/shell.scm (hint-directory, hint-file, record-hint) (hint-given?): New procedures. (guix-shell): Record and probe the 'shell-check' hint.
2021-10-25shell: Maintain a profile cache.Ludovic Courtès
shell: Maintain a profile cache. With this change, running "guix shell" (no arguments) is equivalent to: guix environment -r ~/.cache/guix/profiles/some-root -l guix.scm This is the cache miss. On cache hit, it's equivalent to: guix environment -p ~/.cache/guix/profiles/some-root ... which can run in 0.1s. * guix/scripts/shell.scm (options-with-caching): New procedure. (parse-args): Use it. (%profile-cache-directory): New variable. (profile-cache-key, profile-cached-gc-root): New procedures. (show-help, %options): Add '--rebuild-cache'. (guix-shell)[cache-entries, entry-expiration]: New procedures. Add call to 'maybe-remove-expired-cache-entries'. * doc/guix.texi (Invoking guix shell): Document '--rebuild-cache'.
2021-10-25shell: By default load the local 'manifest.scm' or 'guix.scm' file.Ludovic Courtès
* guix/scripts/shell.scm (parse-args): Add call to 'auto-detect-manifest'. (authorized-directory-file, authorized-shell-directory?) (find-file-in-parent-directories, auto-detect-manifest): New procedures. * tests/guix-shell.sh: Add test. * doc/guix.texi (Invoking guix shell): Document it.
2021-10-25Add 'guix shell'.Ludovic Courtès
* guix/scripts/shell.scm, tests/guix-shell.sh: New files. * Makefile.am (MODULES): Add 'shell.scm'. (SH_TESTS): Add 'tests/guix-shell.sh'. * guix/scripts/environment.scm (show-environment-options-help): New procedure. (show-help): Use it. (guix-environment*): New procedure. (guix-environment): Use it. * po/guix/POTFILES.in: Add it. * doc/guix.texi (Features): Refer to "guix shell" (Invoking guix package): Likewise. (Development): Likewise. (Invoking guix shell): New node. (Invoking guix environment): Add deprecation warning. (Debugging Build Failures): Use 'guix shell' in examples. (Invoking guix container): Refer to 'guix shell'. (Invoking guix processes, Virtualization Services): Adjust examples to use 'guix shell'. * doc/contributing.texi (Building from Git): Refer to 'guix shell'. * etc/completion/bash/guix: Handle "shell".