diff --git a/src/libexpr/flake/call-flake.nix b/src/libexpr/flake/call-flake.nix index 7dc03e7f5..4beb0b0fe 100644 --- a/src/libexpr/flake/call-flake.nix +++ b/src/libexpr/flake/call-flake.nix @@ -9,16 +9,14 @@ let (key: node: let - rawSourceInfo = + sourceInfo = if key == lockFile.root then rootSrc else fetchTree (node.info or {} // removeAttrs node.locked ["dir"]); subdir = if key == lockFile.root then rootSubdir else node.locked.dir or ""; - outPath = rawSourceInfo + ((if subdir == "" then "" else "/") + subdir); - - sourceInfo = rawSourceInfo // { inherit outPath; }; + outPath = sourceInfo + ((if subdir == "" then "" else "/") + subdir); flake = import (outPath + "/flake.nix"); @@ -47,7 +45,21 @@ let outputs = flake.outputs (inputs // { self = result; }); - result = outputs // sourceInfo // { inherit inputs; inherit outputs; inherit sourceInfo; _type = "flake"; }; + result = + outputs + # We add the sourceInfo attribute for its metadata, as they are + # relevant metadata for the flake. However, the outPath of the + # sourceInfo does not necessarily match the outPath of the flake, + # as the flake may be in a subdirectory of a source. + # This is shadowed in the next // + // sourceInfo + // { + # This shadows the sourceInfo.outPath + inherit outPath; + + inherit inputs; inherit outputs; inherit sourceInfo; _type = "flake"; + }; + in if node.flake or true then assert builtins.isFunction flake.outputs; diff --git a/tests/flakes/inputs.sh b/tests/flakes/inputs.sh index d6269fc59..80620488a 100644 --- a/tests/flakes/inputs.sh +++ b/tests/flakes/inputs.sh @@ -46,6 +46,7 @@ test_git_subdir_self_path() { default = assert builtins.readFile ./message == "all good\n"; assert builtins.readFile (inputs.self + "/message") == "all good\n"; + assert inputs.self.outPath == inputs.self.sourceInfo.outPath + "/b-low"; import ./simple.nix; }; };