diff options
Diffstat (limited to 'src/plugins/git/gitplugin.cpp')
-rw-r--r-- | src/plugins/git/gitplugin.cpp | 90 |
1 files changed, 53 insertions, 37 deletions
diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index dfaeb44f45..aa1d36d13b 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -48,9 +48,7 @@ #include <coreplugin/actionmanager/actionmanager.h> #include <coreplugin/actionmanager/actioncontainer.h> #include <coreplugin/actionmanager/command.h> -#include <coreplugin/id.h> #include <coreplugin/idocument.h> -#include <coreplugin/infobar.h> #include <coreplugin/editormanager/editormanager.h> #include <coreplugin/editormanager/ieditor.h> #include <coreplugin/locator/commandlocator.h> @@ -60,12 +58,14 @@ #include <coreplugin/vcsmanager.h> #include <aggregation/aggregate.h> + +#include <texteditor/texteditor.h> +#include <utils/infobar.h> #include <utils/parameteraction.h> #include <utils/pathchooser.h> #include <utils/qtcassert.h> #include <utils/stringutils.h> #include <utils/utilsicons.h> -#include <texteditor/texteditor.h> #include <vcsbase/basevcseditorfactory.h> #include <vcsbase/submitfilemodel.h> @@ -103,7 +103,7 @@ using namespace std::placeholders; namespace Git { namespace Internal { -using GitClientMemberFunc = void (GitClient::*)(const QString &); +using GitClientMemberFunc = void (GitClient::*)(const QString &) const; class GitTopicCache : public Core::IVersionControl::TopicCache { @@ -233,7 +233,7 @@ public: // IVersionControl QString displayName() const final; - Core::Id id() const final; + Utils::Id id() const final; bool isVcsFileOrDirectory(const Utils::FilePath &fileName) const final; @@ -249,7 +249,8 @@ public: bool vcsMove(const QString &from, const QString &to) final; bool vcsCreateRepository(const QString &directory) final; - bool vcsAnnotate(const QString &file, int line) final; + void vcsAnnotate(const QString &file, int line) final; + void vcsDescribe(const QString &source, const QString &id) final { m_gitClient.show(source, id); }; QString vcsTopic(const QString &directory) final; Core::ShellCommand *createInitialCheckoutCommand(const QString &url, @@ -264,11 +265,20 @@ public: menu->addAction(tr("&Copy \"%1\"").arg(reference), [reference] { QApplication::clipboard()->setText(reference); }); QAction *action = menu->addAction(tr("&Describe Change %1").arg(reference), - [=] { describe(workingDirectory, reference); }); + [=] { vcsDescribe(workingDirectory, reference); }); menu->setDefaultAction(action); GitClient::addChangeActions(menu, workingDirectory, reference); } + bool handleLink(const QString &workingDirectory, const QString &reference) final + { + if (reference.contains("..")) + GitClient::instance()->log(workingDirectory, {}, false, {reference}); + else + GitClient::instance()->show(workingDirectory, reference); + return true; + } + RepoUrl getRepoUrl(const QString &location) const override; QStringList additionalToolsPath() const final; @@ -297,12 +307,13 @@ public: void resetRepository(); void recoverDeletedFiles(); void startRebase(); - void startChangeRelatedAction(const Core::Id &id); + void startChangeRelatedAction(const Utils::Id &id); void stageFile(); void unstageFile(); void gitkForCurrentFile(); void gitkForCurrentFolder(); void gitGui(); + void gitBash(); void cleanProject(); void cleanRepository(); void updateSubmodules(); @@ -323,37 +334,37 @@ public: void updateContinueAndAbortCommands(); void delayedPushToGerrit(); - Core::Command *createCommand(QAction *action, Core::ActionContainer *ac, Core::Id id, + Core::Command *createCommand(QAction *action, Core::ActionContainer *ac, Utils::Id id, const Core::Context &context, bool addToLocator, const std::function<void()> &callback, const QKeySequence &keys); Utils::ParameterAction *createParameterAction(Core::ActionContainer *ac, const QString &defaultText, const QString ¶meterText, - Core::Id id, const Core::Context &context, bool addToLocator, + Utils::Id id, const Core::Context &context, bool addToLocator, const std::function<void()> &callback, const QKeySequence &keys = QKeySequence()); QAction *createFileAction(Core::ActionContainer *ac, const QString &defaultText, const QString ¶meterText, - Core::Id id, const Core::Context &context, bool addToLocator, + Utils::Id id, const Core::Context &context, bool addToLocator, const std::function<void()> &callback, const QKeySequence &keys = QKeySequence()); QAction *createProjectAction(Core::ActionContainer *ac, const QString &defaultText, const QString ¶meterText, - Core::Id id, const Core::Context &context, bool addToLocator, + Utils::Id id, const Core::Context &context, bool addToLocator, void (GitPluginPrivate::*func)(), const QKeySequence &keys = QKeySequence()); - QAction *createRepositoryAction(Core::ActionContainer *ac, const QString &text, Core::Id id, + QAction *createRepositoryAction(Core::ActionContainer *ac, const QString &text, Utils::Id id, const Core::Context &context, bool addToLocator, const std::function<void()> &callback, const QKeySequence &keys = QKeySequence()); - QAction *createRepositoryAction(Core::ActionContainer *ac, const QString &text, Core::Id id, + QAction *createRepositoryAction(Core::ActionContainer *ac, const QString &text, Utils::Id id, const Core::Context &context, bool addToLocator, GitClientMemberFunc, const QKeySequence &keys = QKeySequence()); - QAction *createChangeRelatedRepositoryAction(const QString &text, Core::Id id, + QAction *createChangeRelatedRepositoryAction(const QString &text, Utils::Id id, const Core::Context &context); void updateRepositoryBrowserAction(); @@ -365,7 +376,6 @@ public: void onApplySettings();; - void describe(const QString &source, const QString &id) { m_gitClient.show(source, id); }; Core::CommandLocator *m_commandLocator = nullptr; @@ -406,37 +416,37 @@ public: VcsEditorFactory svnLogEditorFactory { &svnLogEditorParameters, [] { return new GitEditorWidget; }, - std::bind(&GitPluginPrivate::describe, this, _1, _2) + std::bind(&GitPluginPrivate::vcsDescribe, this, _1, _2) }; VcsEditorFactory logEditorFactory { &logEditorParameters, [] { return new GitLogEditorWidgetT<GitEditorWidget>; }, - std::bind(&GitPluginPrivate::describe, this, _1, _2) + std::bind(&GitPluginPrivate::vcsDescribe, this, _1, _2) }; VcsEditorFactory reflogEditorFactory { &reflogEditorParameters, [] { return new GitLogEditorWidgetT<GitReflogEditorWidget>; }, - std::bind(&GitPluginPrivate::describe, this, _1, _2) + std::bind(&GitPluginPrivate::vcsDescribe, this, _1, _2) }; VcsEditorFactory blameEditorFactory { &blameEditorParameters, [] { return new GitEditorWidget; }, - std::bind(&GitPluginPrivate::describe, this, _1, _2) + std::bind(&GitPluginPrivate::vcsDescribe, this, _1, _2) }; VcsEditorFactory commitTextEditorFactory { &commitTextEditorParameters, [] { return new GitEditorWidget; }, - std::bind(&GitPluginPrivate::describe, this, _1, _2) + std::bind(&GitPluginPrivate::vcsDescribe, this, _1, _2) }; VcsEditorFactory rebaseEditorFactory { &rebaseEditorParameters, [] { return new GitEditorWidget; }, - std::bind(&GitPluginPrivate::describe, this, _1, _2) + std::bind(&GitPluginPrivate::vcsDescribe, this, _1, _2) }; VcsSubmitEditorFactory submitEditorFactory { @@ -962,6 +972,14 @@ GitPluginPrivate::GitPluginPrivate() = createRepositoryAction(gitToolsMenu, tr("Merge Tool"), "Git.MergeTool", context, true, std::bind(&GitPluginPrivate::startMergeTool, this)); + // -------------- + if (Utils::HostOsInfo::isWindowsHost()) { + gitToolsMenu->addSeparator(context); + + createRepositoryAction(gitToolsMenu, tr("Git Bash"), "Git.GitBash", + context, true, std::bind(&GitPluginPrivate::gitBash, this)); + } + /* \"Git Tools" menu */ // -------------- @@ -991,16 +1009,6 @@ GitPluginPrivate::GitPluginPrivate() m_gerritPlugin->updateActions(currentState()); m_gerritPlugin->addToLocator(m_commandLocator); - connect(VcsOutputWindow::instance(), &VcsOutputWindow::referenceClicked, - this, [this](const QString &name) { - const VcsBasePluginState state = currentState(); - QTC_ASSERT(state.hasTopLevel(), return); - if (name.contains("..")) - m_gitClient.log(state.topLevel(), {}, false, {name}); - else - m_gitClient.show(state.topLevel(), name); - }); - } void GitPluginPrivate::diffCurrentFile() @@ -1201,7 +1209,9 @@ void GitPluginPrivate::startChangeRelatedAction(const Id &id) if (dialog.command() == Show) { m_gitClient.show(workingDirectory, change); return; - } else if (dialog.command() == Archive) { + } + + if (dialog.command() == Archive) { m_gitClient.archive(workingDirectory, change); return; } @@ -1282,6 +1292,13 @@ void GitPluginPrivate::gitGui() m_gitClient.launchGitGui(state.topLevel()); } +void GitPluginPrivate::gitBash() +{ + const VcsBasePluginState state = currentState(); + QTC_ASSERT(state.hasTopLevel(), return); + m_gitClient.launchGitBash(state.topLevel()); +} + void GitPluginPrivate::startCommit(CommitType commitType) { if (!promptBeforeCommit()) @@ -1794,9 +1811,9 @@ QString GitPluginPrivate::displayName() const return QLatin1String("Git"); } -Core::Id GitPluginPrivate::id() const +Utils::Id GitPluginPrivate::id() const { - return Core::Id(VcsBase::Constants::VCS_ID_GIT); + return Utils::Id(VcsBase::Constants::VCS_ID_GIT); } bool GitPluginPrivate::isVcsFileOrDirectory(const Utils::FilePath &fileName) const @@ -1919,11 +1936,10 @@ QStringList GitPluginPrivate::unmanagedFiles(const QString &workingDir, return m_gitClient.unmanagedFiles(workingDir, filePaths); } -bool GitPluginPrivate::vcsAnnotate(const QString &file, int line) +void GitPluginPrivate::vcsAnnotate(const QString &file, int line) { const QFileInfo fi(file); m_gitClient.annotate(fi.absolutePath(), fi.fileName(), QString(), line); - return true; } void GitPlugin::emitFilesChanged(const QStringList &l) |