diff --git a/src/plugins/fossil/fossilclient.cpp b/src/plugins/fossil/fossilclient.cpp index fb7a97abb2a..d05e596ae25 100644 --- a/src/plugins/fossil/fossilclient.cpp +++ b/src/plugins/fossil/fossilclient.cpp @@ -34,8 +34,7 @@ using namespace Utils; using namespace VcsBase; -namespace Fossil { -namespace Internal { +namespace Fossil::Internal { const RunFlags s_pullFlags = RunFlags::ShowStdOut | RunFlags::ShowSuccessMessage; @@ -1170,7 +1169,12 @@ VcsBaseEditorConfig *FossilClient::createLogEditor(VcsBaseEditorWidget *editor) return new FossilLogConfig(editor->toolBar()); } -} // namespace Internal -} // namespace Fossil +FossilClient &fossilClient() +{ + static FossilClient theFossilClient; + return theFossilClient; +} + +} // namespace Fossil::Internal #include "fossilclient.moc" diff --git a/src/plugins/fossil/fossilclient.h b/src/plugins/fossil/fossilclient.h index b3016378461..6df70502bd0 100644 --- a/src/plugins/fossil/fossilclient.h +++ b/src/plugins/fossil/fossilclient.h @@ -11,15 +11,13 @@ #include -namespace Fossil { -namespace Internal { +namespace Fossil::Internal { class FossilSettings; class FossilPluginPrivate; class FossilClient : public VcsBase::VcsBaseClient { - Q_OBJECT public: enum SupportedFeature { AnnotateBlameFeature = 0x2, @@ -109,7 +107,8 @@ private: friend class FossilPluginPrivate; }; +FossilClient &fossilClient(); + Q_DECLARE_OPERATORS_FOR_FLAGS(FossilClient::SupportedFeatures) -} // namespace Internal -} // namespace Fossil +} // namespace Fossil::Internal diff --git a/src/plugins/fossil/fossileditor.cpp b/src/plugins/fossil/fossileditor.cpp index 48268754089..01fc9e821a5 100644 --- a/src/plugins/fossil/fossileditor.cpp +++ b/src/plugins/fossil/fossileditor.cpp @@ -6,7 +6,6 @@ #include "annotationhighlighter.h" #include "constants.h" #include "fossilclient.h" -#include "fossilplugin.h" #include "fossiltr.h" #include @@ -14,8 +13,7 @@ #include #include -namespace Fossil { -namespace Internal { +namespace Fossil::Internal { class FossilEditorWidgetPrivate { @@ -26,7 +24,6 @@ public: QTC_ASSERT(m_exactChangesetId.isValid(), return); } - const QRegularExpression m_exactChangesetId; }; @@ -64,9 +61,8 @@ QString FossilEditorWidget::decorateVersion(const QString &revision) const static const int maxTextSize(120); const Utils::FilePath workingDirectory = source().parentDir(); - const FossilClient *client = FossilPlugin::client(); - const RevisionInfo revisionInfo = client->synchronousRevisionQuery(workingDirectory, revision, - true); + const RevisionInfo revisionInfo = + fossilClient().synchronousRevisionQuery(workingDirectory, revision, true); // format: 'revision (committer "comment...")' QString output = revision.left(shortChangesetIdSize) + " (" + revisionInfo.committer @@ -83,8 +79,8 @@ QString FossilEditorWidget::decorateVersion(const QString &revision) const QStringList FossilEditorWidget::annotationPreviousVersions(const QString &revision) const { const Utils::FilePath workingDirectory = source().parentDir(); - const FossilClient *client = FossilPlugin::client(); - const RevisionInfo revisionInfo = client->synchronousRevisionQuery(workingDirectory, revision); + const RevisionInfo revisionInfo = + fossilClient().synchronousRevisionQuery(workingDirectory, revision); if (revisionInfo.parentId.isEmpty()) return {}; @@ -99,5 +95,4 @@ VcsBase::BaseAnnotationHighlighter *FossilEditorWidget::createAnnotationHighligh return new FossilAnnotationHighlighter(changes); } -} // namespace Internal -} // namespace Fossil +} // namespace Fossil::Internal diff --git a/src/plugins/fossil/fossilplugin.cpp b/src/plugins/fossil/fossilplugin.cpp index 2e4d4f09611..d0a8dcc5301 100644 --- a/src/plugins/fossil/fossilplugin.cpp +++ b/src/plugins/fossil/fossilplugin.cpp @@ -52,20 +52,21 @@ #include #include +#ifdef WITH_TESTS +#include +#endif + using namespace Core; using namespace Utils; using namespace VcsBase; using namespace std::placeholders; -namespace Fossil { -namespace Internal { +namespace Fossil::Internal { -class FossilTopicCache : public IVersionControl::TopicCache +class FossilTopicCache final : public IVersionControl::TopicCache { public: - FossilTopicCache(FossilClient *client) : - m_client(client) - { } + FossilTopicCache() = default; protected: FilePath trackFile(const FilePath &repository) final @@ -75,11 +76,8 @@ protected: QString refreshTopic(const FilePath &repository) final { - return m_client->synchronousTopic(repository); + return fossilClient().synchronousTopic(repository); } - -private: - FossilClient *m_client; }; const VcsBaseEditorParameters fileLogParameters { @@ -183,8 +181,6 @@ public: bool pullOrPush(SyncMode mode); // Variables - FossilClient m_client; - VcsSubmitEditorFactory submitEditorFactory { submitEditorParameters, [] { return new CommitEditor; }, @@ -269,18 +265,13 @@ void FossilPlugin::extensionsInitialized() dd->extensionsInitialized(); } -FossilClient *FossilPlugin::client() -{ - return &dd->m_client; -} - FossilPluginPrivate::FossilPluginPrivate() : VcsBasePluginPrivate(Context(Constants::FOSSIL_CONTEXT)) { Context context(Constants::FOSSIL_CONTEXT); - setTopicCache(new FossilTopicCache(&m_client)); - connect(&m_client, &VcsBaseClient::changed, this, &FossilPluginPrivate::changed); + setTopicCache(new FossilTopicCache); + connect(&fossilClient(), &VcsBaseClient::changed, this, &FossilPluginPrivate::changed); m_commandLocator = new CommandLocator("Fossil", "fossil", "fossil", this); m_commandLocator->setDescription(Tr::tr("Triggers a Fossil version control operation.")); @@ -387,7 +378,7 @@ void FossilPluginPrivate::addCurrentFile() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasFile(), return); - m_client.synchronousAdd(state.currentFileTopLevel(), state.relativeCurrentFile()); + fossilClient().synchronousAdd(state.currentFileTopLevel(), state.relativeCurrentFile()); } void FossilPluginPrivate::deleteCurrentFile() @@ -400,31 +391,31 @@ void FossilPluginPrivate::annotateCurrentFile() const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasFile(), return); const int lineNumber = VcsBaseEditor::lineNumberOfCurrentEditor(state.currentFile()); - m_client.annotate(state.currentFileTopLevel(), state.relativeCurrentFile(), lineNumber); + fossilClient().annotate(state.currentFileTopLevel(), state.relativeCurrentFile(), lineNumber); } void FossilPluginPrivate::diffCurrentFile() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasFile(), return); - m_client.diff(state.currentFileTopLevel(), QStringList(state.relativeCurrentFile())); + fossilClient().diff(state.currentFileTopLevel(), QStringList(state.relativeCurrentFile())); } void FossilPluginPrivate::logCurrentFile() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasFile(), return); - FossilClient::SupportedFeatures features = m_client.supportedFeatures(); + FossilClient::SupportedFeatures features = fossilClient().supportedFeatures(); QStringList extraOptions; - extraOptions << "-n" << QString::number(m_client.settings().logCount()); + extraOptions << "-n" << QString::number(fossilClient().settings().logCount()); if (features.testFlag(FossilClient::TimelineWidthFeature)) - extraOptions << "-W" << QString::number(m_client.settings().timelineWidth()); + extraOptions << "-W" << QString::number(fossilClient().settings().timelineWidth()); // disable annotate context menu for older client versions, used to be supported for current revision only bool enableAnnotationContextMenu = features.testFlag(FossilClient::AnnotateRevisionFeature); - m_client.logCurrentFile(state.currentFileTopLevel(), QStringList(state.relativeCurrentFile()), + fossilClient().logCurrentFile(state.currentFileTopLevel(), QStringList(state.relativeCurrentFile()), extraOptions, enableAnnotationContextMenu); } @@ -435,7 +426,7 @@ void FossilPluginPrivate::revertCurrentFile() RevertDialog dialog(Tr::tr("Revert"), ICore::dialogParent()); if (dialog.exec() == QDialog::Accepted) { - m_client.revertFile(state.currentFileTopLevel(), state.relativeCurrentFile(), + fossilClient().revertFile(state.currentFileTopLevel(), state.relativeCurrentFile(), dialog.revision()); } } @@ -444,7 +435,7 @@ void FossilPluginPrivate::statusCurrentFile() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasFile(), return); - m_client.status(state.currentFileTopLevel(), state.relativeCurrentFile()); + fossilClient().status(state.currentFileTopLevel(), state.relativeCurrentFile()); } void FossilPluginPrivate::createDirectoryActions(const Context &context) @@ -488,21 +479,21 @@ void FossilPluginPrivate::diffRepository() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasTopLevel(), return); - m_client.diff(state.topLevel()); + fossilClient().diff(state.topLevel()); } void FossilPluginPrivate::logRepository() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasTopLevel(), return); - FossilClient::SupportedFeatures features = m_client.supportedFeatures(); + FossilClient::SupportedFeatures features = fossilClient().supportedFeatures(); QStringList extraOptions; - extraOptions << "-n" << QString::number(m_client.settings().logCount()); + extraOptions << "-n" << QString::number(fossilClient().settings().logCount()); if (features.testFlag(FossilClient::TimelineWidthFeature)) - extraOptions << "-W" << QString::number(m_client.settings().timelineWidth()); + extraOptions << "-W" << QString::number(fossilClient().settings().timelineWidth()); - m_client.log(state.topLevel(), {}, extraOptions); + fossilClient().log(state.topLevel(), {}, extraOptions); } void FossilPluginPrivate::revertAll() @@ -512,14 +503,14 @@ void FossilPluginPrivate::revertAll() RevertDialog dialog(Tr::tr("Revert"), ICore::dialogParent()); if (dialog.exec() == QDialog::Accepted) - m_client.revertAll(state.topLevel(), dialog.revision()); + fossilClient().revertAll(state.topLevel(), dialog.revision()); } void FossilPluginPrivate::statusMulti() { const VcsBasePluginState state = currentState(); QTC_ASSERT(state.hasTopLevel(), return); - m_client.status(state.topLevel()); + fossilClient().status(state.topLevel()); } void FossilPluginPrivate::createRepositoryActions(const Context &context) @@ -592,8 +583,8 @@ bool FossilPluginPrivate::pullOrPush(FossilPluginPrivate::SyncMode mode) QTC_ASSERT(state.hasTopLevel(), return false); PullOrPushDialog dialog(pullOrPushMode, ICore::dialogParent()); - dialog.setLocalBaseDirectory(m_client.settings().defaultRepoPath()); - const QString defaultURL(m_client.synchronousGetRepositoryURL(state.topLevel())); + dialog.setLocalBaseDirectory(fossilClient().settings().defaultRepoPath()); + const QString defaultURL(fossilClient().synchronousGetRepositoryURL(state.topLevel())); dialog.setDefaultRemoteLocation(defaultURL); if (dialog.exec() != QDialog::Accepted) return true; @@ -613,9 +604,9 @@ bool FossilPluginPrivate::pullOrPush(FossilPluginPrivate::SyncMode mode) extraOptions << "--private"; switch (mode) { case SyncPull: - return m_client.synchronousPull(state.topLevel(), remoteLocation, extraOptions); + return fossilClient().synchronousPull(state.topLevel(), remoteLocation, extraOptions); case SyncPush: - return m_client.synchronousPush(state.topLevel(), remoteLocation, extraOptions); + return fossilClient().synchronousPush(state.topLevel(), remoteLocation, extraOptions); default: return false; } @@ -628,7 +619,7 @@ void FossilPluginPrivate::update() RevertDialog dialog(Tr::tr("Update"), ICore::dialogParent()); if (dialog.exec() == QDialog::Accepted) - m_client.update(state.topLevel(), dialog.revision()); + fossilClient().update(state.topLevel(), dialog.revision()); } void FossilPluginPrivate::configureRepository() @@ -639,14 +630,14 @@ void FossilPluginPrivate::configureRepository() ConfigureDialog dialog; // retrieve current settings from the repository - RepositorySettings currentSettings = m_client.synchronousSettingsQuery(state.topLevel()); + RepositorySettings currentSettings = fossilClient().synchronousSettingsQuery(state.topLevel()); dialog.setSettings(currentSettings); if (dialog.exec() != QDialog::Accepted) return; const RepositorySettings newSettings = dialog.settings(); - m_client.synchronousConfigureRepository(state.topLevel(), newSettings, currentSettings); + fossilClient().synchronousConfigureRepository(state.topLevel(), newSettings, currentSettings); } void FossilPluginPrivate::commit() @@ -661,14 +652,14 @@ void FossilPluginPrivate::commit() QTC_ASSERT(state.hasTopLevel(), return); m_submitRepository = state.topLevel(); - connect(&m_client, &VcsBaseClient::parsedStatus, this, &FossilPluginPrivate::showCommitWidget); - m_client.emitParsedStatus(m_submitRepository, {}); + connect(&fossilClient(), &VcsBaseClient::parsedStatus, this, &FossilPluginPrivate::showCommitWidget); + fossilClient().emitParsedStatus(m_submitRepository, {}); } void FossilPluginPrivate::showCommitWidget(const QList &status) { //Once we receive our data release the connection so it can be reused elsewhere - disconnect(&m_client, &VcsBaseClient::parsedStatus, + disconnect(&fossilClient(), &VcsBaseClient::parsedStatus, this, &FossilPluginPrivate::showCommitWidget); if (status.isEmpty()) { @@ -702,10 +693,10 @@ void FossilPluginPrivate::showCommitWidget(const QListdocument()->setPreferredDisplayName(msg); - const RevisionInfo currentRevision = m_client.synchronousRevisionQuery(m_submitRepository); - const BranchInfo currentBranch = m_client.synchronousCurrentBranch(m_submitRepository); - const QString currentUser = m_client.synchronousUserDefaultQuery(m_submitRepository); - QStringList tags = m_client.synchronousTagQuery(m_submitRepository, currentRevision.id); + const RevisionInfo currentRevision = fossilClient().synchronousRevisionQuery(m_submitRepository); + const BranchInfo currentBranch = fossilClient().synchronousCurrentBranch(m_submitRepository); + const QString currentUser = fossilClient().synchronousUserDefaultQuery(m_submitRepository); + QStringList tags = fossilClient().synchronousTagQuery(m_submitRepository, currentRevision.id); // Fossil includes branch name in tag list -- remove. tags.removeAll(currentBranch.name); commitEditor->setFields(m_submitRepository, currentBranch, tags, currentUser, status); @@ -717,7 +708,7 @@ void FossilPluginPrivate::showCommitWidget(const QListisPrivateOptionEnabled()) extraOptions += "--private"; - m_client.commit(m_submitRepository, files, editorDocument->filePath().toString(), extraOptions); + fossilClient().commit(m_submitRepository, files, editorDocument->filePath().toString(), extraOptions); } return true; } @@ -850,12 +841,12 @@ Id FossilPluginPrivate::id() const bool FossilPluginPrivate::isVcsFileOrDirectory(const FilePath &filePath) const { - return m_client.isVcsFileOrDirectory(filePath); + return fossilClient().isVcsFileOrDirectory(filePath); } bool FossilPluginPrivate::managesDirectory(const FilePath &directory, FilePath *topLevel) const { - const FilePath topLevelFound = m_client.findTopLevelForFile(directory); + const FilePath topLevelFound = fossilClient().findTopLevelForFile(directory); if (topLevel) *topLevel = topLevelFound; return !topLevelFound.isEmpty(); @@ -863,12 +854,12 @@ bool FossilPluginPrivate::managesDirectory(const FilePath &directory, FilePath * bool FossilPluginPrivate::managesFile(const FilePath &workingDirectory, const QString &fileName) const { - return m_client.managesFile(workingDirectory, fileName); + return fossilClient().managesFile(workingDirectory, fileName); } bool FossilPluginPrivate::isConfigured() const { - const FilePath binary = m_client.vcsBinary(); + const FilePath binary = fossilClient().vcsBinary(); if (binary.isEmpty()) return false; @@ -876,7 +867,7 @@ bool FossilPluginPrivate::isConfigured() const return false; // Local repositories default path must be set and exist - const FilePath repoPath = m_client.settings().defaultRepoPath(); + const FilePath repoPath = fossilClient().settings().defaultRepoPath(); if (repoPath.isEmpty()) return false; @@ -910,35 +901,35 @@ bool FossilPluginPrivate::vcsOpen(const FilePath &filePath) bool FossilPluginPrivate::vcsAdd(const FilePath &filePath) { - return m_client.synchronousAdd(filePath.absolutePath(), filePath.fileName()); + return fossilClient().synchronousAdd(filePath.absolutePath(), filePath.fileName()); } bool FossilPluginPrivate::vcsDelete(const FilePath &filePath) { - return m_client.synchronousRemove(filePath.absolutePath(), filePath.fileName()); + return fossilClient().synchronousRemove(filePath.absolutePath(), filePath.fileName()); } bool FossilPluginPrivate::vcsMove(const FilePath &from, const FilePath &to) { const QFileInfo fromInfo = from.toFileInfo(); const QFileInfo toInfo = to.toFileInfo(); - return m_client.synchronousMove(from.absolutePath(), fromInfo.absoluteFilePath(), + return fossilClient().synchronousMove(from.absolutePath(), fromInfo.absoluteFilePath(), toInfo.absoluteFilePath()); } bool FossilPluginPrivate::vcsCreateRepository(const FilePath &directory) { - return m_client.synchronousCreateRepository(directory); + return fossilClient().synchronousCreateRepository(directory); } void FossilPluginPrivate::vcsAnnotate(const FilePath &filePath, int line) { - m_client.annotate(filePath.absolutePath(), filePath.fileName(), line); + fossilClient().annotate(filePath.absolutePath(), filePath.fileName(), line); } void FossilPluginPrivate::vcsDescribe(const FilePath &source, const QString &id) { - m_client.view(source, id); + fossilClient().view(source, id); } VcsCommand *FossilPluginPrivate::createInitialCheckoutCommand(const QString &sourceUrl, @@ -987,7 +978,7 @@ VcsCommand *FossilPluginPrivate::createInitialCheckoutCommand(const QString &sou checkoutPath.createDir(); // Setup the wizard page command job - auto command = VcsBaseClient::createVcsCommand(checkoutPath, m_client.processEnvironment()); + auto command = VcsBaseClient::createVcsCommand(checkoutPath, fossilClient().processEnvironment()); if (!isLocalRepository && !cloneRepository.exists()) { @@ -1019,11 +1010,11 @@ VcsCommand *FossilPluginPrivate::createInitialCheckoutCommand(const QString &sou // So here we want Fossil to save the remote details when specified. QStringList args; - args << m_client.vcsCommandString(FossilClient::CloneCommand) + args << fossilClient().vcsCommandString(FossilClient::CloneCommand) << extraOptions << sourceUrl << fossilFileNative; - command->addJob({m_client.vcsBinary(), args}, -1); + command->addJob({fossilClient().vcsBinary(), args}, -1); } // check out the cloned repository file into the working copy directory; @@ -1032,20 +1023,20 @@ VcsCommand *FossilPluginPrivate::createInitialCheckoutCommand(const QString &sou QStringList args({"open", fossilFileNative}); if (!checkoutBranch.isEmpty()) args << checkoutBranch; - command->addJob({m_client.vcsBinary(), args}, -1); + command->addJob({fossilClient().vcsBinary(), args}, -1); // set user default to admin user if specified if (!isLocalRepository && !adminUser.isEmpty()) { const QStringList args({ "user", "default", adminUser, "--user", adminUser}); - command->addJob({m_client.vcsBinary(), args}, -1); + command->addJob({fossilClient().vcsBinary(), args}, -1); } // turn-off autosync if requested if (!isLocalRepository && disableAutosync) { const QStringList args({"settings", "autosync", "off"}); - command->addJob({m_client.vcsBinary(), args}, -1); + command->addJob({fossilClient().vcsBinary(), args}, -1); } return command; @@ -1094,13 +1085,9 @@ RevertDialog::RevertDialog(const QString &title, QWidget *parent) }.attachTo(this); } -} // namespace Internal -} // namespace Fossil - #ifdef WITH_TESTS -#include -void Fossil::Internal::FossilPlugin::testDiffFileResolving_data() +void FossilPlugin::testDiffFileResolving_data() { QTest::addColumn("header"); QTest::addColumn("fileName"); @@ -1133,12 +1120,12 @@ void Fossil::Internal::FossilPlugin::testDiffFileResolving_data() << QByteArray("src/plugins/fossil/fossilclient.cpp"); } -void Fossil::Internal::FossilPlugin::testDiffFileResolving() +void FossilPlugin::testDiffFileResolving() { VcsBaseEditorWidget::testDiffFileResolving(dd->diffFactory); } -void Fossil::Internal::FossilPlugin::testLogResolving() +void FossilPlugin::testLogResolving() { QByteArray data( "=== 2014-03-08 ===\n" @@ -1151,3 +1138,5 @@ void Fossil::Internal::FossilPlugin::testLogResolving() VcsBaseEditorWidget::testLogResolving(dd->fileLogFactory, data, "ac6d1129b8", "56d6917c3b"); } #endif + +} // namespace Fossil::Internal diff --git a/src/plugins/fossil/fossilplugin.h b/src/plugins/fossil/fossilplugin.h index 033e22822c0..c9fafc3cafa 100644 --- a/src/plugins/fossil/fossilplugin.h +++ b/src/plugins/fossil/fossilplugin.h @@ -8,8 +8,6 @@ namespace Fossil { namespace Internal { -class FossilClient; - class FossilPlugin final : public ExtensionSystem::IPlugin { Q_OBJECT @@ -20,9 +18,6 @@ class FossilPlugin final : public ExtensionSystem::IPlugin bool initialize(const QStringList &arguments, QString *errorMessage) final; void extensionsInitialized() final; -public: - static FossilClient *client(); - #ifdef WITH_TESTS private slots: void testDiffFileResolving_data();