diff --git a/src/libfetchers/git.cc b/src/libfetchers/git.cc index 7c1630167..a8a52ef30 100644 --- a/src/libfetchers/git.cc +++ b/src/libfetchers/git.cc @@ -496,6 +496,36 @@ struct GitInputScheme : InputScheme Git interprets them as part of the file name. So get rid of them. */ url.query.clear(); + /* Backward compatibility hack: In old versions of Nix, if you had + a flake input like + + inputs.foo.url = "git+https://foo/bar?dir=subdir"; + + it would result in a lock file entry like + + "original": { + "dir": "subdir", + "type": "git", + "url": "https://foo/bar?dir=subdir" + } + + New versions of Nix remove `?dir=subdir` from the `url` field, + since the subdirectory is intended for `FlakeRef`, not the + fetcher (and specifically the remote server), that is, the + flakeref is parsed into + + "original": { + "dir": "subdir", + "type": "git", + "url": "https://foo/bar" + } + + However, new versions of nix parsing old flake.lock files would pass the dir= + query parameter in the "url" attribute to git, which will then complain. + + For this reason, we filtering the `dir` query parameter from the URL + before passing it to git. */ + url.query.erase("dir"); repoInfo.location = url; }