X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/fa4680cb38028aceb68d41e1937d27c71d1f121b..9340a52cf8b310545fdb06f1f5aeec0f6a32d539:/src/revisioncontrolplugin.cpp diff --git a/src/revisioncontrolplugin.cpp b/src/revisioncontrolplugin.cpp index 6c0f82fb8..6a833f622 100644 --- a/src/revisioncontrolplugin.cpp +++ b/src/revisioncontrolplugin.cpp @@ -19,7 +19,13 @@ #include "revisioncontrolplugin.h" +#include +#include +#include +#include #include +#include +#include RevisionControlPlugin::RevisionControlPlugin() { @@ -29,12 +35,32 @@ RevisionControlPlugin::~RevisionControlPlugin() { } +#include "revisioncontrolplugin.moc" + // ---------------------------------------------------------------------------- SubversionPlugin::SubversionPlugin() : m_directory(), - m_fileInfoHash() + m_revisionInfoHash(), + m_updateAction(0), + m_commitAction(0), + m_addAction(0), + m_removeAction(0) { + m_updateAction = new KAction(this); + m_updateAction->setIcon(KIcon("view-refresh")); + m_updateAction->setText(i18nc("@item:inmenu", "SVN Update")); + + m_commitAction = new KAction(this); + m_commitAction->setText(i18nc("@item:inmenu", "SVN Commit...")); + + m_addAction = new KAction(this); + m_addAction->setIcon(KIcon("list-add")); + m_addAction->setText(i18nc("@item:inmenu", "SVN Add")); + + m_removeAction = new KAction(this); + m_removeAction->setIcon(KIcon("list-remove")); + m_removeAction->setText(i18nc("@item:inmenu", "SVN Delete")); } SubversionPlugin::~SubversionPlugin() @@ -49,6 +75,7 @@ QString SubversionPlugin::fileName() const bool SubversionPlugin::beginRetrieval(const QString& directory) { Q_ASSERT(directory.endsWith('/')); + m_directory = directory; const QString path = directory + ".svn/text-base/"; QDir dir(path); @@ -61,7 +88,10 @@ bool SubversionPlugin::beginRetrieval(const QString& directory) // in a fast way in SubversionPlugin::revisionState(). fileName.chop(sizeof(".svn-base") / sizeof(char) - 1); if (!fileName.isEmpty()) { - m_fileInfoHash.insert(fileName, fileInfoList.at(i)); + RevisionInfo info; + info.size = fileInfoList.at(i).size(); + info.timeStamp = fileInfoList.at(i).lastModified(); + m_revisionInfoHash.insert(fileName, info); } } return size > 0; @@ -71,12 +101,68 @@ void SubversionPlugin::endRetrieval() { } -RevisionControlPlugin::RevisionState SubversionPlugin::revisionState(const QString& fileName) +RevisionControlPlugin::RevisionState SubversionPlugin::revisionState(const KFileItem& item) { - if (m_fileInfoHash.contains(fileName)) { - // TODO... - return RevisionControlPlugin::LatestRevision; + const QString name = item.name(); + if (item.isDir()) { + QFile file(m_directory + name + "/.svn"); + if (file.open(QIODevice::ReadOnly)) { + file.close(); + // TODO... + return RevisionControlPlugin::LatestRevision; + } + } else if (m_revisionInfoHash.contains(name)) { + const RevisionInfo info = m_revisionInfoHash.value(item.name()); + const QDateTime localTimeStamp = item.time(KFileItem::ModificationTime).dateTime(); + const QDateTime versionedTimeStamp = info.timeStamp; + + if (localTimeStamp > versionedTimeStamp) { + if ((info.size != item.size()) || !equalRevisionContent(item.name())) { + return RevisionControlPlugin::EditingRevision; + } + } else if (localTimeStamp < versionedTimeStamp) { + if ((info.size != item.size()) || !equalRevisionContent(item.name())) { + return RevisionControlPlugin::UpdateRequiredRevision; + } + } + return RevisionControlPlugin::LatestRevision; } return RevisionControlPlugin::LocalRevision; } + +QList SubversionPlugin::contextMenuActions(const KFileItemList& items) const +{ + QList actions; + actions.append(m_updateAction); + actions.append(m_commitAction); + if (!items.isEmpty()) { + actions.append(m_addAction); + actions.append(m_removeAction); + } + return actions; +} + +bool SubversionPlugin::equalRevisionContent(const QString& name) const +{ + QFile localFile(m_directory + '/' + name); + if (!localFile.open(QIODevice::ReadOnly | QIODevice::Text)) { + return false; + } + + QFile revisionedFile(m_directory + "/.svn/text-base/" + name + ".svn-base"); + if (!revisionedFile.open(QIODevice::ReadOnly | QIODevice::Text)) { + return false; + } + + QTextStream localText(&localFile); + QTextStream revisionedText(&revisionedFile); + while (!localText.atEnd() && !revisionedText.atEnd()) { + if (localText.readLine() != revisionedText.readLine()) { + return false; + } + } + + return localText.atEnd() && revisionedText.atEnd(); +} +