-
Notifications
You must be signed in to change notification settings - Fork 358
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
shell: use naked shell concept with env var prepends for leaner shell with autocompletion #191
Merged
Merged
Changes from all commits
Commits
Show all changes
21 commits
Select commit
Hold shift + click to select a range
8696634
Revert "Revert "Merge pull request #105 from thenonameguy/naked-shell""
thenonameguy 42e4964
Merge branch 'main' of github.com:cachix/devenv into naked-shell
thenonameguy 1641124
Add common env vars to mkNakedShell
thenonameguy 218514a
Fix indentation
thenonameguy dbc9b17
Update flake.lock
thenonameguy fdc015a
Merge branch 'naked-shell' of github.com:thenonameguy/devenv into nak…
thenonameguy ead27c2
Merge branch 'main' of github.com:cachix/devenv into naked-shell
thenonameguy 3e1685e
Merge branch 'main' of github.com:cachix/devenv into naked-shell
thenonameguy f55b647
Add services.postgres.initialDatabases option
thenonameguy 2030aaf
Use nix-direnv in flake template for maximum speed
thenonameguy 63074e6
Include devenv package in flake usage scenario, fix template
thenonameguy 186deb9
Merge branch 'main' of github.com:cachix/devenv into naked-shell
thenonameguy f7b5e92
Use pg_isready on DB that always exists
thenonameguy fa3d586
Merge branch 'main' of github.com:cachix/devenv into naked-shell
thenonameguy cebf544
add docs about $DEVENV_PROFILE
thenonameguy a5a304f
Include all package outputs by default in profile
thenonameguy 0a1333b
Optionally depend on nix-direnv hint users about #speed
thenonameguy d2947ee
Fix postgres readiness probe
thenonameguy ccee09d
Update process-compose example to use new packages flattening
thenonameguy 1d7aa5a
Merge branch 'naked-shell' of github.com:thenonameguy/devenv into nak…
thenonameguy 4717da8
Automatically install nix-direnv, fixes #133
thenonameguy File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,136 @@ | ||
# using copied code from https://github.com/numtide/devshell | ||
# | ||
# MIT License | ||
|
||
# Copyright (c) 2021 Numtide and contributors | ||
|
||
# Permission is hereby granted, free of charge, to any person obtaining a copy | ||
# of this software and associated documentation files (the "Software"), to deal | ||
# in the Software without restriction, including without limitation the rights | ||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
# copies of the Software, and to permit persons to whom the Software is | ||
# furnished to do so, subject to the following conditions: | ||
|
||
# The above copyright notice and this permission notice shall be included in all | ||
# copies or substantial portions of the Software. | ||
|
||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
# SOFTWARE. | ||
|
||
{ bashInteractive | ||
, coreutils | ||
, system | ||
, writeTextFile | ||
, lib | ||
}: | ||
let | ||
bashPath = "${bashInteractive}/bin/bash"; | ||
stdenv = writeTextFile { | ||
name = "naked-stdenv"; | ||
destination = "/setup"; | ||
text = '' | ||
# Fix for `nix develop` | ||
: ''${outputs:=out} | ||
|
||
runHook() { | ||
eval "$shellHook" | ||
unset runHook | ||
} | ||
''; | ||
}; | ||
in | ||
{ name | ||
, # A path to a buildEnv that will be loaded by the shell. | ||
# We assume that the buildEnv contains an ./env.bash script. | ||
profile | ||
, env ? { } | ||
, shellHook ? "" | ||
, meta ? { } | ||
, passthru ? { } | ||
}: | ||
let | ||
# simpler version of https://github.com/numtide/devshell/blob/20d50fc6adf77fd8a652fc824c6e282d7737b85d/modules/env.nix#L41 | ||
envToBash = name: value: "export ${name}=${lib.escapeShellArg (toString value)}"; | ||
startupEnv = lib.concatStringsSep "\n" (lib.mapAttrsToList envToBash env); | ||
derivationArg = { | ||
inherit name system; | ||
|
||
# `nix develop` actually checks and uses builder. And it must be bash. | ||
builder = bashPath; | ||
|
||
# Bring in the dependencies on `nix-build` | ||
args = [ "-ec" "${coreutils}/bin/ln -s ${profile} $out; exit 0" ]; | ||
|
||
# $stdenv/setup is loaded by nix-shell during startup. | ||
# https://github.com/nixos/nix/blob/377345e26f1ac4bbc87bb21debcc52a1d03230aa/src/nix-build/nix-build.cc#L429-L432 | ||
stdenv = stdenv; | ||
|
||
# The shellHook is loaded directly by `nix develop`. But nix-shell | ||
# requires that other trampoline. | ||
shellHook = '' | ||
# Remove all the unnecessary noise that is set by the build env | ||
unset NIX_BUILD_TOP NIX_BUILD_CORES NIX_STORE | ||
unset TEMP TEMPDIR TMP TMPDIR | ||
# $name variable is preserved to keep it compatible with pure shell https://github.com/sindresorhus/pure/blob/47c0c881f0e7cfdb5eaccd335f52ad17b897c060/pure.zsh#L235 | ||
unset builder out shellHook stdenv system | ||
# Flakes stuff | ||
unset dontAddDisableDepTrack outputs | ||
|
||
# For `nix develop`. We get /noshell on Linux and /sbin/nologin on macOS. | ||
if [[ "$SHELL" == "/noshell" || "$SHELL" == "/sbin/nologin" ]]; then | ||
export SHELL=${bashPath} | ||
fi | ||
|
||
# https://github.com/numtide/devshell/issues/158 | ||
PATH=''${PATH#/path-not-set:} | ||
|
||
export DEVENV_PROFILE=${profile} | ||
thenonameguy marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
# add installed packages to PATH | ||
export PATH="$DEVENV_PROFILE/bin:$PATH" | ||
|
||
# prepend common compilation lookup paths | ||
export PKG_CONFIG_PATH="$DEVENV_PROFILE/lib/pkgconfig:$PKG_CONFIG_PATH" | ||
export LD_LIBRARY_PATH="$DEVENV_PROFILE/lib:$LD_LIBRARY_PATH" | ||
export LIBRARY_PATH="$DEVENV_PROFILE/lib:$LIBRARY_PATH" | ||
export C_INCLUDE_PATH="$DEVENV_PROFILE/include:$C_INCLUDE_PATH" | ||
|
||
# these provide shell completions / default config options | ||
export XDG_DATA_DIRS="$DEVENV_PROFILE/share:$XDG_DATA_DIRS" | ||
export XDG_CONFIG_DIRS="$DEVENV_PROFILE/etc/xdg:$XDG_CONFIG_DIRS" | ||
thenonameguy marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
${startupEnv} | ||
|
||
${shellHook} | ||
''; | ||
}; | ||
in | ||
(derivation derivationArg) // { | ||
inherit meta passthru; | ||
|
||
# https://github.com/NixOS/nixpkgs/blob/41f7e338216fd7f5e57817c4f8e148d42fb88b24/pkgs/stdenv/generic/make-derivation.nix#L486-L504 | ||
inputDerivation = derivation (derivationArg // { | ||
# Add a name in case the original drv didn't have one | ||
name = derivationArg.name or "inputDerivation"; | ||
# This always only has one output | ||
outputs = [ "out" ]; | ||
|
||
# Propagate the original builder and arguments, since we override | ||
# them and they might contain references to build inputs | ||
_derivation_original_builder = derivationArg.builder; | ||
_derivation_original_args = derivationArg.args; | ||
|
||
builder = bashPath; | ||
# The bash builtin `export` dumps all current environment variables, | ||
# which is where all build input references end up (e.g. $PATH for | ||
# binaries). By writing this to $out, Nix can find and register | ||
# them as runtime dependencies (since Nix greps for store paths | ||
# through $out to find them) | ||
args = [ "-c" "export > $out" ]; | ||
}); | ||
} // passthru |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe makes more sense to remove it and the user migrates to the new option :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I did not want to break the current users of this flag.
Also there is no way of specifying at the moment that
$USER
with a program fallback should be used with theinitialDatabases
syntax. The name is static at Nix eval time.In my personal projects I almost always have a static database name locally, so it can be hard-coded for maximum ease of use. This way we don't have to pass the
$USER
everywhere.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If it makes sense to deprecate a flag you can do it like: