From 4d1bbebf2ad06ba1e3aaf5171addad08be21a6f5 Mon Sep 17 00:00:00 2001
From: Francois Ferrand <thetypz@gmail.com>
Date: Mon, 3 Oct 2011 14:17:03 +0200
Subject: [PATCH] Git: Add customizable repository browser command.

Change-Id: Iac297e3665b18d97ca80097c4dd33dd70e64b9a1
Reviewed-by: Tobias Hunger <tobias.hunger@nokia.com>
---
 src/plugins/git/gitclient.cpp    |  7 ++++++
 src/plugins/git/gitclient.h      |  2 ++
 src/plugins/git/gitplugin.cpp    | 14 ++++++++++++
 src/plugins/git/gitplugin.h      |  2 ++
 src/plugins/git/gitsettings.cpp  |  2 ++
 src/plugins/git/gitsettings.h    |  1 +
 src/plugins/git/settingspage.cpp |  7 ++++++
 src/plugins/git/settingspage.ui  | 38 ++++++++++++++++++++++++++++++++
 8 files changed, 73 insertions(+)

diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp
index 696560a7839..944679aa8ec 100644
--- a/src/plugins/git/gitclient.cpp
+++ b/src/plugins/git/gitclient.cpp
@@ -1605,6 +1605,13 @@ void GitClient::launchGitK(const QString &workingDirectory)
     tryLauchingGitK(env, workingDirectory, foundBinDir.path() + QLatin1String("/bin"), false);
 }
 
+void GitClient::launchRepositoryBrowser(const QString &workingDirectory)
+{
+    const QString repBrowserBinary = settings()->stringValue(GitSettings::repositoryBrowserCmd);
+    if (!repBrowserBinary.isEmpty())
+        QProcess::startDetached(repBrowserBinary, QStringList(workingDirectory), workingDirectory);
+}
+
 bool GitClient::tryLauchingGitK(const QProcessEnvironment &env,
                                 const QString &workingDirectory,
                                 const QString &gitBinDirectory,
diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h
index 00bad95e531..434a860e091 100644
--- a/src/plugins/git/gitclient.h
+++ b/src/plugins/git/gitclient.h
@@ -215,6 +215,8 @@ public:
                            QString *errorMessage = 0, bool *onBranch = 0);
 
     void launchGitK(const QString &workingDirectory);
+    void launchRepositoryBrowser(const QString &workingDirectory);
+
     QStringList synchronousRepositoryBranches(const QString &repositoryURL);
 
     GitSettings *settings() const;
diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp
index b845f4db344..3eec1999d89 100644
--- a/src/plugins/git/gitplugin.cpp
+++ b/src/plugins/git/gitplugin.cpp
@@ -430,6 +430,11 @@ bool GitPlugin::initialize(const QStringList &arguments, QString *errorMessage)
                            tr("Launch gitk"), Core::Id("Git.LaunchGitK"),
                            globalcontext, true, &GitClient::launchGitK);
 
+    m_repositoryBrowserAction
+            = createRepositoryAction(actionManager, gitContainer,
+                                     tr("Launch repository browser"), Core::Id("Git.LaunchRepositoryBrowser"),
+                                     globalcontext, true, &GitClient::launchRepositoryBrowser).first;
+
     createRepositoryAction(actionManager, gitContainer,
                            tr("Branches..."), Core::Id("Git.BranchList"),
                            globalcontext, true, SLOT(branchList()));
@@ -1031,11 +1036,19 @@ void GitPlugin::updateActions(VcsBase::VcsBasePlugin::ActionState as)
 
     foreach (QAction *repositoryAction, m_repositoryActions)
         repositoryAction->setEnabled(repositoryEnabled);
+    updateRepositoryBrowserAction();
 
     // Prompts for repo.
     m_showAction->setEnabled(true);
 }
 
+void GitPlugin::updateRepositoryBrowserAction()
+{
+    const bool repositoryEnabled = currentState().hasTopLevel();
+    const bool hasRepositoryBrowserCmd = !settings().stringValue(GitSettings::repositoryBrowserCmd).isEmpty();
+    m_repositoryBrowserAction->setEnabled(repositoryEnabled && hasRepositoryBrowserCmd);
+}
+
 void GitPlugin::showCommit()
 {
     const VcsBase::VcsBasePluginState state = currentState();
@@ -1070,6 +1083,7 @@ void GitPlugin::setSettings(const GitSettings &s)
     m_settings = s;
     m_gitClient->saveSettings();
     static_cast<GitVersionControl *>(versionControl())->emitConfigurationChanged();
+    updateRepositoryBrowserAction();
 }
 
 GitClient *GitPlugin::gitClient() const
diff --git a/src/plugins/git/gitplugin.h b/src/plugins/git/gitplugin.h
index 75bab4fc58d..9ad5f2c344a 100644
--- a/src/plugins/git/gitplugin.h
+++ b/src/plugins/git/gitplugin.h
@@ -175,6 +175,7 @@ private:
                                            const Core::Context &context,
                                            bool addToLocator, GitClientMemberFunc);
 
+    void updateRepositoryBrowserAction();
     bool isCommitEditorOpen() const;
     Core::IEditor *openSubmitEditor(const QString &fileName, const CommitData &cd, bool amend);
     void cleanCommitMessageFile();
@@ -193,6 +194,7 @@ private:
     QAction *m_undoAction;
     QAction *m_redoAction;
     QAction *m_menuAction;
+    QAction *m_repositoryBrowserAction;
 
     QVector<Utils::ParameterAction *> m_fileActions;
     QVector<Utils::ParameterAction *> m_projectActions;
diff --git a/src/plugins/git/gitsettings.cpp b/src/plugins/git/gitsettings.cpp
index 177d79a270f..095922306c1 100644
--- a/src/plugins/git/gitsettings.cpp
+++ b/src/plugins/git/gitsettings.cpp
@@ -49,6 +49,7 @@ const QLatin1String GitSettings::winSetHomeEnvironmentKey("WinSetHomeEnvironment
 const QLatin1String GitSettings::showPrettyFormatKey("DiffPrettyFormat");
 const QLatin1String GitSettings::gitkOptionsKey("GitKOptions");
 const QLatin1String GitSettings::logDiffKey("LogDiff");
+const QLatin1String GitSettings::repositoryBrowserCmd("RepositoryBrowserCmd");
 
 GitSettings::GitSettings()
 {
@@ -70,6 +71,7 @@ GitSettings::GitSettings()
     declareKey(gitkOptionsKey, QString());
     declareKey(showPrettyFormatKey, 2);
     declareKey(logDiffKey, false);
+    declareKey(repositoryBrowserCmd, QString());
 }
 
 QString GitSettings::gitBinaryPath(bool *ok, QString *errorMessage) const
diff --git a/src/plugins/git/gitsettings.h b/src/plugins/git/gitsettings.h
index e381dd014a7..a6929bd5fd1 100644
--- a/src/plugins/git/gitsettings.h
+++ b/src/plugins/git/gitsettings.h
@@ -56,6 +56,7 @@ public:
     static const QLatin1String showPrettyFormatKey;
     static const QLatin1String gitkOptionsKey;
     static const QLatin1String logDiffKey;
+    static const QLatin1String repositoryBrowserCmd;
 
     QString gitBinaryPath(bool *ok = 0, QString *errorMessage = 0) const;
 
diff --git a/src/plugins/git/settingspage.cpp b/src/plugins/git/settingspage.cpp
index bcb3ecedd37..5c023a33584 100644
--- a/src/plugins/git/settingspage.cpp
+++ b/src/plugins/git/settingspage.cpp
@@ -36,6 +36,7 @@
 #include "gitclient.h"
 
 #include <vcsbase/vcsbaseconstants.h>
+#include <utils/pathchooser.h>
 
 #include <QCoreApplication>
 #include <QDir>
@@ -65,6 +66,8 @@ SettingsPageWidget::SettingsPageWidget(QWidget *parent) :
 #else
     m_ui.winHomeCheckBox->setVisible(false);
 #endif
+    m_ui.repBrowserCommandPathChooser->setExpectedKind(Utils::PathChooser::ExistingCommand);
+    m_ui.repBrowserCommandPathChooser->setPromptDialogTitle(tr("Git Repository Browser Command"));
 }
 
 GitSettings SettingsPageWidget::settings() const
@@ -77,6 +80,7 @@ GitSettings SettingsPageWidget::settings() const
     rc.setValue(GitSettings::promptOnSubmitKey, m_ui.promptToSubmitCheckBox->isChecked());
     rc.setValue(GitSettings::winSetHomeEnvironmentKey, m_ui.winHomeCheckBox->isChecked());
     rc.setValue(GitSettings::gitkOptionsKey, m_ui.gitkOptionsLineEdit->text().trimmed());
+    rc.setValue(GitSettings::repositoryBrowserCmd, m_ui.repBrowserCommandPathChooser->path().trimmed());
     return rc;
 }
 
@@ -89,6 +93,7 @@ void SettingsPageWidget::setSettings(const GitSettings &s)
     m_ui.promptToSubmitCheckBox->setChecked(s.boolValue(GitSettings::promptOnSubmitKey));
     m_ui.winHomeCheckBox->setChecked(s.boolValue(GitSettings::winSetHomeEnvironmentKey));
     m_ui.gitkOptionsLineEdit->setText(s.stringValue(GitSettings::gitkOptionsKey));
+    m_ui.repBrowserCommandPathChooser->setPath(s.stringValue(GitSettings::repositoryBrowserCmd));
 }
 
 QString SettingsPageWidget::searchKeywords() const
@@ -105,6 +110,8 @@ QString SettingsPageWidget::searchKeywords() const
             << sep << m_ui.promptToSubmitCheckBox->text()
             << sep << m_ui.gitkGroupBox->title()
             << sep << m_ui.gitkOptionsLabel->text()
+            << sep << m_ui.repBrowserGroupBox->title()
+            << sep << m_ui.repBrowserCommandLabel->text()
                ;
     rc.remove(QLatin1Char('&'));
     return rc;
diff --git a/src/plugins/git/settingspage.ui b/src/plugins/git/settingspage.ui
index 2453404c749..b12fbe028d3 100644
--- a/src/plugins/git/settingspage.ui
+++ b/src/plugins/git/settingspage.ui
@@ -152,6 +152,32 @@
      </layout>
     </widget>
    </item>
+   <item>
+    <widget class="QGroupBox" name="repBrowserGroupBox">
+     <property name="title">
+      <string>Repository browser</string>
+     </property>
+     <layout class="QHBoxLayout" name="horizontalLayout_2">
+      <item>
+       <widget class="QLabel" name="repBrowserCommandLabel">
+        <property name="text">
+         <string>Command:</string>
+        </property>
+       </widget>
+      </item>
+      <item>
+       <widget class="Utils::PathChooser" name="repBrowserCommandPathChooser" native="true">
+        <property name="sizePolicy">
+         <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+          <horstretch>0</horstretch>
+          <verstretch>0</verstretch>
+         </sizepolicy>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </widget>
+   </item>
    <item>
     <spacer name="verticalSpacer">
      <property name="orientation">
@@ -167,6 +193,18 @@
    </item>
   </layout>
  </widget>
+ <customwidgets>
+  <customwidget>
+   <class>Utils::PathChooser</class>
+   <extends>QWidget</extends>
+   <header location="global">utils/pathchooser.h</header>
+   <container>1</container>
+   <slots>
+    <signal>editingFinished()</signal>
+    <signal>browsingFinished()</signal>
+   </slots>
+  </customwidget>
+ </customwidgets>
  <tabstops>
   <tabstop>pathLineEdit</tabstop>
  </tabstops>
-- 
GitLab