summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKatja Marttila <katja.marttila@qt.io>2018-10-10 11:41:05 +0300
committerKatja Marttila <katja.marttila@qt.io>2018-10-10 11:45:52 +0300
commit70273f9931aad662d1697b142140791a100059f5 (patch)
tree534f6f71b07af9f95d158e41c2e7425d9373d351
parenta03fd459a23e8a72d01f17f529b8c8e5db9baca3 (diff)
parent9d7cff74d94e3a9ee2beaccfa5aa6a15a93585cb (diff)
Merge remote-tracking branch 'origin/3.0' into master
-rw-r--r--src/libs/installer/createdesktopentryoperation.cpp8
-rw-r--r--src/libs/installer/fileutils.cpp25
-rw-r--r--src/libs/installer/installiconsoperation.cpp5
-rw-r--r--src/libs/installer/packagemanagercore.cpp5
-rw-r--r--src/libs/installer/packagemanagercore_p.cpp72
5 files changed, 68 insertions, 47 deletions
diff --git a/src/libs/installer/createdesktopentryoperation.cpp b/src/libs/installer/createdesktopentryoperation.cpp
index ed55cdbf2..d2e71b14f 100644
--- a/src/libs/installer/createdesktopentryoperation.cpp
+++ b/src/libs/installer/createdesktopentryoperation.cpp
@@ -33,7 +33,6 @@
#include <QDir>
#include <QFile>
#include <QFileInfo>
-#include <QProcessEnvironment>
#include <QTextStream>
using namespace QInstaller;
@@ -50,10 +49,11 @@ QString CreateDesktopEntryOperation::absoluteFileName()
if (hasValue(QLatin1String("directory")))
return QDir(value(QLatin1String("directory")).toString()).absoluteFilePath(filename);
- const QProcessEnvironment env;
- QStringList XDG_DATA_DIRS = env.value(QLatin1String("XDG_DATA_DIRS")).split(QLatin1Char(':'),
+ QStringList XDG_DATA_DIRS = QString::fromLocal8Bit(qgetenv("XDG_DATA_DIRS"))
+ .split(QLatin1Char(':'),
QString::SkipEmptyParts);
- QStringList XDG_DATA_HOME = env.value(QLatin1String("XDG_DATA_HOME")).split(QLatin1Char(':'),
+ QStringList XDG_DATA_HOME = QString::fromLocal8Bit(qgetenv("XDG_DATA_HOME"))
+ .split(QLatin1Char(':'),
QString::SkipEmptyParts);
XDG_DATA_DIRS.push_back(QLatin1String("/usr/share")); // default path
diff --git a/src/libs/installer/fileutils.cpp b/src/libs/installer/fileutils.cpp
index 58744b3c2..c142b55f1 100644
--- a/src/libs/installer/fileutils.cpp
+++ b/src/libs/installer/fileutils.cpp
@@ -173,14 +173,23 @@ void QInstaller::removeFiles(const QString &path, bool ignoreErrors)
const QFileInfoList entries = QDir(path).entryInfoList(QDir::AllEntries | QDir::Hidden);
foreach (const QFileInfo &fi, entries) {
if (fi.isSymLink() || fi.isFile()) {
- QFile f(fi.filePath());
- if (!f.remove()) {
- const QString errorMessage = QCoreApplication::translate("QInstaller",
- "Cannot remove file \"%1\": %2").arg(
- QDir::toNativeSeparators(f.fileName()), f.errorString());
- if (!ignoreErrors)
- throw Error(errorMessage);
- qWarning().noquote() << errorMessage;
+ QString filePath = fi.filePath();
+ QFile f(filePath);
+ bool ok = f.remove();
+ if (!ok) { //ReadOnly can prevent removing in Windows. Change permission and try again.
+ const QFile::Permissions permissions = f.permissions();
+ if (!(permissions & QFile::WriteUser)) {
+ ok = f.setPermissions(filePath, permissions | QFile::WriteUser)
+ && f.remove(filePath);
+ }
+ if (!ok) {
+ const QString errorMessage = QCoreApplication::translate("QInstaller",
+ "Cannot remove file \"%1\": %2").arg(
+ QDir::toNativeSeparators(f.fileName()), f.errorString());
+ if (!ignoreErrors)
+ throw Error(errorMessage);
+ qWarning().noquote() << errorMessage;
+ }
}
}
}
diff --git a/src/libs/installer/installiconsoperation.cpp b/src/libs/installer/installiconsoperation.cpp
index ecd21be86..4b8346e18 100644
--- a/src/libs/installer/installiconsoperation.cpp
+++ b/src/libs/installer/installiconsoperation.cpp
@@ -33,7 +33,6 @@
#include <QDebug>
#include <QDir>
#include <QDirIterator>
-#include <QProcessEnvironment>
using namespace QInstaller;
@@ -43,8 +42,8 @@ QString InstallIconsOperation::targetDirectory()
if (hasValue(QLatin1String("targetdirectory")))
return value(QLatin1String("targetdirectory")).toString();
- const QProcessEnvironment env;
- QStringList XDG_DATA_DIRS = env.value(QLatin1String("XDG_DATA_DIRS")).split(QLatin1Char(':'),
+ QStringList XDG_DATA_DIRS = QString::fromLocal8Bit(qgetenv("XDG_DATA_DIRS"))
+ .split(QLatin1Char(':'),
QString::SkipEmptyParts);
XDG_DATA_DIRS.push_back(QLatin1String("/usr/share/pixmaps")); // default path
XDG_DATA_DIRS.push_back(QDir::home().absoluteFilePath(QLatin1String(".local/share/icons"))); // default path
diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp
index 97ffc8dd1..0e20ff8e9 100644
--- a/src/libs/installer/packagemanagercore.cpp
+++ b/src/libs/installer/packagemanagercore.cpp
@@ -2106,10 +2106,13 @@ bool PackageManagerCore::operationExists(const QString &name)
}
/*!
- Instantly performs the operation \a name with \a arguments.
+ Performs the operation \a name with \a arguments.
Returns \c false if the operation cannot be created or executed.
+ \note The operation is performed threaded. It is not advised to call
+ this function after installation finished signals.
+
\sa {installer::performOperation}{installer.performOperation}
*/
bool PackageManagerCore::performOperation(const QString &name, const QStringList &arguments)
diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp
index 7f0d2f722..827115c88 100644
--- a/src/libs/installer/packagemanagercore_p.cpp
+++ b/src/libs/installer/packagemanagercore_p.cpp
@@ -141,39 +141,49 @@ static void deferredRename(const QString &oldName, const QString &newName, bool
{
#ifdef Q_OS_WIN
QStringList arguments;
- {
- QTemporaryFile f(QDir::temp().absoluteFilePath(QLatin1String("deferredrenameXXXXXX.vbs")));
- QInstaller::openForWrite(&f);
- f.setAutoRemove(false);
-
- arguments << QDir::toNativeSeparators(f.fileName()) << QDir::toNativeSeparators(oldName)
- << QDir::toNativeSeparators(QFileInfo(oldName).dir().absoluteFilePath(QFileInfo(newName)
- .fileName()));
-
- QTextStream batch(&f);
- batch.setCodec("UTF-16");
- batch << "Set fso = WScript.CreateObject(\"Scripting.FileSystemObject\")\n";
- batch << "Set tmp = WScript.CreateObject(\"WScript.Shell\")\n";
- batch << QString::fromLatin1("file = \"%1\"\n").arg(arguments[2]);
- batch << "on error resume next\n";
-
- batch << "while fso.FileExists(file)\n";
- batch << " fso.DeleteFile(file)\n";
- batch << " WScript.Sleep(1000)\n";
- batch << "wend\n";
- batch << QString::fromLatin1("fso.MoveFile \"%1\", file\n").arg(arguments[1]);
- if (restart) {
- //Restart with same command line arguments as first executable
- QStringList commandLineArguments = QCoreApplication::arguments();
- batch << QString::fromLatin1("tmp.exec \"%1 --updater").arg(arguments[2]);
- //Skip the first argument as that is executable itself
- for (int i = 1; i < commandLineArguments.count(); i++) {
- batch << QString::fromLatin1(" %1").arg(commandLineArguments.at(i));
- }
- batch << QString::fromLatin1("\"\n");
+
+ // Check if .vbs extension can be used for running renaming script. If not, create own extension
+ QString extension = QLatin1String(".vbs");
+ QSettingsWrapper settingRoot(QLatin1String("HKEY_CLASSES_ROOT\\.vbs"), QSettingsWrapper::NativeFormat);
+ if (settingRoot.value(QLatin1String(".")).toString() != QLatin1String("VBSFile")) {
+ extension = QLatin1String(".qtInstaller");
+ QSettingsWrapper settingsUser(QLatin1String("HKEY_CURRENT_USER\\Software\\Classes"), QSettingsWrapper::NativeFormat);
+ QString value = settingsUser.value(extension).toString();
+ if (value != QLatin1String("VBSFile"))
+ settingsUser.setValue(extension, QLatin1String("VBSFile"));
+ }
+ QTemporaryFile f(QDir::temp().absoluteFilePath(QLatin1String("deferredrenameXXXXXX%1")).arg(extension));
+
+ QInstaller::openForWrite(&f);
+ f.setAutoRemove(false);
+
+ arguments << QDir::toNativeSeparators(f.fileName()) << QDir::toNativeSeparators(oldName)
+ << QDir::toNativeSeparators(QFileInfo(oldName).dir().absoluteFilePath(QFileInfo(newName)
+ .fileName()));
+
+ QTextStream batch(&f);
+ batch.setCodec("UTF-16");
+ batch << "Set fso = WScript.CreateObject(\"Scripting.FileSystemObject\")\n";
+ batch << "Set tmp = WScript.CreateObject(\"WScript.Shell\")\n";
+ batch << QString::fromLatin1("file = \"%1\"\n").arg(arguments[2]);
+ batch << "on error resume next\n";
+
+ batch << "while fso.FileExists(file)\n";
+ batch << " fso.DeleteFile(file)\n";
+ batch << " WScript.Sleep(1000)\n";
+ batch << "wend\n";
+ batch << QString::fromLatin1("fso.MoveFile \"%1\", file\n").arg(arguments[1]);
+ if (restart) {
+ //Restart with same command line arguments as first executable
+ QStringList commandLineArguments = QCoreApplication::arguments();
+ batch << QString::fromLatin1("tmp.exec \"%1 --updater").arg(arguments[2]);
+ //Skip the first argument as that is executable itself
+ for (int i = 1; i < commandLineArguments.count(); i++) {
+ batch << QString::fromLatin1(" %1").arg(commandLineArguments.at(i));
}
- batch << "fso.DeleteFile(WScript.ScriptFullName)\n";
+ batch << QString::fromLatin1("\"\n");
}
+ batch << "fso.DeleteFile(WScript.ScriptFullName)\n";
QProcessWrapper::startDetached(QLatin1String("cscript"), QStringList() << QLatin1String("//Nologo")
<< arguments[0]);