- Support running snapcraft projects from the IDE

- Patch RunControlFactories to disable unwanted RC modes for snapcraft projects
This commit is contained in:
Benjamin Zeller
2016-11-07 11:48:52 +01:00
parent d9f263725a
commit bc1ee38618
27 changed files with 1048 additions and 146 deletions

View File

@@ -1,6 +1,8 @@
--- a/dist/qtcreator/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp Index: ubuntu-sdk-ide/dist/qtcreator/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp
+++ b/dist/qtcreator/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp ===================================================================
@@ -165,10 +165,10 @@ --- ubuntu-sdk-ide.orig/dist/qtcreator/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp
+++ ubuntu-sdk-ide/dist/qtcreator/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp
@@ -165,10 +165,10 @@ void CMakeManager::createXmlFile(Utils::
proc->setWorkingDirectory(buildDirectoryPath); proc->setWorkingDirectory(buildDirectoryPath);
proc->setEnvironment(env); proc->setEnvironment(env);
@@ -14,9 +16,11 @@
Utils::QtcProcess::addArgs(&args, arguments); Utils::QtcProcess::addArgs(&args, arguments);
proc->setCommand(executable, args); proc->setCommand(executable, args);
--- a/dist/qtcreator/src/plugins/qmlprojectmanager/qmlproject.cpp Index: ubuntu-sdk-ide/dist/qtcreator/src/plugins/qmlprojectmanager/qmlproject.cpp
+++ b/dist/qtcreator/src/plugins/qmlprojectmanager/qmlproject.cpp ===================================================================
@@ -288,9 +288,10 @@ --- ubuntu-sdk-ide.orig/dist/qtcreator/src/plugins/qmlprojectmanager/qmlproject.cpp
+++ ubuntu-sdk-ide/dist/qtcreator/src/plugins/qmlprojectmanager/qmlproject.cpp
@@ -288,9 +288,10 @@ Internal::Manager *QmlProject::projectMa
bool QmlProject::supportsKit(Kit *k, QString *errorMessage) const bool QmlProject::supportsKit(Kit *k, QString *errorMessage) const
{ {
Id deviceType = DeviceTypeKitInformation::deviceTypeId(k); Id deviceType = DeviceTypeKitInformation::deviceTypeId(k);
@@ -29,9 +33,11 @@
return false; return false;
} }
--- a/dist/qtcreator/src/plugins/qmakeprojectmanager/qmakenodes.cpp Index: ubuntu-sdk-ide/dist/qtcreator/src/plugins/qmakeprojectmanager/qmakenodes.cpp
+++ b/dist/qtcreator/src/plugins/qmakeprojectmanager/qmakenodes.cpp ===================================================================
@@ -2024,6 +2024,7 @@ --- ubuntu-sdk-ide.orig/dist/qtcreator/src/plugins/qmakeprojectmanager/qmakenodes.cpp
+++ ubuntu-sdk-ide/dist/qtcreator/src/plugins/qmakeprojectmanager/qmakenodes.cpp
@@ -2024,6 +2024,7 @@ EvalResult *QmakeProFileNode::evaluate(c
result->newVarValues[AndroidExtraLibs] = input.readerExact->values(QLatin1String("ANDROID_EXTRA_LIBS")); result->newVarValues[AndroidExtraLibs] = input.readerExact->values(QLatin1String("ANDROID_EXTRA_LIBS"));
result->newVarValues[IsoIconsVar] = input.readerExact->values(QLatin1String("ISO_ICONS")); result->newVarValues[IsoIconsVar] = input.readerExact->values(QLatin1String("ISO_ICONS"));
result->newVarValues[QmakeProjectName] = input.readerExact->values(QLatin1String("QMAKE_PROJECT_NAME")); result->newVarValues[QmakeProjectName] = input.readerExact->values(QLatin1String("QMAKE_PROJECT_NAME"));
@@ -39,9 +45,11 @@
result->isDeployable = false; result->isDeployable = false;
if (result->projectType == ApplicationTemplate) { if (result->projectType == ApplicationTemplate) {
--- a/dist/qtcreator/src/plugins/qmakeprojectmanager/qmakenodes.h Index: ubuntu-sdk-ide/dist/qtcreator/src/plugins/qmakeprojectmanager/qmakenodes.h
+++ b/dist/qtcreator/src/plugins/qmakeprojectmanager/qmakenodes.h ===================================================================
@@ -107,7 +107,8 @@ --- ubuntu-sdk-ide.orig/dist/qtcreator/src/plugins/qmakeprojectmanager/qmakenodes.h
+++ ubuntu-sdk-ide/dist/qtcreator/src/plugins/qmakeprojectmanager/qmakenodes.h
@@ -107,7 +107,8 @@ enum QmakeVariable {
AndroidPackageSourceDir, AndroidPackageSourceDir,
AndroidExtraLibs, AndroidExtraLibs,
IsoIconsVar, IsoIconsVar,
@@ -51,8 +59,10 @@
}; };
namespace Internal { namespace Internal {
--- a/dist/qtcreator/src/plugins/cmakeprojectmanager/cmakeconfigitem.h Index: ubuntu-sdk-ide/dist/qtcreator/src/plugins/cmakeprojectmanager/cmakeconfigitem.h
+++ b/dist/qtcreator/src/plugins/cmakeprojectmanager/cmakeconfigitem.h ===================================================================
--- ubuntu-sdk-ide.orig/dist/qtcreator/src/plugins/cmakeprojectmanager/cmakeconfigitem.h
+++ ubuntu-sdk-ide/dist/qtcreator/src/plugins/cmakeprojectmanager/cmakeconfigitem.h
@@ -25,6 +25,8 @@ @@ -25,6 +25,8 @@
#pragma once #pragma once
@@ -62,7 +72,7 @@
#include <QByteArray> #include <QByteArray>
#include <QList> #include <QList>
@@ -34,7 +36,7 @@ @@ -34,7 +36,7 @@ namespace ProjectExplorer { class Kit; }
namespace CMakeProjectManager { namespace CMakeProjectManager {
@@ -71,9 +81,11 @@
public: public:
enum Type { FILEPATH, PATH, BOOL, STRING, INTERNAL, STATIC }; enum Type { FILEPATH, PATH, BOOL, STRING, INTERNAL, STATIC };
CMakeConfigItem(); CMakeConfigItem();
--- a/dist/qtcreator/src/plugins/qtsupport/qtversionmanager.cpp Index: ubuntu-sdk-ide/dist/qtcreator/src/plugins/qtsupport/qtversionmanager.cpp
+++ b/dist/qtcreator/src/plugins/qtsupport/qtversionmanager.cpp ===================================================================
@@ -568,6 +568,11 @@ --- ubuntu-sdk-ide.orig/dist/qtcreator/src/plugins/qtsupport/qtversionmanager.cpp
+++ ubuntu-sdk-ide/dist/qtcreator/src/plugins/qtsupport/qtversionmanager.cpp
@@ -568,6 +568,11 @@ bool QtVersionManager::isValidId(int id)
return m_versions.contains(id); return m_versions.contains(id);
} }
@@ -85,9 +97,11 @@
BaseQtVersion *QtVersionManager::version(int id) BaseQtVersion *QtVersionManager::version(int id)
{ {
QTC_ASSERT(isLoaded(), return 0); QTC_ASSERT(isLoaded(), return 0);
--- a/dist/qtcreator/src/plugins/qtsupport/qtversionmanager.h Index: ubuntu-sdk-ide/dist/qtcreator/src/plugins/qtsupport/qtversionmanager.h
+++ b/dist/qtcreator/src/plugins/qtsupport/qtversionmanager.h ===================================================================
@@ -63,6 +63,7 @@ --- ubuntu-sdk-ide.orig/dist/qtcreator/src/plugins/qtsupport/qtversionmanager.h
+++ ubuntu-sdk-ide/dist/qtcreator/src/plugins/qtsupport/qtversionmanager.h
@@ -63,6 +63,7 @@ public:
static void removeVersion(BaseQtVersion *version); static void removeVersion(BaseQtVersion *version);
static bool isValidId(int id); static bool isValidId(int id);
@@ -95,9 +109,11 @@
signals: signals:
// content of BaseQtVersion objects with qmake path might have changed // content of BaseQtVersion objects with qmake path might have changed
--- a/dist/qtcreator/src/plugins/plugins.pro Index: ubuntu-sdk-ide/dist/qtcreator/src/plugins/plugins.pro
+++ b/dist/qtcreator/src/plugins/plugins.pro ===================================================================
@@ -56,7 +56,8 @@ --- ubuntu-sdk-ide.orig/dist/qtcreator/src/plugins/plugins.pro
+++ ubuntu-sdk-ide/dist/qtcreator/src/plugins/plugins.pro
@@ -56,7 +56,8 @@ SUBDIRS = \
winrt \ winrt \
qmlprofiler \ qmlprofiler \
updateinfo \ updateinfo \
@@ -107,9 +123,11 @@
DO_NOT_BUILD_QMLDESIGNER = $$(DO_NOT_BUILD_QMLDESIGNER) DO_NOT_BUILD_QMLDESIGNER = $$(DO_NOT_BUILD_QMLDESIGNER)
isEmpty(DO_NOT_BUILD_QMLDESIGNER) { isEmpty(DO_NOT_BUILD_QMLDESIGNER) {
--- a/dist/qt5/ubuntu-sdk/ubuntu-sdk.pro Index: ubuntu-sdk-ide/dist/qt5/ubuntu-sdk/ubuntu-sdk.pro
+++ b/dist/qt5/ubuntu-sdk/ubuntu-sdk.pro ===================================================================
@@ -11,10 +11,10 @@ --- ubuntu-sdk-ide.orig/dist/qt5/ubuntu-sdk/ubuntu-sdk.pro
+++ ubuntu-sdk-ide/dist/qt5/ubuntu-sdk/ubuntu-sdk.pro
@@ -11,10 +11,10 @@ load(qt_parts)
src_uitk_launcher.subdir = ubuntu-ui-toolkit-launcher src_uitk_launcher.subdir = ubuntu-ui-toolkit-launcher
src_uitk_launcher.depends = sub-src src_uitk_launcher.depends = sub-src
@@ -123,9 +141,11 @@
# additional 'make test' target required by continuous integration system # additional 'make test' target required by continuous integration system
test.target = test test.target = test
--- a/dist/qtcreator/src/plugins/cmakeprojectmanager/cmakeproject.cpp Index: ubuntu-sdk-ide/dist/qtcreator/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/dist/qtcreator/src/plugins/cmakeprojectmanager/cmakeproject.cpp ===================================================================
@@ -387,6 +387,18 @@ --- ubuntu-sdk-ide.orig/dist/qtcreator/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ ubuntu-sdk-ide/dist/qtcreator/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -387,6 +387,18 @@ void CMakeProject::runCMake()
} }
} }
@@ -144,8 +164,10 @@
QList<CMakeBuildTarget> CMakeProject::buildTargets() const QList<CMakeBuildTarget> CMakeProject::buildTargets() const
{ {
BuildDirManager *bdm = nullptr; BuildDirManager *bdm = nullptr;
--- a/dist/qtcreator/src/plugins/cmakeprojectmanager/cmakeproject.h Index: ubuntu-sdk-ide/dist/qtcreator/src/plugins/cmakeprojectmanager/cmakeproject.h
+++ b/dist/qtcreator/src/plugins/cmakeprojectmanager/cmakeproject.h ===================================================================
--- ubuntu-sdk-ide.orig/dist/qtcreator/src/plugins/cmakeprojectmanager/cmakeproject.h
+++ ubuntu-sdk-ide/dist/qtcreator/src/plugins/cmakeprojectmanager/cmakeproject.h
@@ -27,6 +27,7 @@ @@ -27,6 +27,7 @@
#include "cmake_global.h" #include "cmake_global.h"
@@ -154,7 +176,7 @@
#include <projectexplorer/extracompiler.h> #include <projectexplorer/extracompiler.h>
#include <projectexplorer/project.h> #include <projectexplorer/project.h>
@@ -111,6 +112,8 @@ @@ -111,6 +112,8 @@ public:
void runCMake(); void runCMake();
@@ -163,9 +185,11 @@
signals: signals:
/// emitted when cmake is running: /// emitted when cmake is running:
void parsingStarted(); void parsingStarted();
--- a/dist/qt5/ubuntu-sdk/src/UbuntuToolkit/menubar.cpp Index: ubuntu-sdk-ide/dist/qt5/ubuntu-sdk/src/UbuntuToolkit/menubar.cpp
+++ b/dist/qt5/ubuntu-sdk/src/UbuntuToolkit/menubar.cpp ===================================================================
@@ -249,11 +249,11 @@ --- ubuntu-sdk-ide.orig/dist/qt5/ubuntu-sdk/src/UbuntuToolkit/menubar.cpp
+++ ubuntu-sdk-ide/dist/qt5/ubuntu-sdk/src/UbuntuToolkit/menubar.cpp
@@ -249,11 +249,11 @@ PlatformMenuWrapper::PlatformMenuWrapper
, m_target(target) , m_target(target)
, m_inserted(false) , m_inserted(false)
{ {
@@ -182,9 +206,11 @@
syncPlatformMenu(); syncPlatformMenu();
} }
--- a/dist/qtcreator/src/plugins/coreplugin/generatedfile.cpp Index: ubuntu-sdk-ide/dist/qtcreator/src/plugins/coreplugin/generatedfile.cpp
+++ b/dist/qtcreator/src/plugins/coreplugin/generatedfile.cpp ===================================================================
@@ -161,6 +161,12 @@ --- ubuntu-sdk-ide.orig/dist/qtcreator/src/plugins/coreplugin/generatedfile.cpp
+++ ubuntu-sdk-ide/dist/qtcreator/src/plugins/coreplugin/generatedfile.cpp
@@ -161,6 +161,12 @@ bool GeneratedFile::write(QString *error
Utils::FileSaver saver(m_d->path, flags); Utils::FileSaver saver(m_d->path, flags);
saver.write(m_d->contents); saver.write(m_d->contents);
@@ -197,9 +223,11 @@
return saver.finalize(errorMessage); return saver.finalize(errorMessage);
} }
--- a/dist/qtcreator/src/plugins/coreplugin/generatedfile.h Index: ubuntu-sdk-ide/dist/qtcreator/src/plugins/coreplugin/generatedfile.h
+++ b/dist/qtcreator/src/plugins/coreplugin/generatedfile.h ===================================================================
@@ -46,7 +46,9 @@ --- ubuntu-sdk-ide.orig/dist/qtcreator/src/plugins/coreplugin/generatedfile.h
+++ ubuntu-sdk-ide/dist/qtcreator/src/plugins/coreplugin/generatedfile.h
@@ -46,7 +46,9 @@ public:
/* File exists and the user indicated that he wants to keep it */ /* File exists and the user indicated that he wants to keep it */
KeepExistingFileAttribute = 0x8, KeepExistingFileAttribute = 0x8,
/* Force overwriting of a file without asking the user to keep it */ /* Force overwriting of a file without asking the user to keep it */
@@ -210,9 +238,11 @@
}; };
Q_DECLARE_FLAGS(Attributes, Attribute) Q_DECLARE_FLAGS(Attributes, Attribute)
--- a/dist/qtcreator/src/plugins/projectexplorer/jsonwizard/jsonwizardfilegenerator.cpp Index: ubuntu-sdk-ide/dist/qtcreator/src/plugins/projectexplorer/jsonwizard/jsonwizardfilegenerator.cpp
+++ b/dist/qtcreator/src/plugins/projectexplorer/jsonwizard/jsonwizardfilegenerator.cpp ===================================================================
@@ -70,6 +70,7 @@ --- ubuntu-sdk-ide.orig/dist/qtcreator/src/plugins/projectexplorer/jsonwizard/jsonwizardfilegenerator.cpp
+++ ubuntu-sdk-ide/dist/qtcreator/src/plugins/projectexplorer/jsonwizard/jsonwizardfilegenerator.cpp
@@ -70,6 +70,7 @@ bool JsonWizardFileGenerator::setup(cons
f.overwrite = tmp.value(QLatin1String("overwrite"), false); f.overwrite = tmp.value(QLatin1String("overwrite"), false);
f.openInEditor = tmp.value(QLatin1String("openInEditor"), false); f.openInEditor = tmp.value(QLatin1String("openInEditor"), false);
f.openAsProject = tmp.value(QLatin1String("openAsProject"), false); f.openAsProject = tmp.value(QLatin1String("openAsProject"), false);
@@ -220,7 +250,7 @@
f.options = JsonWizard::parseOptions(tmp.value(QLatin1String("options")), errorMessage); f.options = JsonWizard::parseOptions(tmp.value(QLatin1String("options")), errorMessage);
if (!errorMessage->isEmpty()) if (!errorMessage->isEmpty())
@@ -146,6 +147,8 @@ @@ -146,6 +147,8 @@ Core::GeneratedFile JsonWizardFileGenera
attributes |= Core::GeneratedFile::OpenProjectAttribute; attributes |= Core::GeneratedFile::OpenProjectAttribute;
if (JsonWizard::boolFromVariant(file.overwrite, expander)) if (JsonWizard::boolFromVariant(file.overwrite, expander))
attributes |= Core::GeneratedFile::ForceOverwrite; attributes |= Core::GeneratedFile::ForceOverwrite;
@@ -229,7 +259,7 @@
if (file.keepExisting) if (file.keepExisting)
attributes |= Core::GeneratedFile::KeepExistingFileAttribute; attributes |= Core::GeneratedFile::KeepExistingFileAttribute;
@@ -231,6 +234,7 @@ @@ -231,6 +234,7 @@ bool JsonWizardFileGenerator::writeFile(
if (!file->write(errorMessage)) if (!file->write(errorMessage))
return false; return false;
} }
@@ -237,9 +267,11 @@
return true; return true;
} }
--- a/dist/qtcreator/src/plugins/projectexplorer/jsonwizard/jsonwizardfilegenerator.h Index: ubuntu-sdk-ide/dist/qtcreator/src/plugins/projectexplorer/jsonwizard/jsonwizardfilegenerator.h
+++ b/dist/qtcreator/src/plugins/projectexplorer/jsonwizard/jsonwizardfilegenerator.h ===================================================================
@@ -55,6 +55,7 @@ --- ubuntu-sdk-ide.orig/dist/qtcreator/src/plugins/projectexplorer/jsonwizard/jsonwizardfilegenerator.h
+++ ubuntu-sdk-ide/dist/qtcreator/src/plugins/projectexplorer/jsonwizard/jsonwizardfilegenerator.h
@@ -55,6 +55,7 @@ private:
QVariant overwrite = false; QVariant overwrite = false;
QVariant openInEditor = false; QVariant openInEditor = false;
QVariant openAsProject = false; QVariant openAsProject = false;
@@ -247,3 +279,113 @@
QList<JsonWizard::OptionDefinition> options; QList<JsonWizard::OptionDefinition> options;
}; };
Index: ubuntu-sdk-ide/dist/qtcreator/src/plugins/valgrind/callgrindtool.cpp
===================================================================
--- ubuntu-sdk-ide.orig/dist/qtcreator/src/plugins/valgrind/callgrindtool.cpp
+++ ubuntu-sdk-ide/dist/qtcreator/src/plugins/valgrind/callgrindtool.cpp
@@ -987,17 +987,20 @@ public:
bool canRun(RunConfiguration *runConfiguration, Core::Id runMode) const override
{
Q_UNUSED(runConfiguration);
+ if (runConfiguration->id() == "SnapcraftProjectManager.SnapRunConfiguration.Id") return false;
return runMode == CALLGRIND_RUN_MODE;
}
RunControl *create(RunConfiguration *runConfiguration, Core::Id runMode, QString *errorMessage) override
{
Q_UNUSED(errorMessage);
+ if (runConfiguration->id() == "SnapcraftProjectManager.SnapRunConfiguration.Id") return nullptr;
return m_tool->createRunControl(runConfiguration, runMode);
}
IRunConfigurationAspect *createRunConfigurationAspect(ProjectExplorer::RunConfiguration *rc) override
{
+ if (rc->id() == "SnapcraftProjectManager.SnapRunConfiguration.Id") return nullptr;
return createValgrindRunConfigurationAspect(rc);
}
Index: ubuntu-sdk-ide/dist/qtcreator/src/plugins/debugger/debuggerruncontrol.cpp
===================================================================
--- ubuntu-sdk-ide.orig/dist/qtcreator/src/plugins/debugger/debuggerruncontrol.cpp
+++ ubuntu-sdk-ide/dist/qtcreator/src/plugins/debugger/debuggerruncontrol.cpp
@@ -553,6 +553,8 @@ public:
QTC_ASSERT(runConfig, return 0);
QTC_ASSERT(mode == DebugRunMode || mode == DebugRunModeWithBreakOnMain, return 0);
+ if (runConfig->id() == "SnapcraftProjectManager.SnapRunConfiguration.Id") return nullptr;
+
// We cover only local setup here. Remote setups are handled by the
// RunControl factories in the target specific plugins.
QStringList errors;
@@ -568,6 +570,8 @@ public:
if (!(mode == DebugRunMode || mode == DebugRunModeWithBreakOnMain))
return false;
+ if (runConfig->id() == "SnapcraftProjectManager.SnapRunConfiguration.Id") return false;
+
Runnable runnable = runConfig->runnable();
if (runnable.is<StandardRunnable>()) {
IDevice::ConstPtr device = runnable.as<StandardRunnable>().device;
@@ -582,6 +586,7 @@ public:
IRunConfigurationAspect *createRunConfigurationAspect(RunConfiguration *rc) override
{
+ if (rc->id() == "SnapcraftProjectManager.SnapRunConfiguration.Id") return nullptr;
return new DebuggerRunConfigurationAspect(rc);
}
};
Index: ubuntu-sdk-ide/dist/qtcreator/src/plugins/valgrind/memchecktool.cpp
===================================================================
--- ubuntu-sdk-ide.orig/dist/qtcreator/src/plugins/valgrind/memchecktool.cpp
+++ ubuntu-sdk-ide/dist/qtcreator/src/plugins/valgrind/memchecktool.cpp
@@ -703,17 +703,20 @@ public:
bool canRun(RunConfiguration *runConfiguration, Core::Id mode) const override
{
Q_UNUSED(runConfiguration);
+ if (runConfiguration->id() == "SnapcraftProjectManager.SnapRunConfiguration.Id") return false;
return mode == MEMCHECK_RUN_MODE || mode == MEMCHECK_WITH_GDB_RUN_MODE;
}
RunControl *create(RunConfiguration *runConfiguration, Core::Id mode, QString *errorMessage) override
{
Q_UNUSED(errorMessage);
+ if (runConfiguration->id() == "SnapcraftProjectManager.SnapRunConfiguration.Id") return nullptr;
return m_tool->createRunControl(runConfiguration, mode);
}
IRunConfigurationAspect *createRunConfigurationAspect(ProjectExplorer::RunConfiguration *rc) override
{
+ if (rc->id() == "SnapcraftProjectManager.SnapRunConfiguration.Id") return nullptr;
return createValgrindRunConfigurationAspect(rc);
}
Index: ubuntu-sdk-ide/dist/qtcreator/src/plugins/qmlprofiler/qmlprofilerruncontrolfactory.cpp
===================================================================
--- ubuntu-sdk-ide.orig/dist/qtcreator/src/plugins/qmlprofiler/qmlprofilerruncontrolfactory.cpp
+++ ubuntu-sdk-ide/dist/qtcreator/src/plugins/qmlprofiler/qmlprofilerruncontrolfactory.cpp
@@ -65,6 +65,7 @@ QmlProfilerRunControlFactory::QmlProfile
bool QmlProfilerRunControlFactory::canRun(RunConfiguration *runConfiguration, Core::Id mode) const
{
+ if (runConfiguration->id() == "SnapcraftProjectManager.SnapRunConfiguration.Id") return false;
return mode == ProjectExplorer::Constants::QML_PROFILER_RUN_MODE && isLocal(runConfiguration);
}
@@ -72,6 +73,9 @@ RunControl *QmlProfilerRunControlFactory
{
QTC_ASSERT(canRun(runConfiguration, mode), return 0);
QTC_ASSERT(runConfiguration->runnable().is<StandardRunnable>(), return 0);
+
+ if (runConfiguration->id() == "SnapcraftProjectManager.SnapRunConfiguration.Id") return nullptr;
+
auto runnable = runConfiguration->runnable().as<StandardRunnable>();
if (runnable.executable.isEmpty()) {
@@ -114,6 +118,7 @@ RunControl *QmlProfilerRunControlFactory
ProjectExplorer::IRunConfigurationAspect *
QmlProfilerRunControlFactory::createRunConfigurationAspect(ProjectExplorer::RunConfiguration *rc)
{
+ if (rc->id() == "SnapcraftProjectManager.SnapRunConfiguration.Id") return nullptr;
return new QmlProfilerRunConfigurationAspect(rc);
}

View File

@@ -52,7 +52,7 @@ SOURCES += \
src/ubuntu/ubuntuproject.cpp \ src/ubuntu/ubuntuproject.cpp \
src/ubuntu/ubuntuprojectfile.cpp \ src/ubuntu/ubuntuprojectfile.cpp \
src/ubuntu/ubuntuprojectnode.cpp \ src/ubuntu/ubuntuprojectnode.cpp \
#src/ubuntu/ubuntuversion.cpp \ src/ubuntu/ubuntuversion.cpp \
#src/ubuntu/ubuntufeatureprovider.cpp \ #src/ubuntu/ubuntufeatureprovider.cpp \
#src/ubuntu/ubuntuversionmanager.cpp \ #src/ubuntu/ubuntuversionmanager.cpp \
src/ubuntu/ubuntupackagingmode.cpp \ src/ubuntu/ubuntupackagingmode.cpp \
@@ -123,7 +123,7 @@ HEADERS += \
src/ubuntu/ubuntuproject.h \ src/ubuntu/ubuntuproject.h \
src/ubuntu/ubuntuprojectfile.h \ src/ubuntu/ubuntuprojectfile.h \
src/ubuntu/ubuntuprojectnode.h \ src/ubuntu/ubuntuprojectnode.h \
#src/ubuntu/ubuntuversion.h \ src/ubuntu/ubuntuversion.h \
#src/ubuntu/ubuntufeatureprovider.h \ #src/ubuntu/ubuntufeatureprovider.h \
#src/ubuntu/ubuntuversionmanager.h \ #src/ubuntu/ubuntuversionmanager.h \
src/ubuntu/ubuntupackagingmode.h \ src/ubuntu/ubuntupackagingmode.h \

View File

@@ -15,7 +15,7 @@ parts:
source: %{ProjectNameL}/ source: %{ProjectNameL}/
qt-version: qt5 qt-version: qt5
options: ["CONFIG+=snapcraft"] options: ["CONFIG+=snapcraft"]
project-files: [%{ProjectNameL}] project-files: [%{ProjectNameL}.pro]
build-packages: build-packages:
- build-essential - build-essential
- qtbase5-dev - qtbase5-dev

View File

@@ -7,11 +7,11 @@
"trDisplayName": "QtQuick App with QML Ubuntu UI", "trDisplayName": "QtQuick App with QML Ubuntu UI",
"trDisplayCategory": "Snapcraft", "trDisplayCategory": "Snapcraft",
"icon": "../share/ubuntu.png", "icon": "../share/ubuntu.png",
"enabled": "%{JS: [ %{Plugins} ].indexOf('Ubuntu') >= 0}", "enabled": "%{JS: [ %{Plugins} ].indexOf('Ubuntu') >= 0 && Ubuntu.supportsSnappy()}",
"options": "options":
[ [
{ "key": "ProjectFile", "value": "%{JS: Util.fileName('%{ProjectDirectory}/%{ProjectName}', 'pro')}" }, { "key": "ProjectFile", "value": "%{JS: Util.fileName('%{ProjectDirectory}/snapcraft','yaml')}" },
{ "key": "ProjectNameL", "value": "%{JS: \"%{ProjectName}\".toLowerCase()}" }, { "key": "ProjectNameL", "value": "%{JS: \"%{ProjectName}\".toLowerCase()}" },
{ "key": "CppFileName", "value": "%{JS: 'main.' + Util.preferredSuffix('text/x-c++src')}" }, { "key": "CppFileName", "value": "%{JS: 'main.' + Util.preferredSuffix('text/x-c++src')}" },
{ "key": "IsTopLevelProject", "value": "%{JS: !'%{Exists:ProjectExplorer.Profile.Ids}'}" } { "key": "IsTopLevelProject", "value": "%{JS: !'%{Exists:ProjectExplorer.Profile.Ids}'}" }

View File

@@ -0,0 +1,84 @@
#!/usr/bin/python3
# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
#
# QTC device applauncher
# Copyright (C) 2014 Canonical
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: Benjamin Zeller <benjamin.zeller@canonical.com>
import os
import os.path
import subprocess
import argparse
import signal
import sys
# register options to the argument parser
parser = argparse.ArgumentParser(description="SDK snap launcher")
parser.add_argument('snap_package',action="store")
parser.add_argument('snap_command',action='store')
options, args = parser.parse_known_args()
if not os.path.isfile(options.snap_package):
print("Snap file does not exist")
sys.exit(1)
#parse the package name which should be application_version_arch.snap
app_info = os.path.basename(options.snap_package)[:-5].split("_")
if len(app_info) != 3:
print("The snap package name is invalid", file=sys.stderr)
sys.exit(1)
#flush all descriptors
sys.stdout.flush()
sys.stderr.flush()
#ok lets install the snap package
ret = subprocess.call(["snap", "install", options.snap_package, "--dangerous"], stdout=sys.stdout, stderr=sys.stderr)
if ret != 0:
sys.exit(ret)
#flush all descriptors
sys.stdout.flush()
sys.stderr.flush()
#this will contain the actual subprocess object
proc = None
stopped = False
def signalHandler(signum, frame):
print('Signal handler called with signal', signum)
if proc is not None:
proc.kill()
else:
stopped = True
signal.signal(signal.SIGINT, signalHandler)
signal.signal(signal.SIGTERM, signalHandler)
signal.signal(signal.SIGHUP, signalHandler)
#start the actual app
if not stopped:
proc = subprocess.Popen(["snap", "run", app_info[0]+"."+options.snap_command]+args, stdout=sys.stdout, stderr=sys.stderr)
ret = proc.wait()
#flush all descriptors
sys.stdout.flush()
sys.stderr.flush()
subprocess.call(["snap", "remove", app_info[0]], stdout=sys.stdout, stderr=sys.stderr)
sys.exit(ret)

View File

@@ -1,4 +1,23 @@
#!/usr/bin/python3 #!/usr/bin/python3
# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
#
# QTC device applauncher
# Copyright (C) 2014 Canonical
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
# Author: Benjamin Zeller <benjamin.zeller@canonical.com>
import os import os
import sys import sys
@@ -22,6 +41,9 @@ if not os.path.isfile(options.snapcraft) or not os.access(options.snapcraft, os.
print("Using snapcraft from :"+options.snapcraft) print("Using snapcraft from :"+options.snapcraft)
sys.stdout.flush()
sys.stderr.flush()
ret = subprocess.call([options.snapcraft, "clean"]) ret = subprocess.call([options.snapcraft, "clean"])
if ret != 0: if ret != 0:
sys.exit(ret) sys.exit(ret)

View File

@@ -62,6 +62,11 @@ static QMap <QString,ProjectExplorer::Abi> init_architectures()
ProjectExplorer::Abi::GenericLinuxFlavor, ProjectExplorer::Abi::GenericLinuxFlavor,
ProjectExplorer::Abi::ElfFormat, ProjectExplorer::Abi::ElfFormat,
64)); 64));
map.insert(QLatin1String("arm64") , ProjectExplorer::Abi(ProjectExplorer::Abi::ArmArchitecture,
ProjectExplorer::Abi::LinuxOS,
ProjectExplorer::Abi::GenericLinuxFlavor,
ProjectExplorer::Abi::ElfFormat,
64));
return map; return map;
} }
@@ -130,6 +135,15 @@ ProjectExplorer::Abi ClickToolChain::architectureNameToAbi(const QString &arch)
return clickArchitectures[arch]; return clickArchitectures[arch];
} }
QString ClickToolChain::abiToArchitectureName(const ProjectExplorer::Abi &abi)
{
for (auto i = clickArchitectures.constBegin(); i != clickArchitectures.constEnd(); i++){
if (i.value() == abi)
return i.key();
}
return QString("unknown");
}
QList<QString> ClickToolChain::supportedArchitectures() QList<QString> ClickToolChain::supportedArchitectures()
{ {
return clickArchitectures.keys(); return clickArchitectures.keys();
@@ -158,7 +172,13 @@ QString ClickToolChain::gnutriplet(const ProjectExplorer::Abi &abi)
{ {
switch(abi.architecture()) { switch(abi.architecture()) {
case ProjectExplorer::Abi::ArmArchitecture: case ProjectExplorer::Abi::ArmArchitecture:
return QLatin1String("arm-linux-gnueabihf"); switch(abi.wordWidth())
{
case 32:
return QLatin1String("arm-linux-gnueabihf");
case 64:
return QLatin1String("aarch64-linux-gnu");
}
break; break;
case ProjectExplorer::Abi::X86Architecture: case ProjectExplorer::Abi::X86Architecture:
switch(abi.wordWidth()) switch(abi.wordWidth())

View File

@@ -50,6 +50,7 @@ public:
const UbuntuClickTool::Target &clickTarget () const; const UbuntuClickTool::Target &clickTarget () const;
static ProjectExplorer::Abi architectureNameToAbi ( const QString &arch ); static ProjectExplorer::Abi architectureNameToAbi ( const QString &arch );
static QString abiToArchitectureName ( const ProjectExplorer::Abi &abi );
static QList<QString> supportedArchitectures (); static QList<QString> supportedArchitectures ();
QString remoteCompilerCommand () const; QString remoteCompilerCommand () const;

View File

@@ -1,6 +1,7 @@
#include "snapcraftbuildconfiguration.h" #include "snapcraftbuildconfiguration.h"
#include <ubuntu/ubuntuconstants.h> #include <ubuntu/ubuntuconstants.h>
#include <QDebug>
namespace Ubuntu { namespace Ubuntu {
namespace Internal { namespace Internal {
@@ -24,7 +25,9 @@ bool SnapcraftBuildConfiguration::fromMap(const QVariantMap &map)
QVariantMap SnapcraftBuildConfiguration::toMap() const QVariantMap SnapcraftBuildConfiguration::toMap() const
{ {
return ProjectExplorer::BuildConfiguration::toMap(); QVariantMap data = ProjectExplorer::BuildConfiguration::toMap();
qDebug()<<"Storing ID: "<<ProjectExplorer::idFromMap(data);
return data;
} }
ProjectExplorer::NamedWidget *SnapcraftBuildConfiguration::createConfigWidget() ProjectExplorer::NamedWidget *SnapcraftBuildConfiguration::createConfigWidget()

View File

@@ -11,6 +11,7 @@
#include <projectexplorer/projectmacroexpander.h> #include <projectexplorer/projectmacroexpander.h>
#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/buildsteplist.h> #include <projectexplorer/buildsteplist.h>
#include <projectexplorer/kitinformation.h>
#include <coreplugin/documentmanager.h> #include <coreplugin/documentmanager.h>
#include <utils/mimetypes/mimedatabase.h> #include <utils/mimetypes/mimedatabase.h>
@@ -35,6 +36,10 @@ QList<ProjectExplorer::BuildInfo *> SnapcraftBuildConfigurationFactory::availabl
if (qobject_cast<SnapcraftProject *>(parent->project())) if (qobject_cast<SnapcraftProject *>(parent->project()))
return {}; return {};
//restrict this to local devices type kits for now
if (ProjectExplorer::DeviceKitInformation::deviceId(parent->kit()) != ProjectExplorer::Constants::DESKTOP_DEVICE_ID)
return {};
QList<ProjectExplorer::BuildInfo *> infoList; QList<ProjectExplorer::BuildInfo *> infoList;
ProjectExplorer::BuildInfo *info = createBuildInfo(parent->kit(), parent->project()->projectFilePath().toString()); ProjectExplorer::BuildInfo *info = createBuildInfo(parent->kit(), parent->project()->projectFilePath().toString());
if (info) if (info)
@@ -57,6 +62,10 @@ QList<ProjectExplorer::BuildInfo *> SnapcraftBuildConfigurationFactory::availabl
{ {
Utils::MimeDatabase db; Utils::MimeDatabase db;
//restrict this to local devices type kits for now
if (ProjectExplorer::DeviceKitInformation::deviceId(k) != ProjectExplorer::Constants::DESKTOP_DEVICE_ID)
return {};
auto mimeType = db.mimeTypeForFile(projectPath); auto mimeType = db.mimeTypeForFile(projectPath);
if (!mimeType.matchesName(Constants::SNAPCRAFT_PROJECT_MIMETYPE)) if (!mimeType.matchesName(Constants::SNAPCRAFT_PROJECT_MIMETYPE))
return {}; return {};

View File

@@ -39,6 +39,10 @@
using namespace Ubuntu; using namespace Ubuntu;
using namespace Ubuntu::Internal; using namespace Ubuntu::Internal;
enum {
debug = 0
};
SnapcraftProject::SnapcraftProject(SnapcraftProjectManager *manager, const Utils::FileName &fileName) SnapcraftProject::SnapcraftProject(SnapcraftProjectManager *manager, const Utils::FileName &fileName)
: m_manager(manager), : m_manager(manager),
m_fileName(fileName), m_fileName(fileName),
@@ -135,17 +139,55 @@ QString SnapcraftProject::shadowBuildDirectory(const QString &proFilePath
void SnapcraftProject::asyncUpdate() void SnapcraftProject::asyncUpdate()
{ {
qDebug()<<"Syncing from yaml"; if(debug) qDebug()<<"Syncing from yaml";
QString oldDisplayName = displayName();
try { try {
YAML::Node yaml = YAML::LoadFile(m_fileName.toString().toStdString()); YAML::Node yaml = YAML::LoadFile(m_fileName.toString().toStdString());
if (!m_rootNode->syncFromYAMLNode(yaml)) { if (!m_rootNode->syncFromYAMLNode(yaml)) {
qDebug()<<"Invalid YAML file"; if(debug) qDebug()<<"Invalid YAML file";
} }
QStringList commandList;
try {
YAML::Node commands = yaml["apps"];
if (!commands.IsMap()) {
if(debug) qDebug()<<"apps is not a map";
} else {
for (auto it = commands.begin(); it != commands.end(); ++it) {
if(!it->second.IsMap() || it->second["daemon"])
continue;
commandList << QString::fromStdString(it->first.as<std::string>());
}
}
if(yaml["version"]) {
QString snapVer = QString::fromStdString(yaml["version"].as<std::string>());
if (snapVer != m_snapVersion) {
if(debug) qDebug()<<"Snap version is"<<snapVer;
m_snapVersion = snapVer;
emit snapVersionChanged();
}
}
} catch (const YAML::Exception &e) {
if(debug) qDebug()<<"Error while parsing the command list: "<<e.what();
}
if (m_commands != commandList) {
m_commands = commandList;
emit commandListChanged(m_commands);
}
} catch (const YAML::Exception &e) { } catch (const YAML::Exception &e) {
qDebug() << e.what(); if(debug) qDebug() << e.what();
} }
emit displayNameChanged(); if (oldDisplayName != displayName())
emit displayNameChanged();
} }
void SnapcraftProject::maybeUpdate(const QString &pathChanged) void SnapcraftProject::maybeUpdate(const QString &pathChanged)

View File

@@ -47,6 +47,10 @@ public:
SnapcraftProject(SnapcraftProjectManager *manager, const Utils::FileName &fileName); SnapcraftProject(SnapcraftProjectManager *manager, const Utils::FileName &fileName);
QString displayName() const override; QString displayName() const override;
QString snapVersion() const{
return m_snapVersion;
}
ProjectExplorer::IProjectManager *projectManager() const override; ProjectExplorer::IProjectManager *projectManager() const override;
ProjectExplorer::ProjectNode *rootProjectNode() const override; ProjectExplorer::ProjectNode *rootProjectNode() const override;
@@ -60,6 +64,10 @@ public:
return m_fileName.toString(); return m_fileName.toString();
} }
QStringList commands () const {
return m_commands;
}
// Project interface // Project interface
bool supportsKit(ProjectExplorer::Kit *k, QString *errorMessage) const override; bool supportsKit(ProjectExplorer::Kit *k, QString *errorMessage) const override;
bool needsConfiguration() const override; bool needsConfiguration() const override;
@@ -73,9 +81,15 @@ protected slots:
void asyncUpdate (); void asyncUpdate ();
void maybeUpdate (const QString &pathChanged); void maybeUpdate (const QString &pathChanged);
signals:
void commandListChanged (const QStringList &commands);
void snapVersionChanged ();
private: private:
SnapcraftProjectManager *m_manager; SnapcraftProjectManager *m_manager;
QString m_projectName; QString m_projectName;
QStringList m_commands;
QString m_snapVersion;
QPointer<SnapcraftProjectFile> m_file; QPointer<SnapcraftProjectFile> m_file;
Utils::FileName m_fileName; Utils::FileName m_fileName;

View File

@@ -35,6 +35,11 @@
namespace Ubuntu { namespace Ubuntu {
namespace Internal { namespace Internal {
enum {
debug = 0
};
static QIcon generateIcon(const QString &overlay) { static QIcon generateIcon(const QString &overlay) {
const QSize desiredSize = QSize(16, 16); const QSize desiredSize = QSize(16, 16);
@@ -62,7 +67,7 @@ SnapcraftProjectNode::SnapcraftProjectNode(SnapcraftProject *rootProject, const
m_rootProject(rootProject), m_rootProject(rootProject),
m_watcher(watcher) m_watcher(watcher)
{ {
setDisplayName(projectFilePath.parentDir().toString()); setDisplayName(projectFilePath.parentDir().toFileInfo().fileName());
setIcon(generateProjectIcon()); setIcon(generateProjectIcon());
} }
@@ -75,14 +80,14 @@ SnapcraftProjectNode::~SnapcraftProjectNode()
bool SnapcraftProjectNode::syncFromYAMLNode(YAML::Node rootNode) bool SnapcraftProjectNode::syncFromYAMLNode(YAML::Node rootNode)
{ {
qDebug()<<"Sync from YAML node"; if(debug) qDebug()<<"Sync from YAML node";
try { try {
QString displayName = QString::fromStdString(rootNode["name"].as<std::string>()); QString displayName = QString::fromStdString(rootNode["name"].as<std::string>());
setDisplayName(displayName); setDisplayName(displayName);
YAML::Node parts = rootNode["parts"]; YAML::Node parts = rootNode["parts"];
if (!parts.IsMap()) { if (!parts.IsMap()) {
qDebug()<<"Parts is not a map"; if(debug) qDebug()<<"Parts is not a map";
return false; return false;
} }
@@ -145,9 +150,13 @@ bool SnapcraftProjectNode::syncFromYAMLNode(YAML::Node rootNode)
} }
QSet<QString> obsoleteParts = existingParts.toSet() - partsFromYaml.toSet(); QSet<QString> obsoleteParts = existingParts.toSet() - partsFromYaml.toSet();
qDebug()<<"Parts in yaml"<<partsFromYaml;
qDebug()<<"Currently known parts"<<existingParts; if(debug) {
qDebug()<<"Parts now obsolete: "<<obsoleteParts; qDebug()<<"Parts in yaml"<<partsFromYaml;
qDebug()<<"Currently known parts"<<existingParts;
qDebug()<<"Parts now obsolete: "<<obsoleteParts;
}
for (const auto &part : obsoleteParts) { for (const auto &part : obsoleteParts) {
int idx = existingParts.indexOf(part); int idx = existingParts.indexOf(part);
if (idx >= 0) if (idx >= 0)
@@ -158,7 +167,7 @@ bool SnapcraftProjectNode::syncFromYAMLNode(YAML::Node rootNode)
removeFolderNodes(nodesToRemove); removeFolderNodes(nodesToRemove);
addFolderNodes(nodesToAdd); addFolderNodes(nodesToAdd);
} catch (const YAML::Exception &e) { } catch (const YAML::Exception &e) {
qDebug()<<"ERRROR ERROR ERROR "<<e.what(); if(debug) qDebug()<<"ERRROR ERROR ERROR "<<e.what();
return false; return false;
} }
@@ -191,9 +200,9 @@ SnapcraftGenericPartNode::SnapcraftGenericPartNode(const QString &partName, cons
setIcon(generateProjectIcon()); setIcon(generateProjectIcon());
if (watcher->addPath(folderPath.toString())) { if (watcher->addPath(folderPath.toString())) {
qDebug()<<"Added"<<folderPath.toString()<<"to watcher"; if(debug) qDebug()<<"Added"<<folderPath.toString()<<"to watcher";
} else { } else {
qDebug()<<"Failed to add"<<folderPath.toString()<<"to watcher"; if(debug) qDebug()<<"Failed to add"<<folderPath.toString()<<"to watcher";
} }
m_watcherConnection = QObject::connect(watcher, &QFileSystemWatcher::directoryChanged, [this](const QString &path){ m_watcherConnection = QObject::connect(watcher, &QFileSystemWatcher::directoryChanged, [this](const QString &path){
maybeScheduleProjectScan(path); maybeScheduleProjectScan(path);
@@ -228,7 +237,7 @@ void SnapcraftGenericPartNode::scheduleProjectScan()
if (m_scanning) if (m_scanning)
return; return;
qDebug()<<"Scheduling Project scan"; if(debug) qDebug()<<"Scheduling Project scan";
m_scanning = true; m_scanning = true;
@@ -236,7 +245,7 @@ void SnapcraftGenericPartNode::scheduleProjectScan()
rescanTimer->setSingleShot(true); rescanTimer->setSingleShot(true);
rescanTimer->start(0); rescanTimer->start(0);
QObject::connect(rescanTimer, &QTimer::timeout, [this, rescanTimer](){ QObject::connect(rescanTimer, &QTimer::timeout, [this, rescanTimer](){
qDebug()<<"Starting Project scan"; if(debug) qDebug()<<"Starting Project scan";
delete rescanTimer; delete rescanTimer;
this->scanProjectDirectory(); this->scanProjectDirectory();
@@ -335,10 +344,12 @@ void SnapcraftGenericPartNode::scanProjectDirectory()
QList<Utils::FileName> dirsToRemove = (oldDirs - newDirs).toList(); QList<Utils::FileName> dirsToRemove = (oldDirs - newDirs).toList();
QSet<Utils::FileName> dirsToAdd = newDirs - oldDirs; QSet<Utils::FileName> dirsToAdd = newDirs - oldDirs;
qDebug()<<"Removing dirs " <<dirsToRemove; if(debug) {
qDebug()<<"Adding dirs " <<dirsToAdd; qDebug()<<"Removing dirs " <<dirsToRemove;
qDebug()<<"Removing files" <<filesToRemove; qDebug()<<"Adding dirs " <<dirsToAdd;
qDebug()<<"Adding files " <<filesToAdd; qDebug()<<"Removing files" <<filesToRemove;
qDebug()<<"Adding files " <<filesToAdd;
}
removeFileNodes(filesToRemove.toList()); removeFileNodes(filesToRemove.toList());
removeFolderNodes(dirsToRemove); removeFolderNodes(dirsToRemove);
@@ -401,7 +412,8 @@ ProjectExplorer::FolderNode *SnapcraftGenericPartNode::createOrFindFolder(const
watches << currentPath.toFileInfo().absoluteFilePath(); watches << currentPath.toFileInfo().absoluteFilePath();
} }
qDebug()<<"Failed to add watches: "<<m_watcher->addPaths(watches);
m_watcher->addPaths(watches);
return currFolder; return currFolder;
} }

View File

@@ -3,25 +3,81 @@
#include "snapcraftbuildconfiguration.h" #include "snapcraftbuildconfiguration.h"
#include <ubuntu/snap/settings/snapcraftkitinformation.h> #include <ubuntu/snap/settings/snapcraftkitinformation.h>
#include <ubuntu/ubuntuconstants.h> #include <ubuntu/ubuntuconstants.h>
#include <ubuntu/clicktoolchain.h>
#include <projectexplorer/target.h> #include <projectexplorer/target.h>
#include <utils/environment.h> #include <utils/environment.h>
#include <QRegularExpression>
namespace Ubuntu { namespace Ubuntu {
namespace Internal { namespace Internal {
static const char * PACKAGE_NAME_REGEX = "^Snapped ([\\S]+\\.snap)$";
SnapcraftStep::SnapcraftStep(ProjectExplorer::BuildStepList *bsl) SnapcraftStep::SnapcraftStep(ProjectExplorer::BuildStepList *bsl)
: ProjectExplorer::AbstractProcessStep(bsl, Constants::SNAPCRAFT_BUILDSTEP_ID) : ProjectExplorer::AbstractProcessStep(bsl, Constants::SNAPCRAFT_BUILDSTEP_ID)
{ {
setDefaultDisplayName(tr("Snapcraft")); setDefaultDisplayName(tr("Snapcraft"));
connect(qobject_cast<SnapcraftProject *>(target()->project()), &SnapcraftProject::snapVersionChanged,
this, &SnapcraftStep::packagePathChanged);
connect(qobject_cast<SnapcraftProject *>(target()->project()), &SnapcraftProject::displayNameChanged,
this, &SnapcraftStep::packagePathChanged);
} }
SnapcraftStep::SnapcraftStep(ProjectExplorer::BuildStepList *bsl, SnapcraftStep *bs) SnapcraftStep::SnapcraftStep(ProjectExplorer::BuildStepList *bsl, SnapcraftStep *bs)
: ProjectExplorer::AbstractProcessStep(bsl, bs) : ProjectExplorer::AbstractProcessStep(bsl, bs)
{ {
connect(qobject_cast<SnapcraftProject *>(target()->project()), &SnapcraftProject::snapVersionChanged,
this, &SnapcraftStep::packagePathChanged);
connect(qobject_cast<SnapcraftProject *>(target()->project()), &SnapcraftProject::displayNameChanged,
this, &SnapcraftStep::packagePathChanged);
}
void SnapcraftStep::stdOutput(const QString &line)
{
m_lastLine = line;
ProjectExplorer::AbstractProcessStep::stdOutput(line);
}
void SnapcraftStep::processStarted()
{
m_packagePath.clear();
emit packagePathChanged();
ProjectExplorer::AbstractProcessStep::processStarted();
}
void SnapcraftStep::processFinished(int exitCode, QProcess::ExitStatus status)
{
Utils::FileName newPackagePath;
ProjectExplorer::AbstractProcessStep::processFinished(exitCode, status);
if (status == QProcess::NormalExit && exitCode == 0) {
QRegularExpression exp((QLatin1String(PACKAGE_NAME_REGEX)));
QRegularExpressionMatch m = exp.match(m_lastLine);
if(m.hasMatch()) {
ProjectExplorer::BuildConfiguration *bc = target()->activeBuildConfiguration();
if(bc)
newPackagePath = bc->buildDirectory().appendPath(m.captured(1));
}
}
if (m_packagePath != newPackagePath) {
m_packagePath = newPackagePath;
emit packagePathChanged();
}
}
bool SnapcraftStep::processSucceeded(int exitCode, QProcess::ExitStatus status)
{
if (!ProjectExplorer::AbstractProcessStep::processSucceeded(exitCode, status))
return false;
return m_packagePath.toFileInfo().exists();
} }
bool SnapcraftStep::init(QList<const ProjectExplorer::BuildStep *> &) bool SnapcraftStep::init(QList<const ProjectExplorer::BuildStep *> &)
@@ -63,5 +119,21 @@ Utils::FileName SnapcraftStep::snapcraftCommand() const
return bin; return bin;
} }
Utils::FileName SnapcraftStep::packagePath() const
{
if (!m_packagePath.isEmpty())
return m_packagePath;
ProjectExplorer::BuildConfiguration *bc = target()->activeBuildConfiguration();
SnapcraftProject *pro = qobject_cast<SnapcraftProject *>(target()->project());
ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainKitInformation::toolChain(target()->kit());
if(bc && pro && tc && !pro->displayName().isEmpty() && !pro->snapVersion().isEmpty())
return bc->buildDirectory().appendPath(QStringLiteral("%1_%2_%3.snap")
.arg(pro->displayName())
.arg(pro->snapVersion())
.arg(ClickToolChain::abiToArchitectureName(tc->targetAbi())));
return Utils::FileName();
}
} // namespace Internal } // namespace Internal
} // namespace Ubuntu } // namespace Ubuntu

View File

@@ -2,6 +2,7 @@
#define UBUNTU_INTERNAL_SNAPCRAFTSTEP_H #define UBUNTU_INTERNAL_SNAPCRAFTSTEP_H
#include <projectexplorer/abstractprocessstep.h> #include <projectexplorer/abstractprocessstep.h>
#include <utils/fileutils.h>
namespace Ubuntu { namespace Ubuntu {
namespace Internal { namespace Internal {
@@ -21,10 +22,26 @@ public:
virtual ProjectExplorer::BuildStepConfigWidget *createConfigWidget() override; virtual ProjectExplorer::BuildStepConfigWidget *createConfigWidget() override;
Utils::FileName snapcraftCommand () const; Utils::FileName snapcraftCommand () const;
Utils::FileName packagePath () const;
signals:
void packagePathChanged ();
protected: protected:
SnapcraftStep(ProjectExplorer::BuildStepList *bsl); SnapcraftStep(ProjectExplorer::BuildStepList *bsl);
SnapcraftStep(ProjectExplorer::BuildStepList *bsl, SnapcraftStep *bs); SnapcraftStep(ProjectExplorer::BuildStepList *bsl, SnapcraftStep *bs);
// AbstractProcessStep interface
virtual void stdOutput(const QString &line);
virtual void processStarted() override;
virtual void processFinished(int exitCode, QProcess::ExitStatus status) override;
virtual bool processSucceeded(int exitCode, QProcess::ExitStatus status) override;
private:
QString m_lastLine;
Utils::FileName m_packagePath;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -0,0 +1,241 @@
#include "snaprunconfiguration.h"
#include "snapcraftstep.h"
#include "snapcraftproject.h"
#include <ubuntu/ubuntuconstants.h>
#include <projectexplorer/runnables.h>
#include <projectexplorer/target.h>
#include <projectexplorer/buildconfiguration.h>
#include <projectexplorer/buildstep.h>
#include <projectexplorer/buildsteplist.h>
#include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/localenvironmentaspect.h>
#include <projectexplorer/runconfigurationaspects.h>
#include <utils/qtcprocess.h>
#include <utils/pathchooser.h>
#include <QFileInfo>
#include <QFormLayout>
#include <QComboBox>
namespace Ubuntu {
namespace Internal {
const QString COMMAND_KEY = QStringLiteral("SnapProjectManager.SnapRunConfiguration.SnapCommand");
const QString WORKINGDIRECTORYASPECT_ID = QStringLiteral("SnapProjectManager.SnapRunConfiguration.WorkingDirectoryAspect");
const QString ARGUMENTASPECT_ID = QStringLiteral("SnapProjectManager.SnapRunConfiguration.ArgumentAspect");
const QString TERMINALASPECT_ID = QStringLiteral("SnapProjectManager.SnapRunConfiguration.TerminalAspect");
SnapRunConfiguration::SnapRunConfiguration(ProjectExplorer::Target *parent)
: ProjectExplorer::RunConfiguration(parent, Constants::SNAP_RUNCONFIGURATION_ID)
, m_workingDirectoryAspect(new ProjectExplorer::WorkingDirectoryAspect(this, WORKINGDIRECTORYASPECT_ID))
, m_argumentAspect(new ProjectExplorer::ArgumentsAspect(this, ARGUMENTASPECT_ID))
, m_terminalAspect(new ProjectExplorer::TerminalAspect(this, TERMINALASPECT_ID))
, m_localEnvironmentAspect(new ProjectExplorer::LocalEnvironmentAspect(this, ProjectExplorer::LocalEnvironmentAspect::BaseEnvironmentModifier()))
{
m_terminalAspect->setRunMode(ProjectExplorer::ApplicationLauncher::Gui);
addExtraAspect(m_argumentAspect);
addExtraAspect(m_terminalAspect);
addExtraAspect(m_localEnvironmentAspect);
addExtraAspect(m_workingDirectoryAspect);
if(parent) {
SnapcraftProject *pro = qobject_cast<SnapcraftProject *>(parent->project());
if (pro) {
setDisplayName(pro->displayName());
QStringList comms = pro->commands();
if (comms.size())
m_command = comms.first();
}
m_workingDirectoryAspect->setDefaultWorkingDirectory(Utils::FileName::fromString(pro->projectDir().absolutePath()));
}
// Connect target signals
connect(this->target(), &ProjectExplorer::Target::activeBuildConfigurationChanged,
this, &SnapRunConfiguration::updateConfiguration);
updateConfiguration();
}
SnapRunConfiguration::SnapRunConfiguration(ProjectExplorer::Target *parent, SnapRunConfiguration *source)
: ProjectExplorer::RunConfiguration(parent, source),
m_command(source->m_command)
{
// Connect target signals
connect(this->target(), &ProjectExplorer::Target::activeBuildConfigurationChanged,
this, &SnapRunConfiguration::updateConfiguration);
updateConfiguration();
}
QString SnapRunConfiguration::command() const
{
return m_command;
}
void SnapRunConfiguration::setCommand(const QString &command)
{
if (command != m_command) {
m_command = command;
emit enabledChanged();
}
}
bool SnapRunConfiguration::fromMap(const QVariantMap &map)
{
if (!ProjectExplorer::RunConfiguration::fromMap(map))
return false;
m_command = map.value(COMMAND_KEY, QString()).toString();
return true;
}
QVariantMap SnapRunConfiguration::toMap() const
{
QVariantMap map = ProjectExplorer::RunConfiguration::toMap();
map.insert(COMMAND_KEY, m_command);
return map;
}
bool SnapRunConfiguration::isEnabled() const
{
return !m_command.isEmpty();
}
QString SnapRunConfiguration::disabledReason() const
{
return tr("Please select a command to run in the runconfiguration.");
}
QWidget *SnapRunConfiguration::createConfigurationWidget()
{
return new SnapRunConfigurationWidget(this);
}
ProjectExplorer::Runnable SnapRunConfiguration::runnable() const
{
SnapcraftStep *pckStep = activeSnapcraftStep();
if (!pckStep) {
return ProjectExplorer::Runnable();
}
Utils::FileName packagePath = pckStep->packagePath();
if(packagePath.isEmpty()) {
return ProjectExplorer::Runnable();
}
qDebug()<<"Going to run "<<packagePath.toUserOutput();
QStringList args{
packagePath.toUserOutput(),
m_command
};
ProjectExplorer::StandardRunnable r;
r.executable = Utils::FileName::fromString(Constants::UBUNTU_SCRIPTPATH).appendPath(QStringLiteral("qtc_desktop_snaprunner.py")).toString();;
r.workingDirectory = m_workingDirectoryAspect->workingDirectory().toString();
r.environment = m_localEnvironmentAspect->environment();
r.commandLineArguments = Utils::QtcProcess::joinArgs(args);
if (!m_argumentAspect->arguments().isEmpty()) {
r.commandLineArguments.append(QStringLiteral(" -- %1").arg(m_argumentAspect->arguments()));
}
return r;
}
SnapcraftStep *SnapRunConfiguration::activeSnapcraftStep() const
{
ProjectExplorer::BuildConfiguration *buildConf = activeBuildConfiguration();
if(!buildConf)
return nullptr;
ProjectExplorer::BuildStepList *bsList = buildConf->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
for(ProjectExplorer::BuildStep *currStep : bsList->steps()) {
SnapcraftStep *pckStep = qobject_cast<SnapcraftStep*>(currStep);
if(pckStep)
return pckStep;
}
return nullptr;
}
void SnapRunConfiguration::updateConfiguration()
{
if(m_currBuildConfConn)
disconnect(m_currBuildConfConn);
m_currBuildConfConn = connect(activeSnapcraftStep(), &SnapcraftStep::packagePathChanged,
this, &ProjectExplorer::RunConfiguration::requestRunActionsUpdate);
}
SnapRunConfigurationWidget::SnapRunConfigurationWidget(SnapRunConfiguration *config)
: QWidget (nullptr),
m_rc(config),
m_updating(false)
{
QFormLayout *layout = new QFormLayout(this);
layout->setMargin(0);
layout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
setLayout(layout);
m_commandsBox = new QComboBox(this);
updateComboBox();
connect(m_commandsBox, SIGNAL(currentIndexChanged(int)),
this, SLOT(commandSelected(int)));
int idx = m_commandsBox->findText(config->command());
if (idx >= 0)
m_commandsBox->setCurrentIndex(idx);
layout->addRow(tr("Command:"), m_commandsBox);
config->extraAspect<ProjectExplorer::ArgumentsAspect>()->addToMainConfigurationWidget(this, layout);
config->extraAspect<ProjectExplorer::WorkingDirectoryAspect>()->addToMainConfigurationWidget(this,layout);
config->extraAspect<ProjectExplorer::TerminalAspect>()->addToMainConfigurationWidget(this,layout);
if(config->target()) {
connect(qobject_cast<SnapcraftProject*>(config->target()->project()), &SnapcraftProject::commandListChanged,
this, &SnapRunConfigurationWidget::updateComboBox);
}
}
void SnapRunConfigurationWidget::updateComboBox()
{
QString currItem = m_rc->command();
//TODO check if project is still loading, so we do not override something we need
m_updating = true;
m_commandsBox->clear();
m_commandsBox->addItem(QString());
if(m_rc && m_rc->target()) {
SnapcraftProject *pro = qobject_cast<SnapcraftProject *>(m_rc->target()->project());
if (pro) {
QStringList comms = pro->commands();
m_commandsBox->addItems(comms);
}
}
m_updating = false;
int idx = m_commandsBox->findText(currItem);
if (idx <= 0 && m_commandsBox->count() > 1)
m_commandsBox->setCurrentIndex(1);
else if (idx > 0)
m_commandsBox->setCurrentIndex(idx);
else
m_commandsBox->setCurrentIndex(0);
}
void SnapRunConfigurationWidget::commandSelected(const int index)
{
if(m_updating)
return;
if(index == 0)
m_rc->setCommand(QString());
else
m_rc->setCommand(m_commandsBox->itemText(index));
}
} // namespace Internal
} // namespace Ubuntu

View File

@@ -0,0 +1,87 @@
#ifndef UBUNTU_INTERNAL_SNAPRUNCONFIGURATION_H
#define UBUNTU_INTERNAL_SNAPRUNCONFIGURATION_H
#include "snaprunconfigurationfactory.h"
#include <projectexplorer/runconfiguration.h>
#include <utils/fileutils.h>
#include <QStringList>
class QComboBox;
namespace Utils {
class PathChooser;
}
namespace ProjectExplorer {
class WorkingDirectoryAspect;
class ArgumentsAspect;
class TerminalAspect;
class LocalEnvironmentAspect;
}
namespace Ubuntu {
namespace Internal {
class SnapcraftStep;
class SnapRunConfiguration : public ProjectExplorer::RunConfiguration
{
Q_OBJECT
friend class SnapRunConfigurationFactory;
protected:
SnapRunConfiguration(ProjectExplorer::Target *parent);
SnapRunConfiguration(ProjectExplorer::Target *parent, SnapRunConfiguration *source);
public:
QString command () const;
void setCommand (const QString &command);
// ProjectConfiguration interface
virtual bool fromMap(const QVariantMap &map) override;
virtual QVariantMap toMap() const override;
// RunConfiguration interface
virtual bool isEnabled() const override;
virtual QString disabledReason() const override;
virtual QWidget *createConfigurationWidget() override;
virtual ProjectExplorer::Runnable runnable() const override;
private:
SnapcraftStep *activeSnapcraftStep() const;
void updateCommandList(const QStringList &commands);
void updateConfiguration();
private:
QString m_command;
QMetaObject::Connection m_currBuildConfConn;
ProjectExplorer::WorkingDirectoryAspect* m_workingDirectoryAspect;
ProjectExplorer::ArgumentsAspect* m_argumentAspect;
ProjectExplorer::TerminalAspect* m_terminalAspect;
ProjectExplorer::LocalEnvironmentAspect* m_localEnvironmentAspect;
};
class SnapRunConfigurationWidget : public QWidget
{
Q_OBJECT
public:
SnapRunConfigurationWidget(SnapRunConfiguration *config);
protected:
void updateComboBox ();
protected slots:
void commandSelected (const int index);
private:
SnapRunConfiguration *m_rc;
QComboBox *m_commandsBox;
bool m_updating;
};
} // namespace Internal
} // namespace Ubuntu
#endif // UBUNTU_INTERNAL_SNAPRUNCONFIGURATION_H

View File

@@ -0,0 +1,85 @@
#include "snaprunconfigurationfactory.h"
#include "snaprunconfiguration.h"
#include "snapcraftproject.h"
#include <ubuntu/ubuntuconstants.h>
#include <projectexplorer/target.h>
#include <utils/qtcassert.h>
namespace Ubuntu {
namespace Internal {
SnapRunConfigurationFactory::SnapRunConfigurationFactory()
{
setObjectName(QStringLiteral("SnapRunConfigurationFactory"));
}
QList<Core::Id> SnapRunConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent,
ProjectExplorer::IRunConfigurationFactory::CreationMode mode) const
{
Q_UNUSED(mode);
if (!parent)
return {};
if (!qobject_cast<SnapcraftProject *>(parent->project()))
return {};
return {
Constants::SNAP_RUNCONFIGURATION_ID
};
}
QString SnapRunConfigurationFactory::displayNameForId(Core::Id id) const
{
if (id == Constants::SNAP_RUNCONFIGURATION_ID)
return tr("Snapcraft Runconfiguration");
return QString();
}
bool SnapRunConfigurationFactory::canCreate(ProjectExplorer::Target *parent, Core::Id id) const
{
return availableCreationIds(parent, ProjectExplorer::IRunConfigurationFactory::AutoCreate).contains(id);
}
bool SnapRunConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const
{
return availableCreationIds(parent, ProjectExplorer::IRunConfigurationFactory::AutoCreate).contains(ProjectExplorer::idFromMap(map));
}
bool SnapRunConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *product) const
{
return availableCreationIds(parent, ProjectExplorer::IRunConfigurationFactory::AutoCreate).contains(product->id());
}
ProjectExplorer::RunConfiguration *SnapRunConfigurationFactory::clone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *product)
{
QTC_ASSERT(canClone(parent, product), return nullptr);
return new SnapRunConfiguration(parent, static_cast<SnapRunConfiguration *>(product));
}
ProjectExplorer::RunConfiguration *SnapRunConfigurationFactory::doCreate(ProjectExplorer::Target *parent, Core::Id id)
{
QTC_ASSERT(canCreate(parent, id), return nullptr);
if (id == Constants::SNAP_RUNCONFIGURATION_ID)
return new SnapRunConfiguration(parent);
return nullptr;
}
ProjectExplorer::RunConfiguration *SnapRunConfigurationFactory::doRestore(ProjectExplorer::Target *parent, const QVariantMap &map)
{
QTC_ASSERT(canRestore(parent, map), return nullptr);
SnapRunConfiguration *conf = new SnapRunConfiguration(parent);
if (conf->fromMap(map))
return conf;
//something went wrong
delete conf;
return nullptr;
}
} // namespace Internal
} // namespace Ubuntu

View File

@@ -0,0 +1,31 @@
#ifndef UBUNTU_INTERNAL_SNAPRUNCONFIGURATIONFACTORY_H
#define UBUNTU_INTERNAL_SNAPRUNCONFIGURATIONFACTORY_H
#include <projectexplorer/runconfiguration.h>
namespace Ubuntu {
namespace Internal {
class SnapRunConfigurationFactory : public ProjectExplorer::IRunConfigurationFactory
{
public:
SnapRunConfigurationFactory();
// IRunConfigurationFactory interface
virtual QList<Core::Id> availableCreationIds(ProjectExplorer::Target *parent, CreationMode mode) const override;
virtual QString displayNameForId(Core::Id id) const override;
virtual bool canCreate(ProjectExplorer::Target *parent, Core::Id id) const override;
virtual bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const override;
virtual bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *product) const override;
virtual ProjectExplorer::RunConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *product) override;
private:
virtual ProjectExplorer::RunConfiguration *doCreate(ProjectExplorer::Target *parent, Core::Id id) override;
virtual ProjectExplorer::RunConfiguration *doRestore(ProjectExplorer::Target *parent, const QVariantMap &map) override;
};
} // namespace Internal
} // namespace Ubuntu
#endif // UBUNTU_INTERNAL_SNAPRUNCONFIGURATIONFACTORY_H

View File

@@ -11,7 +11,9 @@ SOURCES += \
$$PWD/project/snapcraftrsyncstep.cpp \ $$PWD/project/snapcraftrsyncstep.cpp \
$$PWD/project/snapcraftstep.cpp \ $$PWD/project/snapcraftstep.cpp \
$$PWD/project/snapcraftbuildstepfactory.cpp \ $$PWD/project/snapcraftbuildstepfactory.cpp \
$$PWD/settings/snapcraftkitinformation.cpp $$PWD/settings/snapcraftkitinformation.cpp \
$$PWD/project/snaprunconfiguration.cpp \
$$PWD/project/snaprunconfigurationfactory.cpp
HEADERS += \ HEADERS += \
$$PWD/project/snapcraftproject.h \ $$PWD/project/snapcraftproject.h \
@@ -23,5 +25,7 @@ HEADERS += \
$$PWD/project/snapcraftrsyncstep.h \ $$PWD/project/snapcraftrsyncstep.h \
$$PWD/project/snapcraftstep.h \ $$PWD/project/snapcraftstep.h \
$$PWD/project/snapcraftbuildstepfactory.h \ $$PWD/project/snapcraftbuildstepfactory.h \
$$PWD/settings/snapcraftkitinformation.h $$PWD/settings/snapcraftkitinformation.h \
$$PWD/project/snaprunconfiguration.h \
$$PWD/project/snaprunconfigurationfactory.h

View File

@@ -37,7 +37,7 @@
namespace Ubuntu { namespace Ubuntu {
namespace Internal { namespace Internal {
const char * PACKAGE_NAME_REGEX = "^Snapped ([\\S]+\\.snap)$"; static const char * PACKAGE_NAME_REGEX = "^Snapped ([\\S]+\\.snap)$";
SnapcraftPackageStep::SnapcraftPackageStep(ProjectExplorer::BuildStepList *bsl) SnapcraftPackageStep::SnapcraftPackageStep(ProjectExplorer::BuildStepList *bsl)
: ProjectExplorer::BuildStep (bsl, Constants::UBUNTU_SNAP_PACKAGESTEP_ID) : ProjectExplorer::BuildStep (bsl, Constants::UBUNTU_SNAP_PACKAGESTEP_ID)

View File

@@ -260,23 +260,21 @@ const char FEATURE_UBUNTU_SAUCY[] = "Ubuntu.Wizards.FeatureUbuntuSaucy";
const char FEATURE_UBUNTU_TRUSTY[] = "Ubuntu.Wizards.FeatureUbuntuTrusty"; const char FEATURE_UBUNTU_TRUSTY[] = "Ubuntu.Wizards.FeatureUbuntuTrusty";
const char FEATURE_UBUNTU_UTOPIC[] = "Ubuntu.Wizards.FeatureUbuntuUtopic"; const char FEATURE_UBUNTU_UTOPIC[] = "Ubuntu.Wizards.FeatureUbuntuUtopic";
const char DISTRIB_ID[] = "DISTRIB_ID=";
const char DISTRIB_CODENAME[] = "DISTRIB_CODENAME=";
const char DISTRIB_RELEASE[] = "DISTRIB_RELEASE=";
const char DISTRIB_DESCRIPTION[] = "DISTRIB_DESCRIPTION=";
const char LSB_RELEASE[] = "/etc/lsb-release";
const char PRECISE[] = "precise";
const char QUANTAL[] = "quantal";
const char RARING[] = "raring";
const char SAUCY[] = "saucy";
const char TRUSTY[] = "trusty";
const char UTOPIC[] = "utopic";
const char PLATFORM_DESKTOP[] = "Desktop"; const char PLATFORM_DESKTOP[] = "Desktop";
const char PLATFORM_DESKTOP_DISPLAYNAME[] = "Ubuntu %0"; const char PLATFORM_DESKTOP_DISPLAYNAME[] = "Ubuntu %0";
const QString PRECISE (QStringLiteral("precise"));
const QString QUANTAL (QStringLiteral("quantal"));
const QString RARING (QStringLiteral("raring"));
const QString SAUCY (QStringLiteral("saucy"));
const QString TRUSTY (QStringLiteral("trusty"));
const QString UTOPIC (QStringLiteral("utopic"));
const QString VIVID (QStringLiteral("vivid"));
const QString WILY (QStringLiteral("wily"));
*/ */
const QString XENIAL (QStringLiteral("xenial"));
const char TASK_DEVICE_SCRIPT[] = "Ubuntu.Task.DeviceScript"; const char TASK_DEVICE_SCRIPT[] = "Ubuntu.Task.DeviceScript";
const char UBUNTU_SETTINGS_ICON[] = ":/ubuntu/images/ubuntu-32.png"; const char UBUNTU_SETTINGS_ICON[] = ":/ubuntu/images/ubuntu-32.png";
@@ -400,6 +398,7 @@ const char SNAPCRAFT_PROJECT_PROJECTCONTEXT[] = "SnapcraftProject.ProjectContext
const char SNAPCRAFT_BUILDCONFIGURATION_ID[] = "SnapcraftProjectManager.SnapcraftBuildconfiguration.Id"; const char SNAPCRAFT_BUILDCONFIGURATION_ID[] = "SnapcraftProjectManager.SnapcraftBuildconfiguration.Id";
const char SNAPCRAFT_RSYNCBUILSSTEP_ID[] = "SnapcraftProjectManager.SnapcraftRsyncStep.Id"; const char SNAPCRAFT_RSYNCBUILSSTEP_ID[] = "SnapcraftProjectManager.SnapcraftRsyncStep.Id";
const char SNAPCRAFT_BUILDSTEP_ID[] = "SnapcraftProjectManager.SnapcraftStep.Id"; const char SNAPCRAFT_BUILDSTEP_ID[] = "SnapcraftProjectManager.SnapcraftStep.Id";
const char SNAP_RUNCONFIGURATION_ID[] = "SnapcraftProjectManager.SnapRunConfiguration.Id";

View File

@@ -15,8 +15,11 @@
* *
* Author: Benjamin Zeller <benjamin.zeller@canonical.com> * Author: Benjamin Zeller <benjamin.zeller@canonical.com>
*/ */
#include "ubuntujsextension.h" #include "ubuntujsextension.h"
#include <ubuntu/ubuntubzr.h> #include <ubuntu/ubuntubzr.h>
#include <ubuntu/ubuntuversion.h>
#include <ubuntu/ubuntuconstants.h>
namespace Ubuntu { namespace Ubuntu {
namespace Internal { namespace Internal {
@@ -43,4 +46,12 @@ QString UbuntuJsExtension::developerId() const
return maintainer; return maintainer;
} }
bool UbuntuJsExtension::supportsSnappy() const
{
UbuntuVersion *v = UbuntuVersion::instance();
if (v->isValid())
return v->supportsSnappy();
return false;
}
}} }}

View File

@@ -30,6 +30,7 @@ public:
explicit UbuntuJsExtension(QObject *parent = 0); explicit UbuntuJsExtension(QObject *parent = 0);
Q_INVOKABLE QString developerId() const; Q_INVOKABLE QString developerId() const;
Q_INVOKABLE bool supportsSnappy() const;
}; };
}} }}

View File

@@ -52,11 +52,13 @@
#include <ubuntu/wizards/ubuntuprojectapplicationwizard.h> #include <ubuntu/wizards/ubuntuprojectapplicationwizard.h>
#include <ubuntu/wizards/ubuntufirstrunwizard.h> #include <ubuntu/wizards/ubuntufirstrunwizard.h>
#include <ubuntu/wizards/ubuntuprojectmigrationwizard.h> #include <ubuntu/wizards/ubuntuprojectmigrationwizard.h>
#include <ubuntu/ubuntuversion.h>
#include <ubuntu/snap/project/snapcraftprojectmanager.h> #include <ubuntu/snap/project/snapcraftprojectmanager.h>
#include <ubuntu/snap/project/snapcraftbuildconfigurationfactory.h> #include <ubuntu/snap/project/snapcraftbuildconfigurationfactory.h>
#include <ubuntu/snap/project/snapcraftbuildstepfactory.h> #include <ubuntu/snap/project/snapcraftbuildstepfactory.h>
#include <ubuntu/snap/settings/snapcraftkitinformation.h> #include <ubuntu/snap/settings/snapcraftkitinformation.h>
#include <ubuntu/snap/project/snaprunconfiguration.h>
#include "ubuntujsextension.h" #include "ubuntujsextension.h"
@@ -181,11 +183,14 @@ bool UbuntuPlugin::initialize(const QStringList &arguments, QString *errorString
addAutoReleasedObject(new UbuntuLocalRunControlFactory); addAutoReleasedObject(new UbuntuLocalRunControlFactory);
addAutoReleasedObject(new SnapcraftProjectManager); if (UbuntuVersion::instance()->supportsSnappy()) {
addAutoReleasedObject(new SnapcraftBuildConfigurationFactory); addAutoReleasedObject(new SnapcraftProjectManager);
addAutoReleasedObject(new SnapcraftBuildStepFactory); addAutoReleasedObject(new SnapcraftBuildConfigurationFactory);
addAutoReleasedObject(new SnapcraftBuildStepFactory);
addAutoReleasedObject(new SnapRunConfigurationFactory);
ProjectExplorer::KitManager::registerKitInformation(new SnapcraftKitInformation); ProjectExplorer::KitManager::registerKitInformation(new SnapcraftKitInformation);
}
// Build support // Build support
addAutoReleasedObject(new ClickToolChainFactory); addAutoReleasedObject(new ClickToolChainFactory);

View File

@@ -21,61 +21,59 @@
#include <QFile> #include <QFile>
#include <QStringList> #include <QStringList>
using namespace Ubuntu::Internal; namespace Ubuntu {
namespace Internal {
Q_GLOBAL_STATIC(UbuntuVersion, g_instance);
const char DISTRIB_ID[] = "DISTRIB_ID=";
const char DISTRIB_CODENAME[] = "DISTRIB_CODENAME=";
const char DISTRIB_RELEASE[] = "DISTRIB_RELEASE=";
const char DISTRIB_DESCRIPTION[] = "DISTRIB_DESCRIPTION=";
const char LSB_RELEASE[] = "/etc/lsb-release";
UbuntuVersion::UbuntuVersion() UbuntuVersion::UbuntuVersion()
{ {
initFromLsbFile();
} }
Core::FeatureSet UbuntuVersion::features() { bool UbuntuVersion::supportsSnappy() const
Core::FeatureSet retval;
QString cName = codename();
if (cName==QLatin1String(Constants::PRECISE)) {
retval |= Core::FeatureSet(Constants::FEATURE_UBUNTU_PRECISE);
} else if (cName==QLatin1String(Constants::QUANTAL)) {
retval |= Core::FeatureSet(Constants::FEATURE_UBUNTU_QUANTAL);
} else if (cName==QLatin1String(Constants::RARING)) {
retval |= Core::FeatureSet(Constants::FEATURE_UBUNTU_RARING);
} else if (cName==QLatin1String(Constants::SAUCY)) {
retval |= Core::FeatureSet(Constants::FEATURE_UBUNTU_SAUCY);
retval |= Core::FeatureSet(Constants::FEATURE_UNITY_SCOPE);
} else if (cName==QLatin1String(Constants::TRUSTY)) {
retval |= Core::FeatureSet(Constants::FEATURE_UBUNTU_TRUSTY);
retval |= Core::FeatureSet(Constants::FEATURE_UNITY_SCOPE);
} else if (cName==QLatin1String(Constants::UTOPIC)) {
retval |= Core::FeatureSet(Constants::FEATURE_UBUNTU_UTOPIC);
retval |= Core::FeatureSet(Constants::FEATURE_UNITY_SCOPE);
}
return retval;
}
UbuntuVersion *UbuntuVersion::fromLsbFile(const QString &fileName)
{ {
QFile lsbRelease(fileName); if (m_valid)
return codename() == Constants::XENIAL;
return false;
}
UbuntuVersion *UbuntuVersion::instance()
{
return g_instance();
}
void UbuntuVersion::initFromLsbFile()
{
QFile lsbRelease(QString::fromLatin1(LSB_RELEASE));
if (lsbRelease.open(QIODevice::ReadOnly)) { if (lsbRelease.open(QIODevice::ReadOnly)) {
QByteArray data = lsbRelease.readAll(); QByteArray data = lsbRelease.readAll();
lsbRelease.close(); lsbRelease.close();
UbuntuVersion *ver = new UbuntuVersion;
foreach(QString line, QString::fromLatin1(data).split(QLatin1String("\n"))) { foreach(QString line, QString::fromLatin1(data).split(QLatin1String("\n"))) {
if (line.startsWith(QLatin1String(Constants::DISTRIB_ID))) { if (line.startsWith(QLatin1String(DISTRIB_ID))) {
ver->m_id = line.replace(QLatin1String(Constants::DISTRIB_ID),QLatin1String("")); m_id = line.replace(QLatin1String(DISTRIB_ID),QLatin1String(""));
} else if (line.startsWith(QLatin1String(Constants::DISTRIB_RELEASE))) { } else if (line.startsWith(QLatin1String(DISTRIB_RELEASE))) {
ver->m_release = line.replace(QLatin1String(Constants::DISTRIB_RELEASE),QLatin1String("")); m_release = line.replace(QLatin1String(DISTRIB_RELEASE),QLatin1String(""));
} else if (line.startsWith(QLatin1String(Constants::DISTRIB_CODENAME))) { } else if (line.startsWith(QLatin1String(DISTRIB_CODENAME))) {
ver->m_codename = line.replace(QLatin1String(Constants::DISTRIB_CODENAME),QLatin1String("")); m_codename = line.replace(QLatin1String(DISTRIB_CODENAME),QLatin1String(""));
} else if (line.startsWith(QLatin1String(Constants::DISTRIB_DESCRIPTION))) { } else if (line.startsWith(QLatin1String(DISTRIB_DESCRIPTION))) {
ver->m_description = line.replace(QLatin1String(Constants::DISTRIB_DESCRIPTION),QLatin1String("")); m_description = line.replace(QLatin1String(DISTRIB_DESCRIPTION),QLatin1String(""));
} }
} }
return ver; m_valid = true;
} }
return 0;
} }
}}

View File

@@ -27,28 +27,30 @@ namespace Ubuntu {
namespace Internal { namespace Internal {
class UbuntuVersion : public QObject class UbuntuVersion
{ {
Q_OBJECT
public: public:
explicit UbuntuVersion(); explicit UbuntuVersion();
public slots: public slots:
QString id() { return m_id; } bool isValid () const { return m_valid; }
QString release() { return m_release; } QString id() const { return m_id; }
QString codename() { return m_codename; } QString release() const { return m_release; }
QString description() { return m_description; } QString codename() const { return m_codename; }
QString description() const { return m_description; }
bool supportsSnappy () const;
Core::FeatureSet features(); static UbuntuVersion *instance( );
static UbuntuVersion *fromLsbFile( const QString &fileName ); protected:
void initFromLsbFile( );
protected: protected:
QString m_id; QString m_id;
QString m_release; QString m_release;
QString m_codename; QString m_codename;
QString m_description; QString m_description;
bool m_valid = false;
}; };
} }
} }