GH-228 do not follow symlinks during instance copy on unix
Windows will need a more complex solution.
This commit is contained in:
parent
58840ac10c
commit
0220fe4f9d
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user