diff options
author | kh1 <karsten.heimrich@digia.com> | 2014-07-03 11:36:37 +0200 |
---|---|---|
committer | Karsten Heimrich <karsten.heimrich@digia.com> | 2014-07-04 14:41:21 +0200 |
commit | 7f4fadd08d88262f357671cb8c039253c6e65326 (patch) | |
tree | 16b5128e609771d78fd1ab7673b0bbd72904afae /src/libs/installer | |
parent | d847723173a5cd2bb2eb27ff0eb45ae323c8070a (diff) |
Workaround for QFileInfo::isBundle().
For some reason the former code did not work anyore as expected,
the issue seems to be in QFileInfo::isBundle or how we used it.
To not depend on a possible fix in Qt, we now always resolve the
path before we ask QFileInfo if it is a bundle.
Fixes also the behavior change introduced in cead4555. On OSX,
we get the .dat file passed that's inside the bundle, still we
need to read the data from a .dat file that's located beside
the app bundle...
Change-Id: Idaa7adc6fbad6bd8e9ce90c383b34ea51fe40e8f
Reviewed-by: Kai Koehne <kai.koehne@digia.com>
Diffstat (limited to 'src/libs/installer')
-rw-r--r-- | src/libs/installer/binaryformat.cpp | 6 | ||||
-rw-r--r-- | src/libs/installer/fileutils.cpp | 19 | ||||
-rw-r--r-- | src/libs/installer/fileutils.h | 1 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore_p.cpp | 8 | ||||
-rw-r--r-- | src/libs/installer/packagemanagergui.cpp | 2 |
5 files changed, 29 insertions, 7 deletions
diff --git a/src/libs/installer/binaryformat.cpp b/src/libs/installer/binaryformat.cpp index 28666f8e4..a734bc3fd 100644 --- a/src/libs/installer/binaryformat.cpp +++ b/src/libs/installer/binaryformat.cpp @@ -657,9 +657,11 @@ BinaryContent BinaryContent::readFromBinary(const QString &path) if (magicMarker != MagicInstallerMarker) { // We are not an installer, so we need to read the data from the .dat file. + QFileInfo fi(path); - if (QFileInfo(fi.absoluteFilePath() + QLatin1String("/../../..")).isBundle()) - fi.setFile(fi.absoluteFilePath()); // On OSX it's not inside the bundle, deserves TODO. + QString bundlePath; // On OSX it's not inside the bundle, deserves TODO. + if (QInstaller::isInBundle(fi.absoluteFilePath(), &bundlePath)) + fi.setFile(bundlePath); c.d->m_binaryDataFile.reset(new QFile(fi.absolutePath() + QLatin1Char('/') + fi.baseName() + QLatin1String(".dat"))); diff --git a/src/libs/installer/fileutils.cpp b/src/libs/installer/fileutils.cpp index 2ec690f6d..4708e5602 100644 --- a/src/libs/installer/fileutils.cpp +++ b/src/libs/installer/fileutils.cpp @@ -570,3 +570,22 @@ quint64 QInstaller::fileSize(const QFileInfo &info) return symlinkSizeWin(info.absoluteFilePath()); #endif } + +bool QInstaller::isInBundle(const QString &path, QString *bundlePath) +{ +#ifdef Q_OS_OSX + QFileInfo fi = QFileInfo(path).absoluteFilePath(); + while (!fi.isRoot()) { + if (fi.isBundle()) { + if (bundlePath) + *bundlePath = fi.absoluteFilePath(); + return true; + } + fi.setFile(fi.path()); + } +#else + Q_UNUSED(path) + Q_UNUSED(bundlePath) +#endif + return false; +} diff --git a/src/libs/installer/fileutils.h b/src/libs/installer/fileutils.h index a8efefacd..077ab218b 100644 --- a/src/libs/installer/fileutils.h +++ b/src/libs/installer/fileutils.h @@ -105,6 +105,7 @@ private: void INSTALLER_EXPORT mkpath(const QString &path); quint64 INSTALLER_EXPORT fileSize(const QFileInfo &info); + bool INSTALLER_EXPORT isInBundle(const QString &path, QString *bundlePath = 0); #ifdef Q_OS_WIN QString INSTALLER_EXPORT getLongPathName(const QString &name); diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp index ccc2dc930..190742d9c 100644 --- a/src/libs/installer/packagemanagercore_p.cpp +++ b/src/libs/installer/packagemanagercore_p.cpp @@ -737,7 +737,7 @@ QString PackageManagerCorePrivate::uninstallerName() const { QString filename = m_data.settings().uninstallerName(); #if defined(Q_OS_OSX) - if (QFileInfo(QCoreApplication::applicationDirPath() + QLatin1String("/../..")).isBundle()) + if (QInstaller::isInBundle(QCoreApplication::applicationDirPath())) filename += QLatin1String(".app/Contents/MacOS/") + filename; #elif defined(Q_OS_WIN) filename += QLatin1String(".exe"); @@ -1186,7 +1186,7 @@ void PackageManagerCorePrivate::writeUninstaller(OperationList performedOperatio #ifdef Q_OS_OSX // if it is a bundle, we need some stuff in it... const QString sourceAppDirPath = QCoreApplication::applicationDirPath(); - if (isInstaller() && QFileInfo(sourceAppDirPath + QLatin1String("/../..")).isBundle()) { + if (isInstaller() && QInstaller::isInBundle(sourceAppDirPath)) { Operation *op = createOwnedOperation(QLatin1String("Copy")); op->setArguments(QStringList() << (sourceAppDirPath + QLatin1String("/../PkgInfo")) << (targetAppDirPath + QLatin1String("/../PkgInfo"))); @@ -2005,8 +2005,8 @@ void PackageManagerCorePrivate::deleteUninstaller() QFile uninstaller(QFileInfo(installerBinaryPath()).absoluteFilePath()); uninstaller.remove(); # ifdef Q_OS_OSX - const QLatin1String cdUp("/../../.."); - if (QFileInfo(QFileInfo(installerBinaryPath() + cdUp).absoluteFilePath()).isBundle()) { + if (QInstaller::isInBundle(installerBinaryPath())) { + const QLatin1String cdUp("/../../.."); removeDirectoryThreaded(QFileInfo(installerBinaryPath() + cdUp).absoluteFilePath()); QFile::remove(QFileInfo(installerBinaryPath() + cdUp).absolutePath() + QLatin1String("/") + configurationFileName()); diff --git a/src/libs/installer/packagemanagergui.cpp b/src/libs/installer/packagemanagergui.cpp index c17364fd5..67c19de67 100644 --- a/src/libs/installer/packagemanagergui.cpp +++ b/src/libs/installer/packagemanagergui.cpp @@ -1715,7 +1715,7 @@ bool TargetDirectoryPage::validatePage() if (fi.isDir()) { QString fileName = packageManagerCore()->settings().uninstallerName(); #if defined(Q_OS_OSX) - if (QFileInfo(QCoreApplication::applicationDirPath() + QLatin1String("/../..")).isBundle()) + if (QInstaller::isInBundle(QCoreApplication::applicationDirPath())) fileName += QLatin1String(".app/Contents/MacOS/") + fileName; #elif defined(Q_OS_WIN) fileName += QLatin1String(".exe"); |