From 0220fe4f9d7f07fa137a11597b3465c76cfbcae3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Petr=20Mr=C3=A1zek?= Date: Tue, 7 Apr 2015 18:16:02 +0200 Subject: GH-228 do not follow symlinks during instance copy on unix Windows will need a more complex solution. --- depends/util/src/pathutils.cpp | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) (limited to 'depends/util/src/pathutils.cpp') 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 #include #include +#include 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) -- cgit v1.2.3