From 9065a5f46a7d94e0a8a91e0bdb52834851609006 Mon Sep 17 00:00:00 2001 From: Katja Marttila Date: Mon, 28 Dec 2020 12:55:47 +0200 Subject: Allow disabling undo in CopyDirectory during uninstall Task-number: QTIFW-2088 Change-Id: Ic5e781b89b1c74fc8f65575bd46c073610545523 Reviewed-by: Arttu Tarkiainen --- doc/operations.qdoc | 3 ++ src/libs/installer/copydirectoryoperation.cpp | 8 +++- .../tst_copydirectoryoperation.cpp | 43 +++++++++++++++++----- 3 files changed, 43 insertions(+), 11 deletions(-) diff --git a/doc/operations.qdoc b/doc/operations.qdoc index 4186f8e99..02f393ad1 100644 --- a/doc/operations.qdoc +++ b/doc/operations.qdoc @@ -90,6 +90,9 @@ \li CopyDirectory \li "CopyDirectory" \c sourcePath \c targetPath \li Copies a directory from \c sourcePath to \c targetPath. + \note Directories will be reset during uninstallation. If you want to copy the + directory persistently, you can overwrite the \e UNDO by passing \e UNDOOPERATION + and \e "", to the end of the argument list. \row \li AppendFile \li "AppendFile" \c filename \c text diff --git a/src/libs/installer/copydirectoryoperation.cpp b/src/libs/installer/copydirectoryoperation.cpp index 4cef3facf..a2ef2cf5a 100644 --- a/src/libs/installer/copydirectoryoperation.cpp +++ b/src/libs/installer/copydirectoryoperation.cpp @@ -67,7 +67,7 @@ bool CopyDirectoryOperation::performOperation() if (!checkArgumentCount(2, 3, tr(" [\"forceOverwrite\"]"))) return false; - const QStringList args = arguments(); + const QStringList args = parsePerformOperationArguments(); const QString sourcePath = args.at(0); const QString targetPath = args.at(1); bool overwrite = false; @@ -153,7 +153,11 @@ bool CopyDirectoryOperation::performOperation() bool CopyDirectoryOperation::undoOperation() { - Q_ASSERT(arguments().count() == 2); + if (parseUndoOperationArguments().count() > 0) + return true; + + if (!checkArgumentCount(2)) + return false; QDir dir; const QStringList files = value(QLatin1String("files")).toStringList(); diff --git a/tests/auto/installer/copydirectoryoperation/tst_copydirectoryoperation.cpp b/tests/auto/installer/copydirectoryoperation/tst_copydirectoryoperation.cpp index bf95f635d..a1692095d 100644 --- a/tests/auto/installer/copydirectoryoperation/tst_copydirectoryoperation.cpp +++ b/tests/auto/installer/copydirectoryoperation/tst_copydirectoryoperation.cpp @@ -75,6 +75,20 @@ private: core->deleteLater(); } + QStringList populateSourceDirectory() + { + QStringList fileEntries; + fileEntries << "file1" << "file2" << ".hidden1" << ".hidden2"; + + // Populate source directory + foreach (const QString &entry, fileEntries) { + QFile file(m_sourcePath + entry); + file.open(QFileDevice::ReadWrite); + file.close(); + } + return fileEntries; + } + private slots: void initTestCase() { @@ -129,17 +143,9 @@ private slots: void testCopyDirectoryWithUndo() { - QStringList fileEntries; - fileEntries << "file1" << "file2" << ".hidden1" << ".hidden2"; + const QStringList fileEntries = populateSourceDirectory(); - // Populate source directory - foreach (const QString &entry, fileEntries) { - QFile file(m_sourcePath + entry); - QVERIFY(file.open(QFileDevice::ReadWrite)); - file.close(); - } CopyDirectoryOperation op(nullptr); - op.setArguments(QStringList() << m_sourcePath << m_destinationPath); QVERIFY2(op.performOperation(), op.errorString().toLatin1()); @@ -151,6 +157,25 @@ private slots: QVERIFY(!QFileInfo(m_destinationPath).exists()); } + + void testCopyDirectoryNoUndo() + { + const QStringList fileEntries = populateSourceDirectory(); + + CopyDirectoryOperation op(nullptr); + op.setArguments(QStringList() << m_sourcePath << m_destinationPath << "UNDOOPERATION" << ""); + + QVERIFY2(op.performOperation(), op.errorString().toLatin1()); + + foreach (const QString &entry, fileEntries) + QVERIFY(QFile(m_destinationPath + entry).exists()); + + QVERIFY2(op.undoOperation(), op.errorString().toLatin1()); + // Undo will NOT delete the empty destination directory here + foreach (const QString &entry, fileEntries) + QVERIFY(QFile(m_destinationPath + entry).exists()); + } + void testCopyDirectoryOverwrite() { QFile file(m_sourcePath + "file"); -- cgit v1.2.3