-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
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
Improve support for relative path inputs #10089
Conversation
🎉 All dependencies have been resolved ! |
Discussed during the Nix maintainers meeting on 2024-03-04.
|
This pull request has been mentioned on NixOS Discourse. There might be relevant details there: https://discourse.nixos.org/t/2024-03-04-nix-team-meeting-minute-130/40830/1 |
…re path This is needed for the path:// input scheme (until it returns a FSInputAccessor to the original path, but that's blocked by NixOS#10089) and the Mercurial input scheme.
…re path This is needed for the path:// input scheme (until it returns a FSInputAccessor to the original path, but that's blocked by NixOS#10089) and the Mercurial input scheme.
47ccb1d
to
690281f
Compare
Subflakes are flakes in the same tree, accessed in flake inputs via relative paths (e.g. `inputs.foo.url = "path:./subdir"`). Previously these didn't work very well because they would be separately copied to the store, which is inefficient and makes references to parent directories tricky or impossible. Furthermore, they had their own NAR hash in the lock file, which is superfluous since the parent is already locked. Now subflakes are accessed via the accessor of the calling flake. This avoids the unnecessary copy and makes it possible for subflakes to depend on flakes in a parent directory (so long as they're in the same tree). Lock file nodes for relative flake inputs now have a new `parent` field: { "locked": { "path": "./subdir", "type": "path" }, "original": { "path": "./subdir", "type": "path" }, "parent": [ "foo", "bar" ] } which denotes that `./subdir` is to be interpreted relative to the directory of the `bar` input of the `foo` input of the root flake. Extracted from the lazy-trees branch.
`parentNode.sourceInfo.outPath` does not include the subdir of the parent flake, while `parentNode.outPath` does. So we need to use the latter.
Relative path flakes ("subflakes") are basically fundamentally broken, since they produce lock file entries like "locked": { "lastModified": 1, "narHash": "sha256-/2tW9SKjQbRLzfcJs5SHijli6l3+iPr1235zylGynK8=", "path": "./flakeC", "type": "path" }, that don't specify what "./flakeC" is relative to. They *sometimes* worked by accident because the `narHash` field allowed `fetchToStore()` to get the store path of the subflake *if* it happened to exist in the local store or in a substituter. Subflakes are properly fixed in NixOS#10089 (which adds a "parent" field to the lock file). Rather than come up with some crazy hack to make them work in the interim, let's just disable the only test that depends on the broken behaviour for now.
…Jobs.tests.functional_user
Added a release note. IMHO this is ready to be merged. |
Since ff8e2fe, 'path:' URLs on the CLI are interpreted as relative to the current directory of the user, not the path of the flake we're overriding.
This pull request has been mentioned on NixOS Discourse. There might be relevant details there: https://discourse.nixos.org/t/2024-01-15-nix-team-meeting-minutes-208/58993/1 |
Maybe I misunderstood something or made a mistake somewhere, but I also tried |
Is your flake in a git repo? If not, that would explain the symptoms. IMO a flake should be self-contained unless a flake attribute specifies otherwise. Flakes that aren't in a repo are assumed to be self-contained, or in a more practical sense copied at the Alternatively, we'll also want attributes that specify how a flake should be fetch, e.g. enable submodules or lfs. Those could also be assigned the responsibility to determine the flake source root, such that |
@roberth, the main flake and the "subflake" both were in the same Git repo. I had the following layout:
I have specified I wanted to access Well, I figured how to achieve this also using To be clear, maybe I just did something wrong. |
We have a few test cases here that suggest it should work, but maybe yours is more complicated than what we have? |
I'm pretty sure I was in the subdirectory, the top level flake didn't have any nixosConfigurations. I'll try to see what's going on tomorrow, thanks for the link to the tests. |
@roberth, alright, I was doing something wrong, it works. Sorry for bothering. However I think I found out why I was confused, I think it's an issue with
{
inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
outputs = inputs: {
nixosConfigurations.test = inputs.nixpkgs.lib.nixosSystem {
modules = [
{
nixpkgs.system = "aarch64-linux";
fileSystems."/".device = "/dev/null";
boot.loader.systemd-boot.enable = true;
environment.etc.my-test.text = builtins.readFile ../test;
}
];
};
};
} All of the following is executed in Test 1. $ nix repl
nix-repl> :lf .
nix-repl> nixosConfigurations.test.config.environment.etc.my-test.text
"Test\n" This works as I expect it to work. Test 2.
This works as I expect it to work. Test 3.
I expected Can you confirm if this is a bug, at least conceptually? |
This pull request has been mentioned on NixOS Discourse. There might be relevant details there: https://discourse.nixos.org/t/relative-path-support-for-nix-flakes/18795/7 |
This pull request has been mentioned on NixOS Discourse. There might be relevant details there: |
Motivation
We want it to be possible to refer to flake inputs that reside in the same repo via relative paths (e.g.
inputs.foo.url = "path:./subdir"
). Previously this didn't work very well because those inputs would be separately copied to the store, which is inefficient and makes references to parent directories tricky or impossible. Furthermore, they had their own NAR hash in the lock file, which is superfluous since the parent is already locked. In fact, if relative path inputs worked at all, it was by accident.Now relative path inputs are accessed via the accessor of the calling flake. This avoids the unnecessary copy and makes it possible for relative path inputs to depend on flakes in a parent directory (so long as they're in the same tree).
Lock file nodes for relative path inputs now have a new
parent
field:which denotes that
./subdir
is to be interpreted relative to the directory of thebar
input of thefoo
input of the root flake.Extracted from the lazy-trees branch.
Context
Priorities and Process
Add 👍 to pull requests you find important.
The Nix maintainer team uses a GitHub project board to schedule and track reviews.