aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSefa Eyeoglu <contact@scrumplex.net>2022-10-22 23:25:14 +0200
committerSefa Eyeoglu <contact@scrumplex.net>2022-11-12 20:27:13 +0100
commite048bce13ea4bd56ef96ba7a1a4699142d09600a (patch)
treee7d21af731edf70e139b2bef9ac1fa81246cfd2f
parentddfb449b28fb24f1c3e4ed3802ee4415206f96f1 (diff)
downloadPrismLauncher-e048bce13ea4bd56ef96ba7a1a4699142d09600a.tar.gz
PrismLauncher-e048bce13ea4bd56ef96ba7a1a4699142d09600a.tar.bz2
PrismLauncher-e048bce13ea4bd56ef96ba7a1a4699142d09600a.zip
refactor: allow copy operation with whitelist
Signed-off-by: Sefa Eyeoglu <contact@scrumplex.net>
-rw-r--r--launcher/FileSystem.cpp2
-rw-r--r--launcher/FileSystem.h12
-rw-r--r--launcher/InstanceCopyTask.cpp2
-rw-r--r--tests/FileSystem_test.cpp37
4 files changed, 47 insertions, 6 deletions
diff --git a/launcher/FileSystem.cpp b/launcher/FileSystem.cpp
index 4a8f4bd3..a3b9fe1f 100644
--- a/launcher/FileSystem.cpp
+++ b/launcher/FileSystem.cpp
@@ -174,7 +174,7 @@ bool copy::operator()(const QString& offset)
// Function that'll do the actual copying
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;
auto dst_path = PathCombine(dst, relative_dst_path);
diff --git a/launcher/FileSystem.h b/launcher/FileSystem.h
index b7e175fd..e239984e 100644
--- a/launcher/FileSystem.h
+++ b/launcher/FileSystem.h
@@ -88,9 +88,14 @@ class copy {
m_followSymlinks = follow;
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;
}
bool operator()() { return operator()(QString()); }
@@ -100,7 +105,8 @@ class copy {
private:
bool m_followSymlinks = true;
- const IPathMatcher* m_blacklist = nullptr;
+ const IPathMatcher* m_matcher = nullptr;
+ bool m_whitelist = false;
QDir m_src;
QDir m_dst;
};
diff --git a/launcher/InstanceCopyTask.cpp b/launcher/InstanceCopyTask.cpp
index a4ea947d..fb118353 100644
--- a/launcher/InstanceCopyTask.cpp
+++ b/launcher/InstanceCopyTask.cpp
@@ -26,7 +26,7 @@ void InstanceCopyTask::executeTask()
setStatus(tr("Copying instance %1").arg(m_origInstance->name()));
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);
connect(&m_copyFutureWatcher, &QFutureWatcher<bool>::finished, this, &InstanceCopyTask::copyFinished);
diff --git a/tests/FileSystem_test.cpp b/tests/FileSystem_test.cpp
index 21270f6f..3a5c38d0 100644
--- a/tests/FileSystem_test.cpp
+++ b/tests/FileSystem_test.cpp
@@ -126,7 +126,7 @@ slots:
qDebug() << tempDir.path();
qDebug() << target_dir.path();
FS::copy c(folder, target_dir.path());
- c.blacklist(new RegexpMatcher("[.]?mcmeta"));
+ c.matcher(new RegexpMatcher("[.]?mcmeta"));
c();
for(auto entry: target_dir.entryList())
@@ -147,6 +147,41 @@ slots:
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()
{
QString folder = QFINDTESTDATA("testdata/FileSystem/test_folder");