summaryrefslogtreecommitdiff
path: root/src/plugins/vcsbase/checkoutjobs.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@nokia.com>2009-07-17 17:19:23 +0200
committerFriedemann Kleint <Friedemann.Kleint@nokia.com>2009-07-17 17:19:23 +0200
commit9f14b79cc609c878023b3d00bca0a6c8ce24283f (patch)
tree6fa61a382c0d13e00bf28002963057895f7eccbd /src/plugins/vcsbase/checkoutjobs.cpp
parentb799f32b967b9cb5a91631736ef5f035308beaa8 (diff)
downloadqt-creator-9f14b79cc609c878023b3d00bca0a6c8ce24283f.tar.gz
Add a clone wizard for version control (base classes + git/svn).
Task-number: 244831
Diffstat (limited to 'src/plugins/vcsbase/checkoutjobs.cpp')
-rw-r--r--src/plugins/vcsbase/checkoutjobs.cpp137
1 files changed, 137 insertions, 0 deletions
diff --git a/src/plugins/vcsbase/checkoutjobs.cpp b/src/plugins/vcsbase/checkoutjobs.cpp
new file mode 100644
index 0000000000..1c19bfe7b3
--- /dev/null
+++ b/src/plugins/vcsbase/checkoutjobs.cpp
@@ -0,0 +1,137 @@
+/**************************************************************************
+**
+** This file is part of Qt Creator
+**
+** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+**
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** Commercial Usage
+**
+** Licensees holding valid Qt Commercial licenses may use this file in
+** accordance with the Qt Commercial License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Nokia.
+**
+** GNU Lesser General Public License Usage
+**
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** If you are unsure which license is appropriate for your use, please
+** contact the sales department at http://www.qtsoftware.com/contact.
+**
+**************************************************************************/
+
+#include "checkoutjobs.h"
+
+#include <QtCore/QDebug>
+
+enum { debug = 0 };
+namespace VCSBase {
+
+AbstractCheckoutJob::AbstractCheckoutJob(QObject *parent) :
+ QObject(parent)
+{
+}
+
+struct ProcessCheckoutJobPrivate {
+ ProcessCheckoutJobPrivate(const QString &binary,
+ const QStringList &args,
+ const QString &workingDirectory,
+ const QStringList &env);
+
+ QProcess process;
+ const QString binary;
+ const QStringList args;
+};
+
+ProcessCheckoutJobPrivate::ProcessCheckoutJobPrivate(const QString &b,
+ const QStringList &a,
+ const QString &workingDirectory,
+ const QStringList &env) :
+ binary(b),
+ args(a)
+{
+ if (!workingDirectory.isEmpty())
+ process.setWorkingDirectory(workingDirectory);
+ if (!env.empty())
+ process.setEnvironment(env);
+}
+
+ProcessCheckoutJob::ProcessCheckoutJob(const QString &binary,
+ const QStringList &args,
+ const QString &workingDirectory,
+ const QStringList &env,
+ QObject *parent) :
+ AbstractCheckoutJob(parent),
+ d(new ProcessCheckoutJobPrivate(binary, args, workingDirectory, env))
+{
+ if (debug)
+ qDebug() << "ProcessCheckoutJob" << binary << args << workingDirectory;
+ connect(&d->process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(slotError(QProcess::ProcessError)));
+ connect(&d->process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(slotFinished(int,QProcess::ExitStatus)));
+ connect(&d->process, SIGNAL(readyReadStandardOutput()), this, SLOT(slotOutput()));
+ d->process.setProcessChannelMode(QProcess::MergedChannels);
+ d->process.closeWriteChannel();
+}
+
+ProcessCheckoutJob::~ProcessCheckoutJob()
+{
+ delete d;
+}
+
+void ProcessCheckoutJob::slotOutput()
+{
+ const QString s = QString::fromLocal8Bit(d->process.readAllStandardOutput());
+ if (debug)
+ qDebug() << s;
+ emit output(s);
+}
+
+void ProcessCheckoutJob::slotError(QProcess::ProcessError /* error */)
+{
+ emit failed(d->process.errorString());
+}
+
+void ProcessCheckoutJob::slotFinished (int exitCode, QProcess::ExitStatus exitStatus)
+{
+ if (debug)
+ qDebug() << "finished" << exitCode << exitStatus;
+
+ switch (exitStatus) {
+ case QProcess::NormalExit:
+ emit output(tr("The process terminated with exit code %1.").arg(exitCode));
+ if (exitCode == 0) {
+ emit succeeded();
+ } else {
+ emit failed(tr("The process returned exit code %1.").arg(exitCode));
+ }
+ break;
+ case QProcess::CrashExit:
+ emit failed(tr("The process terminated in an abnormal way."));
+ break;
+ }
+}
+
+void ProcessCheckoutJob::start()
+{
+ d->process.start(d->binary, d->args);
+}
+
+void ProcessCheckoutJob::cancel()
+{
+ if (debug)
+ qDebug() << "ProcessCheckoutJob::start";
+
+ emit output(tr("Stopping..."));
+ d->process.terminate();
+ if (!d->process.waitForFinished(5000))
+ d->process.kill();
+}
+
+} // namespace VCSBase