Merge branch 'v0.20.x'
This commit is contained in:
@@ -26,8 +26,7 @@
|
||||
#include "ExcludeList.hxx"
|
||||
#include "fs/Path.hxx"
|
||||
#include "fs/NarrowPath.hxx"
|
||||
#include "fs/io/TextFile.hxx"
|
||||
#include "system/Error.hxx"
|
||||
#include "input/TextInputStream.hxx"
|
||||
#include "util/StringStrip.hxx"
|
||||
#include "Log.hxx"
|
||||
|
||||
@@ -36,35 +35,29 @@
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
inline void
|
||||
ExcludeList::ParseLine(char *line) noexcept
|
||||
{
|
||||
char *p = Strip(line);
|
||||
if (*p != 0 && *p != '#')
|
||||
patterns.emplace_front(p);
|
||||
}
|
||||
|
||||
bool
|
||||
ExcludeList::LoadFile(Path path_fs) noexcept
|
||||
try {
|
||||
ExcludeList::Load(InputStreamPtr is)
|
||||
{
|
||||
#ifdef HAVE_CLASS_GLOB
|
||||
TextFile file(path_fs);
|
||||
TextInputStream tis(std::move(is));
|
||||
|
||||
char *line;
|
||||
while ((line = file.ReadLine()) != nullptr) {
|
||||
char *p = strchr(line, '#');
|
||||
if (p != nullptr)
|
||||
*p = 0;
|
||||
|
||||
p = Strip(line);
|
||||
if (*p != 0)
|
||||
patterns.emplace_front(p);
|
||||
}
|
||||
while ((line = tis.ReadLine()) != nullptr)
|
||||
ParseLine(line);
|
||||
#else
|
||||
/* not implemented */
|
||||
(void)path_fs;
|
||||
#endif
|
||||
|
||||
return true;
|
||||
} catch (const std::system_error &e) {
|
||||
if (!IsFileNotFound(e))
|
||||
LogError(e);
|
||||
return false;
|
||||
} catch (...) {
|
||||
LogError(std::current_exception());
|
||||
return false;
|
||||
}
|
||||
|
||||
bool
|
||||
|
@@ -28,6 +28,7 @@
|
||||
#include "check.h"
|
||||
#include "Compiler.h"
|
||||
#include "fs/Glob.hxx"
|
||||
#include "input/Ptr.hxx"
|
||||
|
||||
#ifdef HAVE_CLASS_GLOB
|
||||
#include <forward_list>
|
||||
@@ -62,13 +63,16 @@ public:
|
||||
/**
|
||||
* Loads and parses a .mpdignore file.
|
||||
*/
|
||||
bool LoadFile(Path path_fs) noexcept;
|
||||
bool Load(InputStreamPtr is);
|
||||
|
||||
/**
|
||||
* Checks whether one of the patterns in the .mpdignore file matches
|
||||
* the specified file name.
|
||||
*/
|
||||
bool Check(Path name_fs) const noexcept;
|
||||
|
||||
private:
|
||||
void ParseLine(char *line) noexcept;
|
||||
};
|
||||
|
||||
|
||||
|
@@ -36,6 +36,8 @@
|
||||
#include "fs/Traits.hxx"
|
||||
#include "fs/FileSystem.hxx"
|
||||
#include "storage/FileInfo.hxx"
|
||||
#include "input/InputStream.hxx"
|
||||
#include "input/Error.hxx"
|
||||
#include "util/Alloc.hxx"
|
||||
#include "util/StringCompare.hxx"
|
||||
#include "util/UriUtil.hxx"
|
||||
@@ -346,11 +348,15 @@ UpdateWalk::UpdateDirectory(Directory &directory,
|
||||
|
||||
ExcludeList child_exclude_list(exclude_list);
|
||||
|
||||
{
|
||||
const auto exclude_path_fs =
|
||||
storage.MapChildFS(directory.GetPath(), ".mpdignore");
|
||||
if (!exclude_path_fs.IsNull())
|
||||
child_exclude_list.LoadFile(exclude_path_fs);
|
||||
try {
|
||||
Mutex mutex;
|
||||
auto is = InputStream::OpenReady(PathTraitsUTF8::Build(storage.MapUTF8(directory.GetPath()).c_str(),
|
||||
".mpdignore").c_str(),
|
||||
mutex);
|
||||
child_exclude_list.Load(std::move(is));
|
||||
} catch (...) {
|
||||
if (!IsFileNotFound(std::current_exception()))
|
||||
LogError(std::current_exception());
|
||||
}
|
||||
|
||||
if (!child_exclude_list.IsEmpty())
|
||||
|
Reference in New Issue
Block a user