diff --git a/CHANGES b/CHANGES index f430a7910..22dac3dd2 100644 --- a/CHANGES +++ b/CHANGES @@ -9,15 +9,20 @@ This release contains contributions from (alphabetically by first name): - Bill Auger - Gaël PORTAY - Luna Jernberg + - Philip Müller ## Core ## - There is now a bash-completions script for Calamares; turn on the (CMake-time) option INSTALL_COMPLETION to get it. (Thanks Gaël) - The *productWallpaper* setting is documented and works. (Thanks Bill) + - GlobalStorage is available to QML modules as `Global`. + - The height of the navigation bar in QML can be set within the + QML code for the navigation; if not set, try something sensible. ## Modules ## - The *bootloader* module can force a UEFI-based machine to boot into the newly-installed system. #1394 (Thanks Gaël) + - *partition* Pop-ups about boot flags use the right flag names. #1192 # 3.2.23 (2020-04-17) # diff --git a/CMakeLists.txt b/CMakeLists.txt index 6edece315..8603099db 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,6 +54,7 @@ option( BUILD_TESTING "Build the testing tree." ON ) option( WITH_PYTHON "Enable Python modules API (requires Boost.Python)." ON ) option( WITH_PYTHONQT "Enable next generation Python modules API (experimental, requires PythonQt)." OFF ) option( WITH_KF5Crash "Enable crash reporting with KCrash." ON ) +option( WITH_KF5DBus "Use DBus service for unique-application." ON ) # Possible debugging flags are: # - DEBUG_TIMEZONES draws latitude and longitude lines on the timezone @@ -290,7 +291,7 @@ if( ECM_FOUND ) include(KDEInstallDirs) endif() -find_package( KF5 QUIET COMPONENTS CoreAddons Crash ) +find_package( KF5 QUIET COMPONENTS CoreAddons Crash DBusAddons ) set_package_properties( KF5::CoreAddons PROPERTIES TYPE REQUIRED @@ -299,8 +300,17 @@ set_package_properties( PURPOSE "About Calamares" ) if( NOT KF5Crash_FOUND ) + if( WITH_KF5Crash ) + message(WARNING "WITH_KF5Crash is set, but KF5::Crash is not available.") + endif() set( WITH_KF5Crash OFF ) endif() +if( NOT KF5DBusAddons_FOUND ) + if( WITH_KF5DBus ) + message(WARNING "WITH_KF5DBus is set, but KF5::DBusAddons is not available.") + endif() + set( WITH_KF5DBus OFF ) +endif() if( BUILD_TESTING ) enable_testing() @@ -520,6 +530,7 @@ add_feature_info(Python ${WITH_PYTHON} "Python job modules") add_feature_info(PythonQt ${WITH_PYTHONQT} "Python view modules") add_feature_info(Config ${INSTALL_CONFIG} "Install Calamares configuration") add_feature_info(KCrash ${WITH_KF5Crash} "Crash dumps via KCrash") +add_feature_info(KDBusAddons ${WITH_KF5DBus} "Unique-application via DBus") # Add all targets to the build-tree export set set( CMAKE_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/Calamares" CACHE PATH "Installation directory for CMake files" ) diff --git a/CMakeModules/CalamaresAddModuleSubdirectory.cmake b/CMakeModules/CalamaresAddModuleSubdirectory.cmake index 53b952b54..1af520ca8 100644 --- a/CMakeModules/CalamaresAddModuleSubdirectory.cmake +++ b/CMakeModules/CalamaresAddModuleSubdirectory.cmake @@ -168,5 +168,24 @@ function( calamares_add_module_subdirectory ) COMMAND loadmodule ${SUBDIRECTORY} WORKING_DIRECTORY ${CMAKE_BINARY_DIR} ) + # Try it with the tests/ configurations shipped with the module + set( _count 1 ) + set( _testdir ${CMAKE_CURRENT_SOURCE_DIR}/${SUBDIRECTORY}/tests ) + while ( EXISTS "${_testdir}/${_count}.global" OR EXISTS "${_testdir}/${_count}.job" ) + set( _dash_g "" ) + set( _dash_j "" ) + if ( EXISTS "${_testdir}/${_count}.global" ) + set( _dash_g -g ${_testdir}/${_count}.global ) + endif() + if ( EXISTS "${_testdir}/${_count}.job" ) + set( _dash_j -j ${_testdir}/${_count}.job ) + endif() + add_test( + NAME load-${SUBDIRECTORY}-${_count} + COMMAND loadmodule ${_dash_g} ${_dash_j} ${SUBDIRECTORY} + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + ) + math( EXPR _count "${_count} + 1" ) + endwhile() endif() endfunction() diff --git a/lang/calamares_lt.ts b/lang/calamares_lt.ts index a6767d0ff..327e227c0 100644 --- a/lang/calamares_lt.ts +++ b/lang/calamares_lt.ts @@ -2560,12 +2560,12 @@ Diegimo programa užbaigs darbą ir visi pakeitimai bus prarasti. An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a FAT32 filesystem with the <strong>%3</strong> flag enabled and mount point <strong>%2</strong>.<br/><br/>You can continue without setting up an EFI system partition but your system may fail to start. - + EFI sistemos skaidinys yra būtinas, norint paleisti %1.<br/><br/>Norėdami sukonfigūruoti EFI sistemos skaidinį, grįžkite atgal ir pasirinkite arba sukurkite FAT32 failų sistemą su įjungta <strong>%3</strong> vėliavėle ir <strong>%2</strong> prijungimo tašku.<br/><br/>Jūs galite tęsti ir nenustatę EFI sistemos skaidinio, tačiau tokiu atveju, gali nepavykti paleisti jūsų sistemos. An EFI system partition is necessary to start %1.<br/><br/>A partition was configured with mount point <strong>%2</strong> but its <strong>%3</strong> flag is not set.<br/>To set the flag, go back and edit the partition.<br/><br/>You can continue without setting the flag but your system may fail to start. - + EFI sistemos skaidinys yra būtinas, norint paleisti %1.<br/><br/>Skaidinys buvo sukonfigūruotas su prijungimo tašku <strong>%2</strong>, tačiau jo <strong>%3</strong> vėliavėlė yra nenustatyta.<br/>Norėdami nustatyti vėliavėlę, grįžkite atgal ir taisykite skaidinį.<br/><br/>Jūs galite tęsti ir nenustatę vėliavėlės, tačiau tokiu atveju, gali nepavykti paleisti jūsų sistemos. @@ -3804,7 +3804,27 @@ Išvestis: </ul> <p>The vertical scrollbar is adjustable, current width set to 10.</p> - + <h3>%1</h3> + <p>Tai yra pavyzdinis QML failas, rodantis parinktis raiškiuoju tekstu su interaktyviu turiniu.</p> + + <p>QML su raiškiuoju tekstu gali naudoti HTML žymes, interaktyvus turinys yra naudingas jutikliniuose ekranuose.</p> + + <p><b>Tai yra pusjuodis tekstas</b></p> + <p><i>Tai yra kursyvinis tekstas</i></p> + <p><u>Tai yra pabrauktas tekstas</u></p> + <p><center>Šis tekstas bus lygiuojamas centre.</center></p> + <p><s>Tai yra perbraukimas</s></p> + + <p>Kodo pavyzdžiai: + <code>ls -l /home</code></p> + + <p><b>Sąrašai:</b></p> + <ul> + <li>Intel CPU sistemos</li> + <li>AMD CPU sistemos</li> + </ul> + + <p>Vertikalioji slankjuostė yra reguliuojama, dabartinis plotis nustatytas į 10.</p> @@ -3818,7 +3838,8 @@ Išvestis: <h3>Welcome to the %1 <quote>%2</quote> installer</h3> <p>This program will ask you some questions and set up %1 on your computer.</p> - + <h3>Jus sveikina %1 <quote>%2</quote> diegimo programa</h3> + <p>Ši programa užduos jums kelis klausimus ir padės kompiuteryje nusistatyti %1.</p> diff --git a/src/calamares/CMakeLists.txt b/src/calamares/CMakeLists.txt index 81fd0d132..5c5a68a97 100644 --- a/src/calamares/CMakeLists.txt +++ b/src/calamares/CMakeLists.txt @@ -41,12 +41,13 @@ target_link_libraries( calamares_bin KF5::CoreAddons ) if( WITH_KF5Crash ) - target_link_libraries( calamares_bin - PRIVATE - KF5::Crash - ) + target_link_libraries( calamares_bin PRIVATE KF5::Crash ) target_compile_definitions( calamares_bin PRIVATE WITH_KF5Crash ) endif() +if( WITH_KF5DBus ) + target_link_libraries( calamares_bin PRIVATE KF5::DBusAddons ) + target_compile_definitions( calamares_bin PRIVATE WITH_KF5DBus ) +endif() install( TARGETS calamares_bin BUNDLE DESTINATION . @@ -59,7 +60,10 @@ install( FILES ${CMAKE_SOURCE_DIR}/data/images/squid.svg ) if( BUILD_TESTING ) + # Don't install, these are just for enable_testing add_executable( loadmodule testmain.cpp ) target_link_libraries( loadmodule PRIVATE Qt5::Core Qt5::Widgets calamares calamaresui ) - # Don't install, it's just for enable_testing + + add_executable( test_conf test_conf.cpp ) + target_link_libraries( test_conf PUBLIC yamlcpp Qt5::Core ) endif() diff --git a/src/calamares/CalamaresWindow.cpp b/src/calamares/CalamaresWindow.cpp index 84dd35e55..06a31a0e9 100644 --- a/src/calamares/CalamaresWindow.cpp +++ b/src/calamares/CalamaresWindow.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include #include @@ -221,7 +222,13 @@ CalamaresWindow::getQmlNavigation( QWidget* parent ) w->setResizeMode( QQuickWidget::SizeRootObjectToView ); w->setSource( QUrl( CalamaresUtils::searchQmlFile( CalamaresUtils::QmlSearch::Both, QStringLiteral( "calamares-navigation" ) ) ) ); - w->setMinimumHeight( 30 ); // matchine the default widgets version + + // If the QML itself sets a height, use that, otherwise go to 48 pixels + // which seems to match what the widget navigation would use for height + // (with *my* specific screen, style, etc. so YMMV). + qreal minimumHeight = qBound( qreal( 16 ), w->rootObject() ? w->rootObject()->height() : 48, qreal( 64 ) ); + w->setMinimumHeight( int( minimumHeight ) ); + return w; } diff --git a/src/calamares/calamares-navigation.qml b/src/calamares/calamares-navigation.qml index c7cd91835..6b356218d 100644 --- a/src/calamares/calamares-navigation.qml +++ b/src/calamares/calamares-navigation.qml @@ -8,10 +8,10 @@ import QtQuick.Layouts 1.3 Rectangle { id: navigationBar; color: Branding.styleString( Branding.SidebarBackground ); + height: 48; RowLayout { id: buttonBar - height: 64; anchors.fill: parent; Item diff --git a/src/calamares/main.cpp b/src/calamares/main.cpp index 2af46119b..030ccc239 100644 --- a/src/calamares/main.cpp +++ b/src/calamares/main.cpp @@ -25,11 +25,17 @@ #include "utils/Logger.h" #include "utils/Retranslator.h" +#ifndef WITH_KF5DBus +#warning "KDSingleApplicationGuard is deprecated" #include "3rdparty/kdsingleapplicationguard/kdsingleapplicationguard.h" +#endif -#include +#include +#ifdef WITH_KF5DBus +#include +#endif #ifdef WITH_KF5Crash -#include +#include #endif #include @@ -63,7 +69,13 @@ debug_level( QCommandLineParser& parser, QCommandLineOption& levelOption ) } } -static void +/** @brief Handles the command-line arguments + * + * Sets up internals for Calamares based on command-line arguments like `-D`, + * `-d`, etc. Returns @c true if this is a *debug* run, i.e. if the `-d` + * command-line flag is given, @c false otherwise. + */ +static bool handle_args( CalamaresApplication& a ) { QCommandLineOption debugOption( QStringList { "d", "debug" }, @@ -100,8 +112,8 @@ handle_args( CalamaresApplication& a ) CalamaresUtils::setXdgDirs(); } CalamaresUtils::setAllowLocalTranslation( parser.isSet( debugOption ) || parser.isSet( debugTxOption ) ); - Calamares::Settings::init( parser.isSet( debugOption ) ); - a.init(); + + return parser.isSet( debugOption ); } int @@ -129,13 +141,14 @@ main( int argc, char* argv[] ) // TODO: umount anything in /tmp/calamares-... as an emergency save function #endif - KDSingleApplicationGuard guard( KDSingleApplicationGuard::AutoKillOtherInstances ); - if ( guard.isPrimaryInstance() ) - { - handle_args( a ); - return a.exec(); - } - else + bool is_debug = handle_args( a ); + +#ifdef WITH_KF5DBus + KDBusService service( is_debug ? KDBusService::Multiple : KDBusService::Unique ); +#else + KDSingleApplicationGuard guard( is_debug ? KDSingleApplicationGuard::NoPolicy + : KDSingleApplicationGuard::AutoKillOtherInstances ); + if ( !is_debug && !guard.isPrimaryInstance() ) { // Here we have not yet set-up the logger system, so qDebug() is ok auto instancelist = guard.instances(); @@ -150,4 +163,9 @@ main( int argc, char* argv[] ) } return 69; // EX_UNAVAILABLE on FreeBSD } +#endif + + Calamares::Settings::init( is_debug ); + a.init(); + return a.exec(); } diff --git a/src/modules/test_conf.cpp b/src/calamares/test_conf.cpp similarity index 100% rename from src/modules/test_conf.cpp rename to src/calamares/test_conf.cpp diff --git a/src/modules/CMakeLists.txt b/src/modules/CMakeLists.txt index b72b755d3..533c704f8 100644 --- a/src/modules/CMakeLists.txt +++ b/src/modules/CMakeLists.txt @@ -10,12 +10,6 @@ include_directories( ${CMAKE_SOURCE_DIR}/src/libcalamaresui ) -if( BUILD_TESTING ) - add_executable( test_conf test_conf.cpp ) - target_link_libraries( test_conf yamlcpp Qt5::Core ) - target_include_directories( test_conf PUBLIC ${YAMLCPP_INCLUDE_DIR} ) -endif() - string( REPLACE " " ";" SKIP_LIST "${SKIP_MODULES}" ) file( GLOB SUBDIRECTORIES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*" ) diff --git a/src/modules/globalStorage.yaml b/src/modules/globalStorage.yaml deleted file mode 100644 index 1187fe93a..000000000 --- a/src/modules/globalStorage.yaml +++ /dev/null @@ -1,18 +0,0 @@ ---- -syntax: "YAML map of anything" -example: - whats_this: "fake global storage contents" - from_where: "globalStorage.yaml" -a_list: - - "item1" - - "item2" - - "item3" - - "item4" -a_list_of_maps: - - name: "an Item" - contents: - - "an element" - - "another element" - - name: "another item" - contents: - - "not much" diff --git a/src/modules/locale/images/timezone_2.0.png b/src/modules/locale/images/timezone_2.0.png index d037c3f79..fa0bc4818 100644 Binary files a/src/modules/locale/images/timezone_2.0.png and b/src/modules/locale/images/timezone_2.0.png differ diff --git a/src/modules/locale/images/timezone_3.0.png b/src/modules/locale/images/timezone_3.0.png index dc930b78c..d5c003b4e 100644 Binary files a/src/modules/locale/images/timezone_3.0.png and b/src/modules/locale/images/timezone_3.0.png differ diff --git a/src/modules/rawfs/main.py b/src/modules/rawfs/main.py index af8a8198c..1898d8fea 100644 --- a/src/modules/rawfs/main.py +++ b/src/modules/rawfs/main.py @@ -96,6 +96,8 @@ class RawFSItem: count = 0 libcalamares.utils.debug("Copying {} to {}".format(self.source, self.destination)) + if libcalamares.job.configuration["bogus"]: + return srcsize, srcblksize = get_device_size(self.source) destsize, destblksize = get_device_size(self.destination) @@ -151,7 +153,7 @@ def update_global_storage(item, gs): for partition in gs: if partition["device"] == item.destination: ret = subprocess.run(["blkid", "-s", "UUID", "-o", "value", item.destination], - capture_output=True, text=True) + stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True) if ret.returncode == 0: libcalamares.utils.debug("Setting {} UUID to {}".format(item.destination, ret.stdout.rstrip())) @@ -171,6 +173,7 @@ def run(): return (_("Configuration Error"), _("No partitions are defined for
{!s}
to use." ).format("rawfs")) + libcalamares.utils.debug("Copying {!s} raw partitions.".format(len(partitions))) for partition in partitions: if partition["mountPoint"]: for src in libcalamares.job.configuration["targets"]: diff --git a/src/modules/rawfs/rawfs.conf b/src/modules/rawfs/rawfs.conf index 10e654a7d..8d7da3ba3 100644 --- a/src/modules/rawfs/rawfs.conf +++ b/src/modules/rawfs/rawfs.conf @@ -22,3 +22,8 @@ targets: resize: true - mountPoint: /data source: /dev/mmcblk0p3 + +# To support testing, set the *bogus* key to true. No actual work is done, but the +# module's logic is exercised. + +# bogus: false diff --git a/src/modules/rawfs/tests/1.global b/src/modules/rawfs/tests/1.global new file mode 100644 index 000000000..c09df9375 --- /dev/null +++ b/src/modules/rawfs/tests/1.global @@ -0,0 +1,9 @@ +--- +rootMountPoint: /tmp/unpackfs-test-run-rootdir3/ +partitions: + - mountPoint: / + device: /dev/sda1 + fs: ext4 + - mountPoint: /home + device: /dev/sda2 + fs: ext4 diff --git a/src/modules/rawfs/tests/1.job b/src/modules/rawfs/tests/1.job new file mode 100644 index 000000000..6079c43ed --- /dev/null +++ b/src/modules/rawfs/tests/1.job @@ -0,0 +1,14 @@ +# Testing configuration for rawfs + +--- + +targets: + - mountPoint: / + source: / + - mountPoint: /home + source: /images/home.img + resize: true + - mountPoint: /data + source: /dev/mmcblk0p3 + +bogus: true diff --git a/src/modules/testmodule.py b/src/modules/testmodule.py deleted file mode 100755 index 633d57d9f..000000000 --- a/src/modules/testmodule.py +++ /dev/null @@ -1,183 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# -# === This file is part of Calamares - === -# -# Copyright 2014, Teo Mrnjavac -# Copyright 2017, Adriaan de Groot -# -# Calamares 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. -# -# Calamares 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 Calamares. If not, see . -""" -Testing tool to run a single Python module; optionally a global configuration -and module configuration can be read from YAML files. -""" -argumentepilog = """ -moduledir may be a module name (e.g. "welcome") or a full path to the - module (e.g. "src/modules/welcome"). In the former case, an attempt - is made to find the module in several sensible places. -globalstorage_yaml may be given as a full path to a YAML file containing - the global configuration, or as "" or "-" which will leave the - global storage empty. -configuration_yaml may be given as a full path to a YAML file with the - module configuration, as "" or "-" to leave the configuration - empty, or as "+" to load the standard configuration from the - module-directory (e.g. welcome.conf if the welcome module is given). - -The simplest invocation to test a module, with its default configuration, is -to call this program as follows (for, e.g., the welcome module): - - testmodule.py welcome - +""" - -import argparse -import os -import sys - -import yaml - -calamaresimporterror = ("Can not import libcalamares. Ensure the PYTHONPATH " - "environment variable includes the dir where libcalamares.so is " - "installed.") -try: - import libcalamares -except ImportError: - print(calamaresimporterror) - print() - libcalamares = None - - -class Job: - """ - - :param working_path: - :param doc: - :param cfg_doc: - """ - - def __init__(self, working_path, doc, cfg_doc): - self.module_name = doc["name"] - self.pretty_name = "Testing job " + doc["name"] - self.working_path = working_path - self.configuration = cfg_doc - - def setprogress(self, progress): - """ - - :param progress: - """ - print("Job set progress to {}%.".format(progress * 100)) - - -def test_module(moduledir, globalconfigfilename, moduleconfigfilename, lang): - print("Testing module in: " + moduledir) - - confpath = os.path.join(moduledir, "module.desc") - with open(confpath) as f: - doc = yaml.load(f) - - if doc["type"] != "job" or doc["interface"] != "python": - print("Only Python jobs can be tested.") - return 1 - - # Parameter None creates a new, empty GlobalStorage - libcalamares.globalstorage = libcalamares.GlobalStorage(None) - libcalamares.globalstorage.insert("testing", True) - if lang: - libcalamares.globalstorage.insert("locale", lang) - libcalamares.globalstorage.insert("localeConf", {"LANG": lang}) - - # if a file for simulating globalStorage contents is provided, load it - if globalconfigfilename: - with open(globalconfigfilename) as f: - gs_doc = yaml.load(f) - for key, value in gs_doc.items(): - libcalamares.globalstorage.insert(key, value) - print("Global configuration '" + globalconfigfilename + "' loaded.") - else: - print("No global configuration loaded.") - - cfg_doc = dict() - if moduleconfigfilename: - with open(moduleconfigfilename) as f: - cfg_doc = yaml.load(f) - print("Local configuration '" + moduleconfigfilename + "' loaded.") - else: - print("No module configuration loaded.") - - libcalamares.job = Job(moduledir, doc, cfg_doc) - - scriptpath = os.path.abspath(moduledir) - sys.path.append(scriptpath) - import main # Assumed to import main from module itself - - print("Output from module:") - print(main.run()) - - return 0 - - -def munge_filename(filename, module=None): - """ - Maps files "" (empty) and "-" (just a dash) to None, - to simplify processing elsewhere. - """ - if not filename or filename == "-": - return None - if filename == "+" and module is not None: - d, name = os.path.split(module) - if d and not name: - # Ended in a / - d, name = os.path.split(module) - if name: - return os.path.join(module, name + ".conf") - - return filename - - -def find_module(modulename): - if "/" in modulename: - return modulename - else: - for prefix in ("src/modules", "build/src/modules", "../src/modules"): - mp = os.path.join( prefix, modulename ) - if os.path.exists( mp ): - return mp - # Not found? Bail out elsewhere - return modulename - -def main(): - parser = argparse.ArgumentParser(description=globals()["__doc__"], epilog=argumentepilog, formatter_class=argparse.RawDescriptionHelpFormatter) - parser.add_argument("moduledir", - help="Dir containing the Python module.") - parser.add_argument("globalstorage_yaml", nargs="?", - help="A yaml file to initialize GlobalStorage.") - parser.add_argument("configuration_yaml", nargs="?", - help="A yaml file to initialize the Job.") - parser.add_argument("--lang", "-l", nargs="?", default=None, - help="Set translation language.") - args = parser.parse_args() - - # If we get here, it wasn't a --help invocation, so complain - # if libcalamares wasn't found. - if not libcalamares: - parser.error(calamaresimporterror) - - moduledir = find_module(args.moduledir) - return test_module(moduledir, - munge_filename(args.globalstorage_yaml), - munge_filename(args.configuration_yaml, moduledir), - args.lang) - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/src/modules/testpythonrun.sh b/src/modules/testpythonrun.sh deleted file mode 100644 index be2b7800b..000000000 --- a/src/modules/testpythonrun.sh +++ /dev/null @@ -1,55 +0,0 @@ -#! /bin/sh - -### Command-line validation -# -# -SRCDIR=$( dirname "$0" ) -test -d "$SRCDIR" || { echo "! Can't find source directory." ; exit 1 ; } - -MODULE="$1" -test -n "$MODULE" || { echo "! Usage: $0 " ; exit 1 ; } - -### Run-time validation -# -# .. switch SRCDIR to the module that has been found -BINDIR="$SRCDIR" # Keep original SRCDIR -SRCDIR="$SRCDIR/$MODULE" -XSRCDIR="src/modules/$MODULE" # In builddir -TESTDIR="$SRCDIR/tests" - -test -x "$BINDIR/testmodule.py" || { echo "! No support script $BINDIR/testmodule.py" ; exit 1 ; } -test -d "$SRCDIR" || { echo "! Source $SRCDIR is not a directory." ; exit 1 ; } -test -f "$TESTDIR/1.global" || { echo "! Source $SRCDIR has no tests." ; exit 1 ; } - -test -f "libcalamares.so" || { echo "! Run the tests from the build-directory." ; exit 1 ; } -test -d "$XSRCDIR" || { echo "! No module directory $XSRCDIR in build-dir." ; exit 1 ; } - -### Python setup -# -# -export PYTHONPATH=".:$PYTHONPATH" -PYTHON=$( which python3 2> /dev/null ) -if test -z "$PYTHON" ; then - PYTHON=$( which python 2> /dev/null ) -fi -test -x "$PYTHON" || { echo "! No suitable Python executable found." ; exit 1 ; } - -### Test-execution -# -# -C=0 -while true ; do - # Might use shell arithmetic, but need other shebang then - C=$( expr "$C" + 1 ) - - G_CFG="$TESTDIR/$C.global" - J_CFG="$TESTDIR/$C.job" - - test -f "$G_CFG" || break - if test -f "$J_CFG" ; then - $PYTHON "$BINDIR/testmodule.py" "$XSRCDIR" "$G_CFG" "$J_CFG" - else - $PYTHON "$BINDIR/testmodule.py" "$XSRCDIR" "$G_CFG" - fi -done - diff --git a/src/modules/welcomeq/Recommended.qml b/src/modules/welcomeq/Recommended.qml new file mode 100644 index 000000000..373509104 --- /dev/null +++ b/src/modules/welcomeq/Recommended.qml @@ -0,0 +1,67 @@ +/* === This file is part of Calamares - === + * + * Copyright 2020, Anke Boersma + * + * Calamares 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. + * + * Calamares 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 Calamares. If not, see . + */ + +import io.calamares.ui 1.0 + +import QtQuick 2.7 +import QtQuick.Controls 2.2 +import QtQuick.Layouts 1.3 +import org.kde.kirigami 2.7 as Kirigami + +Rectangle { + focus: true + Kirigami.Theme.backgroundColor: Kirigami.Theme.backgroundColor + anchors.fill: parent + anchors.topMargin: 70 + + TextArea { + id: recommended + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + anchors.topMargin: 20 + width: 640 + font.pointSize: 12 + textFormat: Text.RichText + antialiasing: true + activeFocusOnPress: false + wrapMode: Text.WordWrap + + text: qsTr("

This computer does not satisfy some of the recommended requirements for setting up %1.

+

Setup can continue, but some features might be disabled.

").arg(Branding.string(Branding.VersionedName)) + } + + TextArea { + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: recommended.bottom + anchors.topMargin: 20 + width: 640 + background: Rectangle { + implicitWidth: 640 + implicitHeight: 50 + border.color: "#ff0000" + color: "#b0e0e6" + } + font.pointSize: 12 + textFormat: Text.RichText + antialiasing: true + activeFocusOnPress: false + wrapMode: Text.WordWrap + + text: qsTr("

The system is not connected to the internet.

")//.arg(requirementsModel) + } +} diff --git a/src/modules/welcomeq/Requirements.qml b/src/modules/welcomeq/Requirements.qml new file mode 100644 index 000000000..4f5520270 --- /dev/null +++ b/src/modules/welcomeq/Requirements.qml @@ -0,0 +1,67 @@ +/* === This file is part of Calamares - === + * + * Copyright 2020, Anke Boersma + * + * Calamares 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. + * + * Calamares 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 Calamares. If not, see . + */ + +import io.calamares.ui 1.0 + +import QtQuick 2.7 +import QtQuick.Controls 2.2 +import QtQuick.Layouts 1.3 +import org.kde.kirigami 2.7 as Kirigami + +Rectangle { + focus: true + Kirigami.Theme.backgroundColor: Kirigami.Theme.backgroundColor + anchors.fill: parent + anchors.topMargin: 70 + + TextArea { + id: required + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.top + anchors.topMargin: 20 + width: 640 + font.pointSize: 12 + textFormat: Text.RichText + antialiasing: true + activeFocusOnPress: false + wrapMode: Text.WordWrap + + text: qsTr("

This computer does not satisfy the minimum requirements for setting up %1.

+

Setup cannot continue.

").arg(Branding.string(Branding.VersionedName)) + } + + TextArea { + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: required.bottom + anchors.topMargin: 20 + width: 640 + background: Rectangle { + implicitWidth: 640 + implicitHeight: 50 + border.color: "#ff0000" + color: "#ffc0cb" + } + font.pointSize: 12 + textFormat: Text.RichText + antialiasing: true + activeFocusOnPress: false + wrapMode: Text.WordWrap + + text: qsTr("

The installer is not running with administrator rights.

")//.arg(requirementsModel) + } +} diff --git a/src/modules/welcomeq/about.qml b/src/modules/welcomeq/about.qml index f301c6659..7fa6fb462 100644 --- a/src/modules/welcomeq/about.qml +++ b/src/modules/welcomeq/about.qml @@ -28,7 +28,7 @@ Item { focus: true property var appName: "Calamares" - property var appVersion: "3.2.22" + property var appVersion: "3.2.24" Rectangle { id: textArea diff --git a/src/modules/welcomeq/welcomeq.qml b/src/modules/welcomeq/welcomeq.qml index f597f7105..910274fe2 100644 --- a/src/modules/welcomeq/welcomeq.qml +++ b/src/modules/welcomeq/welcomeq.qml @@ -56,6 +56,20 @@ Page fillMode: Image.PreserveAspectFit } + Recommended { + property var required: "yes" //requirementsModel + property var satisfied: "yes" //satisfiedRequirements + property var requiredMet: (required != satisfied) ? true : false + visible: requiredMet + } + + Requirements { + property var required: "yes" //requirementsModel + property var mandatory: "yes" //satisfiedMandatory + property var mandatoryMet: (required != mandatory) ? true : false + visible: mandatoryMet + } + RowLayout { id: buttonBar width: parent.width / 1.5 diff --git a/src/modules/welcomeq/welcomeq.qrc b/src/modules/welcomeq/welcomeq.qrc index 71431254e..ef41f816a 100644 --- a/src/modules/welcomeq/welcomeq.qrc +++ b/src/modules/welcomeq/welcomeq.qrc @@ -3,6 +3,8 @@ welcomeq.qml about.qml release_notes.qml + Recommended.qml + Requirements.qml img/squid.png img/chevron-left-solid.svg img/language-icon-48px.png