diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 7abe9ea1cb653e2d21fd4b857cfa027e2a98a650..c9128ba4ac7f95c136b33a2a87eeb9e42a21e8b3 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -1141,7 +1141,7 @@ bool GitClient::fullySynchronousGit(const QString &workingDirectory, if (!Utils::SynchronousProcess::readDataFromProcess(process, m_settings.timeoutSeconds * 1000, outputText, errorText, true)) { - *errorText->append(GitCommand::msgTimeout(m_settings.timeoutSeconds).toLocal8Bit()); + errorText->append(GitCommand::msgTimeout(m_settings.timeoutSeconds).toLocal8Bit()); Utils::SynchronousProcess::stopProcess(process); return false; } @@ -1254,6 +1254,45 @@ GitClient::StatusResult GitClient::gitStatus(const QString &workingDirectory, return StatusChanged; } +void GitClient::launchGitK(const QString &workingDirectory) +{ + VCSBase::VCSBaseOutputWindow *outwin = VCSBase::VCSBaseOutputWindow::instance(); + // Locate git in (potentially) custom path. m_binaryPath can be absolute, + // which will be handled correctly. + QTC_ASSERT(!m_binaryPath.isEmpty(), return); + const QString gitBinary = QLatin1String(Constants::GIT_BINARY); + const QProcessEnvironment env = processEnvironment(); + const QString path = env.value(QLatin1String("PATH")); + const QString fullGitBinary = Utils::SynchronousProcess::locateBinary(path, m_binaryPath); + if (fullGitBinary.isEmpty()) { + outwin->appendError(tr("Cannot locate %1.").arg(gitBinary)); + return; + } + const QString gitBinDirectory = QFileInfo(fullGitBinary).absolutePath(); +#ifdef Q_OS_WIN + // Launch 'wish' shell from git binary directory with the gitk located there + const QString binary = gitBinDirectory + QLatin1String("/wish"); + const QStringList arguments(gitBinDirectory + QLatin1String("/gitk")); +#else + // Simple: Run gitk from binary path + const QString binary = gitBinDirectory + QLatin1String("/gitk"); + const QStringList arguments; +#endif + outwin->appendCommand(workingDirectory, binary, arguments); + // This should use QProcess::startDetached ideally, but that does not have + // an environment parameter. + QProcess *process = new QProcess(this); + process->setWorkingDirectory(workingDirectory); + process->setProcessEnvironment(env); + process->start(binary, arguments); + if (!process->waitForStarted()) { + outwin->appendError(tr("Unable to launch %1.").arg(binary)); + delete process; + return; + } + connect(process, SIGNAL(finished(int)), process, SLOT(deleteLater())); +} + bool GitClient::getCommitData(const QString &workingDirectory, QString *commitTemplate, CommitData *d, diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index 21403256d296dfb32188b5792ed17abb8fca88d9..592a6d50ff1932ea94175e5387fb6b318d3d073c 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -203,6 +203,8 @@ public: QString *errorMessage = 0, bool *onBranch = 0); + void launchGitK(const QString &workingDirectory); + GitSettings settings() const; void setSettings(const GitSettings &s); diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index 5b5d09902c44a0821775f07714e5ea8e48c0ff38..119530b8ca86ce6ffaf8845712f3103903a7077d 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -416,6 +416,10 @@ bool GitPlugin::initialize(const QStringList &arguments, QString *errorMessage) tr("Clean Repository..."), QLatin1String("Git.CleanRepository"), globalcontext, true, SLOT(cleanRepository())); + createRepositoryAction(actionManager, gitContainer, + tr("Launch gitk"), QLatin1String("Git.LaunchGitK"), + globalcontext, false, &GitClient::launchGitK); + gitContainer->addAction(createSeparator(actionManager, globalcontext, QLatin1String("Git.Sep.Global"), this)); ActionCommandPair actionCommand =