diff --git a/src/plugins/coreplugin/iversioncontrol.h b/src/plugins/coreplugin/iversioncontrol.h index 8cbd8240b360b73dbf21055c74df706c0956f295..edaab39fbdbc4a07cb393792494e8f9c993f8c72 100644 --- a/src/plugins/coreplugin/iversioncontrol.h +++ b/src/plugins/coreplugin/iversioncontrol.h @@ -106,6 +106,10 @@ public: */ virtual bool vcsDelete(const QString &filename) = 0; +signals: + void repositoryChanged(const QString &repository); + void filesChanged(const QStringList &files); + // TODO: ADD A WAY TO DETECT WHETHER A FILE IS MANAGED, e.g // virtual bool sccManaged(const QString &filename) = 0; }; diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp index 282b2bf6815d4e6ff11752b547880f09d6362d8d..e7b8e7fa544bee79b93c339db8a4e5dd536715c6 100644 --- a/src/plugins/coreplugin/mainwindow.cpp +++ b/src/plugins/coreplugin/mainwindow.cpp @@ -126,7 +126,7 @@ MainWindow::MainWindow() : m_progressManager(new ProgressManagerPrivate()), m_scriptManager(new ScriptManagerPrivate(this)), m_variableManager(new VariableManager(this)), - m_vcsManager(new VCSManager()), + m_vcsManager(new VCSManager), m_viewManager(0), m_modeManager(0), m_mimeDatabase(new MimeDatabase), @@ -346,6 +346,7 @@ void MainWindow::extensionsInitialized() OutputPaneManager::instance()->init(); m_actionManager->initialize(); + m_vcsManager->extensionsInitialized(); readSettings(); updateContext(); diff --git a/src/plugins/coreplugin/vcsmanager.cpp b/src/plugins/coreplugin/vcsmanager.cpp index 33c7e484a0272fa8256c5b0b129369a4a50cc0c8..e07ba2ff12e6608afb17099d8542b7bbbf96d60b 100644 --- a/src/plugins/coreplugin/vcsmanager.cpp +++ b/src/plugins/coreplugin/vcsmanager.cpp @@ -57,7 +57,8 @@ struct VCSManagerPrivate { QMap<QString, IVersionControl *> m_cachedMatches; }; -VCSManager::VCSManager() : +VCSManager::VCSManager(QObject *parent) : + QObject(parent), m_d(new VCSManagerPrivate) { } @@ -67,6 +68,17 @@ VCSManager::~VCSManager() delete m_d; } +void VCSManager::extensionsInitialized() +{ + // Change signal connections + foreach (IVersionControl *versionControl, allVersionControls()) { + connect(versionControl, SIGNAL(filesChanged(QStringList)), + this, SIGNAL(filesChanged(QStringList))); + connect(versionControl, SIGNAL(repositoryChanged(QString)), + this, SIGNAL(repositoryChanged(QString))); + } +} + void VCSManager::setVCSEnabled(const QString &directory) { if (debug) diff --git a/src/plugins/coreplugin/vcsmanager.h b/src/plugins/coreplugin/vcsmanager.h index fa94efc618c9d95b6320440fb579f1bf5c613214..772243dd95767278786b0cdc306bdb1a3cbbd600 100644 --- a/src/plugins/coreplugin/vcsmanager.h +++ b/src/plugins/coreplugin/vcsmanager.h @@ -33,6 +33,7 @@ #include "core_global.h" #include <QtCore/QString> +#include <QtCore/QObject> namespace Core { @@ -49,13 +50,16 @@ class IVersionControl; // for the topmost directory it manages. This information is cached and // VCSManager thus knows pretty fast which IVersionControl * is responsible. -class CORE_EXPORT VCSManager +class CORE_EXPORT VCSManager : public QObject { + Q_OBJECT Q_DISABLE_COPY(VCSManager) public: - VCSManager(); + explicit VCSManager(QObject *parent = 0); virtual ~VCSManager(); + void extensionsInitialized(); + IVersionControl *findVersionControlForDirectory(const QString &directory); // Enable the VCS managing a certain directory only. This should @@ -69,6 +73,10 @@ public: // if a failure occurs bool showDeleteDialog(const QString &fileName); +signals: + void repositoryChanged(const QString &repository); + void filesChanged(const QStringList &files); + private: VCSManagerPrivate *m_d; }; diff --git a/src/plugins/cppeditor/cppeditorconstants.h b/src/plugins/cppeditor/cppeditorconstants.h index 356f711ba9ed63eb2890961ccd4a797d06dde3e4..85d02021251984a1eacf6120e4e53b1ba8b06e71 100644 --- a/src/plugins/cppeditor/cppeditorconstants.h +++ b/src/plugins/cppeditor/cppeditorconstants.h @@ -41,8 +41,10 @@ const char * const SWITCH_DECLARATION_DEFINITION = "CppEditor.SwitchDeclarationD const char * const RENAME_SYMBOL_UNDER_CURSOR = "CppEditor.RenameSymbolUnderCursor"; const char * const FIND_USAGES = "CppEditor.FindUsages"; const char * const SEPARATOR = "CppEditor.Separator"; +const char * const SEPARATOR2 = "CppEditor.Separator2"; const char * const FIND_REFERENCES = "CppEditor.FindReferences"; const char * const JUMP_TO_DEFINITION = "CppEditor.JumpToDefinition"; +const char * const UPDATE_CODEMODEL = "CppEditor.UpdateCodeModel"; const char * const HEADER_FILE_TYPE = "CppHeaderFiles"; const char * const SOURCE_FILE_TYPE = "CppSourceFiles"; diff --git a/src/plugins/cppeditor/cppplugin.cpp b/src/plugins/cppeditor/cppplugin.cpp index f98fb6808738bf8fee1833be785b4fc28d66af86..16d7ce4b9148eafabdba17038110632ff0550570 100644 --- a/src/plugins/cppeditor/cppplugin.cpp +++ b/src/plugins/cppeditor/cppplugin.cpp @@ -43,7 +43,7 @@ #include <coreplugin/actionmanager/actionmanager.h> #include <coreplugin/actionmanager/command.h> #include <coreplugin/editormanager/editormanager.h> -#include <coreplugin/progressmanager/progressmanager.h> +#include <cpptools/cppmodelmanagerinterface.h> #include <texteditor/completionsupport.h> #include <texteditor/fontsettings.h> #include <texteditor/storagesettings.h> @@ -112,7 +112,11 @@ CppPlugin *CppPlugin::m_instance = 0; CppPlugin::CppPlugin() : m_actionHandler(0), - m_sortedMethodOverview(false) + m_sortedMethodOverview(false), + m_renameSymbolUnderCursorAction(0), + m_findUsagesAction(0), + m_updateCodeModelAction(0) + { m_instance = this; } @@ -158,6 +162,17 @@ bool CppPlugin::sortedMethodOverview() const return m_sortedMethodOverview; } +static inline + Core::Command *createSeparator(Core::ActionManager *am, + QObject *parent, + const QList<int> &context, + const char *id) +{ + QAction *separator = new QAction(parent); + separator->setSeparator(true); + return am->registerAction(separator, QLatin1String(id), context); +} + bool CppPlugin::initialize(const QStringList & /*arguments*/, QString *errorMessage) { Core::ICore *core = Core::ICore::instance(); @@ -192,6 +207,7 @@ bool CppPlugin::initialize(const QStringList & /*arguments*/, QString *errorMess Core::ActionContainer *contextMenu= am->createMenu(CppEditor::Constants::M_CONTEXT); Core::Command *cmd; + Core::ActionContainer *cppToolsMenu = am->actionContainer(QLatin1String(CppTools::Constants::M_TOOLS_CPP)); QAction *jumpToDefinition = new QAction(tr("Follow Symbol under Cursor"), this); cmd = am->registerAction(jumpToDefinition, @@ -200,7 +216,7 @@ bool CppPlugin::initialize(const QStringList & /*arguments*/, QString *errorMess connect(jumpToDefinition, SIGNAL(triggered()), this, SLOT(jumpToDefinition())); contextMenu->addAction(cmd); - am->actionContainer(CppTools::Constants::M_TOOLS_CPP)->addAction(cmd); + cppToolsMenu->addAction(cmd); QAction *switchDeclarationDefinition = new QAction(tr("Switch between Method Declaration/Definition"), this); cmd = am->registerAction(switchDeclarationDefinition, @@ -209,14 +225,14 @@ bool CppPlugin::initialize(const QStringList & /*arguments*/, QString *errorMess connect(switchDeclarationDefinition, SIGNAL(triggered()), this, SLOT(switchDeclarationDefinition())); contextMenu->addAction(cmd); - am->actionContainer(CppTools::Constants::M_TOOLS_CPP)->addAction(cmd); + cppToolsMenu->addAction(cmd); m_findUsagesAction = new QAction(tr("Find Usages"), this); cmd = am->registerAction(m_findUsagesAction, Constants::FIND_USAGES, context); cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+U"))); connect(m_findUsagesAction, SIGNAL(triggered()), this, SLOT(findUsages())); contextMenu->addAction(cmd); - am->actionContainer(CppTools::Constants::M_TOOLS_CPP)->addAction(cmd); + cppToolsMenu->addAction(cmd); m_renameSymbolUnderCursorAction = new QAction(tr("Rename Symbol under Cursor"), this); cmd = am->registerAction(m_renameSymbolUnderCursorAction, @@ -224,7 +240,17 @@ bool CppPlugin::initialize(const QStringList & /*arguments*/, QString *errorMess cmd->setDefaultKeySequence(QKeySequence("CTRL+SHIFT+R")); connect(m_renameSymbolUnderCursorAction, SIGNAL(triggered()), this, SLOT(renameSymbolUnderCursor())); contextMenu->addAction(cmd); - am->actionContainer(CppTools::Constants::M_TOOLS_CPP)->addAction(cmd); + cppToolsMenu->addAction(cmd); + + // Update context in global context + QList<int> globalContext; + globalContext.append(Core::Constants::C_GLOBAL_ID); + cppToolsMenu->addAction(createSeparator(am, this, globalContext, CppEditor::Constants::SEPARATOR2)); + m_updateCodeModelAction = new QAction(tr("Update code model"), this); + cmd = am->registerAction(m_updateCodeModelAction, QLatin1String(Constants::UPDATE_CODEMODEL), globalContext); + CppTools::CppModelManagerInterface *cppModelManager = CppTools::CppModelManagerInterface::instance(); + connect(m_updateCodeModelAction, SIGNAL(triggered()), cppModelManager, SLOT(updateModifiedSourceFiles())); + cppToolsMenu->addAction(cmd); m_actionHandler = new TextEditor::TextEditorActionHandler(CppEditor::Constants::C_CPPEDITOR, TextEditor::TextEditorActionHandler::Format @@ -233,10 +259,7 @@ bool CppPlugin::initialize(const QStringList & /*arguments*/, QString *errorMess m_actionHandler->initializeActions(); - QAction *separator = new QAction(this); - separator->setSeparator(true); - cmd = am->registerAction(separator, CppEditor::Constants::SEPARATOR, context); - contextMenu->addAction(cmd); + contextMenu->addAction(createSeparator(am, this, context, CppEditor::Constants::SEPARATOR)); cmd = am->command(TextEditor::Constants::AUTO_INDENT_SELECTION); contextMenu->addAction(cmd); @@ -244,10 +267,8 @@ bool CppPlugin::initialize(const QStringList & /*arguments*/, QString *errorMess cmd = am->command(TextEditor::Constants::UN_COMMENT_SELECTION); contextMenu->addAction(cmd); - connect(core->progressManager(), SIGNAL(taskStarted(QString)), - this, SLOT(onTaskStarted(QString))); - connect(core->progressManager(), SIGNAL(allTasksFinished(QString)), - this, SLOT(onAllTasksFinished(QString))); + connect(cppModelManager, SIGNAL(indexingStarted()), this, SLOT(onCppModelIndexingStarted())); + connect(cppModelManager, SIGNAL(indexingFinished()), this, SLOT(onCppModelIndexingFinished())); readSettings(); return true; } @@ -303,20 +324,18 @@ void CppPlugin::findUsages() editor->findUsages(); } -void CppPlugin::onTaskStarted(const QString &type) +void CppPlugin::onCppModelIndexingStarted() { - if (type == CppTools::Constants::TASK_INDEX) { - m_renameSymbolUnderCursorAction->setEnabled(false); - m_findUsagesAction->setEnabled(false); - } + m_renameSymbolUnderCursorAction->setEnabled(false); + m_findUsagesAction->setEnabled(false); + m_updateCodeModelAction->setEnabled(false); } -void CppPlugin::onAllTasksFinished(const QString &type) +void CppPlugin::onCppModelIndexingFinished() { - if (type == CppTools::Constants::TASK_INDEX) { - m_renameSymbolUnderCursorAction->setEnabled(true); - m_findUsagesAction->setEnabled(true); - } + m_renameSymbolUnderCursorAction->setEnabled(true); + m_findUsagesAction->setEnabled(true); + m_updateCodeModelAction->setEnabled(true); } Q_EXPORT_PLUGIN(CppPlugin) diff --git a/src/plugins/cppeditor/cppplugin.h b/src/plugins/cppeditor/cppplugin.h index 3456bd9baf2eb4198aacb1a2cef301037508b95b..e0ccc7ac64e9d6cfe079d0e298cdc1ef504d3268 100644 --- a/src/plugins/cppeditor/cppplugin.h +++ b/src/plugins/cppeditor/cppplugin.h @@ -75,8 +75,8 @@ private slots: void switchDeclarationDefinition(); void jumpToDefinition(); void renameSymbolUnderCursor(); - void onTaskStarted(const QString &type); - void onAllTasksFinished(const QString &type); + void onCppModelIndexingStarted(); + void onCppModelIndexingFinished(); void findUsages(); private: @@ -90,6 +90,7 @@ private: bool m_sortedMethodOverview; QAction *m_renameSymbolUnderCursorAction; QAction *m_findUsagesAction; + QAction *m_updateCodeModelAction; }; class CppEditorFactory : public Core::IEditorFactory diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index 5cae6bdeaf316a142f94699b6c1d7a146c088942..6a490518401d472f46f8c380c5e5c6e3f2421551 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -595,6 +595,8 @@ Document::Ptr CppPreprocessor::switchDocument(Document::Ptr doc) void CppTools::CppModelManagerInterface::updateModifiedSourceFiles() { + if (isIndexing()) + return; const Snapshot snapshot = this->snapshot(); QStringList sourceFiles; @@ -630,7 +632,8 @@ CppTools::CppModelManagerInterface *CppTools::CppModelManagerInterface::instance */ CppModelManager::CppModelManager(QObject *parent) - : CppModelManagerInterface(parent) + : CppModelManagerInterface(parent), + m_indexing(false) { m_findReferences = new CppFindReferences(this); @@ -675,6 +678,11 @@ CppModelManager::CppModelManager(QObject *parent) connect(m_core->editorManager(), SIGNAL(editorAboutToClose(Core::IEditor *)), this, SLOT(editorAboutToClose(Core::IEditor *))); + + connect(m_core->progressManager(), SIGNAL(taskStarted(QString)), + this, SLOT(onTaskStarted(QString))); + connect(m_core->progressManager(), SIGNAL(allTasksFinished(QString)), + this, SLOT(onAllTasksFinished(QString))); } CppModelManager::~CppModelManager() @@ -871,7 +879,7 @@ QStringList CppModelManager::includesInPath(const QString &path) const QFuture<void> CppModelManager::refreshSourceFiles(const QStringList &sourceFiles) { - if (! sourceFiles.isEmpty() && qgetenv("QTCREATOR_NO_CODE_INDEXER").isNull()) { + if (!m_indexing && !sourceFiles.isEmpty() && qgetenv("QTCREATOR_NO_CODE_INDEXER").isNull()) { const QMap<QString, QString> workingCopy = buildWorkingCopyList(); CppPreprocessor *preproc = new CppPreprocessor(this); @@ -897,7 +905,7 @@ QFuture<void> CppModelManager::refreshSourceFiles(const QStringList &sourceFiles m_synchronizer.addFuture(result); - if (sourceFiles.count() > 1) { + if (sourceFiles.count() > 1) { m_core->progressManager()->addTask(result, tr("Indexing"), CppTools::Constants::TASK_INDEX, Core::ProgressManager::CloseOnSuccess); @@ -1391,4 +1399,31 @@ void CppModelManager::GC() protectSnapshot.unlock(); } +bool CppModelManager::isIndexing() const +{ + return m_indexing; +} + +void CppModelManager::setIndexing(bool v) +{ + if (m_indexing == v) + return; + m_indexing = v; + if (v) { + emit indexingStarted(); + } else { + emit indexingFinished(); + } +} + +void CppModelManager::onTaskStarted(const QString &type) +{ + if (type == QLatin1String(CppTools::Constants::TASK_INDEX)) + setIndexing(true); +} +void CppModelManager::onAllTasksFinished(const QString &type) +{ + if (type == QLatin1String(CppTools::Constants::TASK_INDEX)) + setIndexing(false); +} diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h index 4222ccab6be790d6ba5010db6de501511ac7c645..ca13b44a24248b848d70f94fab563d5bf02ab435 100644 --- a/src/plugins/cpptools/cppmodelmanager.h +++ b/src/plugins/cpptools/cppmodelmanager.h @@ -111,6 +111,8 @@ public: void setHeaderSuffixes(const QStringList &suffixes) { m_headerSuffixes = suffixes; } + virtual bool isIndexing() const; + Q_SIGNALS: void projectPathChanged(const QString &projectPath); @@ -129,6 +131,8 @@ private Q_SLOTS: void onProjectAdded(ProjectExplorer::Project *project); void postEditorUpdate(); void updateEditorSelections(); + void onTaskStarted(const QString &type); + void onAllTasksFinished(const QString &type); private: QMap<QString, QString> buildWorkingCopyList(); @@ -175,10 +179,13 @@ private: CppPreprocessor *preproc, QStringList files); + void setIndexing(bool); + private: Core::ICore *m_core; CPlusPlus::Snapshot m_snapshot; + bool m_indexing; // cache bool m_dirty; QStringList m_projectFiles; diff --git a/src/plugins/cpptools/cppmodelmanagerinterface.h b/src/plugins/cpptools/cppmodelmanagerinterface.h index 1976df75eab41cac2dde91932c0517a51d9beebb..1ec38abe304def8ca39d16d2f4e02a1ac85bbb0a 100644 --- a/src/plugins/cpptools/cppmodelmanagerinterface.h +++ b/src/plugins/cpptools/cppmodelmanagerinterface.h @@ -102,6 +102,12 @@ public: virtual void renameUsages(CPlusPlus::Symbol *symbol) = 0; virtual void findUsages(CPlusPlus::Symbol *symbol) = 0; + virtual bool isIndexing() const = 0; + +signals: + void indexingStarted(); + void indexingFinished(); + public Q_SLOTS: void updateModifiedSourceFiles(); virtual void updateSourceFiles(const QStringList &sourceFiles) = 0; diff --git a/src/plugins/cpptools/cpptoolsplugin.cpp b/src/plugins/cpptools/cpptoolsplugin.cpp index bbc894390c8a225c9a2b99c3d2587e97383f2351..d321b7c39b3748079ed8b0552ec2a6964baa48da 100644 --- a/src/plugins/cpptools/cpptoolsplugin.cpp +++ b/src/plugins/cpptools/cpptoolsplugin.cpp @@ -47,6 +47,7 @@ #include <coreplugin/actionmanager/actionmanager.h> #include <coreplugin/editormanager/editormanager.h> #include <coreplugin/progressmanager/progressmanager.h> +#include <coreplugin/vcsmanager.h> #include <cppeditor/cppeditorconstants.h> #include <QtCore/QtConcurrentRun> @@ -97,6 +98,11 @@ bool CppToolsPlugin::initialize(const QStringList &arguments, QString *error) // Objects m_modelManager = new CppModelManager(this); + Core::VCSManager *vcsManager = core->vcsManager(); + connect(vcsManager, SIGNAL(repositoryChanged(QString)), + m_modelManager, SLOT(updateModifiedSourceFiles())); + connect(vcsManager, SIGNAL(filesChanged(QStringList)), + m_modelManager, SLOT(updateModifiedSourceFiles())); addAutoReleasedObject(m_modelManager); m_completion = new CppCodeCompletion(m_modelManager); diff --git a/src/plugins/cvs/cvscontrol.cpp b/src/plugins/cvs/cvscontrol.cpp index 51edeec5a69a2e08ca4e59875eb53f180ac550e9..1689f22052798b8bfa1d3d9143bf23cc8baf2c50 100644 --- a/src/plugins/cvs/cvscontrol.cpp +++ b/src/plugins/cvs/cvscontrol.cpp @@ -96,3 +96,14 @@ QString CVSControl::findTopLevelForDirectory(const QString &directory) const { return m_plugin->findTopLevelForDirectory(directory); } + +void CVSControl::emitRepositoryChanged(const QString &s) +{ + emit repositoryChanged(s); +} + +void CVSControl::emitFilesChanged(const QStringList &l) +{ + emit filesChanged(l); +} + diff --git a/src/plugins/cvs/cvscontrol.h b/src/plugins/cvs/cvscontrol.h index 52067ad37024b1046870274e4d4d488a9fb41c5e..c6adb7ffa9c019d617186446fd45123affee08aa 100644 --- a/src/plugins/cvs/cvscontrol.h +++ b/src/plugins/cvs/cvscontrol.h @@ -56,6 +56,9 @@ public: virtual bool vcsAdd(const QString &fileName); virtual bool vcsDelete(const QString &filename); + void emitRepositoryChanged(const QString &s); + void emitFilesChanged(const QStringList &l); + signals: void enabledChanged(bool); diff --git a/src/plugins/cvs/cvsplugin.cpp b/src/plugins/cvs/cvsplugin.cpp index 654fce42bb307e28924f073b28b9f6d896ae5ff6..0fa8619e27047d9bb43a98b3c753c2bde6832037 100644 --- a/src/plugins/cvs/cvsplugin.cpp +++ b/src/plugins/cvs/cvsplugin.cpp @@ -551,9 +551,11 @@ void CVSPlugin::revertCurrentFile() QStringList args(QLatin1String("update")); args.push_back(QLatin1String("-C")); - const CVSResponse revertResponse = runCVS(args, QStringList(file), cvsShortTimeOut, true); + const QStringList files = QStringList(file); + const CVSResponse revertResponse = runCVS(args, files, cvsShortTimeOut, true); if (revertResponse.result == CVSResponse::Ok) { fcb.setModifiedReload(true); + m_versionControl->emitFilesChanged(files); } } @@ -734,7 +736,10 @@ void CVSPlugin::updateProject() if (!topLevels.empty()) { QStringList args(QLatin1String("update")); args.push_back(QLatin1String("-dR")); - runCVS(args, topLevels, cvsLongTimeOut, true); + const CVSResponse response = runCVS(args, topLevels, cvsLongTimeOut, true); + if (response.result == CVSResponse::Ok) + foreach(const QString &topLevel, topLevels) + m_versionControl->emitRepositoryChanged(topLevel); } } diff --git a/src/plugins/cvs/cvsplugin.h b/src/plugins/cvs/cvsplugin.h index c0f63473b2b202d95871a7b3d5f73f4900b8fdc8..a1515cfc931431761ed10390c824135b8de00394 100644 --- a/src/plugins/cvs/cvsplugin.h +++ b/src/plugins/cvs/cvsplugin.h @@ -59,6 +59,7 @@ namespace CVS { namespace Internal { class CVSSubmitEditor; +class CVSControl; struct CVSResponse { @@ -153,7 +154,7 @@ private: void cleanCommitMessageFile(); CVSSettings m_settings; - Core::IVersionControl *m_versionControl; + CVSControl *m_versionControl; QString m_commitMessageFileName; ProjectExplorer::ProjectExplorerPlugin *m_projectExplorer; diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 419784887f08802591ce8c2ecde796f199eaaa83..486196174af14489508f7d708bca781dfa2f8130 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -34,6 +34,7 @@ #include "gitconstants.h" #include "gitplugin.h" #include "gitsubmiteditor.h" +#include "gitversioncontrol.h" #include <coreplugin/actionmanager/actionmanager.h> #include <coreplugin/coreconstants.h> @@ -43,6 +44,9 @@ #include <coreplugin/progressmanager/progressmanager.h> #include <coreplugin/uniqueidmanager.h> #include <coreplugin/filemanager.h> +#include <coreplugin/filemanager.h> +#include <coreplugin/iversioncontrol.h> + #include <texteditor/itexteditor.h> #include <utils/qtcassert.h> #include <vcsbase/vcsbaseeditor.h> @@ -55,6 +59,7 @@ #include <QtCore/QTime> #include <QtCore/QFileInfo> #include <QtCore/QDir> +#include <QtCore/QSignalMapper> #include <QtGui/QMainWindow> // for msg box parent #include <QtGui/QMessageBox> @@ -102,7 +107,8 @@ static QString formatCommand(const QString &binary, const QStringList &args) GitClient::GitClient(GitPlugin* plugin) : m_msgWait(tr("Waiting for data...")), m_plugin(plugin), - m_core(Core::ICore::instance()) + m_core(Core::ICore::instance()), + m_repositoryChangedSignalMapper(0) { if (QSettings *s = m_core->settings()) { m_settings.fromSettings(s); @@ -317,7 +323,8 @@ void GitClient::checkoutBranch(const QString &workingDirectory, const QString &b { QStringList arguments(QLatin1String("checkout")); arguments << branch; - executeGit(workingDirectory, arguments, 0, true); + GitCommand *cmd = executeGit(workingDirectory, arguments, 0, true); + connectRepositoryChanged(workingDirectory, cmd); } void GitClient::checkout(const QString &workingDirectory, const QString &fileName) @@ -341,7 +348,8 @@ void GitClient::hardReset(const QString &workingDirectory, const QString &commit if (!commit.isEmpty()) arguments << commit; - executeGit(workingDirectory, arguments, 0, true); + GitCommand *cmd = executeGit(workingDirectory, arguments, 0, true); + connectRepositoryChanged(workingDirectory, cmd); } void GitClient::addFile(const QString &workingDirectory, const QString &fileName) @@ -500,18 +508,19 @@ GitCommand *GitClient::createCommand(const QString &workingDirectory, } // Execute a single command -void GitClient::executeGit(const QString &workingDirectory, - const QStringList &arguments, - VCSBase::VCSBaseEditor* editor, - bool outputToWindow, - GitCommand::TerminationReportMode tm, - int editorLineNumber) +GitCommand *GitClient::executeGit(const QString &workingDirectory, + const QStringList &arguments, + VCSBase::VCSBaseEditor* editor, + bool outputToWindow, + GitCommand::TerminationReportMode tm, + int editorLineNumber) { VCSBase::VCSBaseOutputWindow::instance()->appendCommand(formatCommand(QLatin1String(Constants::GIT_BINARY), arguments)); GitCommand *command = createCommand(workingDirectory, editor, outputToWindow, editorLineNumber); command->addJob(arguments, m_settings.timeout); command->setTerminationReportMode(tm); command->execute(); + return command; } // Return fixed arguments required to run @@ -903,6 +912,8 @@ void GitClient::revert(const QStringList &files) QString errorMessage; switch (revertI(files, &isDirectory, &errorMessage)) { case RevertOk: + m_plugin->versionControl()->emitFilesChanged(files); + break; case RevertCanceled: break; case RevertUnchanged: { @@ -918,7 +929,8 @@ void GitClient::revert(const QStringList &files) void GitClient::pull(const QString &workingDirectory) { - executeGit(workingDirectory, QStringList(QLatin1String("pull")), 0, true, GitCommand::ReportStderr); + GitCommand *cmd = executeGit(workingDirectory, QStringList(QLatin1String("pull")), 0, true, GitCommand::ReportStderr); + connectRepositoryChanged(workingDirectory, cmd); } void GitClient::push(const QString &workingDirectory) @@ -952,7 +964,8 @@ void GitClient::stashPop(const QString &workingDirectory) { QStringList arguments(QLatin1String("stash")); arguments << QLatin1String("pop"); - executeGit(workingDirectory, arguments, 0, true); + GitCommand *cmd = executeGit(workingDirectory, arguments, 0, true); + connectRepositoryChanged(workingDirectory, cmd); } void GitClient::branchList(const QString &workingDirectory) @@ -1000,3 +1013,16 @@ void GitClient::setSettings(const GitSettings &s) m_binaryPath = m_settings.gitBinaryPath(); } } + +void GitClient::connectRepositoryChanged(const QString & repository, GitCommand *cmd) +{ + // Bind command success termination with repository to changed signal + if (!m_repositoryChangedSignalMapper) { + m_repositoryChangedSignalMapper = new QSignalMapper(this); + connect(m_repositoryChangedSignalMapper, SIGNAL(mapped(QString)), + m_plugin->versionControl(), SIGNAL(repositoryChanged(QString))); + } + m_repositoryChangedSignalMapper->setMapping(cmd, repository); + connect(cmd, SIGNAL(success()), m_repositoryChangedSignalMapper, SLOT(map()), + Qt::QueuedConnection); +} diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index 341e177f35380a725a27ac454db9fdc2294cd156..76da31203479171106ff7c997bc1e5a0a6bbea18 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -33,7 +33,6 @@ #include "gitsettings.h" #include "gitcommand.h" -#include <coreplugin/iversioncontrol.h> #include <coreplugin/editormanager/ieditor.h> #include <QtCore/QString> @@ -41,6 +40,7 @@ QT_BEGIN_NAMESPACE class QErrorMessage; +class QSignalMapper; QT_END_NAMESPACE namespace Core { @@ -158,12 +158,12 @@ private: bool outputToWindow = false, int editorLineNumber = -1); - void executeGit(const QString &workingDirectory, - const QStringList &arguments, - VCSBase::VCSBaseEditor* editor = 0, - bool outputToWindow = false, - GitCommand::TerminationReportMode tm = GitCommand::NoReport, - int editorLineNumber = -1); + GitCommand *executeGit(const QString &workingDirectory, + const QStringList &arguments, + VCSBase::VCSBaseEditor* editor = 0, + bool outputToWindow = false, + GitCommand::TerminationReportMode tm = GitCommand::NoReport, + int editorLineNumber = -1); bool synchronousGit(const QString &workingDirectory, const QStringList &arguments, @@ -173,12 +173,14 @@ private: enum RevertResult { RevertOk, RevertUnchanged, RevertCanceled, RevertFailed }; RevertResult revertI(QStringList files, bool *isDirectory, QString *errorMessage); + void connectRepositoryChanged(const QString & repository, GitCommand *cmd); const QString m_msgWait; GitPlugin *m_plugin; Core::ICore *m_core; GitSettings m_settings; QString m_binaryPath; + QSignalMapper *m_repositoryChangedSignalMapper; }; diff --git a/src/plugins/git/gitcommand.cpp b/src/plugins/git/gitcommand.cpp index 3f7a97095e64f9e355ed4629fdc4c80b5e0aa98f..ea6c17dab1310e5fe1ae1f31a726e40d10a99ea3 100644 --- a/src/plugins/git/gitcommand.cpp +++ b/src/plugins/git/gitcommand.cpp @@ -177,6 +177,8 @@ void GitCommand::run() emit errorText(error); emit finished(ok, m_cookie); + if (ok) + emit success(); // As it is used asynchronously, we need to delete ourselves this->deleteLater(); } diff --git a/src/plugins/git/gitcommand.h b/src/plugins/git/gitcommand.h index 7acf167750f7c5e4f3a9b7aef0da52d6905357f9..8f1c5aad0ec4e7d2784bbfe15bdf2dfe21ddf82b 100644 --- a/src/plugins/git/gitcommand.h +++ b/src/plugins/git/gitcommand.h @@ -73,6 +73,7 @@ Q_SIGNALS: void outputData(const QByteArray&); void errorText(const QString&); void finished(bool ok, const QVariant &cookie); + void success(); private: struct Job { diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index 7b51b39fbf895ca59654395d2ab2824ad41e7bc5..8ce1b1938d330f20fc79d42a26f230e90f9ca923 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -142,6 +142,7 @@ GitPlugin::GitPlugin() : m_stashListAction(0), m_branchListAction(0), m_gitClient(0), + m_versionControl(0), m_changeSelectionDialog(0), m_submitActionTriggered(false) { @@ -215,8 +216,8 @@ bool GitPlugin::initialize(const QStringList &arguments, QString *errorMessage) addAutoReleasedObject(new GitSubmitEditorFactory(&submitParameters)); - GitVersionControl *versionControl = new GitVersionControl(m_gitClient); - addAutoReleasedObject(versionControl); + m_versionControl = new GitVersionControl(m_gitClient); + addAutoReleasedObject(m_versionControl); addAutoReleasedObject(new CloneWizard); addAutoReleasedObject(new Gitorious::Internal::GitoriousCloneWizard); @@ -232,8 +233,8 @@ bool GitPlugin::initialize(const QStringList &arguments, QString *errorMessage) gitContainer->menu()->setTitle(tr("&Git")); toolsContainer->addMenu(gitContainer); if (QAction *ma = gitContainer->menu()->menuAction()) { - ma->setEnabled(versionControl->isEnabled()); - connect(versionControl, SIGNAL(enabledChanged(bool)), ma, SLOT(setVisible(bool))); + ma->setEnabled(m_versionControl->isEnabled()); + connect(m_versionControl, SIGNAL(enabledChanged(bool)), ma, SLOT(setVisible(bool))); } Core::Command *command; @@ -398,6 +399,11 @@ void GitPlugin::extensionsInitialized() { } +GitVersionControl *GitPlugin::versionControl() const +{ + return m_versionControl; +} + void GitPlugin::submitEditorDiff(const QStringList &unstaged, const QStringList &staged) { m_gitClient->diff(m_submitRepository, QStringList(), unstaged, staged); diff --git a/src/plugins/git/gitplugin.h b/src/plugins/git/gitplugin.h index 4f934a893936a4f5dda262656a971f165e8a1348..0d6ad7fbdd5f412efedb67daf7b1d47c412a4ed6 100644 --- a/src/plugins/git/gitplugin.h +++ b/src/plugins/git/gitplugin.h @@ -59,6 +59,7 @@ namespace Git { namespace Internal { class GitPlugin; +class GitVersionControl; class GitClient; class ChangeSelectionDialog; class GitSubmitEditor; @@ -96,6 +97,7 @@ public: void setSettings(const GitSettings &s); GitClient *gitClient() const; + GitVersionControl *versionControl() const; public slots: void updateActions(); @@ -159,6 +161,7 @@ private: QAction *m_branchListAction; GitClient *m_gitClient; + GitVersionControl *m_versionControl; ChangeSelectionDialog *m_changeSelectionDialog; QString m_submitRepository; QStringList m_submitOrigCommitFiles; diff --git a/src/plugins/git/gitversioncontrol.cpp b/src/plugins/git/gitversioncontrol.cpp index 559d296220e4acd7521d9521a6293f2c6a5e0272..c64a683bea0622f92a9ed46e3c3358e3159556f1 100644 --- a/src/plugins/git/gitversioncontrol.cpp +++ b/src/plugins/git/gitversioncontrol.cpp @@ -96,5 +96,10 @@ QString GitVersionControl::findTopLevelForDirectory(const QString &directory) co return GitClient::findRepositoryForDirectory(directory); } +void GitVersionControl::emitFilesChanged(const QStringList &l) +{ + emit filesChanged(l); +} + } // Internal } // Git diff --git a/src/plugins/git/gitversioncontrol.h b/src/plugins/git/gitversioncontrol.h index 72908b0da226e8f2bedb2859c8f3f8f103088ba7..44598000638800f3ad57de9da892ffff926221e6 100644 --- a/src/plugins/git/gitversioncontrol.h +++ b/src/plugins/git/gitversioncontrol.h @@ -57,6 +57,8 @@ public: virtual bool vcsAdd(const QString &fileName); virtual bool vcsDelete(const QString &filename); + void emitFilesChanged(const QStringList &); + signals: void enabledChanged(bool); diff --git a/src/plugins/perforce/perforceplugin.cpp b/src/plugins/perforce/perforceplugin.cpp index 7039798b0942a5788ce9a585fbf73acadb3c7c81..a80d8f559734d6bb7d8a00230e398ac0974a5cde 100644 --- a/src/plugins/perforce/perforceplugin.cpp +++ b/src/plugins/perforce/perforceplugin.cpp @@ -454,6 +454,8 @@ void PerforcePlugin::revertCurrentFile() Core::FileChangeBlocker fcb(fileName); fcb.setModifiedReload(true); PerforceResponse result2 = runP4Cmd(QStringList() << QLatin1String("revert") << fileName, QStringList(), CommandToWindow|StdOutToWindow|StdErrToWindow|ErrorToWindow); + if (!result2.error) + m_versionControl->emitFilesChanged(QStringList(fileName)); } void PerforcePlugin::diffCurrentFile() @@ -514,7 +516,10 @@ void PerforcePlugin::updateCheckout(const QStringList &dirs) { QStringList args(QLatin1String("sync")); args.append(dirs); - runP4Cmd(args, QStringList(), CommandToWindow|StdOutToWindow|StdErrToWindow|ErrorToWindow); + const PerforceResponse resp = runP4Cmd(args, QStringList(), CommandToWindow|StdOutToWindow|StdErrToWindow|ErrorToWindow); + if (!dirs.empty()) + foreach(const QString &dir, dirs) + m_versionControl->emitRepositoryChanged(dir); } void PerforcePlugin::printOpenedFileList() diff --git a/src/plugins/perforce/perforceversioncontrol.cpp b/src/plugins/perforce/perforceversioncontrol.cpp index 040692428d83c171daac4d841249f2b0923aedf2..ad915b2a2085f42ff63aec3e0da6fd8fc7d1d073 100644 --- a/src/plugins/perforce/perforceversioncontrol.cpp +++ b/src/plugins/perforce/perforceversioncontrol.cpp @@ -94,5 +94,15 @@ QString PerforceVersionControl::findTopLevelForDirectory(const QString &director return m_plugin->findTopLevelForDirectory(directory); } +void PerforceVersionControl::emitRepositoryChanged(const QString &s) +{ + emit repositoryChanged(s); +} + +void PerforceVersionControl::emitFilesChanged(const QStringList &l) +{ + emit filesChanged(l); +} + } // Internal } // Perforce diff --git a/src/plugins/perforce/perforceversioncontrol.h b/src/plugins/perforce/perforceversioncontrol.h index 2992e5518be1cc13fde2b506fc943eba52c2b09c..dd385061cbca5e80267a4ec43f54712381ca94bc 100644 --- a/src/plugins/perforce/perforceversioncontrol.h +++ b/src/plugins/perforce/perforceversioncontrol.h @@ -56,6 +56,9 @@ public: virtual bool vcsAdd(const QString &fileName); virtual bool vcsDelete(const QString &filename); + void emitRepositoryChanged(const QString &s); + void emitFilesChanged(const QStringList &l); + signals: void enabledChanged(bool); diff --git a/src/plugins/subversion/subversioncontrol.cpp b/src/plugins/subversion/subversioncontrol.cpp index 32ef57e5ecce1599bb52162981b563676bde26b8..ff0e0f1c81e872b85872d5990ded86f5089870ac 100644 --- a/src/plugins/subversion/subversioncontrol.cpp +++ b/src/plugins/subversion/subversioncontrol.cpp @@ -96,3 +96,13 @@ QString SubversionControl::findTopLevelForDirectory(const QString &directory) co { return m_plugin->findTopLevelForDirectory(directory); } + +void SubversionControl::emitRepositoryChanged(const QString &s) +{ + emit repositoryChanged(s); +} + +void SubversionControl::emitFilesChanged(const QStringList &l) +{ + emit filesChanged(l); +} diff --git a/src/plugins/subversion/subversioncontrol.h b/src/plugins/subversion/subversioncontrol.h index 42f64ab147e30abe9f806d98d96502a4b16e471c..325cfd10989bb9a4cb435d633c2d911125695852 100644 --- a/src/plugins/subversion/subversioncontrol.h +++ b/src/plugins/subversion/subversioncontrol.h @@ -56,6 +56,9 @@ public: virtual bool vcsAdd(const QString &fileName); virtual bool vcsDelete(const QString &filename); + void emitRepositoryChanged(const QString &); + void emitFilesChanged(const QStringList &); + signals: void enabledChanged(bool); diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp index 676ffc2b8ad517e15f9ced6e1de2906b475627e1..0060e0239535c3ca1edee3e7e6a6675fa2ac1b90 100644 --- a/src/plugins/subversion/subversionplugin.cpp +++ b/src/plugins/subversion/subversionplugin.cpp @@ -574,6 +574,7 @@ void SubversionPlugin::revertCurrentFile() const SubversionResponse revertResponse = runSvn(args, subversionShortTimeOut, true); if (!revertResponse.error) { fcb.setModifiedReload(true); + m_versionControl->emitFilesChanged(QStringList(file)); } } @@ -750,7 +751,10 @@ void SubversionPlugin::updateProject() QStringList args(QLatin1String("update")); args.push_back(QLatin1String(nonInteractiveOptionC)); args.append(topLevels); - runSvn(args, subversionLongTimeOut, true); + const SubversionResponse response = runSvn(args, subversionLongTimeOut, true); + if (!response.error) + foreach(const QString &repo, topLevels) + m_versionControl->emitRepositoryChanged(repo); } void SubversionPlugin::annotateCurrentFile() diff --git a/src/plugins/subversion/subversionplugin.h b/src/plugins/subversion/subversionplugin.h index 1dcfce680324d1ffe7de4e3c8cf71c1bc3e888f8..6e3dab7e5d35235893bd2638fc755dfb01077589 100644 --- a/src/plugins/subversion/subversionplugin.h +++ b/src/plugins/subversion/subversionplugin.h @@ -56,6 +56,7 @@ namespace Subversion { namespace Internal { class SubversionSubmitEditor; +class SubversionControl; struct SubversionResponse { @@ -131,7 +132,7 @@ private: const QStringList m_svnDirectories; SubversionSettings m_settings; - Core::IVersionControl *m_versionControl; + SubversionControl *m_versionControl; QString m_commitMessageFileName; ProjectExplorer::ProjectExplorerPlugin *m_projectExplorer;