diff options
author | Katja Marttila <katja.marttila@qt.io> | 2018-10-10 11:41:05 +0300 |
---|---|---|
committer | Katja Marttila <katja.marttila@qt.io> | 2018-10-10 11:45:52 +0300 |
commit | 70273f9931aad662d1697b142140791a100059f5 (patch) | |
tree | 534f6f71b07af9f95d158e41c2e7425d9373d351 | |
parent | a03fd459a23e8a72d01f17f529b8c8e5db9baca3 (diff) | |
parent | 9d7cff74d94e3a9ee2beaccfa5aa6a15a93585cb (diff) |
Merge remote-tracking branch 'origin/3.0' into master
Change-Id: Ifaa114464151f5ed84ce47a3368c1521eb17a0be
-rw-r--r-- | src/libs/installer/createdesktopentryoperation.cpp | 8 | ||||
-rw-r--r-- | src/libs/installer/fileutils.cpp | 25 | ||||
-rw-r--r-- | src/libs/installer/installiconsoperation.cpp | 5 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore.cpp | 5 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore_p.cpp | 72 |
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]); |