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");
}
protected:
void runCommand(const QList<QStringList> &args, QTextCodec *codec = nullptr);
QStringList addConfigurationArguments(const QStringList &args) const;
};
@@ -85,47 +84,6 @@ QStringList MercurialDiffEditorController::addConfigurationArguments(const QStri
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)
@@ -387,23 +345,20 @@ void MercurialClient::diff(const QString &workingDir, const QStringList &files,
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); });
requestReload(documentId, sourceFile, title, workingDir, {"diff"});
} 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, fileName); });
requestReload(documentId, sourceFile, title, workingDir, {"diff", 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, files); });
requestReload(documentId, sourceFile, title, workingDir, QStringList{"diff"} + files);
}
}
@@ -492,16 +447,17 @@ MercurialClient::StatusItem MercurialClient::parseStatusLine(const QString &line
}
void MercurialClient::requestReload(const QString &documentId, const QString &source, const QString &title,
const QString &workingDirectory,
std::function<VcsBaseDiffEditorController *(Core::IDocument *)> factory)
const QString &workingDirectory, const QStringList &args)
{
// 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);
VcsBaseDiffEditorController *controller = factory(document);
QTC_ASSERT(controller, return);
auto controller = new MercurialDiffEditorController(document);
controller->setReloader([controller, args] {
controller->runCommand({controller->addConfigurationArguments(args)});
});
controller->setVcsBinary(settings().binaryPath());
controller->setVcsTimeoutS(settings().vcsTimeoutS());
controller->setProcessEnvironment(processEnvironment());

View File

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