buildEnv: build the whole tree of directories to pathsToLink
This patch fixes #16614 and #16741. The first issue was caused by the fact that both `/share` and `/share/fish/vendor_completions.d` end in the `pathsToLink`. The `pkgs/build-support/buildenv/builder.pl` creates `/share`, then links `/share/fish` under `/share` and then tries to create the directory `/share/fish/vendor_completions.d` and fails because it already exists. The simplest way to reproduce the issue is to build the next Nix expression: ```nix let pkgs = import <nixpkgs> { }; in pkgs.buildEnv { name = "buildenv-issue"; paths = [ pkgs.fish pkgs.vim ]; pathsToLink = [ "/share" "/share/fish/vendor_completions.d" ]; } ``` The second issue is more critical and was caused by the fact findFiles doesn't recurse deep enough. It stops at first unique directory for the package (e.g., "/share" or even "/") and later the scripts decides it shouldn't link it as it doesn't match pathsToLink (e.g., "/share/fish"), so the result is empty. The test: ```nix let pkgs = import <nixpkgs> { }; in pkgs.buildEnv { name = "buildenv-issue"; paths = [ pkgs.fish pkgs.vim ]; pathsToLink = [ "/share/fish/functions" ]; } ``` or ```nix let pkgs = import <nixpkgs> { }; in pkgs.buildEnv { name = "buildenv-issue"; paths = [ pkgs.vim ]; pathsToLink = [ "/share" ]; } ```
This commit is contained in:
parent
f56a319e3e
commit
0172558e82
|
@ -31,9 +31,23 @@ sub isInPathsToLink {
|
||||||
|
|
||||||
my %symlinks;
|
my %symlinks;
|
||||||
|
|
||||||
|
# Add all pathsToLink and all parent directories.
|
||||||
|
#
|
||||||
|
# For "/a/b/c" that will include
|
||||||
|
# [ "", "/a", "/a/b", "/a/b/c" ]
|
||||||
|
#
|
||||||
|
# That ensures the whole directory tree needed by pathsToLink is
|
||||||
|
# created as directories and not symlinks.
|
||||||
|
$symlinks{""} = ["", 0];
|
||||||
for my $p (@pathsToLink) {
|
for my $p (@pathsToLink) {
|
||||||
$p = "" if $p eq "/";
|
my @parts = split '/', $p;
|
||||||
$symlinks{$p} = ["", 0];
|
|
||||||
|
my $cur = "";
|
||||||
|
for my $x (@parts) {
|
||||||
|
$cur = $cur . "/$x";
|
||||||
|
$cur = "" if $cur eq "/";
|
||||||
|
$symlinks{$cur} = ["", 0];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub findFiles;
|
sub findFiles;
|
||||||
|
|
Loading…
Reference in a new issue