Closed lukateras closed 4 years ago
I wonder if name: type: !(type == "directory" && builtins.readDir name == {})
would work.
We probably have to ignore directories with all-ignored files, but I haven't confirmed this yet.
Can confirm:
$ tree
.
└── hello
└── foo
$ cat .gitignore
/hello/foo
$ git status
On branch master
nothing to commit, working tree clean
It seems like an imminent flaw of builtins.path
which use filter function result for both action: visiting the directory and including directory in the output.
If a directory have to be visited, it will be included into the output. Even if no interesting files are found inside
So "ignore directories with all-ignored files" is the best we can do without resorting to C++ coding
@kvtb nothing stops you from using readDir
and "visiting" the files inside, as demonstrated in the PR that resolved this issue, #23.
The Nix builtins are designed to be minimal but powerful. Friendlier interfaces can be implemented in Nix itself, as deemed useful by Nixpkgs lib
contributors and other library authors.
It seems that one of the few remaining sources of mismatch between Git ignore logic and
hercules-ci/gitignore
is empty directory handling: Git will effectively ignore any empty directory, whilegitignoreFilter
does not.