CppTools: Tests: Fix QTemporaryDir warning on Windows

...coming from TemporaryCopiedDir.

The warning was:

	QTemporaryDir: Unable to remove <some path> most likely due to the presence
	               of read-only files.

It occurred for plugin tests (e.g ClangCodeModel) that used a Qt resource path
as source for TemporaryCopiedDir. Copying a qrc file makes it read-only, see
also QTBUG-17163. Therefore, explicitly add the write permission.

Change-Id: Idc04acd4844c5bc20e9b3de1efc78da3b06ac97c
Reviewed-by: Christian Stenger <christian.stenger@theqtcompany.com>
Reviewed-by: Marco Bubke <marco.bubke@theqtcompany.com>
This commit is contained in:
Nikolai Kosjar
2015-07-01 11:47:17 +02:00
parent dace404ca3
commit 8cb7d68cf6

View File

@@ -294,23 +294,51 @@ QString TemporaryDir::createFile(const QByteArray &relativePath, const QByteArra
return filePath;
}
static bool copyRecursively(const QString &sourceDirPath,
const QString &targetDirPath,
QString *error)
{
auto copyHelper = [](QFileInfo sourceInfo, QFileInfo targetInfo, QString *error) -> bool {
const QString sourcePath = sourceInfo.absoluteFilePath();
const QString targetPath = targetInfo.absoluteFilePath();
if (!QFile::copy(sourcePath, targetPath)) {
if (error) {
*error = QString::fromLatin1("copyRecursively() failed: \"%1\" to \"%2\".")
.arg(sourcePath, targetPath);
}
return false;
}
// Copied files from Qt resources are read-only. Make them writable
// so that their parent directory can be removed without warnings.
QFile file(targetPath);
return file.setPermissions(file.permissions() | QFile::WriteUser);
};
return Utils::FileUtils::copyRecursively(Utils::FileName::fromString(sourceDirPath),
Utils::FileName::fromString(targetDirPath),
error,
copyHelper);
}
TemporaryCopiedDir::TemporaryCopiedDir(const QString &sourceDirPath)
{
if (!m_isValid)
return;
if (!sourceDirPath.isEmpty()) {
QFileInfo fi(sourceDirPath);
if (!fi.exists() || !fi.isReadable()) {
m_isValid = false;
return;
}
if (sourceDirPath.isEmpty())
return;
if (!Utils::FileUtils::copyRecursively(Utils::FileName::fromString(sourceDirPath),
Utils::FileName::fromString(path()))) {
m_isValid = false;
return;
}
QFileInfo fi(sourceDirPath);
if (!fi.exists() || !fi.isReadable()) {
m_isValid = false;
return;
}
QString errorMessage;
if (!copyRecursively(sourceDirPath, path(), &errorMessage)) {
QWARN(qPrintable(errorMessage));
m_isValid = false;
}
}