summaryrefslogtreecommitdiffstats
path: root/src/libs
Commit message (Collapse)AuthorAgeFilesLines
* Metadata cache: clear cache in a separate threadArttu Tarkiainen2022-11-142-21/+52
| | | | | | | | | | | | | | | | | | This removes the visible blocked UI while clearing cache items, which takes some time. Disable controls on the dialog and show a basic progress bar while the clearing is in progress. Also add basic access serialization to GenericDataCache<T> class public methods. It is still possible that the user closes the settings dialog with other means before the clearing in a separate thread was completed, and we want to avoid crashing to race conditions in such case. If the user manages to navigate forward in installer pages, to fetch metadata again, it wouldn't still work correctly though. Task-number: QTIFW-2815 Change-Id: Ic2c0feac44aff69c458105cf0f559e8693fc0d69 Reviewed-by: Iikka Eklund <iikka.eklund@qt.io> Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* MetadataJob: split refreshing cached items into its own methodArttu Tarkiainen2022-11-142-37/+56
| | | | | | | The original method for the moved part was getting quite long. Change-Id: Icc892a7c3623dec3c94215fc553409d060d06aa2 Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* Metadatajob: update cache asynchronouslyArttu Tarkiainen2022-11-113-49/+106
| | | | | | | | | | | Refactor the updating to run in a separate thread, with QFuture -based handling of the result. This removes the visible blocking of UI while updating the cache. Task-number: QTIFW-2815 Change-Id: I67bc1aed8465ca12925b9f80effadf4be7017cea Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* Fix enabled navigation buttons while metadata fetch is still in progressArttu Tarkiainen2022-11-113-1/+19
| | | | | | | | | | This allowed the user to erroneously proceed forward with the installation even when the metadata fetch for newly selected categories was not finished. Task-number: QTIFW-2849 Change-Id: If552b85b3aa8c3ee9246328f12a72fbdaba8b797 Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* Fix clang and compiler warningsKatja Marttila2022-11-0811-15/+17
| | | | | | | | Added const and reference to function names, removed unused variables etc. Change-Id: I5e3851c13ff3baf1884356198020fc86e69d69b4 Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io>
* Add helper class to replace deprecated toSet() callKatja Marttila2022-11-081-1/+7
| | | | | Change-Id: I3211c784cc36345045a661d6fdab439fc45b01aa Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io>
* InstallerProxy: optimize querying components by nameArttu Tarkiainen2022-11-072-6/+9
| | | | | | | | | | | | | | | | | | | | | | | | For some API compatibility with QtScript, the QInstaller::ScriptEngine's implementation of newQObject(QObject *object) method adds findChild() and findChildren() functions as properties for the JS object wrapping the QObject, QInstaller::Component in this case. This results in two extra QJSEngine::evaluate() calls, adding some overhead. The Component class does not utilize the QObject's object tree & ownership feature in the C++ side, so the functions do not add extra value in this context. InstallerProxy::ComponentByName() creates the JavaScript object of the component with the aforementioned ScriptEngine::newQObject() implementation. We inject a snippet resulting in a call to InstallerProxy's componentByName() function for each component script. Measuring with callgrind, the time spent in the extra evaluations was around fifth of the whole evaluation cycle. Modify the function to to make the addition of the extra properties optional, and omit them when querying components by name from script. Task-number: QTIFW-2790 Change-Id: I58040809dcf69599e0fabd98def2dc9464aadf84 Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* Use qAsConst to avoid containers from detachingKatja Marttila2022-11-072-3/+3
| | | | | Change-Id: I22dba356f434e65cf4db117c42b55f13f07c4e18 Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io>
* Use QFileInfo::exists() as that is documented to be fasterKatja Marttila2022-11-048-14/+14
| | | | | Change-Id: I413669860334d96de684c1c32962a33166ac6c7c Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io>
* Merge "Merge remote-tracking branch 'origin/4.5'"Arttu Tarkiainen2022-11-044-54/+77
|\
| * Merge remote-tracking branch 'origin/4.5'Arttu Tarkiainen2022-11-044-54/+77
| |\ | | | | | | | | | Change-Id: Ie9b5f7a3db7e237d396dd5e72577258d953ec38d
| | * Fix virtual component uninstallationKatja Marttila2022-11-044-54/+77
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Virtual components were still wrongly calculated for uninstall depending on which order the tree was clicked and whether the component had dependencies to already installed components or components about to be installed. Change-Id: I624fd1139d15d5e16c81365064dcea2392dc13b1 Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io>
* | | Fix typos in documentationKatja Marttila2022-11-041-1/+1
|/ / | | | | | | | | Change-Id: I958043ec15b0ae8a31b3aa7a33166861bb0a3d41 Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io>
* | Add possibility to post load install scriptsKatja Marttila2022-11-0413-83/+167
| | | | | | | | | | | | | | | | | | | | | | This change adds attribute, postLoad, to existing <Script> -element. Using <Script postLoad="True"> will call the script loading and evaluation only to those components which are selected for install or update right before the components installation start. Task-number: QTIFW-2820 Change-Id: Ic1967d329cbb5de6a0216ff3f76cc2ede178db80 Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io>
* | Fix usage of obsolete toList() callKatja Marttila2022-11-031-3/+3
| | | | | | | | | | Change-Id: Iccc3fcd974b1fca13e5a34349a70cdeac2b7e59d Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io>
* | Merge remote-tracking branch 'origin/4.5'Arttu Tarkiainen2022-11-038-24/+62
|\ \ | |/ | | | | Change-Id: Ic3759bb073b00a168ec3348122484514e02138f5
| * Merge remote-tracking branch 'origin/4.4' into 4.5Arttu Tarkiainen2022-11-038-24/+61
| |\ | | | | | | | | | Change-Id: If99e84c5f6e6914f0d90770053ce6850e70ed403
| | * Fix installer stalling when there's only one CPU core4.4Arttu Tarkiainen2022-09-271-4/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The installer operations are run in the global QThreadPool. The Operation::performOperation() implementation from "QtPatch" operation would call the Component::operations() method, that filtered the returned operation list with QtConcurrent::blockingFilter(). This would lock the installer when the global thread pool object was initialized with maxThreadCount of 1, with the only QThread object from the global pool already running the calling Operation::performOperation() function, which is waiting the result of Component::operations(). Fix by omitting usage of QtConcurrent::blockingFilter() and populating the returned operation list with std::copy_if - the components have usually only a handful operations each so this shouldn't be too noticeable of a performance regression. Task-number: QTIFW-2786 Change-Id: Ia6be9f6697310d3f955a8199712c54f345407067 Reviewed-by: Katja Marttila <katja.marttila@qt.io>
| | * Fix uninstallation of needed virtual componentsKatja Marttila2022-09-161-1/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | In some rare cases, both component to be uninstalled and component to be installed has dependency to same virtual component. In such case the virtual component should not be uninstalled. Change-Id: I3b826693d4a72d6765a5ac1ee9a3957fdf7415da Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io>
| | * Attach to squish only when the port is separately givenKatja Marttila2022-09-081-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Attaching to squish will trigger firewall questions in the installer. Changing the attach behavior so that by default no attach is done, and user can run the installer with --squish-port <number> if the attach is needed. Task-number: QTIFW-2746 Change-Id: I89f06a52b1ef95493e99084cb6080266b4eaf1dc Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io>
| | * Windows: fix installation error with concurrent Extract operationsArttu Tarkiainen2022-09-014-16/+50
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | There was an issue with the Extract operations when using the same "targetDir" argument for multiple archives. The DirectoryGuard object creating the missing leading directories would occasionally run into a race condition when multiple threads competed with creating the directories. Fix by adding installer specific implementation similar to QDir::mkpath(), but which checks if the directory was created elsewhere at every directory level. Also convert an existing similar case with the Extract operation to use the new function. Task-number: QTIFW-2752 Change-Id: I4451e931309edb536294314b11c903189dacf2f0 Reviewed-by: Katja Marttila <katja.marttila@qt.io>
| | * Fix typo resulting in accessing wrong operation result containerArttu Tarkiainen2022-09-011-1/+1
| | | | | | | | | | | | | | | | | | | | | Fortunately no reported issues yet that would have been caused by this. Change-Id: I0ee9cb368600f660eb7c048e8cf3df5d31e43b4f Reviewed-by: Katja Marttila <katja.marttila@qt.io>
| * | Macos: Fix maintenance tool install from repositoryKatja Marttila2022-11-011-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Maintenancetool can be either app bundle or executable itself. In case the maintenancetool is the executable itself, we need to create the app bundle in the code. Task-number: QTIFW-2856 Change-Id: Ib884cbd7d7f18b9503938114d56f3c396c8d3bd6 Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io>
* | | ExtractOp: fix leftover empty directories when 'targetDir' arg is usedArttu Tarkiainen2022-10-311-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The problem was that the directory passed for the DirectoryGuard object handling the creation of leading directories was missing the target directory itself, instead the path ended to its parent directory. When installer does the undo-step for Extract operation, only empty directories are deleted, so in case any directory from a path is missing from the created directory list, the leading directories won't be also deleted. QFileInfo::absolutePath() returns the path of the parent directory for the given path even if it is a directory, fix by using instead the QFileInfo::absoluteFilePath(), which includes the name after the last directory separator. Task-number: QTIFW-2764 Change-Id: I5b03142b46db566615f4983fa3e2ff2690f25262 Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* | | Use static initialization for external-link regexpArttu Tarkiainen2022-10-261-2/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Component::updateModelData() is invoked for every value change with any component, which can result in hundreds of thousands calls when there is a large number of components. We can avoid the repeated validity checks for the QRegularExpression object by initializing it as a static constant. When refiltering the same repository categories, which omits the metadata fetching part, there's a time reduction of some 10% from the start to displaying the component tree again measured by hand, which would match the results measured with callgrind. Also add similar handling to the related string literal. Change-Id: I90694f25e110b54a26ddd0fbc7f9319a6fb5314e Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* | | Merge remote-tracking branch 'origin/4.5' into masterKatja Marttila2022-10-248-26/+79
|\ \ \ | |/ / | | | | | | Change-Id: Icd08be87fa135868e0ffc8f791afce1617f478e1
| * | Adjust available space checking for the metadata cacheArttu Tarkiainen2022-10-241-17/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | As the payload archives are now also downloaded to the local cache instead of the system specific temporary directory, the calculation should check the available space from the cache volume instead of from the temp volume. Task-number: QTIFW-2821 Change-Id: I4d9f202299ea3d2569c66953661329cdb25212a0 Reviewed-by: Katja Marttila <katja.marttila@qt.io>
| * | CLI: Add new '--cache-path' optionArttu Tarkiainen2022-10-215-4/+21
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The option can be used to select the path for metadata cache without opening the installer's settings dialog. Add public PackageManagerCore::resetLocalCache() function and remove automatic initialization of the local cache in the private core class constructor, so we can control the timeline better. Also make PackageManagerCore::clearLocalCache() a regular member function as it does not need to be a Qt slot. Task-number: QTIFW-2810 Change-Id: Ia4a903026a10b90da16ba1b93fd3098a709f7ed7 Reviewed-by: Katja Marttila <katja.marttila@qt.io>
| * | CLI: Add new 'clear-cache' commandArttu Tarkiainen2022-10-212-1/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | The command can be used to clear the contents of local metadata cache without opening the installer GUI. Task-number: QTIFW-2810 Change-Id: I18cec027b9945f83d25fa1716858756ececae6d4 Reviewed-by: Katja Marttila <katja.marttila@qt.io>
| * | Add possibility to synchronize metadata cache manuallyArttu Tarkiainen2022-10-213-4/+39
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The contents of the cache subdirectories and manifest.json may mismatch if the installer process is killed after the metadata fetch, because the manifest file is normally synchronized only when the cache object gets destroyed. While this is a recoverable error, it creates unnecessary overhead of discarding broken items and downloading them again. Add support for synchronizing the cache by the caller and do so each time the cache is updated by Metadatajob. Task-number: QTIFW-2817 Change-Id: Ia4cd3de44d57e8d732d11dc26968aa87323ada0f Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* | | Replace QRegExp usages by QRegularExpressionChristian Stenger2022-10-2114-45/+49
| | | | | | | | | | | | | | | | | | Task-number: QTIFW-1829 Change-Id: I5a48bb5660d6082c1b95247adf84bb3126853aef Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* | | Handle Qt6 inside the project filesChristian Stenger2022-10-211-1/+4
|/ / | | | | | | | | | | Task-number: QTIFW-1829 Change-Id: I003b876911f734956a75f3f75cdbe435caa3f108 Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* | Allow generation and signing of MT in macosKatja Marttila2022-10-206-84/+150
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Previously maintenance tool could be updated from online repository placing installerbase to repository and setting setInstallerBaseBinary() in install script. The maintenancetool app bundle was written in the code and installerbase placed under .app/Contents/MacOS/. This prevented the maintenancetool app bundle to be signed and notarized. Fixed so that the whole app bundle can be placed to repository. This does not break the signing nor notarization as the whole bundle is copied as it is. The setInstallerBaseBinary() is still needed in the install script so that the installer knows which bundle is the maintenance tool. Old way of updating maintenancetool still exists, if the installerbaseBinary does not contain the ending 'app' installer assumes that the maintenance tool is the executable itself instead of whole app bundle. This change also adds a new binarycreator switch --create-maintenancetool, which can be used in macos to create the app bundle for maintenance tool. Task-number: QTIFW-2750 Change-Id: I3483ddb815d035644e826559947f6f9de4af9361 Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io>
* | Fix installer not respecting PersistentLocalCache value properlyArttu Tarkiainen2022-10-201-3/+10
| | | | | | | | | | | | | | | | | | | | In case the installer is configured to use a non-persistent cache, it is not enough anymore to mark the subdirectories of the cache for deletion. Instead it should be done by properly clearing the cache with GenericDataCache<T>::clear(). Change-Id: I25ade37baca048e98cc8edb9d90585dcd6d0f142 Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* | Fix user set metadata cache path not saved for maintenance toolArttu Tarkiainen2022-10-201-0/+3
| | | | | | | | | | | | | | | | | | Write the settings value to network.xml, with the rest of the user configurable settings. Task-number: QTIFW-2812 Change-Id: I90210ddb1426acf06215828dfb18dc65aa107e6e Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* | Fix possible uncaught exceptions while loading package dataArttu Tarkiainen2022-10-191-189/+200
| | | | | | | | | | | | | | | | This affects exceptions thrown when failing to load user interface and license files from package, which are now handled properly. Change-Id: Ibfe9da8f2b8b7e3e08945ae81eb40ae0b045e9b1 Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* | Fix some translated textsFriedemann Kleint2022-10-192-3/+5
| | | | | | | | | | | | | | Fix place holders and count. Change-Id: I4cb4508d2cd24706266dc82872345e7ffbc36174 Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io>
* | libarchive: support linking with zlib compiled into QtCoreArttu Tarkiainen2022-10-181-0/+4
| | | | | | | | | | | | | | | | | | | | | | This removes the requirement of provisioning an external library just for libarchive - as the official IFW binaries already use the zlib bundled with Qt - and tracking updates from multiple sources. Task-number: QTIFW-2803 Change-Id: I9878a3e1a9b5d649bc62590746151e2d5fe903ba Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* | Show information dialog after clearing metadata cacheArttu Tarkiainen2022-10-184-5/+20
| | | | | | | | | | | | | | | | | | | | Show dialog indicating success or failure, including the error message, to add some feedback for the action. Adjust related to code to handle return value of GenericDataCache<T>::clear() function, and fix the wrong return value when an error occurs while deleting cache subdirectories. Change-Id: Ib35f2db3711d85f567f7918c903aebf4236d7041 Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* | Metadatajob: allow replacing existing items to metadata cacheArttu Tarkiainen2022-10-181-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | It is a possible situation that a repository with the same Updates.xml checksum is retrieved from multiple URL:s on a single metadata fetch. This creates a scenario where more than one metadata item with the same checksum is pending registration to the cache, which will fail for the next item after the first registered one. Replacing existing items should be allowed instead. Change-Id: I8957202046231d03b3ac26aa8db0534650d49bfb Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* | Add persistent metadata file cacheArttu Tarkiainen2022-10-1422-186/+1580
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Introduce GenericDataCache and Metadata classes for storing the fetched metadata files (Updates.xml and uncompressed files from the meta.7z archives) on local filesystem. The cache uses a checksum based dictionary to keep track of the cached metadata items, with the SHA1 sums of downloaded Updates.xml files being the keys to refer single metadata item. We still need to download all the Updates.xml files on each fetch to check if the cached metadata items are applicable for the current repositories. Update the Updates.xml files in auto-test data to have unique contents, otherwise there could be conflicts with identical test repositories, as the tests will also utilize the cache now. Also omit registering Repository type to the meta-object system in the class contructors, this is expensive as we construct objects from the class frequently, in the worst case hundreds of thousands times. PackageManagerCore already does the registering. Task-number: QTIFW-2621 Change-Id: Iee10ead68befd722ffe7f18ca48483d5a3666658 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* | Doc: fix "Cannot tie this documentation to anything" warningArttu Tarkiainen2022-10-141-0/+2
| | | | | | | | | | Change-Id: I4cbdf230b6c3883a0ca9e11d8dc6504a49cf0afb Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io>
* | Optimize keeping component reference count in InstallerCalculatorArttu Tarkiainen2022-10-111-8/+3
| | | | | | | | | | | | | | | | | | | | To avoid constructing possibly large temporary QStringList objects, return the value by modifiable reference when accessing the m_referenceCount container. Task-number: QTIFW-2790 Change-Id: Ieb2619624cfbf12561dbec25b966bb7dbae5d29c Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* | Optimize retrieving components by nameArttu Tarkiainen2022-10-115-12/+40
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The PackageManagerCore::componentByName(const QString &name) -function is called repeatedly by the InstallerCalculator class and at minimum once for each install script, because we automatically inject a snippet which stores the return value of the function in the 'component' variable for the script context. Create a <name, component> hash once per each component model reset to make the lookups faster: * This avoids constructing a flat list of components and all their descendants again and again when calling the function. * The linear lookup from the component list is slow because it calls componentMatches() for each element until the satisfactory component was found or the list ends. * The average time complexity of the key lookup from the QHash is constant even for large hashes. Task-number: QTIFW-2790 Change-Id: I580d28f78ac6681d5bcbfbad970002b49de1a830 Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* | Fix deprecate QCommandLineOption::setHidden() usageKatja Marttila2022-09-291-2/+2
| | | | | | | | | | | | | | | | setHidden() -function call should be done with setFlags(QCommandLineOption::HiddenFromHelp) Change-Id: I58a8fa58cc4d86338f9ec70fe29ab1c0ea9b0166 Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io>
* | libarchive: disable crypto support from builds on macOSArttu Tarkiainen2022-09-291-5/+5
| | | | | | | | | | | | | | | | This is uniform with the config options for Windows and Linux, we don't utilize the features in the installer framework. Change-Id: I4d01455ffa3e53195e85ab5312785dcfd2b32a7b Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* | Replace ProductVersion placeholder with actual valueKatja Marttila2022-09-291-1/+1
| | | | | | | | | | | | Task-number: QTIFW-2267 Change-Id: I52a62a285f2a7183c32658cbf86c949705d714d8 Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io>
* | Adjust the 'ready to install' message to avoid repeating the app nameAndreas Pakulat2022-09-271-3/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | The text was using just the word 'Setup' which is inconsistent with other places which usually refer to the application as '<product> Setup'. Adding the product name would've been possible, but it seemed unnecessary to repeat the installer name again right at the last step. So instead replace that with a general message explaining that all needed information has been collected. Task-Name: SQUISH-9672 Change-Id: Ia253f4f921431f272bc1d69352a5fa7179e84d0c Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* | CLI: add support for hiding values of printed optionsArttu Tarkiainen2022-09-222-1/+44
| | | | | | | | | | | | | | | | | | Some options may require values that contain information that should not be echoed. Task-number: QTIFW-2756 Change-Id: I84ee7fd0f27ef68a2b3e886bd639c836835a52b6 Reviewed-by: Katja Marttila <katja.marttila@qt.io>
* | Replace .vbs hack to update maintenance tool binary on WindowsArttu Tarkiainen2022-09-078-45/+104
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Do the replacing of the executable instead by: - The original MT renames itself to a temporary name - The new MT is renamed to the destination file name - The new MT is started as a detached process, it polls to delete the temporary MT (requires that the parent process exited) Introduce hidden options, cleanup-update and cleanup-update-only to start the maintenance tool in a mode for deleting the old binary. Also fix missing verbose messages on hard restart of maintenance tool after update. Due to QProcessWrapper::startDetached using a modified implementation of the wrapped class (QProcess) method, the detached process was started with a new console instead of inheriting the console of the parent process. Fix by adding a second variant of the QProcessWrapper::startDetached functions using the QProcess implementation. Task-number: QTIFW-2625 Change-Id: Iebc5b04befa1e79765217f93723f977556e03d90 Reviewed-by: Leena Miettinen <riitta-leena.miettinen@qt.io> Reviewed-by: Katja Marttila <katja.marttila@qt.io>