diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index b3a590cf3b8792458e724c1498d74e28883f3694..e20b6bac84623c79c240c54f4fd31e4afaa7b9e4 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -873,6 +873,7 @@ bool GitClient::synchronousCheckout(const QString &workingDirectory, outputWindow()->appendError(msg); return false; } + promptSubmoduleUpdate(workingDirectory); return true; } @@ -1710,6 +1711,27 @@ GitClient::StashResult GitClient::ensureStash(const QString &workingDirectory, return Stashed; } +void GitClient::submoduleUpdate(const QString &workingDirectory) +{ + QStringList arguments; + arguments << QLatin1String("submodule") << QLatin1String("update"); + + VcsBase::Command *cmd = executeGit(workingDirectory, arguments, 0, true); + connectRepositoryChanged(workingDirectory, cmd); +} + +void GitClient::promptSubmoduleUpdate(const QString &workingDirectory) +{ + if (!QFile::exists(workingDirectory + QLatin1String("/.gitmodules"))) + return; + + if (QMessageBox::question(Core::ICore::mainWindow(), tr("Submodules Found"), + tr("Would you like to update submodules?"), + QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) { + submoduleUpdate(workingDirectory); + } +} + // Trim a git status file spec: "modified: foo .cpp" -> "modified: foo .cpp" static inline QString trimFileSpecification(QString fileSpec) { @@ -2312,7 +2334,12 @@ bool GitClient::synchronousPull(const QString &workingDirectory, bool rebase) abortCommand = QLatin1String("merge"); } - return executeAndHandleConflicts(workingDirectory, arguments, abortCommand); + bool ok = executeAndHandleConflicts(workingDirectory, arguments, abortCommand); + + if (ok) + promptSubmoduleUpdate(workingDirectory); + + return ok; } void GitClient::synchronousAbortCommand(const QString &workingDir, const QString &abortCommand) diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index 2619a41fa634c64471ce180ef58456b85bc5c8b6..3fa922b697c4ecb322bb7cc0293b53fa3e4252a9 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -158,6 +158,8 @@ public: bool synchronousCheckout(const QString &workingDirectory, const QString &ref, QString *errorMessage); bool synchronousCheckout(const QString &workingDirectory, const QString &ref) { return synchronousCheckout(workingDirectory, ref, 0); } + void submoduleUpdate(const QString &workingDirectory); + void promptSubmoduleUpdate(const QString &workingDirectory); // Do a stash and return identier. enum { StashPromptDescription = 0x1, StashImmediateRestore = 0x2, StashIgnoreUnchanged = 0x4 }; diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index 862b375bfda0f41072650eeabdae23db721a103b..223707a500edc09d3fdd880e6b6bfb61793c4acf 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -441,6 +441,11 @@ bool GitPlugin::initialize(const QStringList &arguments, QString *errorMessage) tr("Change-related Actions..."), Core::Id("Git.ChangeRelatedActions"), globalcontext, true, SLOT(startChangeRelatedAction())); + m_submoduleUpdateAction = + createRepositoryAction(localRepositoryMenu, + tr("Update Submodules"), Core::Id("Git.SubmoduleUpdate"), + globalcontext, true, SLOT(updateSubmodules())).first; + // -------------- localRepositoryMenu->addSeparator(globalcontext); @@ -1089,6 +1094,13 @@ void GitPlugin::cleanRepository(const QString &directory) dialog.exec(); } +void GitPlugin::updateSubmodules() +{ + const VcsBase::VcsBasePluginState state = currentState(); + QTC_ASSERT(state.hasTopLevel(), return); + m_gitClient->submoduleUpdate(state.topLevel()); +} + // If the file is modified in an editor, make sure it is saved. static bool ensureFileSaved(const QString &fileName) { @@ -1224,13 +1236,14 @@ void GitPlugin::updateActions(VcsBase::VcsBasePlugin::ActionState as) fileAction->setParameter(fileName); // If the current file looks like a patch, offer to apply m_applyCurrentFilePatchAction->setParameter(currentState().currentPatchFileDisplayName()); - const QString projectName = currentState().currentProjectName(); foreach (Utils::ParameterAction *projectAction, m_projectActions) projectAction->setParameter(projectName); foreach (QAction *repositoryAction, m_repositoryActions) repositoryAction->setEnabled(repositoryEnabled); + m_submoduleUpdateAction->setVisible(repositoryEnabled + && QFile::exists(currentState().topLevel() + QLatin1String("/.gitmodules"))); updateRepositoryBrowserAction(); } diff --git a/src/plugins/git/gitplugin.h b/src/plugins/git/gitplugin.h index 1517531cbfb5affacedc86d128719a93f73b24b2..02b8f7903b8c541854a6d84bf23a339d70a01597 100644 --- a/src/plugins/git/gitplugin.h +++ b/src/plugins/git/gitplugin.h @@ -123,6 +123,7 @@ private slots: void gitkForCurrentFolder(); void cleanProject(); void cleanRepository(); + void updateSubmodules(); void applyCurrentFilePatch(); void promptApplyPatch(); void gitClientMemberFuncRepositoryAction(); @@ -204,6 +205,7 @@ private: QAction *m_redoAction; QAction *m_menuAction; QAction *m_repositoryBrowserAction; + QAction *m_submoduleUpdateAction; QVector<Utils::ParameterAction *> m_fileActions; QVector<Utils::ParameterAction *> m_projectActions;