aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/vcsbase/vcsbaseplugin.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <[email protected]>2010-05-21 17:46:00 +0200
committerFriedemann Kleint <[email protected]>2010-05-21 17:46:00 +0200
commit5364f5c152a2cdbcdb3abb1b80b658474e081411 (patch)
tree3306f8665c8ce1149cbf65a75acac00599752d29 /src/plugins/vcsbase/vcsbaseplugin.cpp
parent91c4b0305c0d36da4d959d1be744ee61863b4642 (diff)
VCS: Show message box on timeouts/Add SSH prompt.
- Use message boxes on timeouts. - Add a configuration for a graphical SSH password prompt binary with defaults - Launch commands that require authentification with no terminal on UNIX and environment variable SSH_ASKPASS set accordingly. - First attempt at introduce a common function to synchronously run VCS commands in base plugin with flags. - Use standard execution log entries in all VCS plugins (outputwindow).
Diffstat (limited to 'src/plugins/vcsbase/vcsbaseplugin.cpp')
-rw-r--r--src/plugins/vcsbase/vcsbaseplugin.cpp117
1 files changed, 116 insertions, 1 deletions
diff --git a/src/plugins/vcsbase/vcsbaseplugin.cpp b/src/plugins/vcsbase/vcsbaseplugin.cpp
index 7b1c3f40c1c..6f5d24c48f1 100644
--- a/src/plugins/vcsbase/vcsbaseplugin.cpp
+++ b/src/plugins/vcsbase/vcsbaseplugin.cpp
@@ -30,6 +30,7 @@
#include "vcsbaseplugin.h"
#include "vcsbasesubmiteditor.h"
#include "vcsplugin.h"
+#include "commonvcssettings.h"
#include "vcsbaseoutputwindow.h"
#include "corelistener.h"
@@ -43,18 +44,22 @@
#include <projectexplorer/projectexplorer.h>
#include <projectexplorer/project.h>
#include <utils/qtcassert.h>
+#include <utils/synchronousprocess.h>
#include <QtCore/QDebug>
#include <QtCore/QDir>
#include <QtCore/QSharedData>
#include <QtCore/QScopedPointer>
+#include <QtCore/QProcessEnvironment>
+#include <QtCore/QTextStream>
+#include <QtCore/QTextCodec>
#include <QtGui/QAction>
#include <QtGui/QMessageBox>
#include <QtGui/QFileDialog>
#include <QtGui/QMainWindow>
-enum { debug = 0, debugRepositorySearch = 0 };
+enum { debug = 0, debugRepositorySearch = 0, debugExecution = 0 };
namespace VCSBase {
@@ -670,6 +675,116 @@ QString VCSBasePlugin::findRepositoryForDirectory(const QString &dirS,
return QString();
}
+// Is SSH prompt configured?
+static inline QString sshPrompt()
+{
+ return VCSBase::Internal::VCSPlugin::instance()->settings().sshPasswordPrompt;
+}
+
+bool VCSBasePlugin::isSshPromptConfigured()
+{
+ return !sshPrompt().isEmpty();
+}
+
+void VCSBasePlugin::setProcessEnvironment(QProcessEnvironment *e)
+{
+ e->insert(QLatin1String("LANG"), QString(QLatin1Char('C')));
+ const QString sshPromptBinary = sshPrompt();
+ if (!sshPromptBinary.isEmpty())
+ e->insert(QLatin1String("SSH_ASKPASS"), sshPromptBinary);
+}
+
+Utils::SynchronousProcessResponse
+ VCSBasePlugin::runVCS(const QString &workingDir,
+ const QString &binary,
+ const QStringList &arguments,
+ int timeOutMS,
+ unsigned flags,
+ QTextCodec *outputCodec /* = 0 */)
+{
+ const QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
+ return runVCS(workingDir, binary, arguments, timeOutMS, env,
+ flags, outputCodec);
+}
+
+Utils::SynchronousProcessResponse
+ VCSBasePlugin::runVCS(const QString &workingDir,
+ const QString &binary,
+ const QStringList &arguments,
+ int timeOutMS,
+ QProcessEnvironment env,
+ unsigned flags,
+ QTextCodec *outputCodec /* = 0 */)
+{
+ VCSBase::VCSBaseOutputWindow *outputWindow = VCSBase::VCSBaseOutputWindow::instance();
+
+ if (!(flags & SuppressCommandLogging))
+ outputWindow->appendCommand(workingDir, binary, arguments);
+
+ const bool sshPromptConfigured = VCSBasePlugin::isSshPromptConfigured();
+ if (debugExecution) {
+ QDebug nsp = qDebug().nospace();
+ nsp << "VCSBasePlugin::runVCS" << workingDir << binary << arguments
+ << timeOutMS;
+ if (flags & ShowStdOutInLogWindow)
+ nsp << "stdout";
+ if (flags & SuppressStdErrInLogWindow)
+ nsp << "suppress_stderr";
+ if (flags & SuppressFailMessageInLogWindow)
+ nsp << "suppress_fail_msg";
+ if (flags & MergeOutputChannels)
+ nsp << "merge_channels";
+ if (flags & SshPasswordPrompt)
+ nsp << "ssh (" << sshPromptConfigured << ')';
+ if (flags & SuppressCommandLogging)
+ nsp << "suppress_log";
+ if (outputCodec)
+ nsp << " Codec: " << outputCodec->name();
+ }
+
+ // Run, connect stderr to the output window
+ Utils::SynchronousProcess process;
+ if (!workingDir.isEmpty())
+ process.setWorkingDirectory(workingDir);
+
+ VCSBase::VCSBasePlugin::setProcessEnvironment(&env);
+ process.setProcessEnvironment(env);
+ process.setTimeout(timeOutMS);
+ if (outputCodec)
+ process.setStdOutCodec(outputCodec);
+
+ // Suppress terminal on UNIX for ssh prompts if it is configured.
+ if (sshPromptConfigured && (flags & SshPasswordPrompt))
+ process.setFlags(Utils::SynchronousProcess::UnixTerminalDisabled);
+
+ // connect stderr to the output window if desired
+ if (flags & MergeOutputChannels) {
+ process.setProcessChannelMode(QProcess::MergedChannels);
+ } else {
+ if (!(flags & SuppressStdErrInLogWindow)) {
+ process.setStdErrBufferedSignalsEnabled(true);
+ connect(&process, SIGNAL(stdErrBuffered(QString,bool)), outputWindow, SLOT(append(QString)));
+ }
+ }
+
+ // connect stdout to the output window if desired
+ if (flags & ShowStdOutInLogWindow) {
+ process.setStdOutBufferedSignalsEnabled(true);
+ connect(&process, SIGNAL(stdOutBuffered(QString,bool)), outputWindow, SLOT(append(QString)));
+ }
+
+ process.setTimeOutMessageBoxEnabled(true);
+
+ // Run!
+ const Utils::SynchronousProcessResponse sp_resp = process.run(binary, arguments);
+
+ // Fail message?
+ if (sp_resp.result != Utils::SynchronousProcessResponse::Finished &&
+ (!(flags & SuppressFailMessageInLogWindow)))
+ outputWindow->appendError(sp_resp.exitMessage(binary, timeOutMS));
+
+ return sp_resp;
+}
} // namespace VCSBase
#include "vcsbaseplugin.moc"