diff options
author | Tobias Hunger <tobias.hunger@theqtcompany.com> | 2015-03-26 12:22:29 +0100 |
---|---|---|
committer | Tobias Hunger <tobias.hunger@theqtcompany.com> | 2015-04-08 09:30:44 +0000 |
commit | 90ce38da39ba7acf6f7883a86916abcfc7efe23c (patch) | |
tree | 48a34950ff0b1a64d1f052ede5609e3a949837fc | |
parent | d3100774f9b2b342fe36b9b3d213934f79e96b64 (diff) | |
download | qt-creator-90ce38da39ba7acf6f7883a86916abcfc7efe23c.tar.gz |
Vcs: Move handling of settings from VcsBaseClient to VcsBaseClientImpl
... and update users of that functionality accordingly.
Unexpected plus: Now every supported VCS actually saves their setting
when requested.
Change-Id: I02db7b2ce14e5f52d26409b2a01aea290c2a294a
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
49 files changed, 342 insertions, 383 deletions
diff --git a/src/plugins/bazaar/bazaarclient.cpp b/src/plugins/bazaar/bazaarclient.cpp index 514c34bb03..48dc0e7c5d 100644 --- a/src/plugins/bazaar/bazaarclient.cpp +++ b/src/plugins/bazaar/bazaarclient.cpp @@ -68,13 +68,13 @@ class BazaarDiffParameterWidget : public VcsBaseEditorParameterWidget { Q_OBJECT public: - BazaarDiffParameterWidget(BazaarSettings *settings, QWidget *parent = 0) : + BazaarDiffParameterWidget(VcsBaseClientSettings &settings, QWidget *parent = 0) : VcsBaseEditorParameterWidget(parent) { mapSetting(addToggleButton(QLatin1String("-w"), tr("Ignore Whitespace")), - settings->boolPointer(BazaarSettings::diffIgnoreWhiteSpaceKey)); + settings.boolPointer(BazaarSettings::diffIgnoreWhiteSpaceKey)); mapSetting(addToggleButton(QLatin1String("-B"), tr("Ignore Blank Lines")), - settings->boolPointer(BazaarSettings::diffIgnoreBlankLinesKey)); + settings.boolPointer(BazaarSettings::diffIgnoreBlankLinesKey)); } QStringList arguments() const @@ -95,18 +95,18 @@ class BazaarLogParameterWidget : public VcsBaseEditorParameterWidget { Q_OBJECT public: - BazaarLogParameterWidget(BazaarSettings *settings, QWidget *parent = 0) : + BazaarLogParameterWidget(VcsBaseClientSettings &settings, QWidget *parent = 0) : VcsBaseEditorParameterWidget(parent) { mapSetting(addToggleButton(QLatin1String("--verbose"), tr("Verbose"), tr("Show files changed in each revision.")), - settings->boolPointer(BazaarSettings::logVerboseKey)); + settings.boolPointer(BazaarSettings::logVerboseKey)); mapSetting(addToggleButton(QLatin1String("--forward"), tr("Forward"), tr("Show from oldest to newest.")), - settings->boolPointer(BazaarSettings::logForwardKey)); + settings.boolPointer(BazaarSettings::logForwardKey)); mapSetting(addToggleButton(QLatin1String("--include-merges"), tr("Include Merges"), tr("Show merged revisions.")), - settings->boolPointer(BazaarSettings::logIncludeMergesKey)); + settings.boolPointer(BazaarSettings::logIncludeMergesKey)); QList<ComboBoxItem> logChoices; logChoices << ComboBoxItem(tr("Detailed"), QLatin1String("long")) @@ -114,28 +114,23 @@ public: << ComboBoxItem(tr("One Line"), QLatin1String("line")) << ComboBoxItem(tr("GNU Change Log"), QLatin1String("gnu-changelog")); mapSetting(addComboBox(QStringList(QLatin1String("--log-format=%1")), logChoices), - settings->stringPointer(BazaarSettings::logFormatKey)); + settings.stringPointer(BazaarSettings::logFormatKey)); } }; -BazaarClient::BazaarClient(BazaarSettings *settings) : - VcsBaseClient(settings) +BazaarClient::BazaarClient() : + VcsBaseClient(new BazaarSettings) { - setDiffParameterWidgetCreator([=] { return new BazaarDiffParameterWidget(settings); }); - setLogParameterWidgetCreator([=] { return new BazaarLogParameterWidget(settings); }); -} - -BazaarSettings *BazaarClient::settings() const -{ - return dynamic_cast<BazaarSettings *>(VcsBaseClient::settings()); + setDiffParameterWidgetCreator([this] { return new BazaarDiffParameterWidget(settings()); }); + setLogParameterWidgetCreator([this] { return new BazaarLogParameterWidget(settings()); }); } bool BazaarClient::synchronousSetUserId() { QStringList args; args << QLatin1String("whoami") - << (settings()->stringValue(BazaarSettings::userNameKey) + QLatin1String(" <") - + settings()->stringValue(BazaarSettings::userEmailKey) + QLatin1Char('>')); + << (settings().stringValue(BazaarSettings::userNameKey) + QLatin1String(" <") + + settings().stringValue(BazaarSettings::userEmailKey) + QLatin1Char('>')); QByteArray stdOut; return vcsFullySynchronousExec(QDir::currentPath(), args, &stdOut); } diff --git a/src/plugins/bazaar/bazaarclient.h b/src/plugins/bazaar/bazaarclient.h index acee6ba1f4..913f341540 100644 --- a/src/plugins/bazaar/bazaarclient.h +++ b/src/plugins/bazaar/bazaarclient.h @@ -44,9 +44,7 @@ class BazaarClient : public VcsBase::VcsBaseClient Q_OBJECT public: - BazaarClient(BazaarSettings *settings); - - BazaarSettings *settings() const; + BazaarClient(); bool synchronousSetUserId(); BranchInfo synchronousBranchQuery(const QString &repositoryRoot) const; diff --git a/src/plugins/bazaar/bazaarcontrol.cpp b/src/plugins/bazaar/bazaarcontrol.cpp index c74ba8f0f9..e9a9be117d 100644 --- a/src/plugins/bazaar/bazaarcontrol.cpp +++ b/src/plugins/bazaar/bazaarcontrol.cpp @@ -71,7 +71,7 @@ bool BazaarControl::managesFile(const QString &workingDirectory, const QString & bool BazaarControl::isConfigured() const { - const Utils::FileName binary = m_bazaarClient->settings()->binaryPath(); + const Utils::FileName binary = m_bazaarClient->vcsBinary(); if (binary.isEmpty()) return false; QFileInfo fi = binary.toFileInfo(); @@ -148,8 +148,3 @@ void BazaarControl::changed(const QVariant &v) break; } } - -void BazaarControl::emitConfigurationChanged() -{ - emit configurationChanged(); -} diff --git a/src/plugins/bazaar/bazaarcontrol.h b/src/plugins/bazaar/bazaarcontrol.h index 0313e4fb87..d5d8b07c35 100644 --- a/src/plugins/bazaar/bazaarcontrol.h +++ b/src/plugins/bazaar/bazaarcontrol.h @@ -69,7 +69,6 @@ public slots: // files changed signals according to the variant's type: // String -> repository, StringList -> files void changed(const QVariant &); - void emitConfigurationChanged(); private: BazaarClient *m_bazaarClient; diff --git a/src/plugins/bazaar/bazaarplugin.cpp b/src/plugins/bazaar/bazaarplugin.cpp index 3d578557d6..a8b81eea9f 100644 --- a/src/plugins/bazaar/bazaarplugin.cpp +++ b/src/plugins/bazaar/bazaarplugin.cpp @@ -165,12 +165,14 @@ bool BazaarPlugin::initialize(const QStringList &arguments, QString *errorMessag Context context(Constants::BAZAAR_CONTEXT); - m_client = new BazaarClient(&m_bazaarSettings); + m_client = new BazaarClient; auto vcsCtrl = new BazaarControl(m_client); initializeVcs(vcsCtrl, context); - addAutoReleasedObject(new OptionsPage); - m_bazaarSettings.readSettings(ICore::settings()); + auto options = new OptionsPage; + connect(options, &OptionsPage::settingsChanged, + vcsCtrl, &Core::IVersionControl::configurationChanged); + addAutoReleasedObject(options); connect(m_client, &VcsBaseClient::changed, vcsCtrl, &BazaarControl::changed); @@ -214,22 +216,6 @@ BazaarClient *BazaarPlugin::client() const return m_client; } -const BazaarSettings &BazaarPlugin::settings() const -{ - return m_bazaarSettings; -} - -void BazaarPlugin::setSettings(const BazaarSettings &settings) -{ - if (settings != m_bazaarSettings) { - const bool userIdChanged = !m_bazaarSettings.sameUserId(settings); - m_bazaarSettings = settings; - if (userIdChanged) - client()->synchronousSetUserId(); - static_cast<BazaarControl *>(versionControl())->emitConfigurationChanged(); - } -} - void BazaarPlugin::createMenu(const Context &context) { // Create menu item for Bazaar @@ -402,7 +388,7 @@ void BazaarPlugin::logRepository() const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasTopLevel(), return); QStringList extraOptions; - extraOptions += QLatin1String("--limit=") + QString::number(settings().intValue(BazaarSettings::logCountKey)); + extraOptions += QLatin1String("--limit=") + QString::number(m_client->settings().intValue(BazaarSettings::logCountKey)); m_client->log(state.topLevel(), QStringList(), extraOptions); } @@ -606,9 +592,10 @@ void BazaarPlugin::showCommitWidget(const QList<VcsBaseClient::StatusItem> &stat commitEditor->document()->setPreferredDisplayName(msg); const BranchInfo branch = m_client->synchronousBranchQuery(m_submitRepository); + const VcsBaseClientSettings &s = m_client->settings(); commitEditor->setFields(m_submitRepository, branch, - m_bazaarSettings.stringValue(BazaarSettings::userNameKey), - m_bazaarSettings.stringValue(BazaarSettings::userEmailKey), status); + s.stringValue(BazaarSettings::userNameKey), + s.stringValue(BazaarSettings::userEmailKey), status); } void BazaarPlugin::diffFromEditorSelected(const QStringList &files) diff --git a/src/plugins/bazaar/bazaarplugin.h b/src/plugins/bazaar/bazaarplugin.h index 8701264b14..20b62f55f0 100644 --- a/src/plugins/bazaar/bazaarplugin.h +++ b/src/plugins/bazaar/bazaarplugin.h @@ -70,9 +70,6 @@ public: static BazaarPlugin *instance(); BazaarClient *client() const; - const BazaarSettings &settings() const; - void setSettings(const BazaarSettings &settings); - private slots: // File menu action slots void addCurrentFile(); diff --git a/src/plugins/bazaar/clonewizard.cpp b/src/plugins/bazaar/clonewizard.cpp index 29a743927d..e7bf7a8670 100644 --- a/src/plugins/bazaar/clonewizard.cpp +++ b/src/plugins/bazaar/clonewizard.cpp @@ -79,7 +79,7 @@ VcsCommand *CloneWizard::createCommand(Utils::FileName *checkoutDir) if (!cwp) return 0; - const BazaarSettings &settings = BazaarPlugin::instance()->settings(); + const VcsBaseClientSettings &settings = BazaarPlugin::instance()->client()->settings(); *checkoutDir = Utils::FileName::fromString(cwp->path() + QLatin1Char('/') + cwp->directory()); const CloneOptionsPanel *panel = cwp->cloneOptionsPanel(); diff --git a/src/plugins/bazaar/optionspage.cpp b/src/plugins/bazaar/optionspage.cpp index 7b3182970f..883e7d0e50 100644 --- a/src/plugins/bazaar/optionspage.cpp +++ b/src/plugins/bazaar/optionspage.cpp @@ -28,6 +28,7 @@ ** ****************************************************************************/ #include "optionspage.h" +#include "bazaarclient.h" #include "bazaarsettings.h" #include "bazaarplugin.h" @@ -38,6 +39,7 @@ using namespace Bazaar::Internal; using namespace Bazaar; +using namespace VcsBase; OptionsPageWidget::OptionsPageWidget(QWidget *parent) : QWidget(parent) @@ -48,9 +50,9 @@ OptionsPageWidget::OptionsPageWidget(QWidget *parent) m_ui.commandChooser->setHistoryCompleter(QLatin1String("Bazaar.Command.History")); } -BazaarSettings OptionsPageWidget::settings() const +VcsBaseClientSettings OptionsPageWidget::settings() const { - BazaarSettings s = BazaarPlugin::instance()->settings(); + VcsBaseClientSettings s = BazaarPlugin::instance()->client()->settings(); s.setValue(BazaarSettings::binaryPathKey, m_ui.commandChooser->rawPath()); s.setValue(BazaarSettings::userNameKey, m_ui.defaultUsernameLineEdit->text().trimmed()); s.setValue(BazaarSettings::userEmailKey, m_ui.defaultEmailLineEdit->text().trimmed()); @@ -59,7 +61,7 @@ BazaarSettings OptionsPageWidget::settings() const return s; } -void OptionsPageWidget::setSettings(const BazaarSettings &s) +void OptionsPageWidget::setSettings(const VcsBaseClientSettings &s) { m_ui.commandChooser->setPath(s.stringValue(BazaarSettings::binaryPathKey)); m_ui.defaultUsernameLineEdit->setText(s.stringValue(BazaarSettings::userNameKey)); @@ -78,7 +80,7 @@ QWidget *OptionsPage::widget() { if (!m_optionsPageWidget) m_optionsPageWidget = new OptionsPageWidget; - m_optionsPageWidget->setSettings(BazaarPlugin::instance()->settings()); + m_optionsPageWidget->setSettings(BazaarPlugin::instance()->client()->settings()); return m_optionsPageWidget; } @@ -87,11 +89,10 @@ void OptionsPage::apply() if (!m_optionsPageWidget) return; BazaarPlugin *plugin = BazaarPlugin::instance(); - const BazaarSettings newSettings = m_optionsPageWidget->settings(); - if (newSettings != plugin->settings()) { - //assume success and emit signal that settings are changed; - plugin->setSettings(newSettings); - newSettings.writeSettings(Core::ICore::settings()); + const VcsBaseClientSettings newSettings = m_optionsPageWidget->settings(); + VcsBaseClientSettings &s = plugin->client()->settings(); + if (newSettings != s) { + s = newSettings; emit settingsChanged(); } } diff --git a/src/plugins/bazaar/optionspage.h b/src/plugins/bazaar/optionspage.h index 69ae1eb32e..ddec710dbf 100644 --- a/src/plugins/bazaar/optionspage.h +++ b/src/plugins/bazaar/optionspage.h @@ -37,11 +37,13 @@ #include <QWidget> #include <QPointer> +namespace VcsBase { +class VcsBaseClientSettings; +} // namespace VcsBase + namespace Bazaar { namespace Internal { -class BazaarSettings; - class OptionsPageWidget : public QWidget { Q_OBJECT @@ -49,8 +51,8 @@ class OptionsPageWidget : public QWidget public: explicit OptionsPageWidget(QWidget *parent = 0); - BazaarSettings settings() const; - void setSettings(const BazaarSettings &s); + VcsBase::VcsBaseClientSettings settings() const; + void setSettings(const VcsBase::VcsBaseClientSettings &s); private: Ui::OptionsPage m_ui; diff --git a/src/plugins/cvs/checkoutwizard.cpp b/src/plugins/cvs/checkoutwizard.cpp index 65573926bb..9d39bf0a9f 100644 --- a/src/plugins/cvs/checkoutwizard.cpp +++ b/src/plugins/cvs/checkoutwizard.cpp @@ -30,6 +30,7 @@ #include "checkoutwizard.h" #include "checkoutwizardpage.h" +#include "cvsclient.h" #include "cvsplugin.h" #include <coreplugin/iversioncontrol.h> @@ -72,7 +73,7 @@ VcsCommand *CheckoutWizard::createCommand(Utils::FileName *checkoutDir) } QTC_ASSERT(cwp, return 0); - const CvsSettings settings = CvsPlugin::instance()->settings(); + const CvsSettings settings = CvsPlugin::instance()->client()->settings(); const Utils::FileName binary = settings.binaryPath(); QStringList args; diff --git a/src/plugins/cvs/cvsclient.cpp b/src/plugins/cvs/cvsclient.cpp index d41c7c4467..359eb39a72 100644 --- a/src/plugins/cvs/cvsclient.cpp +++ b/src/plugins/cvs/cvsclient.cpp @@ -70,40 +70,41 @@ class CvsDiffParameterWidget : public VcsBaseEditorParameterWidget { Q_OBJECT public: - explicit CvsDiffParameterWidget(CvsSettings *settings, QWidget *parent = 0); + explicit CvsDiffParameterWidget(VcsBaseClientSettings &settings, QWidget *parent = 0); QStringList arguments() const; private: - const CvsSettings *m_settings; + VcsBaseClientSettings &m_settings; }; -CvsDiffParameterWidget::CvsDiffParameterWidget(CvsSettings *settings, QWidget *parent) - : VcsBaseEditorParameterWidget(parent), - m_settings(settings) +CvsDiffParameterWidget::CvsDiffParameterWidget(VcsBaseClientSettings &settings, + QWidget *parent) : + VcsBaseEditorParameterWidget(parent), + m_settings(settings) { mapSetting(addToggleButton(QLatin1String("-w"), tr("Ignore Whitespace")), - settings->boolPointer(CvsSettings::diffIgnoreWhiteSpaceKey)); + settings.boolPointer(CvsSettings::diffIgnoreWhiteSpaceKey)); mapSetting(addToggleButton(QLatin1String("-B"), tr("Ignore Blank Lines")), - settings->boolPointer(CvsSettings::diffIgnoreBlankLinesKey)); + settings.boolPointer(CvsSettings::diffIgnoreBlankLinesKey)); } QStringList CvsDiffParameterWidget::arguments() const { QStringList args; - args = m_settings->stringValue(CvsSettings::diffOptionsKey).split(QLatin1Char(' '), QString::SkipEmptyParts); + args = m_settings.stringValue(CvsSettings::diffOptionsKey).split(QLatin1Char(' '), + QString::SkipEmptyParts); args += VcsBaseEditorParameterWidget::arguments(); return args; } -CvsClient::CvsClient(CvsSettings *settings) : - VcsBaseClient(settings) +CvsClient::CvsClient() : VcsBaseClient(new CvsSettings) { - setDiffParameterWidgetCreator([=] { return new CvsDiffParameterWidget(settings); }); + setDiffParameterWidgetCreator([this] { return new CvsDiffParameterWidget(settings()); }); } -CvsSettings *CvsClient::settings() const +CvsSettings &CvsClient::settings() const { - return dynamic_cast<CvsSettings *>(VcsBaseClient::settings()); + return static_cast<CvsSettings &>(VcsBaseClient::settings()); } Core::Id CvsClient::vcsEditorKind(VcsCommandTag cmd) const diff --git a/src/plugins/cvs/cvsclient.h b/src/plugins/cvs/cvsclient.h index 1b3058e95a..445c4fa6f9 100644 --- a/src/plugins/cvs/cvsclient.h +++ b/src/plugins/cvs/cvsclient.h @@ -44,9 +44,9 @@ class CvsClient : public VcsBase::VcsBaseClient Q_OBJECT public: - CvsClient(CvsSettings *settings); + CvsClient(); - CvsSettings *settings() const; + CvsSettings &settings() const; void diff(const QString &workingDir, const QStringList &files, const QStringList &extraOptions = QStringList()); QString findTopLevelForFile(const QFileInfo &file) const; diff --git a/src/plugins/cvs/cvscontrol.cpp b/src/plugins/cvs/cvscontrol.cpp index ff274a1390..ceb1eeca66 100644 --- a/src/plugins/cvs/cvscontrol.cpp +++ b/src/plugins/cvs/cvscontrol.cpp @@ -29,6 +29,8 @@ ****************************************************************************/ #include "cvscontrol.h" + +#include "cvsclient.h" #include "cvsplugin.h" #include "cvssettings.h" @@ -58,7 +60,7 @@ Core::Id CvsControl::id() const bool CvsControl::isConfigured() const { - const Utils::FileName binary = m_plugin->settings().binaryPath(); + const Utils::FileName binary = m_plugin->client()->vcsBinary(); if (binary.isEmpty()) return false; QFileInfo fi = binary.toFileInfo(); @@ -149,8 +151,3 @@ void CvsControl::emitFilesChanged(const QStringList &l) { emit filesChanged(l); } - -void CvsControl::emitConfigurationChanged() -{ - emit configurationChanged(); -} diff --git a/src/plugins/cvs/cvscontrol.h b/src/plugins/cvs/cvscontrol.h index c1bedee0f3..c7bf1d14b3 100644 --- a/src/plugins/cvs/cvscontrol.h +++ b/src/plugins/cvs/cvscontrol.h @@ -65,7 +65,6 @@ public: void emitRepositoryChanged(const QString &s); void emitFilesChanged(const QStringList &l); - void emitConfigurationChanged(); private: CvsPlugin *m_plugin; diff --git a/src/plugins/cvs/cvsplugin.cpp b/src/plugins/cvs/cvsplugin.cpp index e66efeab2c..f139b2763e 100644 --- a/src/plugins/cvs/cvsplugin.cpp +++ b/src/plugins/cvs/cvsplugin.cpp @@ -211,6 +211,12 @@ CvsPlugin::~CvsPlugin() cleanCommitMessageFile(); } +CvsClient *CvsPlugin::client() const +{ + QTC_CHECK(m_client); + return m_client; +} + void CvsPlugin::cleanCommitMessageFile() { if (!m_commitMessageFileName.isEmpty()) { @@ -246,9 +252,11 @@ bool CvsPlugin::initialize(const QStringList &arguments, QString *errorMessage) Utils::MimeDatabase::addMimeTypes(QLatin1String(":/trolltech.cvs/CVS.mimetypes.xml")); - m_settings.readSettings(ICore::settings()); - m_client = new CvsClient(&m_settings); + m_client = new CvsClient; + auto options = new SettingsPage; + connect(options, &SettingsPage::settingsChanged, + versionControl(), &IVersionControl::configurationChanged); addAutoReleasedObject(new SettingsPage); addAutoReleasedObject(new VcsSubmitEditorFactory(&submitParameters, @@ -503,12 +511,11 @@ bool CvsPlugin::submitEditorAboutToClose() // Prompt user. Force a prompt unless submit was actually invoked (that // is, the editor was closed or shutdown). - CvsSettings newSettings = m_settings; const VcsBaseSubmitEditor::PromptSubmitResult answer = editor->promptSubmit(tr("Closing CVS Editor"), tr("Do you want to commit the change?"), tr("The commit message check failed. Do you want to commit the change?"), - newSettings.boolPointer(CvsSettings::promptOnSubmitKey), + client()->settings().boolPointer(CvsSettings::promptOnSubmitKey), !m_submitActionTriggered); m_submitActionTriggered = false; switch (answer) { @@ -520,7 +527,6 @@ bool CvsPlugin::submitEditorAboutToClose() default: break; } - setSettings(newSettings); // in case someone turned prompting off const QStringList fileList = editor->checkedFiles(); bool closeEditor = true; if (!fileList.empty()) { @@ -617,7 +623,7 @@ void CvsPlugin::revertAll() QStringList args; args << QLatin1String("update") << QLatin1String("-C") << state.topLevel(); const CvsResponse revertResponse = - runCvs(state.topLevel(), args, m_settings.timeOutMs(), + runCvs(state.topLevel(), args, client()->vcsTimeout(), SshPasswordPrompt|ShowStdOutInLogWindow); if (revertResponse.result == CvsResponse::Ok) cvsVersionControl()->emitRepositoryChanged(state.topLevel()); @@ -633,7 +639,7 @@ void CvsPlugin::revertCurrentFile() QStringList args; args << QLatin1String("diff") << state.relativeCurrentFile(); const CvsResponse diffResponse = - runCvs(state.currentFileTopLevel(), args, m_settings.timeOutMs(), 0); + runCvs(state.currentFileTopLevel(), args, client()->vcsTimeout(), 0); switch (diffResponse.result) { case CvsResponse::Ok: return; // Not modified, diff exit code 0 @@ -655,7 +661,7 @@ void CvsPlugin::revertCurrentFile() args.clear(); args << QLatin1String("update") << QLatin1String("-C") << state.relativeCurrentFile(); const CvsResponse revertResponse = - runCvs(state.currentFileTopLevel(), args, m_settings.timeOutMs(), + runCvs(state.currentFileTopLevel(), args, client()->vcsTimeout(), SshPasswordPrompt|ShowStdOutInLogWindow); if (revertResponse.result == CvsResponse::Ok) cvsVersionControl()->emitFilesChanged(QStringList(state.currentFile())); @@ -717,7 +723,7 @@ void CvsPlugin::startCommit(const QString &workingDir, const QString &file) // where we are, so, have stdout/stderr channels merged. QStringList args = QStringList(QLatin1String("status")); const CvsResponse response = - runCvs(workingDir, args, m_settings.timeOutMs(), MergeOutputChannels); + runCvs(workingDir, args, client()->vcsTimeout(), MergeOutputChannels); if (response.result != CvsResponse::Ok) return; // Get list of added/modified/deleted files and purge out undesired ones @@ -765,7 +771,7 @@ bool CvsPlugin::commit(const QString &messageFile, args << QLatin1String("-F") << messageFile; args.append(fileList); const CvsResponse response = - runCvs(m_commitRepository, args, 10 * m_settings.timeOutMs(), + runCvs(m_commitRepository, args, 10 * client()->vcsTimeout(), SshPasswordPrompt|ShowStdOutInLogWindow); return response.result == CvsResponse::Ok ; } @@ -803,7 +809,7 @@ void CvsPlugin::filelog(const QString &workingDir, args << QLatin1String("log"); args.append(file); const CvsResponse response = - runCvs(workingDir, args, m_settings.timeOutMs(), + runCvs(workingDir, args, client()->vcsTimeout(), SshPasswordPrompt, codec); if (response.result != CvsResponse::Ok) return; @@ -844,7 +850,7 @@ bool CvsPlugin::update(const QString &topLevel, const QString &file) if (!file.isEmpty()) args.append(file); const CvsResponse response = - runCvs(topLevel, args, 10 * m_settings.timeOutMs(), + runCvs(topLevel, args, 10 * client()->vcsTimeout(), SshPasswordPrompt|ShowStdOutInLogWindow); const bool ok = response.result == CvsResponse::Ok; if (ok) @@ -891,7 +897,7 @@ bool CvsPlugin::edit(const QString &topLevel, const QStringList &files) QStringList args(QLatin1String("edit")); args.append(files); const CvsResponse response = - runCvs(topLevel, args, m_settings.timeOutMs(), + runCvs(topLevel, args, client()->vcsTimeout(), ShowStdOutInLogWindow|SshPasswordPrompt); return response.result == CvsResponse::Ok; } @@ -903,7 +909,7 @@ bool CvsPlugin::diffCheckModified(const QString &topLevel, const QStringList &fi QStringList args(QLatin1String("-q")); args << QLatin1String("diff"); args.append(files); - const CvsResponse response = runCvs(topLevel, args, m_settings.timeOutMs(), 0); + const CvsResponse response = runCvs(topLevel, args, client()->vcsTimeout(), 0); if (response.result == CvsResponse::OtherError) return false; *modified = response.result == CvsResponse::NonNullExitCode; @@ -931,7 +937,7 @@ bool CvsPlugin::unedit(const QString &topLevel, const QStringList &files) args.append(QLatin1String("-y")); args.append(files); const CvsResponse response = - runCvs(topLevel, args, m_settings.timeOutMs(), + runCvs(topLevel, args, client()->vcsTimeout(), ShowStdOutInLogWindow|SshPasswordPrompt); return response.result == CvsResponse::Ok; } @@ -950,7 +956,7 @@ void CvsPlugin::annotate(const QString &workingDir, const QString &file, args << QLatin1String("-r") << revision; args << file; const CvsResponse response = - runCvs(workingDir, args, m_settings.timeOutMs(), + runCvs(workingDir, args, client()->vcsTimeout(), SshPasswordPrompt, codec); if (response.result != CvsResponse::Ok) return; @@ -979,7 +985,7 @@ bool CvsPlugin::status(const QString &topLevel, const QString &file, const QStri if (!file.isEmpty()) args.append(file); const CvsResponse response = - runCvs(topLevel, args, m_settings.timeOutMs(), 0); + runCvs(topLevel, args, client()->vcsTimeout(), 0); const bool ok = response.result == CvsResponse::Ok; if (ok) showOutputInEditor(title, response.stdOut, OtherContent, topLevel, 0); @@ -1062,7 +1068,7 @@ bool CvsPlugin::describe(const QString &toplevel, const QString &file, const QStringList args; args << QLatin1String("log") << (QLatin1String("-r") + changeNr) << file; const CvsResponse logResponse = - runCvs(toplevel, args, m_settings.timeOutMs(), SshPasswordPrompt); + runCvs(toplevel, args, client()->vcsTimeout(), SshPasswordPrompt); if (logResponse.result != CvsResponse::Ok) { *errorMessage = logResponse.message; return false; @@ -1072,7 +1078,7 @@ bool CvsPlugin::describe(const QString &toplevel, const QString &file, const *errorMessage = msgLogParsingFailed(); return false; } - if (m_settings.boolValue(CvsSettings::describeByCommitIdKey)) { + if (client()->settings().boolValue(CvsSettings::describeByCommitIdKey)) { // Run a log command over the repo, filtering by the commit date // and commit id, collecting all files touched by the commit. const QString commitId = fileLog.front().revisions.front().commitId; @@ -1084,7 +1090,7 @@ bool CvsPlugin::describe(const QString &toplevel, const QString &file, const args << QLatin1String("log") << QLatin1String("-d") << (dateS + QLatin1Char('<') + nextDayS); const CvsResponse repoLogResponse = - runCvs(toplevel, args, 10 * m_settings.timeOutMs(), SshPasswordPrompt); + runCvs(toplevel, args, 10 * client()->vcsTimeout(), SshPasswordPrompt); if (repoLogResponse.result != CvsResponse::Ok) { *errorMessage = repoLogResponse.message; return false; @@ -1121,7 +1127,7 @@ bool CvsPlugin::describe(const QString &repositoryPath, QStringList args(QLatin1String("log")); args << (QLatin1String("-r") + it->revisions.front().revision) << it->file; const CvsResponse logResponse = - runCvs(repositoryPath, args, m_settings.timeOutMs(), SshPasswordPrompt); + runCvs(repositoryPath, args, client()->vcsTimeout(), SshPasswordPrompt); if (logResponse.result != CvsResponse::Ok) { *errorMessage = logResponse.message; return false; @@ -1134,11 +1140,11 @@ bool CvsPlugin::describe(const QString &repositoryPath, if (!isFirstRevision(revision)) { const QString previousRev = previousRevision(revision); QStringList args(QLatin1String("diff")); - args << m_settings.stringValue(CvsSettings::diffOptionsKey) << QLatin1String("-r") << previousRev - << QLatin1String("-r") << it->revisions.front().revision - << it->file; + args << client()->settings().stringValue(CvsSettings::diffOptionsKey) + << QLatin1String("-r") << previousRev << QLatin1String("-r") + << it->revisions.front().revision << it->file; const CvsResponse diffResponse = - runCvs(repositoryPath, args, m_settings.timeOutMs(), 0, codec); + runCvs(repositoryPath, args, client()->vcsTimeout(), 0, codec); switch (diffResponse.result) { case CvsResponse::Ok: case CvsResponse::NonNullExitCode: // Diff exit code != 0 @@ -1186,7 +1192,7 @@ CvsResponse CvsPlugin::runCvs(const QString &workingDirectory, unsigned flags, QTextCodec *outputCodec) const { - const FileName executable = m_settings.binaryPath(); + const FileName executable = client()->vcsBinary(); CvsResponse response; if (executable.isEmpty()) { response.result = CvsResponse::OtherError; @@ -1195,7 +1201,7 @@ CvsResponse CvsPlugin::runCvs(const QString &workingDirectory, } // Run, connect stderr to the output window const SynchronousProcessResponse sp_resp = - runVcs(workingDirectory, executable, m_settings.addOptions(arguments), + runVcs(workingDirectory, executable, client()->settings().addOptions(arguments), timeOut, flags, outputCodec); response.result = CvsResponse::OtherError; @@ -1247,20 +1253,6 @@ IEditor *CvsPlugin::showOutputInEditor(const QString& title, const QString &outp return editor; } -CvsSettings CvsPlugin::settings() const -{ - return m_settings; -} - -void CvsPlugin::setSettings(const CvsSettings &s) -{ - if (s != m_settings) { - m_settings = s; - m_settings.writeSettings(ICore::settings()); - cvsVersionControl()->emitConfigurationChanged(); - } -} - CvsPlugin *CvsPlugin::instance() { QTC_ASSERT(m_cvsPluginInstance, return m_cvsPluginInstance); @@ -1272,7 +1264,7 @@ bool CvsPlugin::vcsAdd(const QString &workingDir, const QString &rawFileName) QStringList args; args << QLatin1String("add") << rawFileName; const CvsResponse response = - runCvs(workingDir, args, m_settings.timeOutMs(), + runCvs(workingDir, args, client()->vcsTimeout(), SshPasswordPrompt|ShowStdOutInLogWindow); return response.result == CvsResponse::Ok; } @@ -1282,7 +1274,7 @@ bool CvsPlugin::vcsDelete(const QString &workingDir, const QString &rawFileName) QStringList args; args << QLatin1String("remove") << QLatin1String("-f") << rawFileName; const CvsResponse response = - runCvs(workingDir, args, m_settings.timeOutMs(), + runCvs(workingDir, args, client()->vcsTimeout(), SshPasswordPrompt|ShowStdOutInLogWindow); return response.result == CvsResponse::Ok; } @@ -1328,7 +1320,7 @@ bool CvsPlugin::managesFile(const QString &workingDirectory, const QString &file QStringList args; args << QLatin1String("status") << fileName; const CvsResponse response = - runCvs(workingDirectory, args, m_settings.timeOutMs(), SshPasswordPrompt); + runCvs(workingDirectory, args, client()->vcsTimeout(), SshPasswordPrompt); if (response.result != CvsResponse::Ok) return false; return !response.stdOut.contains(QLatin1String("Status: Unknown")); diff --git a/src/plugins/cvs/cvsplugin.h b/src/plugins/cvs/cvsplugin.h index 2e9f61fb08..e23be425b6 100644 --- a/src/plugins/cvs/cvsplugin.h +++ b/src/plugins/cvs/cvsplugin.h @@ -78,13 +78,12 @@ public: CvsPlugin(); ~CvsPlugin(); + CvsClient *client() const; + bool initialize(const QStringList &arguments, QString *errorMessage); CvsSubmitEditor *openCVSSubmitEditor(const QString &fileName); - CvsSettings settings() const; - void setSettings(const CvsSettings &s); - // IVersionControl bool vcsAdd(const QString &workingDir, const QString &fileName); bool vcsDelete(const QString &workingDir, const QString &fileName); diff --git a/src/plugins/cvs/settingspage.cpp b/src/plugins/cvs/settingspage.cpp index 1ceb755082..7c76f20342 100644 --- a/src/plugins/cvs/settingspage.cpp +++ b/src/plugins/cvs/settingspage.cpp @@ -29,6 +29,8 @@ ****************************************************************************/ #include "settingspage.h" + +#include "cvsclient.h" #include "cvssettings.h" #include "cvsplugin.h" @@ -43,6 +45,7 @@ using namespace Cvs::Internal; using namespace Utils; +using namespace VcsBase; SettingsPageWidget::SettingsPageWidget(QWidget *parent) : QWidget(parent) @@ -53,7 +56,7 @@ SettingsPageWidget::SettingsPageWidget(QWidget *parent) : m_ui.commandPathChooser->setPromptDialogTitle(tr("CVS Command")); } -CvsSettings SettingsPageWidget::settings() const +VcsBaseClientSettings SettingsPageWidget::settings() const { CvsSettings rc; rc.setValue(CvsSettings::binaryPathKey, m_ui.commandPathChooser->rawPath()); @@ -65,7 +68,7 @@ CvsSettings SettingsPageWidget::settings() const return rc; } -void SettingsPageWidget::setSettings(const CvsSettings &s) +void SettingsPageWidget::setSettings(const VcsBaseClientSettings &s) { m_ui.commandPathChooser->setFileName(s.binaryPath()); m_ui.rootLineEdit->setText(s.stringValue(CvsSettings::cvsRootKey)); @@ -85,14 +88,20 @@ QWidget *SettingsPage::widget() { if (!m_widget) { m_widget = new SettingsPageWidget; - m_widget->setSettings(CvsPlugin::instance()->settings()); + m_widget->setSettings(CvsPlugin::instance()->client()->settings()); } return m_widget; } void SettingsPage::apply() { - CvsPlugin::instance()->setSettings(m_widget->settings()); + VcsBaseClientSettings &s = CvsPlugin::instance()->client()->settings(); + const VcsBaseClientSettings newSettings = m_widget->settings(); + if (s != newSettings) { + s = newSettings; + s.writeSettings(Core::ICore::settings()); + emit settingsChanged(); + } } void SettingsPage::finish() diff --git a/src/plugins/cvs/settingspage.h b/src/plugins/cvs/settingspage.h index e94ac163a6..6c0a3bc11a 100644 --- a/src/plugins/cvs/settingspage.h +++ b/src/plugins/cvs/settingspage.h @@ -43,11 +43,13 @@ QT_BEGIN_NAMESPACE class QSettings; QT_END_NAMESPACE +namespace VcsBase { +class VcsBaseClientSettings; +} // namespace VcsBase + namespace Cvs { namespace Internal { -class CvsSettings; - class SettingsPageWidget : public QWidget { Q_OBJECT @@ -55,8 +57,8 @@ class SettingsPageWidget : public QWidget public: explicit SettingsPageWidget(QWidget *parent = 0); - CvsSettings settings() const; - void setSettings(const CvsSettings &); + VcsBase::VcsBaseClientSettings settings() const; + void setSettings(const VcsBase::VcsBaseClientSettings &); private: Ui::SettingsPage m_ui; @@ -74,6 +76,9 @@ public: void apply(); void finish(); +signals: + void settingsChanged(); + private: QPointer<SettingsPageWidget> m_widget; }; diff --git a/src/plugins/git/branchmodel.cpp b/src/plugins/git/branchmodel.cpp index b34a4d3453..58fccad188 100644 --- a/src/plugins/git/branchmodel.cpp +++ b/src/plugins/git/branchmodel.cpp @@ -646,7 +646,7 @@ void BranchModel::parseOutputLine(const QString &line) const QString fullName = lineParts.at(1); bool current = (sha == m_currentSha); - bool showTags = m_client->settings()->boolValue(GitSettings::showTagsKey); + bool showTags = m_client->settings().boolValue(GitSettings::showTagsKey); // insert node into tree: QStringList nameParts = fullName.split(QLatin1Char('/')); diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 2eca6df849..8c808cefcb 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -393,21 +393,19 @@ class BaseGitDiffArgumentsWidget : public VcsBaseEditorParameterWidget Q_OBJECT public: - BaseGitDiffArgumentsWidget(GitSettings *settings, QWidget *parent = 0) : + BaseGitDiffArgumentsWidget(VcsBaseClientSettings &settings, QWidget *parent = 0) : VcsBaseEditorParameterWidget(parent) { - QTC_ASSERT(settings, return); - m_patienceButton = addToggleButton( QLatin1String("--patience"), tr("Patience"), tr("Use the patience algorithm for calculating the differences.")); - mapSetting(m_patienceButton, settings->boolPointer(GitSettings::diffPatienceKey)); + mapSetting(m_patienceButton, settings.boolPointer(GitSettings::diffPatienceKey)); m_ignoreWSButton = addToggleButton( QLatin1String("--ignore-space-change"), tr("Ignore Whitespace"), tr("Ignore whitespace only changes.")); mapSetting(m_ignoreWSButton, - settings->boolPointer(GitSettings::ignoreSpaceChangesInDiffKey)); + settings.boolPointer(GitSettings::ignoreSpaceChangesInDiffKey)); } protected: @@ -420,15 +418,15 @@ class GitBlameArgumentsWidget : public VcsBaseEditorParameterWidget Q_OBJECT public: - GitBlameArgumentsWidget(GitSettings *settings, QWidget *parent = 0) : + GitBlameArgumentsWidget(VcsBaseClientSettings &settings, QWidget *parent = 0) : VcsBaseEditorParameterWidget(parent) { mapSetting(addToggleButton(QString(), tr("Omit Date"), tr("Hide the date of a change from the output.")), - settings->boolPointer(GitSettings::omitAnnotationDateKey)); + settings.boolPointer(GitSettings::omitAnnotationDateKey)); mapSetting(addToggleButton(QLatin1String("-w"), tr("Ignore Whitespace"), tr("Ignore whitespace only changes.")), - settings->boolPointer(GitSettings::ignoreSpaceChangesInBlameKey)); + settings.boolPointer(GitSettings::ignoreSpaceChangesInBlameKey)); } }; @@ -437,12 +435,12 @@ class GitLogArgumentsWidget : public BaseGitDiffArgumentsWidget Q_OBJECT public: - GitLogArgumentsWidget(GitSettings *settings, QWidget *parent = 0) : + GitLogArgumentsWidget(VcsBaseClientSettings &settings, QWidget *parent = 0) : BaseGitDiffArgumentsWidget(settings, parent) { QToolButton *diffButton = addToggleButton(QLatin1String("--patch"), tr("Show Diff"), tr("Show difference.")); - mapSetting(diffButton, settings->boolPointer(GitSettings::logDiffKey)); + mapSetting(diffButton, settings.boolPointer(GitSettings::logDiffKey)); connect(diffButton, &QToolButton::toggled, m_patienceButton, &QToolButton::setVisible); connect(diffButton, &QToolButton::toggled, m_ignoreWSButton, &QToolButton::setVisible); m_patienceButton->setVisible(diffButton->isChecked()); @@ -452,7 +450,7 @@ public: graphArguments << (QLatin1String("--pretty=format:") + QLatin1String(graphLogFormatC)); QToolButton *graphButton = addToggleButton(graphArguments, tr("Graph"), tr("Show textual graph log.")); - mapSetting(graphButton, settings->boolPointer(GitSettings::graphLogKey)); + mapSetting(graphButton, settings.boolPointer(GitSettings::graphLogKey)); } }; @@ -605,13 +603,10 @@ static inline void msgCannotRun(const QStringList &args, const QString &workingD const char *GitClient::stashNamePrefix = "stash@{"; -GitClient::GitClient(GitSettings *settings) : +GitClient::GitClient() : VcsBase::VcsBaseClientImpl(new GitSettings), m_cachedGitVersion(0), - m_settings(settings), m_disableEditor(false) { - QTC_CHECK(settings); - connect(ICore::instance(), &ICore::saveSettingsRequested, this, &GitClient::saveSettings); m_gitQtcEditor = QString::fromLatin1("\"%1\" -client -block -pid %2") .arg(QCoreApplication::applicationFilePath()) .arg(QCoreApplication::applicationPid()); @@ -908,7 +903,7 @@ void GitClient::log(const QString &workingDirectory, const QString &fileName, arguments << QLatin1String("log") << QLatin1String(noColorOption) << QLatin1String(decorateOption); - int logCount = settings()->intValue(GitSettings::logCountKey); + int logCount = settings().intValue(GitSettings::logCountKey); if (logCount > 0) arguments << QLatin1String("-n") << QString::number(logCount); @@ -939,7 +934,7 @@ void GitClient::reflog(const QString &workingDirectory) arguments << QLatin1String("reflog") << QLatin1String(noColorOption) << QLatin1String(decorateOption); - int logCount = settings()->intValue(GitSettings::logCountKey); + int logCount = settings().intValue(GitSettings::logCountKey); if (logCount > 0) arguments << QLatin1String("-n") << QString::number(logCount); @@ -983,11 +978,6 @@ void GitClient::show(const QString &source, const QString &id, const QString &na }); } -void GitClient::saveSettings() -{ - settings()->writeSettings(ICore::settings()); -} - void GitClient::slotBlameRevisionRequested(const QString &workingDirectory, const QString &file, QString change, int lineNumber) { @@ -2027,14 +2017,14 @@ VcsCommand *GitClient::executeGit(const QString &workingDirectory, QProcessEnvironment GitClient::processEnvironment() const { QProcessEnvironment environment = QProcessEnvironment::systemEnvironment(); - QString gitPath = settings()->stringValue(GitSettings::pathKey); + QString gitPath = settings().stringValue(GitSettings::pathKey); if (!gitPath.isEmpty()) { gitPath += HostOsInfo::pathListSeparator(); gitPath += environment.value(QLatin1String("PATH")); environment.insert(QLatin1String("PATH"), gitPath); } if (HostOsInfo::isWindowsHost() - && settings()->boolValue(GitSettings::winSetHomeEnvironmentKey)) { + && settings().boolValue(GitSettings::winSetHomeEnvironmentKey)) { environment.insert(QLatin1String("HOME"), QDir::toNativeSeparators(QDir::homePath())); } environment.insert(QLatin1String("GIT_EDITOR"), m_disableEditor ? QLatin1String("true") : m_gitQtcEditor); @@ -2414,7 +2404,7 @@ void GitClient::launchGitK(const QString &workingDirectory, const QString &fileN void GitClient::launchRepositoryBrowser(const QString &workingDirectory) { - const QString repBrowserBinary = settings()->stringValue(GitSettings::repositoryBrowserCmd); + const QString repBrowserBinary = settings().stringValue(GitSettings::repositoryBrowserCmd); if (!repBrowserBinary.isEmpty()) QProcess::startDetached(repBrowserBinary, QStringList(workingDirectory), workingDirectory); } @@ -2434,7 +2424,7 @@ bool GitClient::tryLauchingGitK(const QProcessEnvironment &env, binary = wish; } } - const QString gitkOpts = settings()->stringValue(GitSettings::gitkOptionsKey); + const QString gitkOpts = settings().stringValue(GitSettings::gitkOptionsKey); if (!gitkOpts.isEmpty()) arguments.append(QtcProcess::splitArgs(gitkOpts, HostOsInfo::hostOs())); if (!fileName.isEmpty()) @@ -2443,7 +2433,7 @@ bool GitClient::tryLauchingGitK(const QProcessEnvironment &env, // This should always use QProcess::startDetached (as not to kill // the child), but that does not have an environment parameter. bool success = false; - if (!settings()->stringValue(GitSettings::pathKey).isEmpty()) { + if (!settings().stringValue(GitSettings::pathKey).isEmpty()) { auto process = new QProcess(this); process->setWorkingDirectory(workingDirectory); process->setProcessEnvironment(env); @@ -2495,12 +2485,12 @@ FileName GitClient::gitBinDirectory() FileName GitClient::vcsBinary(bool *ok, QString *errorMessage) const { - return settings()->gitExecutable(ok, errorMessage); + return static_cast<GitSettings &>(settings()).gitExecutable(ok, errorMessage); } int GitClient::vcsTimeout() const { - return settings()->intValue(GitSettings::timeoutKey); + return settings().intValue(GitSettings::timeoutKey); } QTextCodec *GitClient::encoding(const QString &workingDirectory, const QByteArray &configVar) const @@ -3060,7 +3050,7 @@ void GitClient::subversionLog(const QString &workingDirectory) { QStringList arguments; arguments << QLatin1String("svn") << QLatin1String("log"); - int logCount = settings()->intValue(GitSettings::logCountKey); + int logCount = settings().intValue(GitSettings::logCountKey); if (logCount > 0) arguments << (QLatin1String("--limit=") + QString::number(logCount)); @@ -3131,7 +3121,7 @@ void GitClient::asyncCommand(const QString &workingDirectory, const QStringList // Git might request an editor, so this must be done asynchronously // and without timeout QString gitCommand = arguments.first(); - VcsOutputWindow::appendCommand(workingDirectory, settings()->binaryPath(), arguments); + VcsOutputWindow::appendCommand(workingDirectory, vcsBinary(), arguments); VcsCommand *command = createCommand(workingDirectory, 0, VcsWindowOutputBind); new ConflictHandler(command, workingDirectory, gitCommand); if (hasProgress) @@ -3176,7 +3166,7 @@ void GitClient::interactiveRebase(const QString &workingDirectory, const QString if (fixup) arguments << QLatin1String("--autosquash"); arguments << commit + QLatin1Char('^'); - VcsOutputWindow::appendCommand(workingDirectory, settings()->binaryPath(), arguments); + VcsOutputWindow::appendCommand(workingDirectory, vcsBinary(), arguments); if (fixup) m_disableEditor = true; asyncCommand(workingDirectory, arguments, true); @@ -3333,11 +3323,6 @@ bool GitClient::cloneRepository(const QString &directory,const QByteArray &url) } } -GitSettings *GitClient::settings() const -{ - return m_settings; -} - // determine version as '(major << 16) + (minor << 8) + patch' or 0. unsigned GitClient::gitVersion(QString *errorMessage) const { diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index e7e67a5af7..ff1854fecc 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -138,7 +138,7 @@ public: static const char *stashNamePrefix; - explicit GitClient(GitSettings *settings); + explicit GitClient(); Utils::FileName vcsBinary(bool *ok = 0, QString *errorMessage = 0) const; int vcsTimeout() const; @@ -331,8 +331,6 @@ public: QStringList synchronousRepositoryBranches(const QString &repositoryURL, const QString &workingDirectory = QString()) const; - GitSettings *settings() const; - QProcessEnvironment processEnvironment() const; bool beginStashScope(const QString &workingDirectory, const QString &command, @@ -350,7 +348,6 @@ public slots: void show(const QString &source, const QString &id, const QString &name = QString()); - void saveSettings(); private slots: void slotBlameRevisionRequested(const QString &workingDirectory, const QString &file, @@ -441,7 +438,6 @@ private: mutable Utils::FileName m_gitVersionForBinary; mutable unsigned m_cachedGitVersion; - GitSettings *m_settings; QString m_gitQtcEditor; QMap<QString, StashInfo> m_stashInfo; QStringList m_updatedSubmodules; diff --git a/src/plugins/git/giteditor.cpp b/src/plugins/git/giteditor.cpp index d621573a31..cad2fa508c 100644 --- a/src/plugins/git/giteditor.cpp +++ b/src/plugins/git/giteditor.cpp @@ -184,7 +184,8 @@ void GitEditorWidget::setPlainTextFiltered(const QString &text) switch (contentType()) { case AnnotateOutput: { - const bool omitAnnotationDate = plugin->settings().boolValue(GitSettings::omitAnnotationDateKey); + const bool omitAnnotationDate + = plugin->gitClient()->settings().boolValue(GitSettings::omitAnnotationDateKey); if (omitAnnotationDate) modText = removeAnnotationDate(text); break; diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index 3e2f1b8c28..5755352c52 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -274,14 +274,15 @@ bool GitPlugin::initialize(const QStringList &arguments, QString *errorMessage) Context context(Constants::GIT_CONTEXT); - m_settings.readSettings(ICore::settings()); - - m_gitClient = new GitClient(&m_settings); + m_gitClient = new GitClient; initializeVcs(new GitVersionControl(m_gitClient), context); // Create the settings Page - addAutoReleasedObject(new SettingsPage()); + SettingsPage *options = new SettingsPage; + connect(options, &SettingsPage::settingsChanged, + versionControl(), &IVersionControl::configurationChanged); + addAutoReleasedObject(options); static const char *describeSlot = SLOT(show(QString,QString)); const int editorCount = sizeof(editorParameters) / sizeof(editorParameters[0]); @@ -1109,7 +1110,7 @@ void GitPlugin::pull() const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasTopLevel(), return); QString topLevel = state.topLevel(); - bool rebase = m_settings.boolValue(GitSettings::pullRebaseKey); + bool rebase = gitClient()->settings().boolValue(GitSettings::pullRebaseKey); if (!rebase) { QString currentBranch = m_gitClient->synchronousCurrentLocalBranch(topLevel); @@ -1415,26 +1416,11 @@ void GitPlugin::updateBranches(const QString &repository) void GitPlugin::updateRepositoryBrowserAction() { const bool repositoryEnabled = currentState().hasTopLevel(); - const bool hasRepositoryBrowserCmd = !m_settings.stringValue(GitSettings::repositoryBrowserCmd).isEmpty(); + const bool hasRepositoryBrowserCmd + = !gitClient()->settings().stringValue(GitSettings::repositoryBrowserCmd).isEmpty(); m_repositoryBrowserAction->setEnabled(repositoryEnabled && hasRepositoryBrowserCmd); } -const GitSettings &GitPlugin::settings() const -{ - return m_settings; -} - -void GitPlugin::setSettings(const GitSettings &s) -{ - if (s == m_settings) - return; - - m_settings = s; - m_gitClient->saveSettings(); - static_cast<GitVersionControl *>(versionControl())->emitConfigurationChanged(); - updateRepositoryBrowserAction(); -} - GitClient *GitPlugin::gitClient() const { return m_gitClient; diff --git a/src/plugins/git/gitplugin.h b/src/plugins/git/gitplugin.h index 1d01add988..ae25b13de2 100644 --- a/src/plugins/git/gitplugin.h +++ b/src/plugins/git/gitplugin.h @@ -85,9 +85,6 @@ public: GitVersionControl *gitVersionControl() const; - const GitSettings &settings() const; - void setSettings(const GitSettings &s); - GitClient *gitClient() const; Gerrit::Internal::GerritPlugin *gerritPlugin() const; diff --git a/src/plugins/git/gitversioncontrol.cpp b/src/plugins/git/gitversioncontrol.cpp index 3b62907601..562501b7c0 100644 --- a/src/plugins/git/gitversioncontrol.cpp +++ b/src/plugins/git/gitversioncontrol.cpp @@ -143,7 +143,7 @@ QString GitVersionControl::vcsTopic(const QString &directory) QStringList GitVersionControl::additionalToolsPath() const { - QStringList res = m_client->settings()->searchPathList(); + QStringList res = m_client->settings().searchPathList(); const QString binaryPath = m_client->gitBinDirectory().toString(); if (!binaryPath.isEmpty() && !res.contains(binaryPath)) res << binaryPath; @@ -180,10 +180,5 @@ void GitVersionControl::emitRepositoryChanged(const QString &r) emit repositoryChanged(r); } -void GitVersionControl::emitConfigurationChanged() -{ - emit configurationChanged(); -} - } // Internal } // Git diff --git a/src/plugins/git/gitversioncontrol.h b/src/plugins/git/gitversioncontrol.h index cc7faad360..c0126e9079 100644 --- a/src/plugins/git/gitversioncontrol.h +++ b/src/plugins/git/gitversioncontrol.h @@ -66,7 +66,6 @@ public: void emitFilesChanged(const QStringList &); void emitRepositoryChanged(const QString &); - void emitConfigurationChanged(); private: GitClient *m_client; diff --git a/src/plugins/git/logchangedialog.cpp b/src/plugins/git/logchangedialog.cpp index 7e7a967765..d37c229491 100644 --- a/src/plugins/git/logchangedialog.cpp +++ b/src/plugins/git/logchangedialog.cpp @@ -217,7 +217,7 @@ LogChangeDialog::LogChangeDialog(bool isReset, QWidget *parent) : m_resetTypeComboBox->addItem(tr("Mixed"), QLatin1String("--mixed")); m_resetTypeComboBox->addItem(tr("Soft"), QLatin1String("--soft")); GitClient *client = GitPlugin::instance()->gitClient(); - m_resetTypeComboBox->setCurrentIndex(client->settings()->intValue( + m_resetTypeComboBox->setCurrentIndex(client->settings().intValue( GitSettings::lastResetIndexKey)); popUpLayout->addWidget(m_resetTypeComboBox); popUpLayout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Ignored)); @@ -247,8 +247,8 @@ bool LogChangeDialog::runDialog(const QString &repository, if (QDialog::exec() == QDialog::Accepted) { if (m_resetTypeComboBox) { GitClient *client = GitPlugin::instance()->gitClient(); - client->settings()->setValue(GitSettings::lastResetIndexKey, - m_resetTypeComboBox->currentIndex()); + client->settings().setValue(GitSettings::lastResetIndexKey, + m_resetTypeComboBox->currentIndex()); } return true; } diff --git a/src/plugins/git/settingspage.cpp b/src/plugins/git/settingspage.cpp index 4c85840d3b..7c7055adde 100644 --- a/src/plugins/git/settingspage.cpp +++ b/src/plugins/git/settingspage.cpp @@ -33,6 +33,7 @@ #include "gitplugin.h" #include "gitclient.h" +#include <coreplugin/icore.h> #include <vcsbase/vcsbaseconstants.h> #include <utils/hostosinfo.h> #include <coreplugin/messagebox.h> @@ -41,6 +42,8 @@ #include <QDebug> #include <QTextStream> +using namespace VcsBase; + namespace Git { namespace Internal { @@ -66,7 +69,7 @@ SettingsPageWidget::SettingsPageWidget(QWidget *parent) : m_ui.repBrowserCommandPathChooser->setPromptDialogTitle(tr("Git Repository Browser Command")); } -GitSettings SettingsPageWidget::settings() const +VcsBaseClientSettings SettingsPageWidget::settings() const { GitSettings rc; rc.setValue(GitSettings::pathKey, m_ui.pathLineEdit->text()); @@ -80,7 +83,7 @@ GitSettings SettingsPageWidget::settings() const return rc; } -void SettingsPageWidget::setSettings(const GitSettings &s) +void SettingsPageWidget::setSettings(const VcsBaseClientSettings &s) { m_ui.pathLineEdit->setText(s.stringValue(GitSettings::pathKey)); m_ui.logCountSpinBox->setValue(s.intValue(GitSettings::logCountKey)); @@ -104,24 +107,29 @@ QWidget *SettingsPage::widget() { if (!m_widget) { m_widget = new SettingsPageWidget; - m_widget->setSettings(GitPlugin::instance()->settings()); + m_widget->setSettings(GitPlugin::instance()->gitClient()->settings()); } return m_widget; } void SettingsPage::apply() { - const GitSettings newSettings = m_widget->settings(); // Warn if git cannot be found in path if the widget is on top + const VcsBaseClientSettings newSettings = m_widget->settings(); if (m_widget->isVisible()) { bool gitFoundOk; QString errorMessage; - newSettings.gitExecutable(&gitFoundOk, &errorMessage); + static_cast<const GitSettings &>(newSettings).gitExecutable(&gitFoundOk, &errorMessage); if (!gitFoundOk) Core::AsynchronousMessageBox::warning(tr("Git Settings"), errorMessage); } - GitPlugin::instance()->setSettings(newSettings); + VcsBaseClientSettings &s = GitPlugin::instance()->gitClient()->settings(); + if (s != newSettings) { + s = newSettings; + s.writeSettings(Core::ICore::settings()); + emit settingsChanged(); + } } void SettingsPage::finish() diff --git a/src/plugins/git/settingspage.h b/src/plugins/git/settingspage.h index d161b81409..e73fd4b0d2 100644 --- a/src/plugins/git/settingspage.h +++ b/src/plugins/git/settingspage.h @@ -42,18 +42,20 @@ QT_BEGIN_NAMESPACE class QSettings; QT_END_NAMESPACE +namespace VcsBase { +class VcsBaseClientSettings; +} // namespace VcsBase + namespace Git { namespace Internal { -class GitSettings; - class SettingsPageWidget : public QWidget { Q_OBJECT public: explicit SettingsPageWidget(QWidget *parent = 0); - GitSettings settings() const; - void setSettings(const GitSettings &); + VcsBase::VcsBaseClientSettings settings() const; + void setSettings(const VcsBase::VcsBaseClientSettings &s); private: Ui::SettingsPage m_ui; @@ -70,6 +72,9 @@ public: void apply(); void finish(); +signals: + void settingsChanged(); + private: QPointer<SettingsPageWidget> m_widget; }; diff --git a/src/plugins/mercurial/clonewizard.cpp b/src/plugins/mercurial/clonewizard.cpp index bd4e432819..036e6018a6 100644 --- a/src/plugins/mercurial/clonewizard.cpp +++ b/src/plugins/mercurial/clonewizard.cpp @@ -30,6 +30,7 @@ #include "clonewizard.h" #include "clonewizardpage.h" +#include "mercurialclient.h" #include "mercurialplugin.h" #include "mercurialsettings.h" @@ -74,7 +75,7 @@ VcsCommand *CloneWizard::createCommand(Utils::FileName *checkoutDir) if (!cwp) return 0; - const MercurialSettings &settings = MercurialPlugin::settings(); + const VcsBaseClientSettings &settings = MercurialPlugin::client()->settings(); QString path = cwp->path(); QString directory = cwp->directory(); diff --git a/src/plugins/mercurial/mercurialclient.cpp b/src/plugins/mercurial/mercurialclient.cpp index 11d82b4ec0..31c50f0f32 100644 --- a/src/plugins/mercurial/mercurialclient.cpp +++ b/src/plugins/mercurial/mercurialclient.cpp @@ -58,25 +58,20 @@ class MercurialDiffParameterWidget : public VcsBaseEditorParameterWidget { Q_OBJECT public: - MercurialDiffParameterWidget(MercurialSettings *settings, QWidget *parent = 0) : + MercurialDiffParameterWidget(VcsBaseClientSettings &settings, QWidget *parent = 0) : VcsBaseEditorParameterWidget(parent) { mapSetting(addToggleButton(QLatin1String("-w"), tr("Ignore Whitespace")), - settings->boolPointer(MercurialSettings::diffIgnoreWhiteSpaceKey)); + settings.boolPointer(MercurialSettings::diffIgnoreWhiteSpaceKey)); mapSetting(addToggleButton(QLatin1String("-B"), tr("Ignore Blank Lines")), - settings->boolPointer(MercurialSettings::diffIgnoreBlankLinesKey)); + settings.boolPointer(MercurialSettings::diffIgnoreBlankLinesKey)); } }; -MercurialClient::MercurialClient(MercurialSettings *settings) : - VcsBaseClient(settings) +MercurialClient::MercurialClient() : + VcsBaseClient(new MercurialSettings) { - setDiffParameterWidgetCreator([=] { return new MercurialDiffParameterWidget(settings); }); -} - -MercurialSettings *MercurialClient::settings() const -{ - return dynamic_cast<MercurialSettings *>(VcsBaseClient::settings()); + setDiffParameterWidgetCreator([this] { return new MercurialDiffParameterWidget(settings()); }); } bool MercurialClient::manifestSync(const QString &repository, const QString &relativeFilename) diff --git a/src/plugins/mercurial/mercurialclient.h b/src/plugins/mercurial/mercurialclient.h index cae751fce8..80c9067e1c 100644 --- a/src/plugins/mercurial/mercurialclient.h +++ b/src/plugins/mercurial/mercurialclient.h @@ -42,9 +42,7 @@ class MercurialClient : public VcsBase::VcsBaseClient { Q_OBJECT public: - MercurialClient(MercurialSettings *settings); - - MercurialSettings *settings() const; + MercurialClient(); bool synchronousClone(const QString &workingDir, const QString &srcLocation, diff --git a/src/plugins/mercurial/mercurialcontrol.cpp b/src/plugins/mercurial/mercurialcontrol.cpp index 8482d70353..6f5ad95fb1 100644 --- a/src/plugins/mercurial/mercurialcontrol.cpp +++ b/src/plugins/mercurial/mercurialcontrol.cpp @@ -98,7 +98,7 @@ bool MercurialControl::managesFile(const QString &workingDirectory, const QStrin bool MercurialControl::isConfigured() const { - const Utils::FileName binary = mercurialClient->settings()->binaryPath(); + const Utils::FileName binary = mercurialClient->vcsBinary(); if (binary.isEmpty()) return false; QFileInfo fi = binary.toFileInfo(); @@ -186,10 +186,5 @@ void MercurialControl::changed(const QVariant &v) } } -void MercurialControl::emitConfigurationChanged() -{ - emit configurationChanged(); -} - } // namespace Internal } // namespace Mercurial diff --git a/src/plugins/mercurial/mercurialcontrol.h b/src/plugins/mercurial/mercurialcontrol.h index e3db1a0893..31dc0063f3 100644 --- a/src/plugins/mercurial/mercurialcontrol.h +++ b/src/plugins/mercurial/mercurialcontrol.h @@ -70,7 +70,6 @@ public slots: // files changed signals according to the variant's type: // String -> repository, StringList -> files void changed(const QVariant&); - void emitConfigurationChanged(); private: MercurialClient *mercurialClient; diff --git a/src/plugins/mercurial/mercurialplugin.cpp b/src/plugins/mercurial/mercurialplugin.cpp index a7dcb65b26..4f0799407a 100644 --- a/src/plugins/mercurial/mercurialplugin.cpp +++ b/src/plugins/mercurial/mercurialplugin.cpp @@ -136,12 +136,11 @@ bool MercurialPlugin::initialize(const QStringList & /* arguments */, QString * { Core::Context context(Constants::MERCURIAL_CONTEXT); - m_client = new MercurialClient(&mercurialSettings); + m_client = new MercurialClient; initializeVcs(new MercurialControl(m_client), context); optionsPage = new OptionsPage(); addAutoReleasedObject(optionsPage); - mercurialSettings.readSettings(core->settings()); connect(m_client, SIGNAL(changed(QVariant)), versionControl(), SLOT(changed(QVariant))); connect(m_client, SIGNAL(needUpdate()), this, SLOT(update())); @@ -176,19 +175,6 @@ bool MercurialPlugin::initialize(const QStringList & /* arguments */, QString * return true; } -const MercurialSettings &MercurialPlugin::settings() -{ - return m_instance->mercurialSettings; -} - -void MercurialPlugin::setSettings(const MercurialSettings &settings) -{ - if (settings != m_instance->mercurialSettings) { - m_instance->mercurialSettings = settings; - static_cast<MercurialControl *>(m_instance->versionControl())->emitConfigurationChanged(); - } -} - void MercurialPlugin::createMenu(const Core::Context &context) { // Create menu item for Mercurial diff --git a/src/plugins/mercurial/mercurialplugin.h b/src/plugins/mercurial/mercurialplugin.h index c2c5c80f92..e2386e78ad 100644 --- a/src/plugins/mercurial/mercurialplugin.h +++ b/src/plugins/mercurial/mercurialplugin.h @@ -75,9 +75,6 @@ public: static MercurialPlugin *instance() { return m_instance; } static MercurialClient *client() { return m_instance->m_client; } - static const MercurialSettings &settings(); - static void setSettings(const MercurialSettings &settings); - private slots: // File menu action slots void addCurrentFile(); diff --git a/src/plugins/mercurial/optionspage.cpp b/src/plugins/mercurial/optionspage.cpp index ffeb84dd0f..924ea2a03a 100644 --- a/src/plugins/mercurial/optionspage.cpp +++ b/src/plugins/mercurial/optionspage.cpp @@ -29,6 +29,8 @@ ****************************************************************************/ #include "optionspage.h" + +#include "mercurialclient.h" #include "mercurialsettings.h" #include "mercurialplugin.h" @@ -38,6 +40,8 @@ #include <QTextStream> +using namespace VcsBase; + namespace Mercurial { namespace Internal { @@ -50,9 +54,9 @@ OptionsPageWidget::OptionsPageWidget(QWidget *parent) : m_ui.commandChooser->setPromptDialogTitle(tr("Mercurial Command")); } -MercurialSettings OptionsPageWidget::settings() const +VcsBaseClientSettings OptionsPageWidget::settings() const { - MercurialSettings s = MercurialPlugin::settings(); + MercurialSettings s; s.setValue(MercurialSettings::binaryPathKey, m_ui.commandChooser->rawPath()); s.setValue(MercurialSettings::userNameKey, m_ui.defaultUsernameLineEdit->text().trimmed()); s.setValue(MercurialSettings::userEmailKey, m_ui.defaultEmailLineEdit->text().trimmed()); @@ -61,7 +65,7 @@ MercurialSettings OptionsPageWidget::settings() const return s; } -void OptionsPageWidget::setSettings(const MercurialSettings &s) +void OptionsPageWidget::setSettings(const VcsBaseClientSettings &s) { m_ui.commandChooser->setPath(s.stringValue(MercurialSettings::binaryPathKey)); m_ui.defaultUsernameLineEdit->setText(s.stringValue(MercurialSettings::userNameKey)); @@ -80,7 +84,7 @@ QWidget *OptionsPage::widget() { if (!optionsPageWidget) optionsPageWidget = new OptionsPageWidget; - optionsPageWidget->setSettings(MercurialPlugin::settings()); + optionsPageWidget->setSettings(MercurialPlugin::client()->settings()); return optionsPageWidget; } @@ -88,13 +92,15 @@ void OptionsPage::apply() { if (!optionsPageWidget) return; - const MercurialSettings newSettings = optionsPageWidget->settings(); - if (newSettings != MercurialPlugin::settings()) { - //assume success and emit signal that settings are changed; - MercurialPlugin::setSettings(newSettings); - newSettings.writeSettings(Core::ICore::settings()); + + const VcsBaseClientSettings newSettings = optionsPageWidget->settings(); + VcsBaseClientSettings &s = MercurialPlugin::instance()->client()->settings(); + if (s != newSettings) { + s = newSettings; + s.writeSettings(Core::ICore::settings()); emit settingsChanged(); } + } void OptionsPage::finish() diff --git a/src/plugins/mercurial/optionspage.h b/src/plugins/mercurial/optionspage.h index 15e84096dd..24dcac25dd 100644 --- a/src/plugins/mercurial/optionspage.h +++ b/src/plugins/mercurial/optionspage.h @@ -38,11 +38,13 @@ #include <QWidget> #include <QPointer> +namespace VcsBase { +class VcsBaseClientSettings; +} // namespace VcsBase + namespace Mercurial { namespace Internal { -class MercurialSettings; - class OptionsPageWidget : public QWidget { Q_OBJECT @@ -50,8 +52,8 @@ class OptionsPageWidget : public QWidget public: explicit OptionsPageWidget(QWidget *parent = 0); - MercurialSettings settings() const; - void setSettings(const MercurialSettings &s); + VcsBase::VcsBaseClientSettings settings() const; + void setSettings(const VcsBase::VcsBaseClientSettings &s); private: Ui::OptionsPage m_ui; diff --git a/src/plugins/subversion/checkoutwizard.cpp b/src/plugins/subversion/checkoutwizard.cpp index c7b655d65a..4fa5fd0ae2 100644 --- a/src/plugins/subversion/checkoutwizard.cpp +++ b/src/plugins/subversion/checkoutwizard.cpp @@ -74,8 +74,9 @@ VcsCommand *CheckoutWizard::createCommand(FileName *checkoutDir) } QTC_ASSERT(cwp, return 0); - const SubversionSettings settings = SubversionPlugin::instance()->settings(); - const FileName binary = settings.binaryPath(); + SubversionClient *client = SubversionPlugin::instance()->client(); + const VcsBaseClientSettings &settings = client->settings(); + const FileName binary = client->vcsBinary(); const QString directory = cwp->directory(); QStringList args; args << QLatin1String("checkout"); diff --git a/src/plugins/subversion/settingspage.cpp b/src/plugins/subversion/settingspage.cpp index 6f2bfa9994..851f8ae2c9 100644 --- a/src/plugins/subversion/settingspage.cpp +++ b/src/plugins/subversion/settingspage.cpp @@ -29,8 +29,10 @@ ****************************************************************************/ #include "settingspage.h" -#include "subversionsettings.h" + +#include "subversionclient.h" #include "subversionplugin.h" +#include "subversionsettings.h" #include <coreplugin/icore.h> #include <extensionsystem/pluginmanager.h> @@ -43,6 +45,7 @@ using namespace Subversion::Internal; using namespace Utils; +using namespace VcsBase; SettingsPageWidget::SettingsPageWidget(QWidget *parent) : QWidget(parent) @@ -53,7 +56,7 @@ SettingsPageWidget::SettingsPageWidget(QWidget *parent) : m_ui.pathChooser->setPromptDialogTitle(tr("Subversion Command")); } -SubversionSettings SettingsPageWidget::settings() const +VcsBase::VcsBaseClientSettings SettingsPageWidget::settings() const { SubversionSettings rc; rc.setValue(SubversionSettings::binaryPathKey, m_ui.pathChooser->rawPath()); @@ -70,7 +73,7 @@ SubversionSettings SettingsPageWidget::settings() const return rc; } -void SettingsPageWidget::setSettings(const SubversionSettings &s) +void SettingsPageWidget::setSettings(const VcsBaseClientSettings &s) { m_ui.pathChooser->setFileName(s.binaryPath()); m_ui.usernameLineEdit->setText(s.stringValue(SubversionSettings::userKey)); @@ -94,14 +97,20 @@ QWidget *SettingsPage::widget() { if (!m_widget) { m_widget = new SettingsPageWidget; - m_widget->setSettings(SubversionPlugin::instance()->settings()); + m_widget->setSettings(SubversionPlugin::instance()->client()->settings()); } return m_widget; } void SettingsPage::apply() { - SubversionPlugin::instance()->setSettings(m_widget->settings()); + const VcsBaseClientSettings newSettings = m_widget->settings(); + VcsBaseClientSettings &s = SubversionPlugin::instance()->client()->settings(); + if (s != newSettings) { + s = newSettings; + s.writeSettings(Core::ICore::settings()); + emit settingsChanged(); + } } void SettingsPage::finish() diff --git a/src/plugins/subversion/settingspage.h b/src/plugins/subversion/settingspage.h index c705122e75..dc9ab2b8d0 100644 --- a/src/plugins/subversion/settingspage.h +++ b/src/plugins/subversion/settingspage.h @@ -43,11 +43,13 @@ QT_BEGIN_NAMESPACE class QSettings; QT_END_NAMESPACE +namespace VcsBase { +class VcsBaseClientSettings; +} // namespace VcsBa + namespace Subversion { namespace Internal { -class SubversionSettings; - class SettingsPageWidget : public QWidget { Q_OBJECT @@ -55,8 +57,8 @@ class SettingsPageWidget : public QWidget public: explicit SettingsPageWidget(QWidget *parent = 0); - SubversionSettings settings() const; - void setSettings(const SubversionSettings &); + VcsBase::VcsBaseClientSettings settings() const; + void setSettings(const VcsBase::VcsBaseClientSettings &s); private: Ui::SettingsPage m_ui; @@ -74,6 +76,9 @@ public: void apply(); void finish(); +signals: + void settingsChanged(); + private: QPointer<SettingsPageWidget> m_widget; }; diff --git a/src/plugins/subversion/subversionclient.cpp b/src/plugins/subversion/subversionclient.cpp index 58045aa281..db1b2be053 100644 --- a/src/plugins/subversion/subversionclient.cpp +++ b/src/plugins/subversion/subversionclient.cpp @@ -62,24 +62,18 @@ class SubversionLogParameterWidget : public VcsBaseEditorParameterWidget { Q_OBJECT public: - SubversionLogParameterWidget(SubversionSettings *settings, QWidget *parent = 0) : + SubversionLogParameterWidget(VcsBaseClientSettings &settings, QWidget *parent = 0) : VcsBaseEditorParameterWidget(parent) { mapSetting(addToggleButton(QLatin1String("--verbose"), tr("Verbose"), tr("Show files changed in each revision")), - settings->boolPointer(SubversionSettings::logVerboseKey)); + settings.boolPointer(SubversionSettings::logVerboseKey)); } }; -SubversionClient::SubversionClient(SubversionSettings *settings) : - VcsBaseClient(settings) +SubversionClient::SubversionClient() : VcsBaseClient(new SubversionSettings) { - setLogParameterWidgetCreator([=] { return new SubversionLogParameterWidget(settings); }); -} - -SubversionSettings *SubversionClient::settings() const -{ - return dynamic_cast<SubversionSettings *>(VcsBaseClient::settings()); + setLogParameterWidgetCreator([this] { return new SubversionLogParameterWidget(settings()); }); } VcsCommand *SubversionClient::createCommitCmd(const QString &repositoryRoot, @@ -89,7 +83,7 @@ VcsCommand *SubversionClient::createCommitCmd(const QString &repositoryRoot, { const QStringList svnExtraOptions = QStringList(extraOptions) - << SubversionClient::addAuthenticationOptions(*settings()) + << SubversionClient::addAuthenticationOptions(settings()) << QLatin1String(Constants::NON_INTERACTIVE_OPTION) << QLatin1String("--encoding") << QLatin1String("utf8") << QLatin1String("--file") << commitMessageFile; @@ -124,9 +118,9 @@ Id SubversionClient::vcsEditorKind(VcsCommandTag cmd) const } // Add authorization options to the command line arguments. -QStringList SubversionClient::addAuthenticationOptions(const SubversionSettings &settings) +QStringList SubversionClient::addAuthenticationOptions(const VcsBaseClientSettings &settings) { - if (!settings.hasAuthentication()) + if (!static_cast<const SubversionSettings &>(settings).hasAuthentication()) return QStringList(); const QString userName = settings.stringValue(SubversionSettings::userKey); @@ -223,7 +217,7 @@ void DiffController::setChangeNumber(int changeNumber) QString DiffController::getDescription() const { QStringList args(QLatin1String("log")); - args << SubversionClient::addAuthenticationOptions(*m_client->settings()); + args << SubversionClient::addAuthenticationOptions(m_client->settings()); args << QLatin1String("-r"); args << QString::number(m_changeNumber); const SubversionResponse logResponse = @@ -247,7 +241,7 @@ void DiffController::postCollectTextualDiffOutput() QStringList args; args << QLatin1String("diff"); - args << m_client->addAuthenticationOptions(*m_client->settings()); + args << m_client->addAuthenticationOptions(m_client->settings()); args << QLatin1String("--internal-diff"); if (ignoreWhitespace()) args << QLatin1String("-x") << QLatin1String("-uw"); @@ -312,10 +306,10 @@ void SubversionClient::log(const QString &workingDir, const QStringList &extraOptions, bool enableAnnotationContextMenu) { - const auto logCount = settings()->intValue(SubversionSettings::logCountKey); + const auto logCount = settings().intValue(SubversionSettings::logCountKey); QStringList svnExtraOptions = QStringList(extraOptions) - << SubversionClient::addAuthenticationOptions(*settings()); + << SubversionClient::addAuthenticationOptions(settings()); if (logCount > 0) svnExtraOptions << QLatin1String("-l") << QString::number(logCount); diff --git a/src/plugins/subversion/subversionclient.h b/src/plugins/subversion/subversionclient.h index 5db0327b16..cd34bb779c 100644 --- a/src/plugins/subversion/subversionclient.h +++ b/src/plugins/subversion/subversionclient.h @@ -48,9 +48,7 @@ class SubversionClient : public VcsBase::VcsBaseClient Q_OBJECT public: - SubversionClient(SubversionSettings *settings); - - SubversionSettings *settings() const; + SubversionClient(); VcsBase::VcsCommand *createCommitCmd(const QString &repositoryRoot, const QStringList &files, @@ -75,7 +73,7 @@ public: StatusItem parseStatusLine(const QString &line) const; // Add authorization options to the command line arguments. - static QStringList addAuthenticationOptions(const SubversionSettings &settings); + static QStringList addAuthenticationOptions(const VcsBase::VcsBaseClientSettings &settings); QString synchronousTopic(const QString &repository); diff --git a/src/plugins/subversion/subversioncontrol.cpp b/src/plugins/subversion/subversioncontrol.cpp index 052abac0eb..a6fe4d48d4 100644 --- a/src/plugins/subversion/subversioncontrol.cpp +++ b/src/plugins/subversion/subversioncontrol.cpp @@ -29,6 +29,8 @@ ****************************************************************************/ #include "subversioncontrol.h" + +#include "subversionclient.h" #include "subversionplugin.h" #include "subversionsettings.h" @@ -80,7 +82,7 @@ Core::Id SubversionControl::id() const bool SubversionControl::isConfigured() const { - const Utils::FileName binary = m_plugin->settings().binaryPath(); + const Utils::FileName binary = m_plugin->client()->vcsBinary(); if (binary.isEmpty()) return false; QFileInfo fi = binary.toFileInfo(); @@ -161,10 +163,5 @@ void SubversionControl::emitFilesChanged(const QStringList &l) emit filesChanged(l); } -void SubversionControl::emitConfigurationChanged() -{ - emit configurationChanged(); -} - } // namespace Internal } // namespace Subversion diff --git a/src/plugins/subversion/subversioncontrol.h b/src/plugins/subversion/subversioncontrol.h index a6530ed695..54f8ac0286 100644 --- a/src/plugins/subversion/subversioncontrol.h +++ b/src/plugins/subversion/subversioncontrol.h @@ -62,7 +62,6 @@ public: void emitRepositoryChanged(const QString &); void emitFilesChanged(const QStringList &); - void emitConfigurationChanged(); private: SubversionPlugin *m_plugin; diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp index 939a8ae85a..aaef47b008 100644 --- a/src/plugins/subversion/subversionplugin.cpp +++ b/src/plugins/subversion/subversionplugin.cpp @@ -247,8 +247,7 @@ bool SubversionPlugin::initialize(const QStringList & /*arguments */, QString *e Utils::MimeDatabase::addMimeTypes(QLatin1String(":/trolltech.subversion/Subversion.mimetypes.xml")); - m_settings.readSettings(ICore::settings()); - m_client = new SubversionClient(&m_settings); + m_client = new SubversionClient; addAutoReleasedObject(new SettingsPage); @@ -451,6 +450,12 @@ bool SubversionPlugin::initialize(const QStringList & /*arguments */, QString *e return true; } +SubversionClient *SubversionPlugin::client() const +{ + QTC_CHECK(m_client); + return m_client; +} + bool SubversionPlugin::submitEditorAboutToClose() { if (!isCommitEditorOpen()) @@ -470,7 +475,7 @@ bool SubversionPlugin::submitEditorAboutToClose() // Prompt user. Force a prompt unless submit was actually invoked (that // is, the editor was closed or shutdown). - SubversionSettings newSettings = m_settings; + VcsBaseClientSettings &newSettings = client()->settings(); const VcsBaseSubmitEditor::PromptSubmitResult answer = editor->promptSubmit(tr("Closing Subversion Editor"), tr("Do you want to commit the change?"), @@ -487,7 +492,6 @@ bool SubversionPlugin::submitEditorAboutToClose() default: break; } - setSettings(newSettings); // in case someone turned prompting off const QStringList fileList = editor->checkedFiles(); bool closeEditor = true; if (!fileList.empty()) { @@ -578,7 +582,7 @@ void SubversionPlugin::revertAll() // NoteL: Svn "revert ." doesn not work. QStringList args; args << QLatin1String("revert"); - args << SubversionClient::addAuthenticationOptions(settings()); + args << SubversionClient::addAuthenticationOptions(client()->settings()); args << QLatin1String("--recursive") << state.topLevel(); const SubversionResponse revertResponse = runSvn(state.topLevel(), args, m_client->vcsTimeout() * 1000, @@ -596,7 +600,7 @@ void SubversionPlugin::revertCurrentFile() QTC_ASSERT(state.hasFile(), return); QStringList args(QLatin1String("diff")); - args << SubversionClient::addAuthenticationOptions(settings()); + args << SubversionClient::addAuthenticationOptions(client()->settings()); args.push_back(state.relativeCurrentFile()); const SubversionResponse diffResponse @@ -617,7 +621,7 @@ void SubversionPlugin::revertCurrentFile() // revert args.clear(); args << QLatin1String("revert"); - args << SubversionClient::addAuthenticationOptions(settings()); + args << SubversionClient::addAuthenticationOptions(client()->settings()); args << state.relativeCurrentFile(); const SubversionResponse revertResponse @@ -680,7 +684,7 @@ void SubversionPlugin::startCommit(const QString &workingDir, const QStringList } QStringList args(QLatin1String("status")); - args << SubversionClient::addAuthenticationOptions(settings()); + args << SubversionClient::addAuthenticationOptions(client()->settings()); args += files; const SubversionResponse response @@ -760,7 +764,7 @@ void SubversionPlugin::svnStatus(const QString &workingDir, const QString &relat const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasTopLevel(), return); QStringList args(QLatin1String("status")); - args << SubversionClient::addAuthenticationOptions(settings()); + args << SubversionClient::addAuthenticationOptions(client()->settings()); if (!relativePath.isEmpty()) args.append(relativePath); VcsOutputWindow::setRepository(workingDir); @@ -786,7 +790,7 @@ void SubversionPlugin::updateProject() void SubversionPlugin::svnUpdate(const QString &workingDir, const QString &relativePath) { QStringList args(QLatin1String("update")); - args << SubversionClient::addAuthenticationOptions(settings()); + args << SubversionClient::addAuthenticationOptions(client()->settings()); args.push_back(QLatin1String(Constants::NON_INTERACTIVE_OPTION)); if (!relativePath.isEmpty()) args.append(relativePath); @@ -820,8 +824,9 @@ void SubversionPlugin::vcsAnnotate(const QString &workingDir, const QString &fil QTextCodec *codec = VcsBaseEditor::getCodec(source); QStringList args(QLatin1String("annotate")); - args << SubversionClient::addAuthenticationOptions(settings()); - if (m_settings.boolValue(SubversionSettings::spaceIgnorantAnnotationKey)) + const VcsBaseClientSettings &s = client()->settings(); + args << SubversionClient::addAuthenticationOptions(s); + if (s.boolValue(SubversionSettings::spaceIgnorantAnnotationKey)) args << QLatin1String("-x") << QLatin1String("-uw"); if (!revision.isEmpty()) args << QLatin1String("-r") << revision; @@ -913,7 +918,7 @@ SubversionResponse SubversionPlugin::runSvn(const QString &workingDir, const QStringList &arguments, int timeOut, unsigned flags, QTextCodec *outputCodec) const { - const FileName executable = m_settings.binaryPath(); + const FileName executable = client()->vcsBinary(); SubversionResponse response; if (executable.isEmpty()) { response.error = true; @@ -960,20 +965,6 @@ IEditor *SubversionPlugin::showOutputInEditor(const QString &title, const QStrin return editor; } -SubversionSettings SubversionPlugin::settings() const -{ - return m_settings; -} - -void SubversionPlugin::setSettings(const SubversionSettings &s) -{ - if (s != m_settings) { - m_settings = s; - m_settings.writeSettings(ICore::settings()); - subVersionControl()->emitConfigurationChanged(); - } -} - SubversionPlugin *SubversionPlugin::instance() { QTC_ASSERT(m_subversionPluginInstance, return m_subversionPluginInstance); @@ -1004,7 +995,7 @@ bool SubversionPlugin::vcsAdd(const QString &workingDir, const QString &rawFileN const QString file = QDir::toNativeSeparators(rawFileName); QStringList args; args << QLatin1String("add") - << SubversionClient::addAuthenticationOptions(settings()) + << SubversionClient::addAuthenticationOptions(client()->settings()) << QLatin1String("--parents") << file; const SubversionResponse response = runSvn(workingDir, args, m_client->vcsTimeout() * 1000, @@ -1018,7 +1009,8 @@ bool SubversionPlugin::vcsDelete(const QString &workingDir, const QString &rawFi QStringList args; args << QLatin1String("delete"); - args << SubversionClient::addAuthenticationOptions(settings()) << QLatin1String("--force") << file; + args << SubversionClient::addAuthenticationOptions(client()->settings()) + << QLatin1String("--force") << file; const SubversionResponse response = runSvn(workingDir, args, m_client->vcsTimeout() * 1000, @@ -1029,7 +1021,7 @@ bool SubversionPlugin::vcsDelete(const QString &workingDir, const QString &rawFi bool SubversionPlugin::vcsMove(const QString &workingDir, const QString &from, const QString &to) { QStringList args(QLatin1String("move")); - args << SubversionClient::addAuthenticationOptions(settings()); + args << SubversionClient::addAuthenticationOptions(client()->settings()); args << QDir::toNativeSeparators(from) << QDir::toNativeSeparators(to); const SubversionResponse response = runSvn(workingDir, args, m_client->vcsTimeout() * 1000, @@ -1093,7 +1085,7 @@ bool SubversionPlugin::managesFile(const QString &workingDirectory, const QStrin { QStringList args; args << QLatin1String("status"); - args << SubversionClient::addAuthenticationOptions(settings()) << fileName; + args << SubversionClient::addAuthenticationOptions(client()->settings()) << fileName; SubversionResponse response = runSvn(workingDirectory, args, m_client->vcsTimeout() * 1000, 0); return response.stdOut.isEmpty() || response.stdOut.at(0) != QLatin1Char('?'); diff --git a/src/plugins/subversion/subversionplugin.h b/src/plugins/subversion/subversionplugin.h index ffbbc7b2dc..4ce214c923 100644 --- a/src/plugins/subversion/subversionplugin.h +++ b/src/plugins/subversion/subversionplugin.h @@ -75,10 +75,9 @@ public: bool initialize(const QStringList &arguments, QString *errorMessage); - SubversionSubmitEditor *openSubversionSubmitEditor(const QString &fileName); + SubversionClient *client() const; - SubversionSettings settings() const; - void setSettings(const SubversionSettings &s); + SubversionSubmitEditor *openSubversionSubmitEditor(const QString &fileName); // IVersionControl bool vcsAdd(const QString &workingDir, const QString &fileName); @@ -150,7 +149,6 @@ private: const QStringList m_svnDirectories; - SubversionSettings m_settings; SubversionClient *m_client; QString m_commitMessageFileName; QString m_commitRepository; diff --git a/src/plugins/vcsbase/vcsbaseclient.cpp b/src/plugins/vcsbase/vcsbaseclient.cpp index 3c767db4d4..3b4079f36a 100644 --- a/src/plugins/vcsbase/vcsbaseclient.cpp +++ b/src/plugins/vcsbase/vcsbaseclient.cpp @@ -79,25 +79,66 @@ static Core::IEditor *locateEditor(const char *property, const QString &entry) namespace VcsBase { +class VcsBaseClientImplPrivate +{ +public: + VcsBaseClientImplPrivate(VcsBaseClientSettings *settings); + ~VcsBaseClientImplPrivate(); + + VcsBaseClientSettings *m_clientSettings; +}; + + +VcsBaseClientImplPrivate::VcsBaseClientImplPrivate(VcsBaseClientSettings *settings) : + m_clientSettings(settings) +{ + m_clientSettings->readSettings(Core::ICore::settings()); +} + +VcsBaseClientImplPrivate::~VcsBaseClientImplPrivate() +{ + delete m_clientSettings; +} + +VcsBaseClientImpl::VcsBaseClientImpl(VcsBaseClientSettings *settings) : + d(new VcsBaseClientImplPrivate(settings)) +{ + connect(Core::ICore::instance(), &Core::ICore::saveSettingsRequested, + this, &VcsBaseClientImpl::saveSettings); +} + +VcsBaseClientImpl::~VcsBaseClientImpl() +{ + delete d; +} + +VcsBaseClientSettings &VcsBaseClientImpl::settings() const +{ + return *d->m_clientSettings; +} + +void VcsBaseClientImpl::saveSettings() +{ + settings().writeSettings(Core::ICore::settings()); +} + class VcsBaseClientPrivate { public: - VcsBaseClientPrivate(VcsBaseClient *client, VcsBaseClientSettings *settings); + VcsBaseClientPrivate(VcsBaseClient *client); void bindCommandToEditor(VcsCommand *cmd, VcsBaseEditorWidget *editor); VcsBaseEditorParameterWidget *createDiffEditor(); VcsBaseEditorParameterWidget *createLogEditor(); - VcsBaseClientSettings *m_clientSettings; QSignalMapper *m_cmdFinishedMapper; VcsBaseClient::ParameterWidgetCreator m_diffParamWidgetCreator; VcsBaseClient::ParameterWidgetCreator m_logParamWidgetCreator; }; -VcsBaseClientPrivate::VcsBaseClientPrivate(VcsBaseClient *client, VcsBaseClientSettings *settings) : - m_clientSettings(settings), +VcsBaseClientPrivate::VcsBaseClientPrivate(VcsBaseClient *client) : m_cmdFinishedMapper(new QSignalMapper(client)) { } @@ -124,11 +165,10 @@ VcsBaseClient::StatusItem::StatusItem(const QString &s, const QString &f) : { } VcsBaseClient::VcsBaseClient(VcsBaseClientSettings *settings) : - d(new VcsBaseClientPrivate(this, settings)) + VcsBaseClientImpl(settings), + d(new VcsBaseClientPrivate(this)) { qRegisterMetaType<QVariant>(); - connect(Core::ICore::instance(), &Core::ICore::saveSettingsRequested, - this, &VcsBaseClient::saveSettings); connect(d->m_cmdFinishedMapper, static_cast<void (QSignalMapper::*)(QWidget*)>(&QSignalMapper::mapped), this, &VcsBaseClient::commandFinishedGotoLine); } @@ -495,11 +535,6 @@ void VcsBaseClient::commit(const QString &repositoryRoot, enqueueJob(cmd, args); } -VcsBaseClientSettings *VcsBaseClient::settings() const -{ - return d->m_clientSettings; -} - QString VcsBaseClient::vcsEditorTitle(const QString &vcsCmd, const QString &sourceId) const { return vcsBinary().toFileInfo().baseName() + @@ -577,12 +612,12 @@ void VcsBaseClient::resetCachedVcsInfo(const QString &workingDir) Utils::FileName VcsBaseClient::vcsBinary() const { - return d->m_clientSettings->binaryPath(); + return settings().binaryPath(); } int VcsBaseClient::vcsTimeout() const { - return d->m_clientSettings->intValue(VcsBaseClientSettings::timeoutKey); + return settings().intValue(VcsBaseClientSettings::timeoutKey); } void VcsBaseClient::statusParser(const QString &text) @@ -612,11 +647,6 @@ void VcsBaseClient::annotateRevision(const QString &workingDirectory, const QSt annotate(workingDirectory, file, changeCopy, lineNumber); } -void VcsBaseClient::saveSettings() -{ - settings()->writeSettings(Core::ICore::settings()); -} - void VcsBaseClient::commandFinishedGotoLine(QWidget *editorObject) { VcsBaseEditorWidget *editor = qobject_cast<VcsBaseEditorWidget *>(editorObject); diff --git a/src/plugins/vcsbase/vcsbaseclient.h b/src/plugins/vcsbase/vcsbaseclient.h index f1ecf34cc1..58375cf2a3 100644 --- a/src/plugins/vcsbase/vcsbaseclient.h +++ b/src/plugins/vcsbase/vcsbaseclient.h @@ -59,6 +59,7 @@ class VcsCommand; class VcsBaseEditorWidget; class VcsBaseClientSettings; class VcsJob; +class VcsBaseClientImplPrivate; class VcsBaseClientPrivate; class VcsBaseEditorParameterWidget; @@ -67,6 +68,15 @@ class VCSBASE_EXPORT VcsBaseClientImpl : public QObject Q_OBJECT public: + explicit VcsBaseClientImpl(VcsBaseClientSettings *settings); + ~VcsBaseClientImpl(); + + VcsBaseClientSettings &settings() const; + +private: + void saveSettings(); + + VcsBaseClientImplPrivate *d; }; class VCSBASE_EXPORT VcsBaseClient : public VcsBaseClientImpl @@ -131,7 +141,6 @@ public: virtual QString findTopLevelForFile(const QFileInfo &file) const = 0; - virtual VcsBaseClientSettings *settings() const; virtual QProcessEnvironment processEnvironment() const; Utils::FileName vcsBinary() const; @@ -207,7 +216,6 @@ protected: private: void statusParser(const QString&); void annotateRevision(const QString&, const QString&, const QString&, int); - void saveSettings(); void commandFinishedGotoLine(QWidget*); friend class VcsBaseClientPrivate; |