From bae2b04cccbd0a03a9639f2c3e7f9659b310f354 Mon Sep 17 00:00:00 2001 From: Niels Weber Date: Thu, 13 Jun 2013 09:47:59 +0200 Subject: Updated changelog Change-Id: I7f3e18e7da97d93d8f398a533aa6bea5cadcf1d4 Reviewed-by: Tim Jenssen --- Changelog | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Changelog b/Changelog index 8bb76e26c..5096699ff 100644 --- a/Changelog +++ b/Changelog @@ -5,5 +5,6 @@ - Now continues on unknown operations. - Fixed error handling in 7z lib. - Added a DisplayName setting for repositories. (QTIFW-244) +- Chinese Translation added - Documentation fixes and additions. -- Bugfixes +- Bugfixes (QTIFW-271 et al) -- cgit v1.2.3 From f028c0dcc865933703a3db31f526bfe7b53d7f1b Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Thu, 13 Jun 2013 16:30:32 +0200 Subject: Fix missing removal of directories for MkDirOperation * use removeDirectory instead of rmdir * rmdir is not able to delete subdirectories * pass force parameter to removeDirectory * adds unit test Change-Id: I1f52aefdb5d13793321fe6001809362d34ad8941 Reviewed-by: Niels Weber Reviewed-by: Tim Jenssen --- src/libs/kdtools/kdupdaterupdateoperations.cpp | 32 ++-- tests/auto/installer/installer.pro | 3 +- .../mkdiroperationtest/mkdiroperationtest.pro | 6 + .../mkdiroperationtest/tst_mkdiroperationtest.cpp | 169 +++++++++++++++++++++ 4 files changed, 193 insertions(+), 17 deletions(-) create mode 100644 tests/auto/installer/mkdiroperationtest/mkdiroperationtest.pro create mode 100644 tests/auto/installer/mkdiroperationtest/tst_mkdiroperationtest.cpp diff --git a/src/libs/kdtools/kdupdaterupdateoperations.cpp b/src/libs/kdtools/kdupdaterupdateoperations.cpp index 8270bba03..b67026970 100644 --- a/src/libs/kdtools/kdupdaterupdateoperations.cpp +++ b/src/libs/kdtools/kdupdaterupdateoperations.cpp @@ -58,20 +58,27 @@ static QString errnoToQString(int error) #endif } -static bool removeDirectory(const QString &path, QString *errorString) +static bool removeDirectory(const QString &path, QString *errorString, bool force = true) { Q_ASSERT(errorString); const QFileInfoList entries = QDir(path).entryInfoList(QDir::NoDotAndDotDot | QDir::AllEntries | QDir::Hidden); for (QFileInfoList::const_iterator it = entries.constBegin(); it != entries.constEnd(); ++it) { if (it->isDir() && !it->isSymLink()) { - removeDirectory(it->filePath(), errorString); - } else { + removeDirectory(it->filePath(), errorString, force); + } else if (force) { QFile f(it->filePath()); if (!f.remove()) return false; } } + // even remove some hidden, OS-created files in there +#if defined Q_OS_MAC + QFile::remove(path + QLatin1String("/.DS_Store")); +#elif defined Q_OS_WIN + QFile::remove(path + QLatin1String("/Thumbs.db")); +#endif + errno = 0; const bool success = QDir().rmdir(path); if (errno) @@ -446,8 +453,7 @@ void MkdirOperation::backup() bool MkdirOperation::performOperation() { - // Requires only one parameter. That is the name of - // the file to remove. + // Requires only one parameter. That is the path which should be created QStringList args = this->arguments(); if (args.count() != 1) { setError(InvalidArguments); @@ -467,7 +473,10 @@ bool MkdirOperation::undoOperation() { Q_ASSERT(arguments().count() == 1); - QDir createdDir = QDir(value(QLatin1String("createddir")).toString()); + QString createdDirValue = value(QLatin1String("createddir")).toString(); + if (createdDirValue.isEmpty()) + createdDirValue = arguments().first(); + QDir createdDir = QDir(createdDirValue); const bool forceremoval = QVariant(value(QLatin1String("forceremoval"))).toBool(); // Since refactoring we know the mkdir operation which is creating the target path. If we do a full @@ -482,18 +491,9 @@ bool MkdirOperation::undoOperation() return true; QString errorString; - if (forceremoval) - return removeDirectory(createdDir.path(), &errorString); - // even remove some hidden, OS-created files in there -#if defined Q_OS_MAC - QFile::remove(createdDir.path() + QLatin1String("/.DS_Store")); -#elif defined Q_OS_WIN - QFile::remove(createdDir.path() + QLatin1String("/Thumbs.db")); -#endif + const bool result = removeDirectory(createdDir.path(), &errorString, forceremoval); - errno = 0; - const bool result = QDir::root().rmdir(createdDir.path()); if (!result) { if (errorString.isEmpty()) setError(UserDefinedError, tr("Cannot remove directory %1: %2").arg(createdDir.path(), errorString)); diff --git a/tests/auto/installer/installer.pro b/tests/auto/installer/installer.pro index 911e1ad75..e903b806a 100644 --- a/tests/auto/installer/installer.pro +++ b/tests/auto/installer/installer.pro @@ -3,4 +3,5 @@ TEMPLATE = subdirs SUBDIRS += \ settings \ repository \ - fakestopprocessforupdateoperation + fakestopprocessforupdateoperation \ + mkdiroperationtest diff --git a/tests/auto/installer/mkdiroperationtest/mkdiroperationtest.pro b/tests/auto/installer/mkdiroperationtest/mkdiroperationtest.pro new file mode 100644 index 000000000..19ca5819c --- /dev/null +++ b/tests/auto/installer/mkdiroperationtest/mkdiroperationtest.pro @@ -0,0 +1,6 @@ +include(../../qttest.pri) + +QT -= gui +QT += testlib + +SOURCES = tst_mkdiroperationtest.cpp diff --git a/tests/auto/installer/mkdiroperationtest/tst_mkdiroperationtest.cpp b/tests/auto/installer/mkdiroperationtest/tst_mkdiroperationtest.cpp new file mode 100644 index 000000000..fd427400d --- /dev/null +++ b/tests/auto/installer/mkdiroperationtest/tst_mkdiroperationtest.cpp @@ -0,0 +1,169 @@ +/************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Installer Framework. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +**************************************************************************/ + +#include "init.h" +#include "kdupdaterupdateoperations.h" + +#include +#include +#include +#include +#include + +using namespace KDUpdater; +using namespace QInstaller; + +class tst_mkdiroperationtest : public QObject +{ + Q_OBJECT + +private slots: + void initTestCase() + { + QInstaller::init(); + QString path = QDir::current().path() + QDir::toNativeSeparators("/test"); + if (QDir(path).exists()) { + QFAIL("Remove test folder first!"); + } + } + + void testMissingArguments() + { + MkdirOperation op; + + QVERIFY(op.testOperation()); + QVERIFY(!op.performOperation()); + + QCOMPARE(UpdateOperation::Error(op.error()), UpdateOperation::InvalidArguments); + QCOMPARE(op.errorString(), QString("Invalid arguments: 0 arguments given, 1 expected.")); + + } + + void testCreateDirectory_data() + { + QTest::addColumn("directory"); + QTest::newRow("/test") << "/test"; + QTest::newRow("/test/test") << "/test/test"; + QTest::newRow("/test/test/test") << "/test/test/test"; + } + + void testCreateDirectory() + { + QFETCH(QString, directory); + QString path = QDir::current().path() + QDir::toNativeSeparators(directory); + + QVERIFY2(!QDir(path).exists(), path.toAscii()); + MkdirOperation op; + op.setArguments(QStringList() << path); + op.backup(); + QVERIFY2(op.performOperation(), op.errorString().toAscii()); + QVERIFY2(QDir(path).exists(), path.toAscii()); + QVERIFY2(op.undoOperation(), op.errorString().toAscii()); + QVERIFY2(!QDir(path).exists(), path.toAscii()); + } + + void testCreateDirectory_customFile_data() + { + QTest::addColumn("directory"); + QTest::addColumn("filename"); + QTest::newRow("/test") << "/test" << "/test/file.txt"; + QTest::newRow("/test/test") << "/test/test" << "/test/file.txt"; + QTest::newRow("/test/test/test") << "/test/test/test" << "/test/test/test/file.txt"; + } + + void testCreateDirectory_customFile() + { + QFETCH(QString, directory); + QFETCH(QString, filename); + QString path = QDir::current().path() + QDir::toNativeSeparators(directory); + QString filepath = QDir::current().path() + QDir::toNativeSeparators(filename); + + QVERIFY2(!QDir(path).exists(), path.toAscii()); + MkdirOperation op; + op.setArguments(QStringList() << path); + op.backup(); + QVERIFY2(op.performOperation(), op.errorString().toAscii()); + QVERIFY2(QDir(path).exists(), path.toAscii()); + QFile file(filepath); + file.open(QIODevice::WriteOnly | QIODevice::Text); + QTextStream out(&file); + out << "This file is generated by QTest\n"; + file.close(); + QVERIFY2(!op.undoOperation(), op.errorString().toAscii()); + QVERIFY2(file.exists(), filepath.toAscii()); + QVERIFY2(QDir(filepath).remove(filepath), "Could not remove file"); + QVERIFY2(!file.exists(), filepath.toAscii()); + QVERIFY2(op.undoOperation(), op.errorString().toAscii()); + QVERIFY2(!QDir(path).exists(), path.toAscii()); + } + + void testCreateDirectory_customFile_force_data() + { + testCreateDirectory_customFile_data(); + } + + void testCreateDirectory_customFile_force() + { + QFETCH(QString, directory); + QFETCH(QString, filename); + QString path = QDir::current().path() + QDir::toNativeSeparators(directory); + QString filepath = QDir::current().path() + QDir::toNativeSeparators(filename); + + QVERIFY2(!QDir(path).exists(), path.toAscii()); + MkdirOperation op; + op.setArguments(QStringList() << path); + op.setValue("forceremoval",true); + op.backup(); + QVERIFY2(op.performOperation(), op.errorString().toAscii()); + QVERIFY2(QDir(path).exists(), path.toAscii()); + QFile file(filepath); + file.open(QIODevice::WriteOnly | QIODevice::Text); + QTextStream out(&file); + out << "This file is generated by QTest\n"; + file.close(); + QVERIFY2(op.undoOperation(), op.errorString().toAscii()); + QVERIFY2(!file.exists(), path.toAscii()); + } +}; + +QTEST_MAIN(tst_mkdiroperationtest) + +#include "tst_mkdiroperationtest.moc" -- cgit v1.2.3