Add testcase for nix develop with __structuredAttrs

This commit is contained in:
Maximilian Bosch 2021-05-18 15:07:30 +02:00
parent f1e281c4fe
commit 3504c811a5
No known key found for this signature in database
GPG key ID: 091DBF4D1FC46B8E
5 changed files with 24 additions and 3 deletions

View file

@ -256,6 +256,9 @@ struct Common : InstallableCommand, MixProfile
// FIXME: properly unquote 'outputs'. // FIXME: properly unquote 'outputs'.
StringMap rewrites; StringMap rewrites;
for (auto & outputName : tokenizeString<std::vector<std::string>>(replaceStrings(outputs->second.quoted, "'", ""))) { for (auto & outputName : tokenizeString<std::vector<std::string>>(replaceStrings(outputs->second.quoted, "'", ""))) {
// Hacky way to obtain the key of an associate array. This is needed for strctured attrs where
// `outputs` is an associative array. If the regex isn't matched, the non-structured-attrs behavior will
// be used.
std::regex ptrn(R"re(\[([A-z0-9]+)\]=.*)re"); std::regex ptrn(R"re(\[([A-z0-9]+)\]=.*)re");
std::smatch match; std::smatch match;
if (std::regex_match(outputName, match, ptrn)) { if (std::regex_match(outputName, match, ptrn)) {

View file

@ -8,6 +8,9 @@ if [[ -n $stdenv ]]; then
source $stdenv/setup source $stdenv/setup
fi fi
# In case of `__structuredAttrs = true;` the list of outputs is an associative
# array with a format like `outname => /nix/store/hash-drvname-outname`, so `__olist`
# must contain the array's keys (hence `${!...[@]}`) in this case.
if [ -e .attrs.sh ]; then if [ -e .attrs.sh ]; then
__olist="${!outputs[@]}" __olist="${!outputs[@]}"
else else
@ -16,10 +19,10 @@ fi
for __output in $__olist; do for __output in $__olist; do
if [[ -z $__done ]]; then if [[ -z $__done ]]; then
export > ${!__output} export > "${!__output}"
set >> ${!__output} set >> "${!__output}"
__done=1 __done=1
else else
echo -n >> ${!__output} echo -n >> "${!__output}"
fi fi
done done

View file

@ -8,6 +8,14 @@ let pkgs = rec {
for pkg in $buildInputs; do for pkg in $buildInputs; do
export PATH=$PATH:$pkg/bin export PATH=$PATH:$pkg/bin
done done
# mimic behavior of stdenv for `$out` etc. for structured attrs.
if [ -n "''${ATTRS_SH_FILE}" ]; then
for o in "''${!outputs[@]}"; do
eval "''${o}=''${outputs[$o]}"
export "''${o}"
done
fi
''; '';
stdenv = mkDerivation { stdenv = mkDerivation {

View file

@ -6,10 +6,12 @@ let
mkdir $out; echo bla > $out/bla mkdir $out; echo bla > $out/bla
''; '';
}; };
inherit (import ./shell.nix { inNixShell = true; }) stdenv;
in in
mkDerivation { mkDerivation {
name = "structured2"; name = "structured2";
__structuredAttrs = true; __structuredAttrs = true;
inherit stdenv;
outputs = [ "out" "dev" ]; outputs = [ "out" "dev" ];
my.list = [ "a" "b" "c" ]; my.list = [ "a" "b" "c" ];
exportReferencesGraph.refs = [ dep ]; exportReferencesGraph.refs = [ dep ];

View file

@ -12,3 +12,8 @@ nix-build structured-attrs.nix -A all -o $TEST_ROOT/result
export NIX_BUILD_SHELL=$SHELL export NIX_BUILD_SHELL=$SHELL
env NIX_PATH=nixpkgs=shell.nix nix-shell structured-attrs-shell.nix \ env NIX_PATH=nixpkgs=shell.nix nix-shell structured-attrs-shell.nix \
--run 'test -e .attrs.json; test "3" = "$(jq ".my.list|length" < $ATTRS_JSON_FILE)"' --run 'test -e .attrs.json; test "3" = "$(jq ".my.list|length" < $ATTRS_JSON_FILE)"'
# `nix develop` is a slightly special way of dealing with environment vars, it parses
# these from a shell-file exported from a derivation. This is to test especially `outputs`
# (which is an associative array in thsi case) being fine.
nix develop -f structured-attrs-shell.nix -c bash -c 'test -n "$out"'