diff options
author | Petr Mrázek <peterix@gmail.com> | 2015-04-07 18:16:02 +0200 |
---|---|---|
committer | Petr Mrázek <peterix@gmail.com> | 2015-04-13 00:06:31 +0200 |
commit | 0220fe4f9d7f07fa137a11597b3465c76cfbcae3 (patch) | |
tree | e803758112d4dec1ed56929e517e88595616b3e7 /depends/util | |
parent | 58840ac10cc7aac866d61cbcece3c3b9be1af8b4 (diff) | |
download | MultiMC-0220fe4f9d7f07fa137a11597b3465c76cfbcae3.tar MultiMC-0220fe4f9d7f07fa137a11597b3465c76cfbcae3.tar.gz MultiMC-0220fe4f9d7f07fa137a11597b3465c76cfbcae3.tar.lz MultiMC-0220fe4f9d7f07fa137a11597b3465c76cfbcae3.tar.xz MultiMC-0220fe4f9d7f07fa137a11597b3465c76cfbcae3.zip |
GH-228 do not follow symlinks during instance copy on unix
Windows will need a more complex solution.
Diffstat (limited to 'depends/util')
-rw-r--r-- | depends/util/include/pathutils.h | 2 | ||||
-rw-r--r-- | depends/util/src/pathutils.cpp | 40 |
2 files changed, 31 insertions, 11 deletions
diff --git a/depends/util/include/pathutils.h b/depends/util/include/pathutils.h index 2cc65db5..a506280e 100644 --- a/depends/util/include/pathutils.h +++ b/depends/util/include/pathutils.h @@ -51,7 +51,7 @@ LIBUTIL_EXPORT bool ensureFilePathExists(QString filenamepath); */ LIBUTIL_EXPORT bool ensureFolderPathExists(QString filenamepath); -LIBUTIL_EXPORT bool copyPath(QString src, QString dst); +LIBUTIL_EXPORT bool copyPath(QString src, QString dst, bool follow_symlinks = true); /// Opens the given file in the default application. LIBUTIL_EXPORT void openFileInDefaultProgram(QString filename); diff --git a/depends/util/src/pathutils.cpp b/depends/util/src/pathutils.cpp index a193212c..1cbb2cb2 100644 --- a/depends/util/src/pathutils.cpp +++ b/depends/util/src/pathutils.cpp @@ -19,6 +19,7 @@ #include <QDir> #include <QDesktopServices> #include <QUrl> +#include <QDebug> QString PathCombine(QString path1, QString path2) { @@ -111,26 +112,45 @@ bool ensureFolderPathExists(QString foldernamepath) return success; } -bool copyPath(QString src, QString dst) +bool copyPath(QString src, QString dst, bool follow_symlinks) { + //NOTE always deep copy on windows. the alternatives are too messy. + #if defined Q_OS_WIN32 + follow_symlinks = true; + #endif + QDir dir(src); if (!dir.exists()) return false; if (!ensureFolderPathExists(dst)) return false; - foreach(QString d, dir.entryList(QDir::Dirs | QDir::NoDotAndDotDot)) - { - QString inner_src = src + QDir::separator() + d; - QString inner_dst = dst + QDir::separator() + d; - copyPath(inner_src, inner_dst); - } + bool OK = true; - foreach(QString f, dir.entryList(QDir::Files)) + foreach(QString f, dir.entryList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot | QDir::Hidden | QDir::System)) { - QFile::copy(src + QDir::separator() + f, dst + QDir::separator() + f); + QString inner_src = src + QDir::separator() + f; + QString inner_dst = dst + QDir::separator() + f; + QFileInfo fileInfo(inner_src); + if(!follow_symlinks && fileInfo.isSymLink()) + { + OK &= QFile::link(fileInfo.symLinkTarget(),inner_dst); + } + else if (fileInfo.isDir()) + { + OK &= copyPath(inner_src, inner_dst, follow_symlinks); + } + else if (fileInfo.isFile()) + { + OK &= QFile::copy(inner_src, inner_dst); + } + else + { + OK = false; + qCritical() << "Copy ERROR: Unknown filesystem object:" << inner_src; + } } - return true; + return OK; } void openDirInDefaultProgram(QString path, bool ensureExists) |