From 9a17d424cb964f70242912fc726b475a7fce035e Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 29 Aug 2024 10:21:08 +0200 Subject: [PATCH] Update mime database from Qt qtbase/1b39e61a775d70ee96287e9f0e418cb5741e6638 QMimeDatabase: fix detection of pattern conflict in different prefixes Change-Id: Ic795a65d98bb59520bd5fb92dc92f1444bbea2db Reviewed-by: Jarek Kobus --- src/libs/utils/mimetypes2/mimeprovider.cpp | 43 ++++++++++------------ src/libs/utils/mimetypes2/mimeprovider_p.h | 6 +-- 2 files changed, 21 insertions(+), 28 deletions(-) diff --git a/src/libs/utils/mimetypes2/mimeprovider.cpp b/src/libs/utils/mimetypes2/mimeprovider.cpp index c0266ffd86c..d4c8cffc327 100644 --- a/src/libs/utils/mimetypes2/mimeprovider.cpp +++ b/src/libs/utils/mimetypes2/mimeprovider.cpp @@ -214,32 +214,25 @@ void MimeBinaryProvider::addFileNameMatches(const QString &fileName, MimeGlobMat return; Q_ASSERT(m_cacheFile); const QString lowerFileName = fileName.toLower(); + int numMatches = 0; // Check literals (e.g. "Makefile") - matchGlobList(result, m_cacheFile.get(), m_cacheFile->getUint32(PosLiteralListOffset), - fileName); + numMatches = matchGlobList(result, m_cacheFile.get(), + m_cacheFile->getUint32(PosLiteralListOffset), fileName); // Check the very common *.txt cases with the suffix tree - if (result.m_matchingMimeTypes.isEmpty()) { + if (numMatches == 0) { const int reverseSuffixTreeOffset = m_cacheFile->getUint32(PosReverseSuffixTreeOffset); const int numRoots = m_cacheFile->getUint32(reverseSuffixTreeOffset); const int firstRootOffset = m_cacheFile->getUint32(reverseSuffixTreeOffset + 4); - matchSuffixTree(result, - m_cacheFile.get(), - numRoots, - firstRootOffset, - lowerFileName, - lowerFileName.size() - 1, - false); - if (result.m_matchingMimeTypes.isEmpty()) - matchSuffixTree(result, - m_cacheFile.get(), - numRoots, - firstRootOffset, - fileName, - fileName.size() - 1, - true); + if (matchSuffixTree(result, m_cacheFile.get(), numRoots, firstRootOffset, lowerFileName, + lowerFileName.size() - 1, false)) { + ++numMatches; + } else if (matchSuffixTree(result, m_cacheFile.get(), numRoots, firstRootOffset, fileName, + fileName.size() - 1, true)) { + ++numMatches; + } } // Check complex globs (e.g. "callgrind.out[0-9]*" or "README*") - if (result.m_matchingMimeTypes.isEmpty()) + if (numMatches == 0) matchGlobList(result, m_cacheFile.get(), m_cacheFile->getUint32(PosGlobListOffset), fileName); } @@ -255,11 +248,10 @@ void MimeBinaryProvider::excludeMimeTypeGlobs(const QStringList &toExclude) appendIfNew(m_mimeTypesWithExcludedGlobs, mt); } -void MimeBinaryProvider::matchGlobList(MimeGlobMatchResult &result, - CacheFile *cacheFile, - int off, - const QString &fileName) +int MimeBinaryProvider::matchGlobList(MimeGlobMatchResult &result, CacheFile *cacheFile, int off, + const QString &fileName) { + int numMatches = 0; const int numGlobs = cacheFile->getUint32(off); //qDebug() << "Loading" << numGlobs << "globs from" << cacheFile->file.fileName() << "at offset" << cacheFile->globListOffset; for (int i = 0; i < numGlobs; ++i) { @@ -279,9 +271,12 @@ void MimeBinaryProvider::matchGlobList(MimeGlobMatchResult &result, continue; MimeGlobPattern glob(pattern, QString() /*unused*/, weight, qtCaseSensitive); - if (glob.matchFileName(fileName)) + if (glob.matchFileName(fileName)) { result.addMatch(QLatin1StringView(mimeType), weight, pattern); + ++numMatches; + } } + return numMatches; } bool MimeBinaryProvider::matchSuffixTree(MimeGlobMatchResult &result, diff --git a/src/libs/utils/mimetypes2/mimeprovider_p.h b/src/libs/utils/mimetypes2/mimeprovider_p.h index 87a59e3008b..2ae3b0c966e 100644 --- a/src/libs/utils/mimetypes2/mimeprovider_p.h +++ b/src/libs/utils/mimetypes2/mimeprovider_p.h @@ -128,10 +128,8 @@ public: private: struct CacheFile; - void matchGlobList(MimeGlobMatchResult &result, - CacheFile *cacheFile, - int offset, - const QString &fileName); + int matchGlobList(MimeGlobMatchResult &result, CacheFile *cacheFile, int offset, + const QString &fileName); bool matchSuffixTree(MimeGlobMatchResult &result, CacheFile *cacheFile, int numEntries,