From 1b1d97f9ed63f72fe0d559e356440fa00635e5ea Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 5 May 2015 13:03:43 +0200 Subject: Vcs: Make VcsCommandPage available to JsonWizards Add a page to run checkout commands with. Change-Id: I4c6a6f662c3dfa19fd8f837934e8173412ee6f36 Reviewed-by: Orgad Shaneh --- src/plugins/vcsbase/wizard/vcscommandpage.cpp | 257 ++++++++++++++++++++++++++ 1 file changed, 257 insertions(+) create mode 100644 src/plugins/vcsbase/wizard/vcscommandpage.cpp (limited to 'src/plugins/vcsbase/wizard/vcscommandpage.cpp') diff --git a/src/plugins/vcsbase/wizard/vcscommandpage.cpp b/src/plugins/vcsbase/wizard/vcscommandpage.cpp new file mode 100644 index 0000000000..0ab6fa3e1a --- /dev/null +++ b/src/plugins/vcsbase/wizard/vcscommandpage.cpp @@ -0,0 +1,257 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms and +** conditions see http://www.qt.io/terms-conditions. For further information +** use the contact form at http://www.qt.io/contact-us. +** +** 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 or version 3 as published by the Free +** Software Foundation and appearing in the file LICENSE.LGPLv21 and +** LICENSE.LGPLv3 included in the packaging of this file. Please review the +** following information to ensure the GNU Lesser General Public License +** requirements will be met: https://www.gnu.org/licenses/lgpl.html and +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, The Qt Company gives you certain additional +** rights. These rights are described in The Qt Company LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#include "vcscommandpage.h" + +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +using namespace Core; +using namespace ProjectExplorer; + +namespace VcsBase { +namespace Internal { + +static char VCSCOMMAND_VCSID[] = "vcsId"; +static char VCSCOMMAND_RUN_MESSAGE[] = "trRunMessage"; +static char VCSCOMMAND_REPO[] = "repository"; +static char VCSCOMMAND_DIR[] = "baseDirectory"; +static char VCSCOMMAND_EXTRA_ARGS[] = "extraArguments"; +static char VCSCOMMAND_CHECKOUTNAME[] = "checkoutName"; + +// ---------------------------------------------------------------------- +// VcsCommandPageFactory: +// ---------------------------------------------------------------------- + +VcsCommandPageFactory::VcsCommandPageFactory() +{ + setTypeIdsSuffix(QLatin1String("VcsCommand")); +} + +Utils::WizardPage *VcsCommandPageFactory::create(JsonWizard *wizard, Id typeId, + const QVariant &data) +{ + Q_UNUSED(wizard); + + QTC_ASSERT(canCreate(typeId), return 0); + + QVariantMap tmp = data.toMap(); + + auto page = new VcsCommandPage; + page->setVersionControlId(tmp.value(QLatin1String(VCSCOMMAND_VCSID)).toString()); + page->setRunMessage(tmp.value(QLatin1String(VCSCOMMAND_RUN_MESSAGE)).toString()); + + QStringList args; + const QVariant argsVar = tmp.value(QLatin1String(VCSCOMMAND_EXTRA_ARGS)); + if (!argsVar.isNull()) { + if (argsVar.type() == QVariant::String) { + args << argsVar.toString(); + } else if (argsVar.type() == QVariant::List) { + args = Utils::transform(argsVar.toList(), [](const QVariant &in) { + return in.toString(); + }); + } else { + return 0; + } + } + + page->setCheckoutData(tmp.value(QLatin1String(VCSCOMMAND_REPO)).toString(), + tmp.value(QLatin1String(VCSCOMMAND_DIR)).toString(), + tmp.value(QLatin1String(VCSCOMMAND_CHECKOUTNAME)).toString(), + args); + + return page; +} + +bool VcsCommandPageFactory::validateData(Id typeId, const QVariant &data, QString *errorMessage) +{ + QTC_ASSERT(canCreate(typeId), return false); + + QString em; + if (data.type() != QVariant::Map) + em = tr("\"data\" is no json object in \"VcsCommand\" page."); + + if (em.isEmpty()) { + const QVariantMap tmp = data.toMap(); + + QString str = tmp.value(QLatin1String(VCSCOMMAND_VCSID)).toString(); + if (str.isEmpty()) { + em = tr("\"%1\" not set in \"data\" section of \"VcsCommand\" page.") + .arg(QLatin1String(VCSCOMMAND_VCSID)); + } + str = tmp.value(QLatin1String(VCSCOMMAND_REPO)).toString(); + if (str.isEmpty()) { + em = tr("\"%1\" not set in \"data\" section of \"VcsCommand\" page.") + .arg(QLatin1String(VCSCOMMAND_REPO)); + } + str = tmp.value(QLatin1String(VCSCOMMAND_DIR)).toString(); + if (str.isEmpty()) { + em = tr("\"%1\" not set in \"data\" section of \"VcsCommand\" page.") + .arg(QLatin1String(VCSCOMMAND_DIR));; + } + str = tmp.value(QLatin1String(VCSCOMMAND_CHECKOUTNAME)).toString(); + if (str.isEmpty()) { + em = tr("\"%1\" not set in \"data\" section of \"VcsCommand\" page.") + .arg(QLatin1String(VCSCOMMAND_CHECKOUTNAME)); + } + + str = tmp.value(QLatin1String(VCSCOMMAND_RUN_MESSAGE)).toString(); + if (str.isEmpty()) { + em = tr("\"%1\" not set in \"data\" section of \"VcsCommand\" page.") + .arg(QLatin1String(VCSCOMMAND_RUN_MESSAGE)); + } + + const QVariant extra = tmp.value(QLatin1String(VCSCOMMAND_EXTRA_ARGS)); + if (!extra.isNull() && extra.type() != QVariant::String && extra.type() != QVariant::List) { + em = tr("\"%1\" in \"data\" section of \"VcsCommand\" page has unexpected type (unset, String or List).") + .arg(QLatin1String(VCSCOMMAND_EXTRA_ARGS)); + } + } + + if (errorMessage) + *errorMessage = em; + + return em.isEmpty(); +} + +// ---------------------------------------------------------------------- +// VcsCommandPage: +// ---------------------------------------------------------------------- + +VcsCommandPage::VcsCommandPage() +{ + setTitle(tr("Checkout")); +} + +void VcsCommandPage::initializePage() +{ + auto wiz = qobject_cast(wizard()); + QTC_ASSERT(wiz, return); + + const QString vcsId = wiz->expander()->expand(m_vcsId); + IVersionControl *vc = VcsManager::versionControl(Id::fromString(vcsId)); + if (!vc) { + qWarning() << QCoreApplication::translate("VcsBase::VcsCommandPage", + "\"%1\" (%2) not found.") + .arg(QLatin1String(VCSCOMMAND_VCSID), vcsId); + return; + } + if (!vc->isConfigured()) { + qWarning() << QCoreApplication::translate("VcsBase::VcsCommandPage", + "Version control \"%1\" is not configured.") + .arg(vcsId); + return; + } + if (!vc->supportsOperation(IVersionControl::InitialCheckoutOperation)) { + qWarning() << QCoreApplication::translate("VcsBase::VcsCommandPage", + "Version control \"%1\" does not support initial checkouts.") + .arg(vcsId); + return; + } + + const QString repo = wiz->expander()->expand(m_repository); + if (repo.isEmpty()) { + qWarning() << QCoreApplication::translate("VcsBase::VcsCommandPage", + "\"%1\" is empty when trying to run checkout.") + .arg(QLatin1String(VCSCOMMAND_REPO)); + return; + } + + const QString base = wiz->expander()->expand(m_directory); + if (!QDir(base).exists()) { + qWarning() << QCoreApplication::translate("VcsBase::VcsCommandPage", + "\"%1\" (%2) does not exist.") + .arg(QLatin1String(VCSCOMMAND_DIR), base); + return; + } + + const QString name = wiz->expander()->expand(m_name); + if (name.isEmpty()) { + qWarning() << QCoreApplication::translate("VcsBase::VcsCommandPage", + "\"%1\" is empty when trying to run checkout.") + .arg(QLatin1String(VCSCOMMAND_CHECKOUTNAME)); + return; + } + + const QString runMessage = wiz->expander()->expand(m_runMessage); + if (!runMessage.isEmpty()) + setStartedStatus(runMessage); + + QStringList extraArgs; + foreach (const QString &in, m_arguments) { + const QString tmp = wiz->expander()->expand(in); + if (tmp.isEmpty()) + continue; + if (tmp == QStringLiteral("\"\"")) + extraArgs << QString(); + extraArgs << tmp; + } + + ShellCommand *command + = vc->createInitialCheckoutCommand(repo, Utils::FileName::fromString(base), + name, extraArgs); + start(command); +} + +void VcsCommandPage::setCheckoutData(const QString &repo, const QString &baseDir, const QString &name, + const QStringList &args) +{ + m_repository = repo; + m_directory = baseDir; + m_name = name; + m_arguments = args; +} + +void VcsCommandPage::appendJob(bool skip, const QStringList &command) +{ + m_additionalJobs.append(JobData(skip, command)); +} + +void VcsCommandPage::setVersionControlId(const QString &id) +{ + m_vcsId = id; +} + +void VcsCommandPage::setRunMessage(const QString &msg) +{ + m_runMessage = msg; +} + +} // namespace Internal +} // namespace VcsBase -- cgit v1.2.3