Mercurial: Simplify DiffEditorController setup

Change-Id: I28157e5ac310d8921bf16676cd695060d29c0254
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
This commit is contained in:
hjk
2020-02-06 12:42:43 +01:00
parent 9c02a11039
commit fd8187cb86
2 changed files with 13 additions and 54 deletions

View File

@@ -64,7 +64,6 @@ public:
setDisplayName("Hg Diff"); setDisplayName("Hg Diff");
} }
protected:
void runCommand(const QList<QStringList> &args, QTextCodec *codec = nullptr); void runCommand(const QList<QStringList> &args, QTextCodec *codec = nullptr);
QStringList addConfigurationArguments(const QStringList &args) const; QStringList addConfigurationArguments(const QStringList &args) const;
}; };
@@ -85,47 +84,6 @@ QStringList MercurialDiffEditorController::addConfigurationArguments(const QStri
return args + configArgs; return args + configArgs;
} }
class FileDiffController : public MercurialDiffEditorController
{
public:
FileDiffController(IDocument *document, const QString &fileName) :
MercurialDiffEditorController(document)
{
setReloader([this, fileName] {
QStringList args = { "diff", fileName };
runCommand({ addConfigurationArguments(args) });
});
}
};
class FileListDiffController : public MercurialDiffEditorController
{
public:
FileListDiffController(IDocument *document, const QStringList &fileNames) :
MercurialDiffEditorController(document)
{
setReloader([this, fileNames] {
QStringList args { "diff" };
args << fileNames;
runCommand({addConfigurationArguments(args)});
});
}
};
class RepositoryDiffController : public MercurialDiffEditorController
{
public:
RepositoryDiffController(IDocument *document) :
MercurialDiffEditorController(document)
{
setReloader([this] {
QStringList args = { "diff" };
runCommand({addConfigurationArguments(args)});
});
}
};
///////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////
MercurialClient::MercurialClient(MercurialSettings *settings) : VcsBaseClient(settings) MercurialClient::MercurialClient(MercurialSettings *settings) : VcsBaseClient(settings)
@@ -387,23 +345,20 @@ void MercurialClient::diff(const QString &workingDir, const QStringList &files,
const QString sourceFile = VcsBaseEditor::getSource(workingDir, fileName); const QString sourceFile = VcsBaseEditor::getSource(workingDir, fileName);
const QString documentId = QString(Constants::MERCURIAL_PLUGIN) const QString documentId = QString(Constants::MERCURIAL_PLUGIN)
+ ".DiffRepo." + sourceFile; + ".DiffRepo." + sourceFile;
requestReload(documentId, sourceFile, title, workingDir, requestReload(documentId, sourceFile, title, workingDir, {"diff"});
[](IDocument *doc) { return new RepositoryDiffController(doc); });
} else if (files.size() == 1) { } else if (files.size() == 1) {
fileName = files.at(0); fileName = files.at(0);
const QString title = tr("Mercurial Diff \"%1\"").arg(fileName); const QString title = tr("Mercurial Diff \"%1\"").arg(fileName);
const QString sourceFile = VcsBaseEditor::getSource(workingDir, fileName); const QString sourceFile = VcsBaseEditor::getSource(workingDir, fileName);
const QString documentId = QString(Constants::MERCURIAL_PLUGIN) const QString documentId = QString(Constants::MERCURIAL_PLUGIN)
+ ".DiffFile." + sourceFile; + ".DiffFile." + sourceFile;
requestReload(documentId, sourceFile, title, workingDir, requestReload(documentId, sourceFile, title, workingDir, {"diff", fileName});
[fileName](IDocument *doc) { return new FileDiffController(doc, fileName); });
} else { } else {
const QString title = tr("Mercurial Diff \"%1\"").arg(workingDir); const QString title = tr("Mercurial Diff \"%1\"").arg(workingDir);
const QString sourceFile = VcsBaseEditor::getSource(workingDir, fileName); const QString sourceFile = VcsBaseEditor::getSource(workingDir, fileName);
const QString documentId = QString(Constants::MERCURIAL_PLUGIN) const QString documentId = QString(Constants::MERCURIAL_PLUGIN)
+ ".DiffFile." + workingDir; + ".DiffFile." + workingDir;
requestReload(documentId, sourceFile, title, workingDir, requestReload(documentId, sourceFile, title, workingDir, QStringList{"diff"} + files);
[files](IDocument *doc) { return new FileListDiffController(doc, files); });
} }
} }
@@ -492,16 +447,17 @@ MercurialClient::StatusItem MercurialClient::parseStatusLine(const QString &line
} }
void MercurialClient::requestReload(const QString &documentId, const QString &source, const QString &title, void MercurialClient::requestReload(const QString &documentId, const QString &source, const QString &title,
const QString &workingDirectory, const QString &workingDirectory, const QStringList &args)
std::function<VcsBaseDiffEditorController *(Core::IDocument *)> factory)
{ {
// Creating document might change the referenced source. Store a copy and use it. // Creating document might change the referenced source. Store a copy and use it.
const QString sourceCopy = source; const QString sourceCopy = source;
IDocument *document = DiffEditorController::findOrCreateDocument(documentId, title); IDocument *document = DiffEditorController::findOrCreateDocument(documentId, title);
QTC_ASSERT(document, return); QTC_ASSERT(document, return);
VcsBaseDiffEditorController *controller = factory(document); auto controller = new MercurialDiffEditorController(document);
QTC_ASSERT(controller, return); controller->setReloader([controller, args] {
controller->runCommand({controller->addConfigurationArguments(args)});
});
controller->setVcsBinary(settings().binaryPath()); controller->setVcsBinary(settings().binaryPath());
controller->setVcsTimeoutS(settings().vcsTimeoutS()); controller->setVcsTimeoutS(settings().vcsTimeoutS());
controller->setProcessEnvironment(processEnvironment()); controller->setProcessEnvironment(processEnvironment());

View File

@@ -34,6 +34,8 @@ namespace VcsBase { class VcsBaseDiffEditorController; }
namespace Mercurial { namespace Mercurial {
namespace Internal { namespace Internal {
class MercurialDiffEditorController;
class MercurialClient : public VcsBase::VcsBaseClient class MercurialClient : public VcsBase::VcsBaseClient
{ {
Q_OBJECT Q_OBJECT
@@ -88,8 +90,9 @@ signals:
void needMerge(); void needMerge();
private: private:
void requestReload(const QString &documentId, const QString &source, const QString &title, const QString &workingDirectory, void requestReload(const QString &documentId, const QString &source, const QString &title,
std::function<VcsBase::VcsBaseDiffEditorController *(Core::IDocument *)> factory); const QString &workingDirectory,
const QStringList &args);
void parsePullOutput(const QString &output); void parsePullOutput(const QString &output);
}; };