From ecf48086de63dc767b37f5a63faf0e6b438c5641 Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Fri, 30 Oct 2009 17:40:33 +0100
Subject: [PATCH] Checkout wizard: Hangs on Windows when VCS binary is missing.

due to StartFailed being emitted from start(). Set state correctly,
improve error reporting.
Reviewed-by: con <qtc-commiter@nokia.com>
---
 src/plugins/vcsbase/checkoutjobs.cpp               | 11 +++++++++--
 src/plugins/vcsbase/checkoutprogresswizardpage.cpp |  7 ++++---
 src/plugins/vcsbase/checkoutwizarddialog.cpp       |  2 +-
 3 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/src/plugins/vcsbase/checkoutjobs.cpp b/src/plugins/vcsbase/checkoutjobs.cpp
index 7a419a00982..257068d5b50 100644
--- a/src/plugins/vcsbase/checkoutjobs.cpp
+++ b/src/plugins/vcsbase/checkoutjobs.cpp
@@ -94,9 +94,16 @@ void ProcessCheckoutJob::slotOutput()
     emit output(s);
 }
 
-void ProcessCheckoutJob::slotError(QProcess::ProcessError /* error */)
+void ProcessCheckoutJob::slotError(QProcess::ProcessError error)
 {
-    emit failed(d->process.errorString());
+    switch (error) {
+    case QProcess::FailedToStart:
+        emit failed(tr("Unable to start %1: %2").arg(d->binary, d->process.errorString()));
+        break;
+    default:
+        emit failed(d->process.errorString());
+        break;
+    }
 }
 
 void ProcessCheckoutJob::slotFinished (int exitCode, QProcess::ExitStatus exitStatus)
diff --git a/src/plugins/vcsbase/checkoutprogresswizardpage.cpp b/src/plugins/vcsbase/checkoutprogresswizardpage.cpp
index 6af15fb0f8b..8fcaef51fc3 100644
--- a/src/plugins/vcsbase/checkoutprogresswizardpage.cpp
+++ b/src/plugins/vcsbase/checkoutprogresswizardpage.cpp
@@ -63,10 +63,11 @@ void CheckoutProgressWizardPage::start(const QSharedPointer<AbstractCheckoutJob>
     connect(job.data(), SIGNAL(succeeded()), this, SLOT(slotSucceeded()));
     QApplication::setOverrideCursor(Qt::WaitCursor);
     ui->logPlainTextEdit->clear();
-    setSubTitle(tr("Checkout started..."));
-    job->start();
+    setSubTitle(tr("Checkout started..."));    
     m_state = Running;
-
+    // Note: Process jobs can emit failed() right from
+    // the start() method on Windows.
+    job->start();
 }
 
 void CheckoutProgressWizardPage::slotFailed(const QString &why)
diff --git a/src/plugins/vcsbase/checkoutwizarddialog.cpp b/src/plugins/vcsbase/checkoutwizarddialog.cpp
index 9cb5a6a45e8..36b9c271ee0 100644
--- a/src/plugins/vcsbase/checkoutwizarddialog.cpp
+++ b/src/plugins/vcsbase/checkoutwizarddialog.cpp
@@ -70,9 +70,9 @@ void CheckoutWizardDialog::slotTerminated(bool success)
 
 void CheckoutWizardDialog::start(const QSharedPointer<AbstractCheckoutJob> &job)
 {
-    m_progressPage->start(job);
     // No "back" available while running.
     button(QWizard::BackButton)->setEnabled(false);
+    m_progressPage->start(job);
 }
 
 void CheckoutWizardDialog::reject()
-- 
GitLab