summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--qmake/main.cpp42
-rw-r--r--tests/auto/tools/qmake/tst_qmake.cpp3
2 files changed, 36 insertions, 9 deletions
diff --git a/qmake/main.cpp b/qmake/main.cpp
index a598296898..dd1cca9633 100644
--- a/qmake/main.cpp
+++ b/qmake/main.cpp
@@ -242,6 +242,39 @@ static int doLink(int argc, char **argv)
#endif
+static bool setFilePermissions(QFile &file, QFileDevice::Permissions permissions)
+{
+ if (file.setPermissions(permissions))
+ return true;
+ fprintf(stderr, "Error setting permissions on %s: %s\n",
+ qPrintable(file.fileName()), qPrintable(file.errorString()));
+ return false;
+}
+
+static bool copyFileTimes(QFile &targetFile, const QString &sourceFilePath,
+ bool mustEnsureWritability, QString *errorString)
+{
+#ifdef Q_OS_WIN
+ bool mustRestorePermissions = false;
+ QFileDevice::Permissions targetPermissions;
+ if (mustEnsureWritability) {
+ targetPermissions = targetFile.permissions();
+ if (!targetPermissions.testFlag(QFileDevice::WriteUser)) {
+ mustRestorePermissions = true;
+ if (!setFilePermissions(targetFile, targetPermissions | QFileDevice::WriteUser))
+ return false;
+ }
+ }
+#endif
+ if (!IoUtils::touchFile(targetFile.fileName(), sourceFilePath, errorString))
+ return false;
+#ifdef Q_OS_WIN
+ if (mustRestorePermissions && !setFilePermissions(targetFile, targetPermissions))
+ return false;
+#endif
+ return true;
+}
+
static int installFile(const QString &source, const QString &target, bool exe = false,
bool preservePermissions = false)
{
@@ -270,18 +303,15 @@ static int installFile(const QString &source, const QString &target, bool exe =
targetPermissions |= QFileDevice::ExeOwner | QFileDevice::ExeUser |
QFileDevice::ExeGroup | QFileDevice::ExeOther;
}
- if (!targetFile.setPermissions(targetPermissions)) {
- fprintf(stderr, "Error setting permissions on %s: %s\n",
- qPrintable(target), qPrintable(targetFile.errorString()));
+ if (!setFilePermissions(targetFile, targetPermissions))
return 3;
- }
- // Copy file times
QString error;
- if (!IoUtils::touchFile(target, sourceFile.fileName(), &error)) {
+ if (!copyFileTimes(targetFile, sourceFile.fileName(), preservePermissions, &error)) {
fprintf(stderr, "%s", qPrintable(error));
return 3;
}
+
return 0;
}
diff --git a/tests/auto/tools/qmake/tst_qmake.cpp b/tests/auto/tools/qmake/tst_qmake.cpp
index 8ca367773d..09e725f98a 100644
--- a/tests/auto/tools/qmake/tst_qmake.cpp
+++ b/tests/auto/tools/qmake/tst_qmake.cpp
@@ -679,9 +679,6 @@ void tst_qmake::qinstall()
QFile srcfile(src.filePath("main.cpp"));
QVERIFY(srcfile.setPermissions(srcfile.permissions() & ~writeFlags));
QDir dst("zort");
-#ifdef Q_OS_WIN
- QEXPECT_FAIL("", "QTBUG-77299", Abort);
-#endif
QVERIFY(qinstall(src.absolutePath(), dst.absolutePath()));
QCOMPARE(src.entryList(QDir::Files, QDir::Name), dst.entryList(QDir::Files, QDir::Name));
}