Add testcase for nix develop
with __structuredAttrs
This commit is contained in:
parent
f1e281c4fe
commit
3504c811a5
|
@ -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)) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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 ];
|
||||||
|
|
|
@ -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"'
|
||||||
|
|
Loading…
Reference in a new issue