diff options
4 files changed, 28 insertions, 1 deletions
diff --git a/doc/reference/jsextensions/jsextension-fileinfo.qdoc b/doc/reference/jsextensions/jsextension-fileinfo.qdoc index 8e847a5ef..967606ea7 100644 --- a/doc/reference/jsextensions/jsextension-fileinfo.qdoc +++ b/doc/reference/jsextensions/jsextension-fileinfo.qdoc @@ -44,6 +44,18 @@ \endcode Returns the file name of \c filePath up to (but not including) the first '.' character. + \section2 canonicalPath + \code + FileInfo.canonicalPath(filePath: string): string + \endcode + Returns a canonicalized \c filePath, i.e. an absolute path without symbolic + links or redundant "." or ".." elements. + On Windows, drive substitutions are also resolved. + + It is recommended to use \c{canonicalPath} in only those cases where + canonical paths are really necessary. In most cases, \c{cleanPath} should + be enough. + \section2 cleanPath \code FileInfo.cleanPath(filePath: string): string diff --git a/src/lib/corelib/jsextensions/fileinfoextension.cpp b/src/lib/corelib/jsextensions/fileinfoextension.cpp index cdc058757..5b30ec35f 100644 --- a/src/lib/corelib/jsextensions/fileinfoextension.cpp +++ b/src/lib/corelib/jsextensions/fileinfoextension.cpp @@ -63,6 +63,7 @@ public: static QScriptValue js_baseName(QScriptContext *context, QScriptEngine *engine); static QScriptValue js_suffix(QScriptContext *context, QScriptEngine *engine); static QScriptValue js_completeSuffix(QScriptContext *context, QScriptEngine *engine); + static QScriptValue js_canonicalPath(QScriptContext *context, QScriptEngine *engine); static QScriptValue js_cleanPath(QScriptContext *context, QScriptEngine *engine); static QScriptValue js_completeBaseName(QScriptContext *context, QScriptEngine *engine); static QScriptValue js_relativePath(QScriptContext *context, QScriptEngine *engine); @@ -136,6 +137,16 @@ QScriptValue FileInfoExtension::js_completeSuffix(QScriptContext *context, QScri return FileInfo::completeSuffix(context->argument(0).toString()); } +QScriptValue FileInfoExtension::js_canonicalPath(QScriptContext *context, QScriptEngine *engine) +{ + Q_UNUSED(engine); + if (Q_UNLIKELY(context->argumentCount() < 1)) { + return context->throwError(QScriptContext::SyntaxError, + Tr::tr("canonicalPath expects 1 argument")); + } + return QFileInfo(context->argument(0).toString()).canonicalFilePath(); +} + QScriptValue FileInfoExtension::js_cleanPath(QScriptContext *context, QScriptEngine *engine) { Q_UNUSED(engine); @@ -281,6 +292,8 @@ void initializeJsExtensionFileInfo(QScriptValue extensionObject) engine->newFunction(FileInfoExtension::js_suffix)); fileInfoObj.setProperty(QLatin1String("completeSuffix"), engine->newFunction(FileInfoExtension::js_completeSuffix)); + fileInfoObj.setProperty(QLatin1String("canonicalPath"), + engine->newFunction(FileInfoExtension::js_canonicalPath)); fileInfoObj.setProperty(QLatin1String("cleanPath"), engine->newFunction(FileInfoExtension::js_cleanPath)); fileInfoObj.setProperty(StringConstants::completeBaseNameProperty(), diff --git a/tests/auto/blackbox/testdata/jsextensions-fileinfo/fileinfo.qbs b/tests/auto/blackbox/testdata/jsextensions-fileinfo/fileinfo.qbs index 244f2122e..5d0521c2a 100644 --- a/tests/auto/blackbox/testdata/jsextensions-fileinfo/fileinfo.qbs +++ b/tests/auto/blackbox/testdata/jsextensions-fileinfo/fileinfo.qbs @@ -13,6 +13,7 @@ Product { var output = new TextFile(FileInfo.joinPaths(product.sourceDirectory, "output.txt"), TextFile.WriteOnly); output.writeLine(FileInfo.baseName("/tmp/blubb.tar.gz")); + output.writeLine(FileInfo.canonicalPath("/usr/local//../bin/")); output.writeLine(FileInfo.cleanPath("/usr/local//../bin/")); output.writeLine(FileInfo.completeBaseName("/tmp/blubb.tar.gz")); output.writeLine(FileInfo.fileName("/tmp/blubb.tar.gz")); diff --git a/tests/auto/blackbox/tst_blackbox.cpp b/tests/auto/blackbox/tst_blackbox.cpp index de0e2c26d..380b5dd80 100644 --- a/tests/auto/blackbox/tst_blackbox.cpp +++ b/tests/auto/blackbox/tst_blackbox.cpp @@ -4015,10 +4015,11 @@ void TestBlackbox::jsExtensionsFileInfo() QVERIFY(output.exists()); QVERIFY(output.open(QIODevice::ReadOnly)); const QList<QByteArray> lines = output.readAll().trimmed().split('\n'); - QCOMPARE(lines.size(), 25); + QCOMPARE(lines.size(), 26); int i = 0; QCOMPARE(lines.at(i++).trimmed().constData(), "blubb"); QCOMPARE(lines.at(i++).trimmed().constData(), "/usr/bin"); + QCOMPARE(lines.at(i++).trimmed().constData(), "/usr/bin"); QCOMPARE(lines.at(i++).trimmed().constData(), "blubb.tar"); QCOMPARE(lines.at(i++).trimmed().constData(), "blubb.tar.gz"); QCOMPARE(lines.at(i++).trimmed().constData(), "/tmp/blubb.tar.gz"); |