Mercurial: Save resources, polishing.

Start the jobrunner on demand, save options only if changed,
give it the structure used elsewhere in the VCS plugins. Remove
last traces of the cmd /c hack.
This commit is contained in:
Friedemann Kleint
2009-11-06 12:32:38 +01:00
parent d570b05bec
commit b0e1fdbfc4
11 changed files with 194 additions and 133 deletions

View File

@@ -76,15 +76,15 @@ QSharedPointer<VCSBase::AbstractCheckoutJob> CloneWizard::createJob(const QList<
if (!page) if (!page)
return QSharedPointer<VCSBase::AbstractCheckoutJob>(); return QSharedPointer<VCSBase::AbstractCheckoutJob>();
MercurialSettings *settings = MercurialPlugin::instance()->settings(); const MercurialSettings &settings = MercurialPlugin::instance()->settings();
QStringList args = settings->standardArguments(); QStringList args = settings.standardArguments();
QString path = page->path(); QString path = page->path();
QString directory = page->directory(); QString directory = page->directory();
args << QLatin1String("clone") << page->repository() << directory; args << QLatin1String("clone") << page->repository() << directory;
*checkoutPath = path + QLatin1Char('/') + directory; *checkoutPath = path + QLatin1Char('/') + directory;
return QSharedPointer<VCSBase::AbstractCheckoutJob>(new VCSBase::ProcessCheckoutJob(settings->binary(), return QSharedPointer<VCSBase::AbstractCheckoutJob>(new VCSBase::ProcessCheckoutJob(settings.binary(),
args, path)); args, path));
} }

View File

@@ -60,11 +60,10 @@ inline Core::IEditor* locateEditor(const Core::ICore *core, const char *property
return 0; return 0;
} }
MercurialClient::MercurialClient() MercurialClient::MercurialClient() :
: core(Core::ICore::instance()) jobManager(0),
core(Core::ICore::instance())
{ {
jobManager = new MercurialJobRunner();
jobManager->start();
} }
MercurialClient::~MercurialClient() MercurialClient::~MercurialClient()
@@ -118,9 +117,9 @@ bool MercurialClient::executeHgSynchronously(const QFileInfo &file, const QStrin
QProcess hgProcess; QProcess hgProcess;
hgProcess.setWorkingDirectory(file.isDir() ? file.absoluteFilePath() : file.absolutePath()); hgProcess.setWorkingDirectory(file.isDir() ? file.absoluteFilePath() : file.absolutePath());
const MercurialSettings *settings = MercurialPlugin::instance()->settings(); const MercurialSettings &settings = MercurialPlugin::instance()->settings();
const QString binary = settings->binary(); const QString binary = settings.binary();
const QStringList arguments = MercurialPlugin::instance()->standardArguments() + args; const QStringList arguments = settings.standardArguments() + args;
VCSBase::VCSBaseOutputWindow *outputWindow = VCSBase::VCSBaseOutputWindow::instance(); VCSBase::VCSBaseOutputWindow *outputWindow = VCSBase::VCSBaseOutputWindow::instance();
outputWindow->appendCommand(MercurialJobRunner::msgExecute(binary, arguments)); outputWindow->appendCommand(MercurialJobRunner::msgExecute(binary, arguments));
@@ -134,9 +133,9 @@ bool MercurialClient::executeHgSynchronously(const QFileInfo &file, const QStrin
hgProcess.closeWriteChannel(); hgProcess.closeWriteChannel();
if (!hgProcess.waitForFinished(settings->timeout())) { if (!hgProcess.waitForFinished(settings.timeoutMilliSeconds())) {
hgProcess.terminate(); hgProcess.terminate();
outputWindow->appendError(MercurialJobRunner::msgTimeout(settings->timeout())); outputWindow->appendError(MercurialJobRunner::msgTimeout(settings.timeoutSeconds()));
return false; return false;
} }
@@ -170,7 +169,7 @@ void MercurialClient::annotate(const QFileInfo &file)
"annotate", file.absoluteFilePath()); "annotate", file.absoluteFilePath());
QSharedPointer<HgTask> job(new HgTask(file.absolutePath(), args, editor)); QSharedPointer<HgTask> job(new HgTask(file.absolutePath(), args, editor));
jobManager->enqueueJob(job); enqueueJob(job);
} }
void MercurialClient::diff(const QFileInfo &fileOrDir) void MercurialClient::diff(const QFileInfo &fileOrDir)
@@ -198,7 +197,7 @@ void MercurialClient::diff(const QFileInfo &fileOrDir)
"diff", id); "diff", id);
QSharedPointer<HgTask> job(new HgTask(workingPath, args, editor)); QSharedPointer<HgTask> job(new HgTask(workingPath, args, editor));
jobManager->enqueueJob(job); enqueueJob(job);
} }
void MercurialClient::log(const QFileInfo &fileOrDir) void MercurialClient::log(const QFileInfo &fileOrDir)
@@ -223,7 +222,7 @@ void MercurialClient::log(const QFileInfo &fileOrDir)
"log", id); "log", id);
QSharedPointer<HgTask> job(new HgTask(workingDir, args, editor)); QSharedPointer<HgTask> job(new HgTask(workingDir, args, editor));
jobManager->enqueueJob(job); enqueueJob(job);
} }
void MercurialClient::revert(const QFileInfo &fileOrDir, const QString &revision) void MercurialClient::revert(const QFileInfo &fileOrDir, const QString &revision)
@@ -239,7 +238,7 @@ void MercurialClient::revert(const QFileInfo &fileOrDir, const QString &revision
QSharedPointer<HgTask> job(new HgTask(fileOrDir.isDir() ? fileOrDir.absoluteFilePath() : QSharedPointer<HgTask> job(new HgTask(fileOrDir.isDir() ? fileOrDir.absoluteFilePath() :
fileOrDir.absolutePath(), args, false)); fileOrDir.absolutePath(), args, false));
jobManager->enqueueJob(job); enqueueJob(job);
} }
void MercurialClient::status(const QFileInfo &fileOrDir) void MercurialClient::status(const QFileInfo &fileOrDir)
@@ -250,7 +249,7 @@ void MercurialClient::status(const QFileInfo &fileOrDir)
QSharedPointer<HgTask> job(new HgTask(fileOrDir.isDir() ? fileOrDir.absoluteFilePath() : QSharedPointer<HgTask> job(new HgTask(fileOrDir.isDir() ? fileOrDir.absoluteFilePath() :
fileOrDir.absolutePath(), args, false)); fileOrDir.absolutePath(), args, false));
jobManager->enqueueJob(job); enqueueJob(job);
} }
void MercurialClient::statusWithSignal(const QFileInfo &repositoryRoot) void MercurialClient::statusWithSignal(const QFileInfo &repositoryRoot)
@@ -261,7 +260,7 @@ void MercurialClient::statusWithSignal(const QFileInfo &repositoryRoot)
connect(job.data(), SIGNAL(rawData(QByteArray)), connect(job.data(), SIGNAL(rawData(QByteArray)),
this, SLOT(statusParser(QByteArray))); this, SLOT(statusParser(QByteArray)));
jobManager->enqueueJob(job); enqueueJob(job);
} }
void MercurialClient::statusParser(const QByteArray &data) void MercurialClient::statusParser(const QByteArray &data)
@@ -302,7 +301,7 @@ void MercurialClient::import(const QFileInfo &repositoryRoot, const QStringList
args += files; args += files;
QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false)); QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false));
jobManager->enqueueJob(job); enqueueJob(job);
} }
void MercurialClient::pull(const QFileInfo &repositoryRoot, const QString &repository) void MercurialClient::pull(const QFileInfo &repositoryRoot, const QString &repository)
@@ -312,7 +311,7 @@ void MercurialClient::pull(const QFileInfo &repositoryRoot, const QString &repos
args.append(repository); args.append(repository);
QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false)); QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false));
jobManager->enqueueJob(job); enqueueJob(job);
} }
void MercurialClient::push(const QFileInfo &repositoryRoot, const QString &repository) void MercurialClient::push(const QFileInfo &repositoryRoot, const QString &repository)
@@ -322,7 +321,7 @@ void MercurialClient::push(const QFileInfo &repositoryRoot, const QString &repos
args.append(repository); args.append(repository);
QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false)); QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false));
jobManager->enqueueJob(job); enqueueJob(job);
} }
void MercurialClient::incoming(const QFileInfo &repositoryRoot, const QString &repository) void MercurialClient::incoming(const QFileInfo &repositoryRoot, const QString &repository)
@@ -341,7 +340,7 @@ void MercurialClient::incoming(const QFileInfo &repositoryRoot, const QString &r
true, "incoming", id); true, "incoming", id);
QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, editor)); QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, editor));
jobManager->enqueueJob(job); enqueueJob(job);
} }
void MercurialClient::outgoing(const QFileInfo &repositoryRoot) void MercurialClient::outgoing(const QFileInfo &repositoryRoot)
@@ -358,7 +357,7 @@ void MercurialClient::outgoing(const QFileInfo &repositoryRoot)
"outgoing", id); "outgoing", id);
QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, editor)); QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, editor));
jobManager->enqueueJob(job); enqueueJob(job);
} }
void MercurialClient::view(const QString &source, const QString &id) void MercurialClient::view(const QString &source, const QString &id)
@@ -374,7 +373,7 @@ void MercurialClient::view(const QString &source, const QString &id)
true, "view", id); true, "view", id);
QSharedPointer<HgTask> job(new HgTask(source, args, editor)); QSharedPointer<HgTask> job(new HgTask(source, args, editor));
jobManager->enqueueJob(job); enqueueJob(job);
} }
void MercurialClient::update(const QFileInfo &repositoryRoot, const QString &revision) void MercurialClient::update(const QFileInfo &repositoryRoot, const QString &revision)
@@ -384,7 +383,7 @@ void MercurialClient::update(const QFileInfo &repositoryRoot, const QString &rev
args << revision; args << revision;
QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false)); QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false));
jobManager->enqueueJob(job); enqueueJob(job);
} }
void MercurialClient::commit(const QFileInfo &repositoryRoot, const QStringList &files, void MercurialClient::commit(const QFileInfo &repositoryRoot, const QStringList &files,
@@ -395,7 +394,7 @@ void MercurialClient::commit(const QFileInfo &repositoryRoot, const QStringList
args << QLatin1String("-u") << committerInfo; args << QLatin1String("-u") << committerInfo;
args << QLatin1String("-l") << commitMessageFile << files; args << QLatin1String("-l") << commitMessageFile << files;
QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false)); QSharedPointer<HgTask> job(new HgTask(repositoryRoot.absoluteFilePath(), args, false));
jobManager->enqueueJob(job); enqueueJob(job);
} }
QString MercurialClient::findTopLevelForFile(const QFileInfo &file) QString MercurialClient::findTopLevelForFile(const QFileInfo &file)
@@ -443,3 +442,12 @@ VCSBase::VCSBaseEditor *MercurialClient::createVCSEditor(const QString &kind, QS
core->editorManager()->activateEditor(outputEditor); core->editorManager()->activateEditor(outputEditor);
return baseEditor; return baseEditor;
} }
void MercurialClient::enqueueJob(const QSharedPointer<HgTask> &job)
{
if (!jobManager) {
jobManager = new MercurialJobRunner();
jobManager->start();
}
jobManager->enqueueJob(job);
}

View File

@@ -32,6 +32,7 @@
#include <QtCore/QObject> #include <QtCore/QObject>
#include <QtCore/QPair> #include <QtCore/QPair>
#include <QtCore/QSharedPointer>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QFileInfo; class QFileInfo;
@@ -49,6 +50,7 @@ namespace Mercurial {
namespace Internal { namespace Internal {
class MercurialJobRunner; class MercurialJobRunner;
class HgTask;
class MercurialClient : public QObject class MercurialClient : public QObject
{ {
@@ -90,6 +92,7 @@ private slots:
private: private:
bool executeHgSynchronously(const QFileInfo &file, const QStringList &args, bool executeHgSynchronously(const QFileInfo &file, const QStringList &args,
QByteArray *output=0) const; QByteArray *output=0) const;
void enqueueJob(const QSharedPointer<HgTask> &);
MercurialJobRunner *jobManager; MercurialJobRunner *jobManager;
Core::ICore *core; Core::ICore *core;

View File

@@ -97,10 +97,10 @@ void MercurialJobRunner::restart()
void MercurialJobRunner::getSettings() void MercurialJobRunner::getSettings()
{ {
const MercurialSettings *settings = MercurialPlugin::instance()->settings(); const MercurialSettings &settings = MercurialPlugin::instance()->settings();
binary = settings->binary(); binary = settings.binary();
timeout = settings->timeout(); timeout = settings.timeoutMilliSeconds();
standardArguments = settings->standardArguments(); standardArguments = settings.standardArguments();
} }
void MercurialJobRunner::enqueueJob(const QSharedPointer<HgTask> &job) void MercurialJobRunner::enqueueJob(const QSharedPointer<HgTask> &job)
@@ -142,9 +142,9 @@ QString MercurialJobRunner::msgStartFailed(const QString &binary, const QString
return tr("Unable to start mercurial process '%1': %2").arg(binary, why); return tr("Unable to start mercurial process '%1': %2").arg(binary, why);
} }
QString MercurialJobRunner::msgTimeout(int timeoutMS) QString MercurialJobRunner::msgTimeout(int timeoutSeconds)
{ {
return tr("Timed out after %1ms waiting for mercurial process to finish.").arg(timeoutMS); return tr("Timed out after %1s waiting for mercurial process to finish.").arg(timeoutSeconds);
} }
void MercurialJobRunner::task(const QSharedPointer<HgTask> &job) void MercurialJobRunner::task(const QSharedPointer<HgTask> &job)
@@ -192,7 +192,7 @@ void MercurialJobRunner::task(const QSharedPointer<HgTask> &job)
if (!hgProcess.waitForFinished(timeout)) { if (!hgProcess.waitForFinished(timeout)) {
hgProcess.terminate(); hgProcess.terminate();
emit error(msgTimeout(timeout)); emit error(msgTimeout(timeout / 1000));
return; return;
} }

View File

@@ -83,7 +83,7 @@ public:
static QString msgExecute(const QString &binary, const QStringList &args); static QString msgExecute(const QString &binary, const QStringList &args);
static QString msgStartFailed(const QString &binary, const QString &why); static QString msgStartFailed(const QString &binary, const QString &why);
static QString msgTimeout(int timeoutMS); static QString msgTimeout(int timeoutSeconds);
protected: protected:
void run(); void run();

View File

@@ -121,8 +121,7 @@ static inline const VCSBase::VCSBaseEditorParameters *findType(int ie)
MercurialPlugin *MercurialPlugin::m_instance = 0; MercurialPlugin *MercurialPlugin::m_instance = 0;
MercurialPlugin::MercurialPlugin() MercurialPlugin::MercurialPlugin() :
: mercurialSettings(new MercurialSettings),
optionsPage(0), optionsPage(0),
client(0), client(0),
mercurialVC(0), mercurialVC(0),
@@ -139,11 +138,6 @@ MercurialPlugin::~MercurialPlugin()
client = 0; client = 0;
} }
if (mercurialSettings) {
delete mercurialSettings;
mercurialSettings = 0;
}
deleteCommitLog(); deleteCommitLog();
m_instance = 0; m_instance = 0;
@@ -161,6 +155,7 @@ bool MercurialPlugin::initialize(const QStringList &arguments, QString *error_me
optionsPage = new OptionsPage(); optionsPage = new OptionsPage();
addAutoReleasedObject(optionsPage); addAutoReleasedObject(optionsPage);
mercurialSettings.readSettings(core->settings());
client = new MercurialClient(); client = new MercurialClient();
connect(optionsPage, SIGNAL(settingsChanged()), client, SLOT(settingsChanged())); connect(optionsPage, SIGNAL(settingsChanged()), client, SLOT(settingsChanged()));
@@ -194,14 +189,21 @@ void MercurialPlugin::extensionsInitialized()
this, SLOT(currentProjectChanged(ProjectExplorer::Project *))); this, SLOT(currentProjectChanged(ProjectExplorer::Project *)));
} }
MercurialSettings *MercurialPlugin::settings() const MercurialSettings &MercurialPlugin::settings() const
{ {
return mercurialSettings; return mercurialSettings;
} }
void MercurialPlugin::setSettings(const MercurialSettings &settings)
{
if (settings != mercurialSettings) {
mercurialSettings = settings;
}
}
QStringList MercurialPlugin::standardArguments() const QStringList MercurialPlugin::standardArguments() const
{ {
return mercurialSettings->standardArguments(); return mercurialSettings.standardArguments();
} }
void MercurialPlugin::createMenu() void MercurialPlugin::createMenu()
@@ -530,8 +532,8 @@ void MercurialPlugin::showCommitWidget(const QList<QPair<QString, QString> > &st
QString branch = client->branchQuerySync(currentProjectRoot()); QString branch = client->branchQuerySync(currentProjectRoot());
commitEditor->setFields(currentProjectRoot(), branch, mercurialSettings->userName(), commitEditor->setFields(currentProjectRoot(), branch, mercurialSettings.userName(),
mercurialSettings->email(), status); mercurialSettings.email(), status);
commitEditor->registerActions(editorUndo, editorRedo, editorCommit, editorDiff); commitEditor->registerActions(editorUndo, editorRedo, editorCommit, editorDiff);
connect(commitEditor, SIGNAL(diffSelectedFiles(const QStringList &)), connect(commitEditor, SIGNAL(diffSelectedFiles(const QStringList &)),
@@ -564,11 +566,11 @@ bool MercurialPlugin::closeEditor(Core::IEditor *editor)
if (!editorFile || !commitEditor) if (!editorFile || !commitEditor)
return true; return true;
bool dummyPrompt = settings()->prompt(); bool dummyPrompt = mercurialSettings.prompt();
const VCSBase::VCSBaseSubmitEditor::PromptSubmitResult response = const VCSBase::VCSBaseSubmitEditor::PromptSubmitResult response =
commitEditor->promptSubmit(tr("Close commit editor"), tr("Do you want to commit the changes?"), commitEditor->promptSubmit(tr("Close commit editor"), tr("Do you want to commit the changes?"),
tr("Message check failed. Do you want to proceed?"), tr("Message check failed. Do you want to proceed?"),
&dummyPrompt, settings()->prompt()); &dummyPrompt, mercurialSettings.prompt());
switch (response) { switch (response) {
case VCSBase::VCSBaseSubmitEditor::SubmitCanceled: case VCSBase::VCSBaseSubmitEditor::SubmitCanceled:

View File

@@ -30,6 +30,8 @@
#ifndef MERCURIALPLUGIN_H #ifndef MERCURIALPLUGIN_H
#define MERCURIALPLUGIN_H #define MERCURIALPLUGIN_H
#include "mercurialsettings.h"
#include <extensionsystem/iplugin.h> #include <extensionsystem/iplugin.h>
#include <coreplugin/icorelistener.h> #include <coreplugin/icorelistener.h>
@@ -85,7 +87,8 @@ public:
bool closeEditor(Core::IEditor *editor); bool closeEditor(Core::IEditor *editor);
QStringList standardArguments() const; QStringList standardArguments() const;
MercurialSettings *settings(); const MercurialSettings &settings() const;
void setSettings(const MercurialSettings &settings);
private slots: private slots:
// File menu action Slots // File menu action Slots
@@ -146,7 +149,7 @@ private:
//Variables //Variables
static MercurialPlugin *m_instance; static MercurialPlugin *m_instance;
MercurialSettings *mercurialSettings; MercurialSettings mercurialSettings;
OptionsPage *optionsPage; OptionsPage *optionsPage;
MercurialClient *client; MercurialClient *client;

View File

@@ -30,40 +30,53 @@
#include "mercurialsettings.h" #include "mercurialsettings.h"
#include "constants.h" #include "constants.h"
#include <coreplugin/icore.h>
#include <QtCore/QSettings> #include <QtCore/QSettings>
using namespace Mercurial::Internal; using namespace Mercurial::Internal;
MercurialSettings::MercurialSettings() enum { timeOutDefaultSeconds = 30 };
MercurialSettings::MercurialSettings() :
m_binary(QLatin1String(Constants::MERCURIALDEFAULT)),
m_logCount(0),
m_timeoutSeconds(timeOutDefaultSeconds),
m_prompt(true)
{ {
readSettings();
} }
QString MercurialSettings::binary() const QString MercurialSettings::binary() const
{ {
return bin; return m_binary;
} }
QString MercurialSettings::application() const void MercurialSettings::setBinary(const QString &b)
{ {
return app; m_binary = b;
} }
QStringList MercurialSettings::standardArguments() const QStringList MercurialSettings::standardArguments() const
{ {
return standardArgs; return m_standardArguments;
} }
QString MercurialSettings::userName() const QString MercurialSettings::userName() const
{ {
return user; return m_user;
}
void MercurialSettings::setUserName(const QString &u)
{
m_user = u;
} }
QString MercurialSettings::email() const QString MercurialSettings::email() const
{ {
return mail; return m_mail;
}
void MercurialSettings::setEmail(const QString &m)
{
m_mail = m;
} }
int MercurialSettings::logCount() const int MercurialSettings::logCount() const
@@ -71,16 +84,26 @@ int MercurialSettings::logCount() const
return m_logCount; return m_logCount;
} }
int MercurialSettings::timeout() const void MercurialSettings::setLogCount(int l)
{
m_logCount = l;
}
int MercurialSettings::timeoutMilliSeconds() const
{ {
//return timeout is in Ms //return timeout is in Ms
return m_timeout * 1000; return m_timeoutSeconds * 1000;
} }
int MercurialSettings::timeoutSeconds() const int MercurialSettings::timeoutSeconds() const
{ {
//return timeout in seconds (as the user specifies on the options page //return timeout in seconds (as the user specifies on the options page
return m_timeout; return m_timeoutSeconds;
}
void MercurialSettings::setTimeoutSeconds(int s)
{
m_timeoutSeconds = s;
} }
bool MercurialSettings::prompt() const bool MercurialSettings::prompt() const
@@ -88,50 +111,39 @@ bool MercurialSettings::prompt() const
return m_prompt; return m_prompt;
} }
void MercurialSettings::writeSettings(const QString &application, const QString &userName, void MercurialSettings::setPrompt(bool b)
const QString &email, int logCount, int timeout, bool prompt)
{ {
QSettings *settings = Core::ICore::instance()->settings(); m_prompt = b;
if (settings) {
settings->beginGroup(QLatin1String("Mercurial"));
settings->setValue(QLatin1String(Constants::MERCURIALPATH), application);
settings->setValue(QLatin1String(Constants::MERCURIALUSERNAME), userName);
settings->setValue(QLatin1String(Constants::MERCURIALEMAIL), email);
settings->setValue(QLatin1String(Constants::MERCURIALLOGCOUNT), logCount);
settings->setValue(QLatin1String(Constants::MERCURIALTIMEOUT), timeout);
settings->setValue(QLatin1String(Constants::MERCURIALPROMPTSUBMIT), prompt);
settings->endGroup();
}
app = application;
user = userName;
mail = email;
m_logCount = logCount;
m_timeout = timeout;
m_prompt = prompt;
setBinAndArgs();
} }
void MercurialSettings::readSettings() void MercurialSettings::writeSettings(QSettings *settings) const
{ {
QSettings *settings = Core::ICore::instance()->settings();
if (settings) {
settings->beginGroup(QLatin1String("Mercurial")); settings->beginGroup(QLatin1String("Mercurial"));
app = settings->value(QLatin1String(Constants::MERCURIALPATH), settings->setValue(QLatin1String(Constants::MERCURIALPATH), m_binary);
settings->setValue(QLatin1String(Constants::MERCURIALUSERNAME), m_user);
settings->setValue(QLatin1String(Constants::MERCURIALEMAIL), m_mail);
settings->setValue(QLatin1String(Constants::MERCURIALLOGCOUNT), m_logCount);
settings->setValue(QLatin1String(Constants::MERCURIALTIMEOUT), m_timeoutSeconds);
settings->setValue(QLatin1String(Constants::MERCURIALPROMPTSUBMIT), m_prompt);
settings->endGroup();
}
void MercurialSettings::readSettings(const QSettings *settings)
{
const QString keyRoot = QLatin1String("Mercurial/");
m_binary = settings->value(keyRoot + QLatin1String(Constants::MERCURIALPATH),
QLatin1String(Constants::MERCURIALDEFAULT)).toString(); QLatin1String(Constants::MERCURIALDEFAULT)).toString();
user = settings->value(QLatin1String(Constants::MERCURIALUSERNAME), QString()).toString(); m_user = settings->value(keyRoot + QLatin1String(Constants::MERCURIALUSERNAME), QString()).toString();
mail = settings->value(QLatin1String(Constants::MERCURIALEMAIL), QString()).toString(); m_mail = settings->value(keyRoot + QLatin1String(Constants::MERCURIALEMAIL), QString()).toString();
m_logCount = settings->value(QLatin1String(Constants::MERCURIALLOGCOUNT), 0).toInt(); m_logCount = settings->value(keyRoot + QLatin1String(Constants::MERCURIALLOGCOUNT), 0).toInt();
m_timeout = settings->value(QLatin1String(Constants::MERCURIALTIMEOUT), 30).toInt(); m_timeoutSeconds = settings->value(keyRoot + QLatin1String(Constants::MERCURIALTIMEOUT), timeOutDefaultSeconds).toInt();
m_prompt = settings->value(QLatin1String(Constants::MERCURIALPROMPTSUBMIT), true).toBool(); m_prompt = settings->value(keyRoot + QLatin1String(Constants::MERCURIALPROMPTSUBMIT), true).toBool();
settings->endGroup();
}
setBinAndArgs();
} }
void MercurialSettings::setBinAndArgs() bool MercurialSettings::equals(const MercurialSettings &rhs) const
{ {
standardArgs.clear(); return m_binary == rhs.m_binary && m_standardArguments == rhs.m_standardArguments
bin = app; && m_user == rhs.m_user && m_mail == rhs.m_mail
&& m_logCount == rhs.m_logCount && m_timeoutSeconds == rhs.m_timeoutSeconds
&& m_prompt == rhs.m_prompt;
} }

View File

@@ -33,6 +33,10 @@
#include <QtCore/QString> #include <QtCore/QString>
#include <QtCore/QStringList> #include <QtCore/QStringList>
QT_BEGIN_NAMESPACE
class QSettings;
QT_END_NAMESPACE
namespace Mercurial { namespace Mercurial {
namespace Internal { namespace Internal {
@@ -42,32 +46,50 @@ public:
MercurialSettings(); MercurialSettings();
QString binary() const; QString binary() const;
QString application() const; void setBinary(const QString &);
// Calculated.
QStringList standardArguments() const; QStringList standardArguments() const;
QString userName() const; QString userName() const;
void setUserName(const QString &);
QString email() const; QString email() const;
void setEmail(const QString &);
int logCount() const; int logCount() const;
int timeout() const; void setLogCount(int l);
int timeoutMilliSeconds() const;
int timeoutSeconds() const; int timeoutSeconds() const;
void setTimeoutSeconds(int s);
bool prompt() const; bool prompt() const;
void writeSettings(const QString &application, const QString &userName, void setPrompt(bool b);
const QString &email, int logCount, int timeout, bool prompt);
void writeSettings(QSettings *settings) const;
void readSettings(const QSettings *settings);
bool equals(const MercurialSettings &rhs) const;
private: private:
void readSettings(); void readSettings();
void setBinAndArgs();
QString bin; // used because windows requires cmd.exe to run the mercurial binary QString m_binary;
// in this case the actual mercurial binary will be part of the standard args QStringList m_standardArguments;
QString app; // this is teh actual mercurial executable QString m_user;
QStringList standardArgs; QString m_mail;
QString user;
QString mail;
int m_logCount; int m_logCount;
int m_timeout; int m_timeoutSeconds;
bool m_prompt; bool m_prompt;
}; };
inline bool operator==(const MercurialSettings &s1, const MercurialSettings &s2)
{ return s1.equals(s2); }
inline bool operator!=(const MercurialSettings &s1, const MercurialSettings &s2)
{ return !s1.equals(s2); }
} //namespace Internal } //namespace Internal
} //namespace Mercurial } //namespace Mercurial

View File

@@ -31,6 +31,7 @@
#include "mercurialsettings.h" #include "mercurialsettings.h"
#include "mercurialplugin.h" #include "mercurialplugin.h"
#include <coreplugin/icore.h>
#include <utils/pathchooser.h> #include <utils/pathchooser.h>
#include <vcsbase/vcsbaseconstants.h> #include <vcsbase/vcsbaseconstants.h>
@@ -45,24 +46,26 @@ OptionsPageWidget::OptionsPageWidget(QWidget *parent) :
m_ui.commandChooser->setPromptDialogTitle(tr("Mercurial Command")); m_ui.commandChooser->setPromptDialogTitle(tr("Mercurial Command"));
} }
void OptionsPageWidget::updateOptions() MercurialSettings OptionsPageWidget::settings() const
{ {
MercurialSettings *settings = MercurialPlugin::instance()->settings(); MercurialSettings rc;
m_ui.commandChooser->setPath(settings->application()); rc.setBinary(m_ui.commandChooser->path());
m_ui.defaultUsernameLineEdit->setText(settings->userName()); rc.setUserName(m_ui.defaultUsernameLineEdit->text().trimmed());
m_ui.defaultEmailLineEdit->setText(settings->email()); rc.setEmail(m_ui.defaultEmailLineEdit->text().trimmed());
m_ui.logEntriesCount->setValue(settings->logCount()); rc.setLogCount(m_ui.logEntriesCount->value());
m_ui.timeout->setValue(settings->timeoutSeconds()); rc.setTimeoutSeconds(m_ui.timeout->value());
m_ui.promptOnSubmitCheckBox->setChecked(settings->prompt()); rc.setPrompt(m_ui.promptOnSubmitCheckBox->isChecked());
return rc;
} }
void OptionsPageWidget::saveOptions() void OptionsPageWidget::setSettings(const MercurialSettings &s)
{ {
MercurialSettings *settings = MercurialPlugin::instance()->settings(); m_ui.commandChooser->setPath(s.binary());
m_ui.defaultUsernameLineEdit->setText(s.userName());
settings->writeSettings(m_ui.commandChooser->path(), m_ui.defaultUsernameLineEdit->text(), m_ui.defaultEmailLineEdit->setText(s.email());
m_ui.defaultEmailLineEdit->text(), m_ui.logEntriesCount->value(), m_ui.logEntriesCount->setValue(s.logCount());
m_ui.timeout->value(), m_ui.promptOnSubmitCheckBox->isChecked()); m_ui.timeout->setValue(s.timeoutSeconds());
m_ui.promptOnSubmitCheckBox->setChecked(s.prompt());
} }
OptionsPage::OptionsPage() OptionsPage::OptionsPage()
@@ -93,7 +96,7 @@ QWidget *OptionsPage::createPage(QWidget *parent)
{ {
if (!optionsPageWidget) if (!optionsPageWidget)
optionsPageWidget = new OptionsPageWidget(parent); optionsPageWidget = new OptionsPageWidget(parent);
optionsPageWidget.data()->updateOptions(); optionsPageWidget->setSettings(MercurialPlugin::instance()->settings());
return optionsPageWidget; return optionsPageWidget;
} }
@@ -101,8 +104,13 @@ void OptionsPage::apply()
{ {
if (!optionsPageWidget) if (!optionsPageWidget)
return; return;
optionsPageWidget.data()->saveOptions(); MercurialPlugin *plugin = MercurialPlugin::instance();
const MercurialSettings newSettings = optionsPageWidget->settings();
if (newSettings != plugin->settings()) {
//assume success and emit signal that settings are changed; //assume success and emit signal that settings are changed;
plugin->setSettings(newSettings);
newSettings.writeSettings(Core::ICore::instance()->settings());
emit settingsChanged(); emit settingsChanged();
}
} }

View File

@@ -40,13 +40,16 @@
namespace Mercurial { namespace Mercurial {
namespace Internal { namespace Internal {
class MercurialSettings;
class OptionsPageWidget : public QWidget class OptionsPageWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit OptionsPageWidget(QWidget *parent = 0); explicit OptionsPageWidget(QWidget *parent = 0);
void updateOptions();
void saveOptions(); MercurialSettings settings() const;
void setSettings(const MercurialSettings &s);
private: private:
Ui::OptionsPage m_ui; Ui::OptionsPage m_ui;