GH-228 do not follow symlinks during instance copy on unix

Windows will need a more complex solution.
This commit is contained in:
Petr Mrázek 2015-04-07 18:16:02 +02:00
parent 58840ac10c
commit 0220fe4f9d
3 changed files with 32 additions and 12 deletions

View File

@ -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);

View File

@ -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)

View File

@ -501,7 +501,7 @@ InstanceList::copyInstance(InstancePtr &newInstance, InstancePtr &oldInstance, c
QDir rootDir(instDir);
qDebug() << instDir.toUtf8();
if (!copyPath(oldInstance->instanceRoot(), instDir))
if (!copyPath(oldInstance->instanceRoot(), instDir, false))
{
rootDir.removeRecursively();
return InstanceList::CantCreateDir;