Merge branch 'master' of https://github.com/calamares/calamares into development

This commit is contained in:
Philip Müller 2020-05-09 10:39:28 +02:00
commit fb8e69ca6c
24 changed files with 292 additions and 288 deletions

View File

@ -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) #

View File

@ -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" )

View File

@ -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()

View File

@ -2560,12 +2560,12 @@ Diegimo programa užbaigs darbą ir visi pakeitimai bus prarasti.</translation>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="433"/>
<source>An EFI system partition is necessary to start %1.&lt;br/&gt;&lt;br/&gt;To configure an EFI system partition, go back and select or create a FAT32 filesystem with the &lt;strong&gt;%3&lt;/strong&gt; flag enabled and mount point &lt;strong&gt;%2&lt;/strong&gt;.&lt;br/&gt;&lt;br/&gt;You can continue without setting up an EFI system partition but your system may fail to start.</source>
<translation type="unfinished"/>
<translation>EFI sistemos skaidinys yra būtinas, norint paleisti %1.&lt;br/&gt;&lt;br/&gt;Norėdami sukonfigūruoti EFI sistemos skaidinį, grįžkite atgal ir pasirinkite arba sukurkite FAT32 failų sistemą su įjungta &lt;strong&gt;%3&lt;/strong&gt; vėliavėle ir &lt;strong&gt;%2&lt;/strong&gt; prijungimo tašku.&lt;br/&gt;&lt;br/&gt;Jūs galite tęsti ir nenustatę EFI sistemos skaidinio, tačiau tokiu atveju, gali nepavykti paleisti jūsų sistemos.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="447"/>
<source>An EFI system partition is necessary to start %1.&lt;br/&gt;&lt;br/&gt;A partition was configured with mount point &lt;strong&gt;%2&lt;/strong&gt; but its &lt;strong&gt;%3&lt;/strong&gt; flag is not set.&lt;br/&gt;To set the flag, go back and edit the partition.&lt;br/&gt;&lt;br/&gt;You can continue without setting the flag but your system may fail to start.</source>
<translation type="unfinished"/>
<translation>EFI sistemos skaidinys yra būtinas, norint paleisti %1.&lt;br/&gt;&lt;br/&gt;Skaidinys buvo sukonfigūruotas su prijungimo tašku &lt;strong&gt;%2&lt;/strong&gt;, tačiau jo &lt;strong&gt;%3&lt;/strong&gt; vėliavėlė yra nenustatyta.&lt;br/&gt;Norėdami nustatyti vėliavėlę, grįžkite atgal ir taisykite skaidinį.&lt;br/&gt;&lt;br/&gt;Jūs galite tęsti ir nenustatę vėliavėlės, tačiau tokiu atveju, gali nepavykti paleisti jūsų sistemos.</translation>
</message>
<message>
<location filename="../src/modules/partition/gui/PartitionViewStep.cpp" line="446"/>
@ -3804,7 +3804,27 @@ Išvestis:
&lt;/ul&gt;
&lt;p&gt;The vertical scrollbar is adjustable, current width set to 10.&lt;/p&gt;</source>
<translation type="unfinished"/>
<translation>&lt;h3&gt;%1&lt;/h3&gt;
&lt;p&gt;Tai yra pavyzdinis QML failas, rodantis parinktis raiškiuoju tekstu su interaktyviu turiniu.&lt;/p&gt;
&lt;p&gt;QML su raiškiuoju tekstu gali naudoti HTML žymes, interaktyvus turinys yra naudingas jutikliniuose ekranuose.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Tai yra pusjuodis tekstas&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Tai yra kursyvinis tekstas&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;u&gt;Tai yra pabrauktas tekstas&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&lt;center&gt;Šis tekstas bus lygiuojamas centre.&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;&lt;s&gt;Tai yra perbraukimas&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;Kodo pavyzdžiai:
&lt;code&gt;ls -l /home&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Sąrašai:&lt;/b&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Intel CPU sistemos&lt;/li&gt;
&lt;li&gt;AMD CPU sistemos&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vertikalioji slankjuostė yra reguliuojama, dabartinis plotis nustatytas į 10.&lt;/p&gt;</translation>
</message>
<message>
<location filename="../src/modules/welcomeq/release_notes.qml" line="85"/>
@ -3818,7 +3838,8 @@ Išvestis:
<location filename="../src/modules/welcomeq/welcomeq.qml" line="44"/>
<source>&lt;h3&gt;Welcome to the %1 &lt;quote&gt;%2&lt;/quote&gt; installer&lt;/h3&gt;
&lt;p&gt;This program will ask you some questions and set up %1 on your computer.&lt;/p&gt;</source>
<translation type="unfinished"/>
<translation>&lt;h3&gt;Jus sveikina %1 &lt;quote&gt;%2&lt;/quote&gt; diegimo programa&lt;/h3&gt;
&lt;p&gt;Ši programa užduos jums kelis klausimus ir padės kompiuteryje nusistatyti %1.&lt;/p&gt;</translation>
</message>
<message>
<location filename="../src/modules/welcomeq/welcomeq.qml" line="71"/>

View File

@ -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()

View File

@ -38,6 +38,7 @@
#include <QFile>
#include <QFileInfo>
#include <QLabel>
#include <QQuickItem>
#include <QQuickWidget>
#include <QTreeView>
@ -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;
}

View File

@ -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

View File

@ -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 <KF5/KCoreAddons/KAboutData>
#include <KCoreAddons/KAboutData>
#ifdef WITH_KF5DBus
#include <KDBusAddons/KDBusService>
#endif
#ifdef WITH_KF5Crash
#include <KF5/KCrash/KCrash>
#include <KCrash/KCrash>
#endif
#include <QCommandLineParser>
@ -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();
}

View File

@ -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} "*" )

View File

@ -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"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View File

@ -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 <pre>{!s}</pre> 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"]:

View File

@ -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

View File

@ -0,0 +1,9 @@
---
rootMountPoint: /tmp/unpackfs-test-run-rootdir3/
partitions:
- mountPoint: /
device: /dev/sda1
fs: ext4
- mountPoint: /home
device: /dev/sda2
fs: ext4

View File

@ -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

View File

@ -1,183 +0,0 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# === This file is part of Calamares - <https://github.com/calamares> ===
#
# Copyright 2014, Teo Mrnjavac <teo@kde.org>
# Copyright 2017, Adriaan de Groot <groot@kde.org>
#
# 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 <http://www.gnu.org/licenses/>.
"""
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())

View File

@ -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 <module>" ; 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

View File

@ -0,0 +1,67 @@
/* === This file is part of Calamares - <https://github.com/calamares> ===
*
* Copyright 2020, Anke Boersma <demm@kaosx.us>
*
* 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 <http://www.gnu.org/licenses/>.
*/
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("<p>This computer does not satisfy some of the recommended requirements for setting up %1.</p>
<p>Setup can continue, but some features might be disabled.</p>").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("<p>The system is not connected to the internet.</p>")//.arg(requirementsModel)
}
}

View File

@ -0,0 +1,67 @@
/* === This file is part of Calamares - <https://github.com/calamares> ===
*
* Copyright 2020, Anke Boersma <demm@kaosx.us>
*
* 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 <http://www.gnu.org/licenses/>.
*/
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("<p>This computer does not satisfy the minimum requirements for setting up %1.</p>
<p>Setup cannot continue.</p>").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("<p>The installer is not running with administrator rights.</p>")//.arg(requirementsModel)
}
}

View File

@ -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

View File

@ -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

View File

@ -3,6 +3,8 @@
<file alias="welcomeq.qml">welcomeq.qml</file>
<file alias="about.qml">about.qml</file>
<file alias="release_notes.qml">release_notes.qml</file>
<file alias="Recommended.qml">Recommended.qml</file>
<file alias="Requirements.qml">Requirements.qml</file>
<file>img/squid.png</file>
<file>img/chevron-left-solid.svg</file>
<file>img/language-icon-48px.png</file>