return;
}
- if (!thread->retrievedItems()) {
- // Ignore m_silentUpdate for an error message
- emit errorMessage(i18nc("@info:status", "Update of version information failed."));
- return;
- }
-
- const QList<ItemState> itemStates = thread->itemStates();
- foreach (const ItemState& itemState, itemStates) {
- QHash<QByteArray, QVariant> values;
- values.insert("version", QVariant(itemState.version));
- m_model->setData(itemState.index, values);
+ const QMap<QString, QVector<ItemState> >& itemStates = thread->itemStates();
+ QMap<QString, QVector<ItemState> >::const_iterator it = itemStates.constBegin();
+ for (; it != itemStates.constEnd(); ++it) {
+ const QVector<ItemState>& items = it.value();
+
+ foreach (const ItemState& item, items) {
+ QHash<QByteArray, QVariant> values;
+ values.insert("version", QVariant(item.version));
+ m_model->setData(m_model->index(item.item), values);
+ }
}
if (!m_silentUpdate) {
m_pendingItemStatesUpdate = true;
return;
}
- QList<ItemState> itemStates;
- const int itemCount = m_model->count();
- itemStates.reserve(itemCount);
-
- for (int i = 0; i < itemCount; ++i) {
- ItemState itemState;
- itemState.index = i;
- itemState.item = m_model->fileItem(i);
- itemState.version = KVersionControlPlugin2::UnversionedVersion;
- itemStates.append(itemState);
- }
+ QMap<QString, QVector<ItemState> > itemStates;
+ createItemStatesList(itemStates);
if (!itemStates.isEmpty()) {
if (!m_silentUpdate) {
}
}
+int VersionControlObserver::createItemStatesList(QMap<QString, QVector<ItemState> >& itemStates,
+ const int firstIndex)
+{
+ const int itemCount = m_model->count();
+ const int currentExpansionLevel = m_model->expandedParentsCount(firstIndex);
+
+ QVector<ItemState> items;
+ items.reserve(itemCount - firstIndex);
+
+ int index;
+ for (index = firstIndex; index < itemCount; ++index) {
+ const int expansionLevel = m_model->expandedParentsCount(index);
+
+ if (expansionLevel == currentExpansionLevel) {
+ ItemState itemState;
+ itemState.item = m_model->fileItem(index);
+ itemState.version = KVersionControlPlugin2::UnversionedVersion;
+
+ items.append(itemState);
+ } else if (expansionLevel > currentExpansionLevel) {
+ // Sub folder
+ index += createItemStatesList(itemStates, index) - 1;
+ } else {
+ break;
+ }
+ }
+
+ if (items.count() > 0) {
+ const KUrl& url = items.first().item.url();
+ itemStates.insert(url.directory(KUrl::AppendTrailingSlash), items);
+ }
+
+ return index - firstIndex; // number of processed items
+}
+
KVersionControlPlugin* VersionControlObserver::searchPlugin(const KUrl& directory) const
{
static bool pluginsAvailable = true;
}
}
+ // We use the number of upUrl() calls to find the best matching plugin
+ // for the given directory. The smaller value, the better it is (0 is best).
+ KVersionControlPlugin* bestPlugin = 0;
+ int bestScore = INT_MAX;
+
// Verify whether the current directory contains revision information
// like .svn, .git, ...
foreach (KVersionControlPlugin* plugin, plugins) {
const QString fileName = directory.path(KUrl::AddTrailingSlash) + plugin->fileName();
if (QFile::exists(fileName)) {
+ // The score of this plugin is 0 (best), so we can just return this plugin,
+ // instead of going through the plugin scoring procedure, we can't find a better one ;)
return plugin;
}
if (m_versionedDirectory) {
KUrl dirUrl(directory);
KUrl upUrl = dirUrl.upUrl();
- while (upUrl != dirUrl) {
+ int upUrlCounter = 1;
+ while ((upUrlCounter < bestScore) && (upUrl != dirUrl)) {
const QString fileName = dirUrl.path(KUrl::AddTrailingSlash) + plugin->fileName();
if (QFile::exists(fileName)) {
- return plugin;
+ if (upUrlCounter < bestScore) {
+ bestPlugin = plugin;
+ bestScore = upUrlCounter;
+ }
+ break;
}
dirUrl = upUrl;
upUrl = dirUrl.upUrl();
+ ++upUrlCounter;
}
}
}
- return 0;
+ return bestPlugin;
}
bool VersionControlObserver::isVersioned() const