mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-11-17 07:13:23 +01:00
Merge pull request #242539 from hercules-ci/nixos-rebuild-repl
nixos-rebuild: Add `nixos-rebuild repl`
This commit is contained in:
commit
2339744b73
3 changed files with 76 additions and 2 deletions
|
@ -55,6 +55,14 @@ which causes the new configuration (and previous ones created using
|
||||||
This can be useful to separate test configurations from "stable"
|
This can be useful to separate test configurations from "stable"
|
||||||
configurations.
|
configurations.
|
||||||
|
|
||||||
|
A repl, or read-eval-print loop, is also available. You can inspect your configuration and use the Nix language with
|
||||||
|
|
||||||
|
```ShellSession
|
||||||
|
# nixos-rebuild repl
|
||||||
|
```
|
||||||
|
|
||||||
|
Your configuration is loaded into the `config` variable. Use tab for autocompletion, use the `:r` command to reload the configuration files. See `:?` or [`nix repl` in the Nix manual](https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-repl.html) to learn more.
|
||||||
|
|
||||||
Finally, you can do
|
Finally, you can do
|
||||||
|
|
||||||
```ShellSession
|
```ShellSession
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
.Sh SYNOPSIS
|
.Sh SYNOPSIS
|
||||||
.Nm
|
.Nm
|
||||||
.Bro
|
.Bro
|
||||||
.Cm switch | boot | test | build | dry-build | dry-activate | edit | build-vm | build-vm-with-bootloader | list-generations Op Fl -json
|
.Cm switch | boot | test | build | dry-build | dry-activate | edit | repl | build-vm | build-vm-with-bootloader | list-generations Op Fl -json
|
||||||
.Brc
|
.Brc
|
||||||
.br
|
.br
|
||||||
.Op Fl -upgrade | -upgrade-all
|
.Op Fl -upgrade | -upgrade-all
|
||||||
|
@ -143,6 +143,10 @@ Opens
|
||||||
.Pa configuration.nix
|
.Pa configuration.nix
|
||||||
in the default editor.
|
in the default editor.
|
||||||
.
|
.
|
||||||
|
.It Cm repl
|
||||||
|
Opens the configuration in
|
||||||
|
.Ic nix repl Ns .
|
||||||
|
.
|
||||||
.It Cm build-vm
|
.It Cm build-vm
|
||||||
Build a script that starts a NixOS virtual machine with the desired
|
Build a script that starts a NixOS virtual machine with the desired
|
||||||
configuration. It leaves a symlink
|
configuration. It leaves a symlink
|
||||||
|
|
|
@ -49,7 +49,7 @@ while [ "$#" -gt 0 ]; do
|
||||||
--help)
|
--help)
|
||||||
showSyntax
|
showSyntax
|
||||||
;;
|
;;
|
||||||
switch|boot|test|build|edit|dry-build|dry-run|dry-activate|build-vm|build-vm-with-bootloader|list-generations)
|
switch|boot|test|build|edit|repl|dry-build|dry-run|dry-activate|build-vm|build-vm-with-bootloader|list-generations)
|
||||||
if [ "$i" = dry-run ]; then i=dry-build; fi
|
if [ "$i" = dry-run ]; then i=dry-build; fi
|
||||||
# exactly one action mandatory, bail out if multiple are given
|
# exactly one action mandatory, bail out if multiple are given
|
||||||
if [ -n "$action" ]; then showSyntax; fi
|
if [ -n "$action" ]; then showSyntax; fi
|
||||||
|
@ -511,6 +511,68 @@ if [ "$action" = dry-build ]; then
|
||||||
extraBuildFlags+=(--dry-run)
|
extraBuildFlags+=(--dry-run)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ "$action" = repl ]; then
|
||||||
|
# This is a very end user command, implemented using sub-optimal means.
|
||||||
|
# You should feel free to improve its behavior, as well as resolve tech
|
||||||
|
# debt in "breaking" ways. Humans adapt quite well.
|
||||||
|
if [[ -z $flake ]]; then
|
||||||
|
exec nix repl '<nixpkgs/nixos>' "${extraBuildFlags[@]}"
|
||||||
|
else
|
||||||
|
if [[ -n "${lockFlags[0]}" ]]; then
|
||||||
|
# nix repl itself does not support locking flags
|
||||||
|
log "nixos-rebuild repl does not support locking flags yet"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
d='$'
|
||||||
|
q='"'
|
||||||
|
bold="$(echo -e '\033[1m')"
|
||||||
|
blue="$(echo -e '\033[34;1m')"
|
||||||
|
attention="$(echo -e '\033[35;1m')"
|
||||||
|
reset="$(echo -e '\033[0m')"
|
||||||
|
# This nix repl invocation is impure, because usually the flakeref is.
|
||||||
|
# For a solution that preserves the motd and custom scope, we need
|
||||||
|
# something like https://github.com/NixOS/nix/issues/8679.
|
||||||
|
exec nix repl --impure --expr "
|
||||||
|
let flake = builtins.getFlake ''$flake'';
|
||||||
|
configuration = flake.$flakeAttr;
|
||||||
|
motd = ''
|
||||||
|
$d{$q\n$q}
|
||||||
|
Hello and welcome to the NixOS configuration
|
||||||
|
$flakeAttr
|
||||||
|
in $flake
|
||||||
|
|
||||||
|
The following is loaded into nix repl's scope:
|
||||||
|
|
||||||
|
- ${blue}config${reset} All option values
|
||||||
|
- ${blue}options${reset} Option data and metadata
|
||||||
|
- ${blue}pkgs${reset} Nixpkgs package set
|
||||||
|
- other module arguments
|
||||||
|
|
||||||
|
- ${blue}flake${reset} Flake outputs, inputs and source info of $flake
|
||||||
|
|
||||||
|
Use tab completion to browse around ${blue}config${reset}.
|
||||||
|
|
||||||
|
Use ${bold}:r${reset} to ${bold}reload${reset} everything after making a change in the flake.
|
||||||
|
(assuming $flake is a mutable flake ref)
|
||||||
|
|
||||||
|
See ${bold}:?${reset} for more repl commands.
|
||||||
|
|
||||||
|
${attention}warning:${reset} nixos-rebuild repl does not currently enforce pure evaluation.
|
||||||
|
'';
|
||||||
|
scope =
|
||||||
|
assert configuration._type or null == ''configuration'';
|
||||||
|
assert configuration.class or ''nixos'' == ''nixos'';
|
||||||
|
configuration._module.args //
|
||||||
|
configuration._module.specialArgs //
|
||||||
|
{
|
||||||
|
inherit (configuration) config options;
|
||||||
|
inherit flake;
|
||||||
|
};
|
||||||
|
in builtins.seq scope builtins.trace motd scope
|
||||||
|
" "${extraBuildFlags[@]}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
if [ "$action" = list-generations ]; then
|
if [ "$action" = list-generations ]; then
|
||||||
if [ ! -L "$profile" ]; then
|
if [ ! -L "$profile" ]; then
|
||||||
log "No profile \`$(basename "$profile")' found"
|
log "No profile \`$(basename "$profile")' found"
|
||||||
|
|
Loading…
Reference in a new issue