-
-
Notifications
You must be signed in to change notification settings - Fork 1.9k
nix flakes: add support for git submodules #4423
Description
I recently learned about Nix Flakes, and I tried out making my blog a perfectly reproducible build. The trouble is, my blog uses a Git submodule to reference some code that I then present in my blog posts. This is fine and all, but I run into an issue - although I can fetch my blog source using Flakes' input attribute, it doesn't fetch submodules! This means that the code that I reference in my build process is simply not there.
This seems to be almost possible; from a brief glance around Nix's source code, I discovered that a flake input gets turned into a "regular" input, which can point to a git repo and have a submodules attribute that, I think, would do what I want. It feels as though it was intended that this would work, but it doesn't.
It doesn't work because, for a reason unknown to me, a flake input's attributes must all be strings (except for flake). Here's the code that rejects non-string arguments:
nix/src/libexpr/flake/flake.cc
Lines 123 to 127 in 724b7f4
| if (attr.value->type() == nString) | |
| attrs.emplace(attr.name, attr.value->string.s); | |
| else | |
| throw TypeError("flake input attribute '%s' is %s while a string is expected", | |
| attr.name, showType(*attr.value)); |
If non-string arguments were not rejected, a submodules field could be forwarded to the Git input scheme, which I suspect would make this work. Is there a reason that Flakes rejects all non-string "third party" attributes? It puts them into an attribute set anyway. Right now, I'm falling into a rather amusing loop:
If submodules is a string, it's rejected by the Git input scheme. But if it's a bool, it's rejected by the Flake code.
