refactor: allow copy operation with whitelist

Signed-off-by: Sefa Eyeoglu <contact@scrumplex.net>
This commit is contained in:
Sefa Eyeoglu 2022-10-22 23:25:14 +02:00
parent ddfb449b28
commit e048bce13e
No known key found for this signature in database
GPG Key ID: C10411294912A422
4 changed files with 47 additions and 6 deletions

View File

@ -174,7 +174,7 @@ bool copy::operator()(const QString& offset)
// Function that'll do the actual copying // Function that'll do the actual copying
auto copy_file = [&](QString src_path, QString relative_dst_path) { auto copy_file = [&](QString src_path, QString relative_dst_path) {
if (m_blacklist && m_blacklist->matches(relative_dst_path)) if (m_matcher && (m_matcher->matches(relative_dst_path) == !m_whitelist))
return; return;
auto dst_path = PathCombine(dst, relative_dst_path); auto dst_path = PathCombine(dst, relative_dst_path);

View File

@ -88,9 +88,14 @@ class copy {
m_followSymlinks = follow; m_followSymlinks = follow;
return *this; return *this;
} }
copy& blacklist(const IPathMatcher* filter) copy& matcher(const IPathMatcher* filter)
{ {
m_blacklist = filter; m_matcher = filter;
return *this;
}
copy& whitelist(bool whitelist)
{
m_whitelist = whitelist;
return *this; return *this;
} }
bool operator()() { return operator()(QString()); } bool operator()() { return operator()(QString()); }
@ -100,7 +105,8 @@ class copy {
private: private:
bool m_followSymlinks = true; bool m_followSymlinks = true;
const IPathMatcher* m_blacklist = nullptr; const IPathMatcher* m_matcher = nullptr;
bool m_whitelist = false;
QDir m_src; QDir m_src;
QDir m_dst; QDir m_dst;
}; };

View File

@ -26,7 +26,7 @@ void InstanceCopyTask::executeTask()
setStatus(tr("Copying instance %1").arg(m_origInstance->name())); setStatus(tr("Copying instance %1").arg(m_origInstance->name()));
FS::copy folderCopy(m_origInstance->instanceRoot(), m_stagingPath); FS::copy folderCopy(m_origInstance->instanceRoot(), m_stagingPath);
folderCopy.followSymlinks(false).blacklist(m_matcher.get()); folderCopy.followSymlinks(false).matcher(m_matcher.get());
m_copyFuture = QtConcurrent::run(QThreadPool::globalInstance(), folderCopy); m_copyFuture = QtConcurrent::run(QThreadPool::globalInstance(), folderCopy);
connect(&m_copyFutureWatcher, &QFutureWatcher<bool>::finished, this, &InstanceCopyTask::copyFinished); connect(&m_copyFutureWatcher, &QFutureWatcher<bool>::finished, this, &InstanceCopyTask::copyFinished);

View File

@ -126,7 +126,7 @@ slots:
qDebug() << tempDir.path(); qDebug() << tempDir.path();
qDebug() << target_dir.path(); qDebug() << target_dir.path();
FS::copy c(folder, target_dir.path()); FS::copy c(folder, target_dir.path());
c.blacklist(new RegexpMatcher("[.]?mcmeta")); c.matcher(new RegexpMatcher("[.]?mcmeta"));
c(); c();
for(auto entry: target_dir.entryList()) for(auto entry: target_dir.entryList())
@ -147,6 +147,41 @@ slots:
f(); f();
} }
void test_copy_with_whitelist()
{
QString folder = QFINDTESTDATA("testdata/FileSystem/test_folder");
auto f = [&folder]()
{
QTemporaryDir tempDir;
tempDir.setAutoRemove(true);
qDebug() << "From:" << folder << "To:" << tempDir.path();
QDir target_dir(FS::PathCombine(tempDir.path(), "test_folder"));
qDebug() << tempDir.path();
qDebug() << target_dir.path();
FS::copy c(folder, target_dir.path());
c.matcher(new RegexpMatcher("[.]?mcmeta"));
c.whitelist(true);
c();
for(auto entry: target_dir.entryList())
{
qDebug() << entry;
}
QVERIFY(target_dir.entryList().contains("pack.mcmeta"));
QVERIFY(!target_dir.entryList().contains("assets"));
};
// first try variant without trailing /
QVERIFY(!folder.endsWith('/'));
f();
// then variant with trailing /
folder.append('/');
QVERIFY(folder.endsWith('/'));
f();
}
void test_copy_with_dot_hidden() void test_copy_with_dot_hidden()
{ {
QString folder = QFINDTESTDATA("testdata/FileSystem/test_folder"); QString folder = QFINDTESTDATA("testdata/FileSystem/test_folder");