diff options
author | Eike Ziller <eike.ziller@qt.io> | 2017-05-26 10:55:20 +0200 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2017-05-26 10:55:24 +0200 |
commit | 972a2385833e4f2ce1163cfd16d316ee514ddb17 (patch) | |
tree | bfac6f0dcaf0626dae29e1c6680d6c36d7899bf8 | |
parent | 574c5d35667de559193e94a571727da78b5ca968 (diff) | |
parent | 8cc9b5c57d453ea0de7fe9838b22824c7f9eec21 (diff) |
Merge remote-tracking branch 'origin/4.3'
Change-Id: I944d289b40ea54afcb74864886375b6f240da3eb
-rw-r--r-- | plugins/fossil/fossilclient.cpp | 117 | ||||
-rw-r--r-- | plugins/fossil/fossilcontrol.cpp | 34 | ||||
-rw-r--r-- | plugins/fossil/fossilcontrol.h | 1 | ||||
-rw-r--r-- | plugins/fossil/fossileditor.cpp | 57 | ||||
-rw-r--r-- | plugins/fossil/fossileditor.h | 12 | ||||
-rw-r--r-- | plugins/fossil/fossilplugin.cpp | 3 | ||||
-rw-r--r-- | plugins/fossil/fossilsettings.cpp | 2 | ||||
-rw-r--r-- | plugins/fossil/fossilsettings.h | 1 |
8 files changed, 156 insertions, 71 deletions
diff --git a/plugins/fossil/fossilclient.cpp b/plugins/fossil/fossilclient.cpp index 6e88166..584fc81 100644 --- a/plugins/fossil/fossilclient.cpp +++ b/plugins/fossil/fossilclient.cpp @@ -24,6 +24,7 @@ ****************************************************************************/ #include "fossilclient.h" +#include "fossileditor.h" #include "constants.h" #include <coreplugin/id.h> @@ -93,6 +94,13 @@ public: mapSetting(addToggleButton("|BLAME|", tr("Show Committers")), settings.boolPointer(FossilSettings::annotateShowCommittersKey)); } + + // Force listVersions setting to false by default. + // This way the annotated line number would not get offset by the version list. + settings.setValue(FossilSettings::annotateListVersionsKey, false); + + mapSetting(addToggleButton(QLatin1String("--log"), tr("List Versions")), + settings.boolPointer(FossilSettings::annotateListVersionsKey)); } }; @@ -568,36 +576,17 @@ QString FossilClient::synchronousGetRepositoryURL(const QString &workingDirector return output; } -struct TopicData -{ - QDateTime timeStamp; - QString topic; -}; - QString FossilClient::synchronousTopic(const QString &workingDirectory) { - static QMap<QString, TopicData> topicCache; - if (workingDirectory.isEmpty()) return QString(); // return current branch name - - const QString topLevel = findTopLevelForFile(workingDirectory); - const QFileInfo currentStateFile(topLevel + "/" + Constants::FOSSILREPO); - - TopicData &data = topicCache[workingDirectory]; - const QDateTime lastModified = currentStateFile.lastModified(); - if (lastModified == data.timeStamp) - return data.topic; - const BranchInfo branchInfo = synchronousCurrentBranch(workingDirectory); if (branchInfo.name().isEmpty()) return QString(); - data.timeStamp = lastModified; - data.topic = branchInfo.name(); - return data.topic; + return branchInfo.name(); } bool FossilClient::synchronousCreateRepository(const QString &workingDirectory, const QStringList &extraOptions) @@ -744,19 +733,34 @@ VcsBase::VcsBaseEditorWidget *FossilClient::annotate( VcsBase::VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source, VcsBase::VcsBaseEditor::getCodec(source), vcsCmdString.toLatin1().constData(), id); - QStringList effectiveArgs = extraOptions; - if (!editor->configurationAdded()) { - if (VcsBase::VcsBaseEditorConfig *editorConfig = createAnnotateEditor(editor)) { + + // We need to be able to re-query the configuration widget for the arguments + // each time the Annotate is requested from the main menu. This allows processing of + // the effective args controlled via configuration widget. + // However VcsBaseEditorWidget no longer stores the configuration widget and thus + // does not support configurationWidget() query. + // So we re-implement the configurationWidget() in FossilEditorWidget sub-class. + + auto *fossilEditor = qobject_cast<FossilEditorWidget *>(editor); + QTC_ASSERT(fossilEditor, return editor); + + if (!fossilEditor->configurationAdded()) { + if (VcsBase::VcsBaseEditorConfig *editorConfig = createAnnotateEditor(fossilEditor)) { + editorConfig->setBaseArguments(extraOptions); // editor has been just created, createVcsEditor() didn't set a configuration widget yet connect(editorConfig, &VcsBase::VcsBaseEditorConfig::commandExecutionRequested, - [=] { return this->annotate(workingDir, file, revision, lineNumber, extraOptions + editorConfig->arguments()); } ); - effectiveArgs += editorConfig->arguments(); - editor->setConfigurationAdded(); + [=]() { + const int line = VcsBase::VcsBaseEditor::lineNumberOfCurrentEditor(); + return this->annotate(workingDir, file, revision, line, editorConfig->arguments()); + } ); + fossilEditor->setConfigurationWidget(editorConfig); } } + QStringList effectiveArgs = extraOptions; + if (VcsBase::VcsBaseEditorConfig *editorConfig = fossilEditor->configurationWidget()) + effectiveArgs = editorConfig->arguments(); - VcsBase::VcsCommand *cmd = createCommand(workingDir, editor); - cmd->setCookie(lineNumber); + VcsBase::VcsCommand *cmd = createCommand(workingDir, fossilEditor); // here we introduce a "|BLAME|" meta-option to allow both annotate and blame modes int pos = effectiveArgs.indexOf("|BLAME|"); @@ -765,10 +769,15 @@ VcsBase::VcsBaseEditorWidget *FossilClient::annotate( effectiveArgs.removeAt(pos); } QStringList args(vcsCmdString); - args << revisionSpec(revision) << effectiveArgs << "--log" << file; + args << revisionSpec(revision) << effectiveArgs << file; + + // When version list requested, ignore the source line. + if (args.contains("--log")) + lineNumber = -1; + cmd->setCookie(lineNumber); enqueueJob(cmd, args); - return editor; + return fossilEditor; } bool FossilClient::isVcsFileOrDirectory(const Utils::FileName &fileName) const @@ -945,28 +954,34 @@ void FossilClient::log(const QString &workingDir, const QStringList &files, VcsBase::VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source, VcsBase::VcsBaseEditor::getCodec(source), vcsCmdString.toLatin1().constData(), id); - editor->setFileLogAnnotateEnabled(enableAnnotationContextMenu); - QStringList effectiveArgs = extraOptions; - if (!editor->configurationAdded()) { - if (VcsBase::VcsBaseEditorConfig *editorConfig = createLogEditor(editor)) { + auto *fossilEditor = qobject_cast<FossilEditorWidget *>(editor); + QTC_ASSERT(fossilEditor, return); + + fossilEditor->setFileLogAnnotateEnabled(enableAnnotationContextMenu); + + if (!fossilEditor->configurationAdded()) { + if (VcsBase::VcsBaseEditorConfig *editorConfig = createLogEditor(fossilEditor)) { + editorConfig->setBaseArguments(extraOptions); // editor has been just created, createVcsEditor() didn't set a configuration widget yet connect(editorConfig, &VcsBase::VcsBaseEditorConfig::commandExecutionRequested, - [=]() { this->log(workingDir, files, extraOptions + editorConfig->arguments(), enableAnnotationContextMenu); } ); - effectiveArgs += editorConfig->arguments(); - editor->setConfigurationAdded(); + [=]() { this->log(workingDir, files, editorConfig->arguments(), enableAnnotationContextMenu); } ); + fossilEditor->setConfigurationWidget(editorConfig); } } + QStringList effectiveArgs = extraOptions; + if (VcsBase::VcsBaseEditorConfig *editorConfig = fossilEditor->configurationWidget()) + effectiveArgs = editorConfig->arguments(); //@TODO: move highlighter and widgets to fossil editor sources. - new FossilLogHighlighter(editor->document()); + new FossilLogHighlighter(fossilEditor->document()); QStringList args(vcsCmdString); args << effectiveArgs; if (!files.isEmpty()) args << "--path" << files; - enqueueJob(createCommand(workingDir, editor), args); + enqueueJob(createCommand(workingDir, fossilEditor), args); } void FossilClient::logCurrentFile(const QString &workingDir, const QStringList &files, @@ -991,26 +1006,32 @@ void FossilClient::logCurrentFile(const QString &workingDir, const QStringList & VcsBase::VcsBaseEditorWidget *editor = createVcsEditor(kind, title, source, VcsBase::VcsBaseEditor::getCodec(source), vcsCmdString.toLatin1().constData(), id); - editor->setFileLogAnnotateEnabled(enableAnnotationContextMenu); - QStringList effectiveArgs = extraOptions; - if (!editor->configurationAdded()) { - if (VcsBase::VcsBaseEditorConfig *editorConfig = createLogEditor(editor)) { + auto *fossilEditor = qobject_cast<FossilEditorWidget *>(editor); + QTC_ASSERT(fossilEditor, return); + + fossilEditor->setFileLogAnnotateEnabled(enableAnnotationContextMenu); + + if (!fossilEditor->configurationAdded()) { + if (VcsBase::VcsBaseEditorConfig *editorConfig = createLogEditor(fossilEditor)) { + editorConfig->setBaseArguments(extraOptions); // editor has been just created, createVcsEditor() didn't set a configuration widget yet connect(editorConfig, &VcsBase::VcsBaseEditorConfig::commandExecutionRequested, - [=]() { this->logCurrentFile(workingDir, files, extraOptions + editorConfig->arguments(), enableAnnotationContextMenu); } ); - effectiveArgs += editorConfig->arguments(); - editor->setConfigurationAdded(); + [=]() { this->logCurrentFile(workingDir, files, editorConfig->arguments(), enableAnnotationContextMenu); } ); + fossilEditor->setConfigurationWidget(editorConfig); } } + QStringList effectiveArgs = extraOptions; + if (VcsBase::VcsBaseEditorConfig *editorConfig = fossilEditor->configurationWidget()) + effectiveArgs = editorConfig->arguments(); //@TODO: move highlighter and widgets to fossil editor sources. - new FossilLogHighlighter(editor->document()); + new FossilLogHighlighter(fossilEditor->document()); QStringList args(vcsCmdString); args << effectiveArgs << files; - enqueueJob(createCommand(workingDir, editor), args); + enqueueJob(createCommand(workingDir, fossilEditor), args); } void FossilClient::revertFile(const QString &workingDir, diff --git a/plugins/fossil/fossilcontrol.cpp b/plugins/fossil/fossilcontrol.cpp index 45ef0c2..dc515c9 100644 --- a/plugins/fossil/fossilcontrol.cpp +++ b/plugins/fossil/fossilcontrol.cpp @@ -41,9 +41,33 @@ #include <QDir> #include <QUrl> -using namespace Fossil::Internal; +namespace Fossil { +namespace Internal { + +class FossilTopicCache : public Core::IVersionControl::TopicCache +{ +public: + FossilTopicCache(FossilClient *client) : + m_client(client) + { } + +protected: + QString trackFile(const QString &repository) final + { + return repository + "/" + Constants::FOSSILREPO; + } + + QString refreshTopic(const QString &repository) final + { + return m_client->synchronousTopic(repository); + } + +private: + FossilClient *m_client; +}; FossilControl::FossilControl(FossilClient *client) : + Core::IVersionControl(new FossilTopicCache(client)), m_client(client) { } @@ -156,11 +180,6 @@ bool FossilControl::vcsAnnotate(const QString &file, int line) return true; } -QString FossilControl::vcsTopic(const QString &directory) -{ - return m_client->synchronousTopic(directory); -} - Core::ShellCommand *FossilControl::createInitialCheckoutCommand(const QString &sourceUrl, const Utils::FileName &baseDirectory, const QString &localName, @@ -287,3 +306,6 @@ void FossilControl::changed(const QVariant &v) break; } } + +} // namespace Internal +} // namespace Fossil diff --git a/plugins/fossil/fossilcontrol.h b/plugins/fossil/fossilcontrol.h index 8a3e53f..59a3bf4 100644 --- a/plugins/fossil/fossilcontrol.h +++ b/plugins/fossil/fossilcontrol.h @@ -59,7 +59,6 @@ public: bool vcsMove(const QString &from, const QString &to) final; bool vcsCreateRepository(const QString &directory) final; bool vcsAnnotate(const QString &file, int line) final; - QString vcsTopic(const QString &directory) final; Core::ShellCommand *createInitialCheckoutCommand(const QString &sourceUrl, const Utils::FileName &baseDirectory, const QString &localName, diff --git a/plugins/fossil/fossileditor.cpp b/plugins/fossil/fossileditor.cpp index c379fd9..2c36f3b 100644 --- a/plugins/fossil/fossileditor.cpp +++ b/plugins/fossil/fossileditor.cpp @@ -34,6 +34,7 @@ #include <utils/synchronousprocess.h> #include <vcsbase/diffandloghighlighter.h> +#include <QRegularExpression> #include <QRegExp> #include <QString> #include <QTextCursor> @@ -44,15 +45,31 @@ namespace Fossil { namespace Internal { -FossilEditorWidget::FossilEditorWidget() : - m_exactChangesetId(Constants::CHANGESET_ID_EXACT), - m_firstChangesetId(QString("\n") + Constants::CHANGESET_ID + " "), - m_nextChangesetId(m_firstChangesetId) +class FossilEditorWidgetPrivate { - QTC_ASSERT(m_exactChangesetId.isValid(), return); - QTC_ASSERT(m_firstChangesetId.isValid(), return); - QTC_ASSERT(m_nextChangesetId.isValid(), return); +public: + FossilEditorWidgetPrivate() : + m_exactChangesetId(Constants::CHANGESET_ID_EXACT), + m_firstChangesetId(QString("\n") + Constants::CHANGESET_ID + " "), + m_nextChangesetId(m_firstChangesetId), + m_configurationWidget(nullptr) + { + QTC_ASSERT(m_exactChangesetId.isValid(), return); + QTC_ASSERT(m_firstChangesetId.isValid(), return); + QTC_ASSERT(m_nextChangesetId.isValid(), return); + } + + + const QRegularExpression m_exactChangesetId; + const QRegularExpression m_firstChangesetId; + const QRegularExpression m_nextChangesetId; + + VcsBase::VcsBaseEditorConfig *m_configurationWidget; +}; +FossilEditorWidget::FossilEditorWidget() : + d(new FossilEditorWidgetPrivate) +{ setAnnotateRevisionTextFormat(tr("&Annotate %1")); setAnnotatePreviousRevisionTextFormat(tr("Annotate &Parent Revision %1")); @@ -65,6 +82,26 @@ FossilEditorWidget::FossilEditorWidget() : setLogEntryPattern(logChangePattern); } +FossilEditorWidget::~FossilEditorWidget() +{ + delete d; +} + +bool FossilEditorWidget::setConfigurationWidget(VcsBase::VcsBaseEditorConfig *w) +{ + if (configurationAdded()) + return false; + + d->m_configurationWidget = w; + setConfigurationAdded(); + return true; +} + +VcsBase::VcsBaseEditorConfig *FossilEditorWidget::configurationWidget() const +{ + return d->m_configurationWidget; +} + QSet<QString> FossilEditorWidget::annotationChanges() const { @@ -77,12 +114,12 @@ QSet<QString> FossilEditorWidget::annotationChanges() const QSet<QString> changes; - QRegularExpressionMatch firstChangesetIdMatch = m_firstChangesetId.match(txt); + QRegularExpressionMatch firstChangesetIdMatch = d->m_firstChangesetId.match(txt); if (firstChangesetIdMatch.hasMatch()) { QString changeId = firstChangesetIdMatch.captured(1); changes.insert(changeId); - QRegularExpressionMatchIterator i = m_nextChangesetId.globalMatch(txt); + QRegularExpressionMatchIterator i = d->m_nextChangesetId.globalMatch(txt); while (i.hasNext()) { const QRegularExpressionMatch nextChangesetIdMatch = i.next(); changeId = nextChangesetIdMatch.captured(1); @@ -98,7 +135,7 @@ QString FossilEditorWidget::changeUnderCursor(const QTextCursor &cursorIn) const cursor.select(QTextCursor::WordUnderCursor); if (cursor.hasSelection()) { const QString change = cursor.selectedText(); - QRegularExpressionMatch exactChangesetIdMatch = m_exactChangesetId.match(change); + QRegularExpressionMatch exactChangesetIdMatch = d->m_exactChangesetId.match(change); if (exactChangesetIdMatch.hasMatch()) return change; } diff --git a/plugins/fossil/fossileditor.h b/plugins/fossil/fossileditor.h index e052b93..e9adc35 100644 --- a/plugins/fossil/fossileditor.h +++ b/plugins/fossil/fossileditor.h @@ -27,26 +27,28 @@ #include <vcsbase/vcsbaseeditor.h> -#include <QRegularExpression> - namespace Fossil { namespace Internal { +class FossilEditorWidgetPrivate; + class FossilEditorWidget : public VcsBase::VcsBaseEditorWidget { Q_OBJECT public: FossilEditorWidget(); + ~FossilEditorWidget() final; + + bool setConfigurationWidget(VcsBase::VcsBaseEditorConfig *w); + VcsBase::VcsBaseEditorConfig *configurationWidget() const; private: QSet<QString> annotationChanges() const final; QString changeUnderCursor(const QTextCursor &cursor) const final; VcsBase::BaseAnnotationHighlighter *createAnnotationHighlighter(const QSet<QString> &changes) const final; - const QRegularExpression m_exactChangesetId; - const QRegularExpression m_firstChangesetId; - const QRegularExpression m_nextChangesetId; + FossilEditorWidgetPrivate *d; }; } // namespace Internal diff --git a/plugins/fossil/fossilplugin.cpp b/plugins/fossil/fossilplugin.cpp index f8da7a8..55034fa 100644 --- a/plugins/fossil/fossilplugin.cpp +++ b/plugins/fossil/fossilplugin.cpp @@ -265,7 +265,8 @@ void FossilPlugin::annotateCurrentFile() { const VcsBase::VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasFile(), return); - m_client->annotate(state.currentFileTopLevel(), state.relativeCurrentFile()); + const int lineNumber = VcsBase::VcsBaseEditor::lineNumberOfCurrentEditor(state.currentFile()); + m_client->annotate(state.currentFileTopLevel(), state.relativeCurrentFile(), QString(), lineNumber); } void FossilPlugin::diffCurrentFile() diff --git a/plugins/fossil/fossilsettings.cpp b/plugins/fossil/fossilsettings.cpp index e6f4769..f946d7f 100644 --- a/plugins/fossil/fossilsettings.cpp +++ b/plugins/fossil/fossilsettings.cpp @@ -36,6 +36,7 @@ const QString FossilSettings::sslIdentityFileKey("sslIdentityFile"); const QString FossilSettings::diffIgnoreAllWhiteSpaceKey("diffIgnoreAllWhiteSpace"); const QString FossilSettings::diffStripTrailingCRKey("diffStripTrailingCR"); const QString FossilSettings::annotateShowCommittersKey("annotateShowCommitters"); +const QString FossilSettings::annotateListVersionsKey("annotateListVersions"); const QString FossilSettings::timelineWidthKey("timelineWidth"); const QString FossilSettings::timelineLineageFilterKey("timelineLineageFilter"); const QString FossilSettings::timelineVerboseKey("timelineVerbose"); @@ -52,6 +53,7 @@ FossilSettings::FossilSettings() declareKey(diffIgnoreAllWhiteSpaceKey, false); declareKey(diffStripTrailingCRKey, false); declareKey(annotateShowCommittersKey, false); + declareKey(annotateListVersionsKey, false); declareKey(timelineWidthKey, 0); declareKey(timelineLineageFilterKey, ""); declareKey(timelineVerboseKey, false); diff --git a/plugins/fossil/fossilsettings.h b/plugins/fossil/fossilsettings.h index 5a82e8d..3e58e77 100644 --- a/plugins/fossil/fossilsettings.h +++ b/plugins/fossil/fossilsettings.h @@ -38,6 +38,7 @@ public: static const QString diffIgnoreAllWhiteSpaceKey; static const QString diffStripTrailingCRKey; static const QString annotateShowCommittersKey; + static const QString annotateListVersionsKey; static const QString timelineWidthKey; static const QString timelineLineageFilterKey; static const QString timelineVerboseKey; |