aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/mercurial
diff options
context:
space:
mode:
authorAsit Dhal <dhal.asitk@gmail.com>2018-12-09 22:47:40 +0100
committerAsit Dhal <dhal.asitk@gmail.com>2018-12-11 20:30:08 +0000
commit85a02fe8aa7d12f66c553081e5e0c0da86c185c3 (patch)
tree194662895b2c842c531dcce35aeef01e56d8d01d /src/plugins/mercurial
parent813d08b338754ad523c1ec67c38b6a8388048d39 (diff)
DiffEditor: Diff editor for Mercurial
Fixes: QTCREATORBUG-21124 Change-Id: Ib823896bf1b22cc12e62a0526ad1987957c44a0e Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Diffstat (limited to 'src/plugins/mercurial')
-rw-r--r--src/plugins/mercurial/constants.h1
-rw-r--r--src/plugins/mercurial/mercurialclient.cpp149
-rw-r--r--src/plugins/mercurial/mercurialclient.h7
3 files changed, 142 insertions, 15 deletions
diff --git a/src/plugins/mercurial/constants.h b/src/plugins/mercurial/constants.h
index b515c28b8bc..1813d16723b 100644
--- a/src/plugins/mercurial/constants.h
+++ b/src/plugins/mercurial/constants.h
@@ -31,6 +31,7 @@ namespace Mercurial {
namespace Constants {
enum { debug = 0 };
+const char MERCURIAL_PLUGIN[] = "MercurialPlugin";
const char MERCURIALREPO[] = ".hg";
const char MERCURIALDEFAULT[] = "hg";
const char MERCURIAL_CONTEXT[] = "Mercurial Context";
diff --git a/src/plugins/mercurial/mercurialclient.cpp b/src/plugins/mercurial/mercurialclient.cpp
index 3998f06411b..b0b45fc5e7c 100644
--- a/src/plugins/mercurial/mercurialclient.cpp
+++ b/src/plugins/mercurial/mercurialclient.cpp
@@ -24,13 +24,17 @@
****************************************************************************/
#include "mercurialclient.h"
+#include "mercurialplugin.h"
#include "constants.h"
+#include <coreplugin/idocument.h>
+
#include <vcsbase/vcscommand.h>
#include <vcsbase/vcsoutputwindow.h>
#include <vcsbase/vcsbaseplugin.h>
#include <vcsbase/vcsbaseeditor.h>
#include <vcsbase/vcsbaseeditorconfig.h>
+#include <vcsbase/vcsbasediffeditorcontroller.h>
#include <utils/synchronousprocess.h>
#include <utils/fileutils.h>
#include <utils/hostosinfo.h>
@@ -43,32 +47,101 @@
#include <QTextStream>
#include <QVariant>
+using namespace Core;
+using namespace DiffEditor;
using namespace Utils;
using namespace VcsBase;
namespace Mercurial {
namespace Internal {
-// Parameter widget controlling whitespace diff mode, associated with a parameter
-class MercurialDiffConfig : public VcsBaseEditorConfig
+class MercurialDiffEditorController : public VcsBaseDiffEditorController
{
- Q_OBJECT
public:
- MercurialDiffConfig(VcsBaseClientSettings &settings, QToolBar *toolBar) :
- VcsBaseEditorConfig(toolBar)
+ MercurialDiffEditorController(IDocument *document, const QString &workingDirectory);
+
+protected:
+ void runCommand(const QList<QStringList> &args, QTextCodec *codec = nullptr);
+ QStringList addConfigurationArguments(const QStringList &args) const;
+};
+
+MercurialDiffEditorController::MercurialDiffEditorController(IDocument *document, const QString &workingDirectory):
+ VcsBaseDiffEditorController(document, MercurialPlugin::client(), workingDirectory)
+{
+}
+
+void MercurialDiffEditorController::runCommand(const QList<QStringList> &args, QTextCodec *codec)
+{
+ // at this moment, don't ignore any errors
+ VcsBaseDiffEditorController::runCommand(args, 0u, codec);
+}
+
+QStringList MercurialDiffEditorController::addConfigurationArguments(const QStringList &args) const
+{
+ QStringList configArgs{ "-g", "-p" };
+ configArgs << "-U" << QString::number(contextLineCount());
+ if (ignoreWhitespace()) {
+ configArgs << "-w" << "-b" << "-B" << "-Z";
+ }
+ return args + configArgs;
+}
+
+class FileDiffController : public MercurialDiffEditorController
+{
+public:
+ FileDiffController(IDocument *document, const QString &dir, const QString &fileName) :
+ MercurialDiffEditorController(document, dir),
+ m_fileName(fileName)
+ { }
+
+ void reload() override
{
- mapSetting(addToggleButton(QLatin1String("-w"), tr("Ignore Whitespace")),
- settings.boolPointer(MercurialSettings::diffIgnoreWhiteSpaceKey));
- mapSetting(addToggleButton(QLatin1String("-B"), tr("Ignore Blank Lines")),
- settings.boolPointer(MercurialSettings::diffIgnoreBlankLinesKey));
+ QStringList args = { "diff", m_fileName };
+ runCommand({ addConfigurationArguments(args) });
}
+
+private:
+ const QString m_fileName;
};
+class FileListDiffController : public MercurialDiffEditorController
+{
+public:
+ FileListDiffController(IDocument *document, const QString &dir, const QStringList &fileNames) :
+ MercurialDiffEditorController(document, dir),
+ m_fileNames(fileNames)
+ { }
+
+ void reload() override
+ {
+ QStringList args { "diff" };
+ args << m_fileNames;
+ runCommand({addConfigurationArguments(args)});
+ }
+
+private:
+ const QStringList m_fileNames;
+};
+
+
+class RepositoryDiffController : public MercurialDiffEditorController
+{
+public:
+ RepositoryDiffController(IDocument *document, const QString &dir) :
+ MercurialDiffEditorController(document, dir)
+ { }
+
+ void reload() override
+ {
+ QStringList args = { "diff" };
+ runCommand({addConfigurationArguments(args)});
+ }
+};
+
+/////////////////////////////////////////////////////////////
+
MercurialClient::MercurialClient() : VcsBaseClient(new MercurialSettings)
{
- setDiffConfigCreator([this](QToolBar *toolBar) {
- return new MercurialDiffConfig(settings(), toolBar);
- });
}
bool MercurialClient::manifestSync(const QString &repository, const QString &relativeFilename)
@@ -317,9 +390,39 @@ void MercurialClient::commit(const QString &repositoryRoot, const QStringList &f
void MercurialClient::diff(const QString &workingDir, const QStringList &files,
const QStringList &extraOptions)
{
- QStringList args(extraOptions);
- args << QLatin1String("-g") << QLatin1String("-p") << QLatin1String("-U 8");
- VcsBaseClient::diff(workingDir, files, args);
+ Q_UNUSED(extraOptions);
+
+ QString fileName;
+
+ if (files.empty()) {
+ const QString title = tr("Mercurial Diff");
+ const QString sourceFile = VcsBaseEditor::getSource(workingDir, fileName);
+ const QString documentId = QString(Constants::MERCURIAL_PLUGIN)
+ + ".DiffRepo." + sourceFile;
+ requestReload(documentId, sourceFile, title,
+ [workingDir](IDocument *doc) {
+ return new RepositoryDiffController(doc, workingDir);
+ });
+ } else if (files.size() == 1) {
+ fileName = files.at(0);
+ const QString title = tr("Mercurial Diff \"%1\"").arg(fileName);
+ const QString sourceFile = VcsBaseEditor::getSource(workingDir, fileName);
+ const QString documentId = QString(Constants::MERCURIAL_PLUGIN)
+ + ".DiffFile." + sourceFile;
+ requestReload(documentId, sourceFile, title,
+ [workingDir, fileName](IDocument *doc) {
+ return new FileDiffController(doc, workingDir, fileName);
+ });
+ } else {
+ const QString title = tr("Mercurial Diff \"%1\"").arg(workingDir);
+ const QString sourceFile = VcsBaseEditor::getSource(workingDir, fileName);
+ const QString documentId = QString(Constants::MERCURIAL_PLUGIN)
+ + ".DiffFile." + workingDir;
+ requestReload(documentId, sourceFile, title,
+ [workingDir, files](IDocument *doc) {
+ return new FileListDiffController(doc, workingDir, files);
+ });
+ }
}
void MercurialClient::import(const QString &repositoryRoot, const QStringList &files,
@@ -406,6 +509,22 @@ MercurialClient::StatusItem MercurialClient::parseStatusLine(const QString &line
return item;
}
+void MercurialClient::requestReload(const QString &documentId, const QString &source, const QString &title,
+ std::function<DiffEditor::DiffEditorController *(Core::IDocument *)> factory) const
+{
+ // Creating document might change the referenced source. Store a copy and use it.
+ const QString sourceCopy = source;
+
+ IDocument *document = DiffEditorController::findOrCreateDocument(documentId, title);
+ QTC_ASSERT(document, return);
+ DiffEditorController *controller = factory(document);
+ QTC_ASSERT(controller, return);
+
+ VcsBasePlugin::setSource(document, sourceCopy);
+ EditorManager::activateEditorForDocument(document);
+ controller->requestReload();
+}
+
void MercurialClient::parsePullOutput(const QString &output)
{
if (output.endsWith(QLatin1String("no changes found")))
diff --git a/src/plugins/mercurial/mercurialclient.h b/src/plugins/mercurial/mercurialclient.h
index 8f23e0d76ef..4c1ecc52df3 100644
--- a/src/plugins/mercurial/mercurialclient.h
+++ b/src/plugins/mercurial/mercurialclient.h
@@ -26,8 +26,13 @@
#pragma once
#include "mercurialsettings.h"
+#include <coreplugin/editormanager/ieditor.h>
#include <vcsbase/vcsbaseclient.h>
+namespace DiffEditor {
+class DiffEditorController;
+}
+
namespace Mercurial {
namespace Internal {
@@ -85,6 +90,8 @@ signals:
void needMerge();
private:
+ void requestReload(const QString &documentId, const QString &source, const QString &title,
+ std::function<DiffEditor::DiffEditorController *(Core::IDocument *)> factory) const;
void parsePullOutput(const QString &output);
};