db/update/Walk: load all .mpdignore files of all parent directories

When updating everything, this did work, but if updating only a
subdirectory, the ".mpdignore" in the parents were not used.

Closes https://github.com/MusicPlayerDaemon/MPD/issues/1172
This commit is contained in:
Max Kellermann 2021-05-25 22:35:18 +02:00
parent db0682a469
commit 363d9f0180
2 changed files with 26 additions and 3 deletions

2
NEWS
View File

@ -1,4 +1,6 @@
ver 0.22.9 (not yet released)
* database
- simple: load all .mpdignore files of all parent directories
* Windows
- fix build failure with SQLite

View File

@ -458,6 +458,28 @@ UpdateWalk::DirectoryMakeUriParentChecked(Directory &root,
return directory;
}
static void
LoadExcludeLists(std::forward_list<ExcludeList> &lists,
const Storage &storage, const Directory &directory) noexcept
{
assert(!lists.empty());
if (!directory.IsRoot())
LoadExcludeLists(lists, storage, *directory.parent);
lists.emplace_front();
LoadExcludeListOrLog(storage, directory, lists.front());
}
static auto
LoadExcludeLists(const Storage &storage, const Directory &directory) noexcept
{
std::forward_list<ExcludeList> lists;
lists.emplace_front();
LoadExcludeLists(lists, storage, directory);
return lists;
}
inline void
UpdateWalk::UpdateUri(Directory &root, const char *uri) noexcept
try {
@ -478,9 +500,8 @@ try {
return;
}
ExcludeList exclude_list;
UpdateDirectoryChild(*parent, exclude_list, name, info);
const auto exclude_lists = LoadExcludeLists(storage, *parent);
UpdateDirectoryChild(*parent, exclude_lists.front(), name, info);
} catch (...) {
LogError(std::current_exception());
}