SVN commit 829270 by dfaure: Fix mimetype determination with pattern like *.pkg.tar.gz Analysis and patch by Pino, unit test by me. M +6 -2 kdebase/apps/konqueror/settings/filetypes/tests/filetypestest.cpp M +4 -2 kdelibs/kdecore/services/kmimetypefactory.cpp --- trunk/KDE/kdebase/apps/konqueror/settings/filetypes/tests/filetypestest.cpp #829269:829270 @@ -248,7 +248,7 @@ MimeTypeData data(mimeTypeName, true); data.setComment("Fake MimeType"); - QStringList patterns = QStringList() << "*.fake"; + QStringList patterns = QStringList() << "*.pkg.tar.gz"; data.setPatterns(patterns); QVERIFY(data.isDirty()); QVERIFY(data.sync()); @@ -257,7 +257,11 @@ KMimeType::Ptr mime = KMimeType::mimeType(mimeTypeName); QVERIFY(mime); QCOMPARE(mime->comment(), QString("Fake MimeType")); - QCOMPARE(mime->patterns(), patterns); + QCOMPARE(mime->patterns(), patterns); // must sort them if more than one + + // Testcase for the shaman.xml bug + QCOMPARE(KMimeType::findByPath("/whatever/foo.pkg.tar.gz")->name(), QString("fake/unit-test-fake-mimetype")); + m_mimeTypeCreatedSuccessfully = true; } --- trunk/KDE/kdelibs/kdecore/services/kmimetypefactory.cpp #829269:829270 @@ -193,7 +193,7 @@ if (pattern[0] == '*' && pattern.indexOf('[') == -1) { if ( len + 1 < pattern_len ) return false; - + const QChar *c1 = pattern.unicode() + pattern_len - 1; const QChar *c2 = filename.unicode() + len - 1; int cnt = 1; @@ -217,7 +217,7 @@ } // Names without any wildcards like "README" - if (pattern.indexOf('[') == -1 && pattern.indexOf('*') == -1 && pattern.indexOf('?')) + if (pattern.indexOf('[') == -1 && pattern.indexOf('*') == -1 && pattern.indexOf('?')) return (pattern == filename); // Other patterns, like "[Mm]akefile": use slow but correct method @@ -284,6 +284,8 @@ } else if (pattern.length() > matchingPatternLength) { // longer: clear any previous match (like *.bz2, when pattern is *.tar.bz2) matchingMimeTypes.clear(); + // remember the new "longer" length + matchingPatternLength = pattern.length(); } KMimeType *newMimeType = createEntry( *it_offset ); assert (newMimeType && newMimeType->isType( KST_KMimeType ));