From 0df375a08a47997cb7df204229d747b8976f9232 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Thu, 19 Jan 2012 15:26:54 +0100 Subject: [PATCH] FileName: Add method to find parent directories Change-Id: Ia8382e3f7a9312e0878cce041723973ccf751aae Reviewed-by: Daniel Teske --- src/libs/utils/fileutils.cpp | 22 +++++ src/libs/utils/fileutils.h | 2 + tests/auto/auto.pro | 1 + tests/auto/utils/fileutils/fileutils.pro | 13 +++ tests/auto/utils/fileutils/tst_fileutils.cpp | 98 ++++++++++++++++++++ tests/auto/utils/utils.pro | 6 ++ 6 files changed, 142 insertions(+) create mode 100644 tests/auto/utils/fileutils/fileutils.pro create mode 100644 tests/auto/utils/fileutils/tst_fileutils.cpp create mode 100644 tests/auto/utils/utils.pro diff --git a/src/libs/utils/fileutils.cpp b/src/libs/utils/fileutils.cpp index 4d75bd75a6..07460cf167 100644 --- a/src/libs/utils/fileutils.cpp +++ b/src/libs/utils/fileutils.cpp @@ -452,6 +452,28 @@ QString FileName::toUserOutput() const return QDir::toNativeSeparators(toString()); } +/// Find the parent directory of a given directory. + +/// Returns an empty FileName if the current dirctory is already +/// a root level directory. + +/// \returns \a FileName with the last segment removed. +FileName FileName::parentDir() const +{ + const QString basePath = toString(); + if (basePath.isEmpty()) + return FileName(); + + const QDir base(basePath); + if (base.isRoot()) + return FileName(); + + const QString path = basePath + QLatin1String("/.."); + const QString parent = QDir::cleanPath(path); + + return FileName::fromString(parent); +} + /// Constructs a FileName from \a fileName /// \a fileName is not checked for validity. FileName FileName::fromString(const QString &filename) diff --git a/src/libs/utils/fileutils.h b/src/libs/utils/fileutils.h index 5f4b8a56e9..e5af4b722f 100644 --- a/src/libs/utils/fileutils.h +++ b/src/libs/utils/fileutils.h @@ -152,6 +152,8 @@ public: QString toString() const; QString toUserOutput() const; + FileName parentDir() const; + bool operator==(const FileName &other) const; bool operator!=(const FileName &other) const; bool operator<(const FileName &other) const; diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro index 009cbaf80e..4bb160e3d4 100644 --- a/tests/auto/auto.pro +++ b/tests/auto/auto.pro @@ -13,6 +13,7 @@ SUBDIRS += \ profilewriter \ ioutils \ qtcprocess \ + utils \ utils_stringutils \ filesearch diff --git a/tests/auto/utils/fileutils/fileutils.pro b/tests/auto/utils/fileutils/fileutils.pro new file mode 100644 index 0000000000..8989860f20 --- /dev/null +++ b/tests/auto/utils/fileutils/fileutils.pro @@ -0,0 +1,13 @@ +include(../../qttest.pri) +include(../shared/shared.pri) + +include($$IDE_SOURCE_TREE/src/libs/utils/utils.pri) + +UTILSDIR = $$IDE_SOURCE_TREE/src/libs/ + +INCLUDEPATH += $$UTILSDIR +DEFINES += QTCREATOR_UTILS_LIB + +SOURCES += tst_fileutils.cpp \ + $$UTILSDIR/utils/fileutils.cpp \ + diff --git a/tests/auto/utils/fileutils/tst_fileutils.cpp b/tests/auto/utils/fileutils/tst_fileutils.cpp new file mode 100644 index 0000000000..ff4b7d89e4 --- /dev/null +++ b/tests/auto/utils/fileutils/tst_fileutils.cpp @@ -0,0 +1,98 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** +** GNU Lesser General Public License Usage +** +** 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, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** Other Usage +** +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +**************************************************************************/ + +#include +#include + +#include + +//TESTED_COMPONENT=src/libs/utils +using namespace Utils; + +class tst_fileutils : public QObject +{ + Q_OBJECT + +public: + +private slots: + void parentDir_data(); + void parentDir(); +}; + +void tst_fileutils::parentDir_data() +{ + QTest::addColumn("path"); + QTest::addColumn("parentPath"); + QTest::addColumn("expectFailMessage"); + + QTest::newRow("empty path") << QString() << QString() << QString(); + QTest::newRow("root only") << QString::fromLatin1("/") << QString() << QString(); + QTest::newRow("//") << QString::fromLatin1("//") << QString() << QString(); + QTest::newRow("/tmp/dir") << QString::fromLatin1("/tmp/dir") << QString::fromLatin1("/tmp") << QString(); + QTest::newRow("relative/path") << QString::fromLatin1("relative/path") << QString::fromLatin1("relative") << QString(); + QTest::newRow("relativepath") << QString::fromLatin1("relativepath") << QString::fromLatin1(".") + << QString::fromLatin1("see QTBUG-23892"); + + // Windows stuff: +#ifdef Q_OS_WIN + QTest::newRow("C:/data") << QString::fromLatin1("C:/data") << QString::fromLatin1("C:/") << QString(); + QTest::newRow("C:/") << QString::fromLatin1("C:/") << QString() << QString(); + QTest::newRow("//./com1") << QString::fromLatin1("//./com1") << QString::fromLatin1("/") << QString(); + QTest::newRow("//?/path") << QString::fromLatin1("//?/path") << QString::fromLatin1("/") + << QString::fromLatin1("Qt 4 can not handle this path."); + QTest::newRow("/Global??/UNC/host") << QString::fromLatin1("/Global??/UNC/host") + << QString::fromLatin1("/Global??/UNC/host") + << QString::fromLatin1("Qt 4 can not handle this path."); + QTest::newRow("//server/directory/file") + << QString::fromLatin1("//server/directory/file") << QString::fromLatin1("//server/directory") << QString(); + QTest::newRow("//server/directory") + << QString::fromLatin1("//server/directory") << QString::fromLatin1("//server") << QString(); + QTest::newRow("//server") + << QString::fromLatin1("//server") << QString() << QString(); +#endif +} + +void tst_fileutils::parentDir() +{ + QFETCH(QString, path); + QFETCH(QString, parentPath); + QFETCH(QString, expectFailMessage); + + FileName result = FileName::fromString(path).parentDir(); + if (!expectFailMessage.isEmpty()) + QEXPECT_FAIL("", expectFailMessage.toUtf8().constData(), Continue); + QCOMPARE(result.toString(), parentPath); +} + +QTEST_APPLESS_MAIN(tst_fileutils) +#include "tst_fileutils.moc" diff --git a/tests/auto/utils/utils.pro b/tests/auto/utils/utils.pro new file mode 100644 index 0000000000..21d4bac88b --- /dev/null +++ b/tests/auto/utils/utils.pro @@ -0,0 +1,6 @@ +TEMPLATE = subdirs +CONFIG += ordered + +SUBDIRS = \ + fileutils \ + -- GitLab