Index: svn/fileviewsvnplugin.h =================================================================== --- svn/fileviewsvnplugin.h +++ svn/fileviewsvnplugin.h @@ -96,6 +96,13 @@ QList directoryActions(const KFileItem &directory) const; + /** + * Checks #item parent directory (or its parent directory and so on) is unversioned. + * @param item Item to check. + * @return True item is in unversioned directory, false otherwise. + */ + bool isInUnversionedDir(const KFileItem& item) const; + private: bool m_pendingOperation; QHash m_versionInfoHash; Index: svn/fileviewsvnplugin.cpp =================================================================== --- svn/fileviewsvnplugin.cpp +++ svn/fileviewsvnplugin.cpp @@ -226,6 +226,11 @@ return m_versionInfoHash.value(itemUrl); } + // If parent directory is unversioned item itself is unversioned. + if (isInUnversionedDir(item)) { + return UnversionedVersion; + } + if (!item.isDir()) { // files that have not been listed by 'svn status' (= m_versionInfoHash) // are under version control per definition @@ -254,6 +259,14 @@ QList FileViewSvnPlugin::actions(const KFileItemList& items) const { + // Special case: if any item is in unversioned directory we shouldn't add any actions because + // we can do nothing with this item. + for (const auto &i : qAsConst(items)) { + if (isInUnversionedDir(i)) { + return {}; + } + } + if (items.count() == 1 && items.first().isDir()) { return directoryActions(items.first()); } @@ -656,4 +669,18 @@ return actions; } +bool FileViewSvnPlugin::isInUnversionedDir(const KFileItem& item) const +{ + const QString itemPath = item.localPath(); + + for (auto it = m_versionInfoHash.cbegin(); it != m_versionInfoHash.cend(); ++it) { + // Add QDir::separator() to m_versionInfoHash entry to ensure this is a directory. + if (it.value() == UnversionedVersion && itemPath.startsWith(it.key() + QDir::separator())) { + return true; + } + } + + return false; +} + #include "fileviewsvnplugin.moc"