16 Commits

Author SHA1 Message Date
Adriaan de Groot
b3cda8d7cb Docs: polish the README to match new additions 2021-02-23 12:20:55 +01:00
Adriaan de Groot
4611f2f9ea CI: note that the release-script is Linux-only 2021-02-23 12:20:28 +01:00
Adriaan de Groot
7acd4bb3d6 Changes: pre-release housekeeping 2021-02-23 11:41:06 +01:00
Adriaan de Groot
41b4b59a5e [mobile] Apply coding style 2021-02-23 11:37:55 +01:00
Adriaan de Groot
077320dc19 CI: add the style tool from calamares 2021-02-23 11:37:16 +01:00
Adriaan de Groot
c5eeeb7a50 Merge pull request #8 from Undef-a/upstream/fs_selection
[mobile] Allow user to configure filesystem type
2021-02-23 11:17:03 +01:00
undef
52882df5ee [mobile] bugfix: initialise externalToInternal
This variable was uninitialised, leading to an undefined action occurring
when the install target screen is skipped.
2021-02-21 21:13:30 +00:00
undef
616e51b3ee [mobile] Allow user to configure filesystem type
The user can now configure the target root filesystem type. Options
provided are ext4 (default), f2fs and btrfs.

OS Maintainers are required to provide their own BTRFS install script
which configures default submodules as required.

Allow disabling selection of fstype
This setting is disabled by default and defaults to ext4. Enabling it
will provide the user with a choice of ext4, f2fs and btrfs for the root
filesystem.

Add FS specific mkfs configuration options
This allows distribution maintainers to set the command/script used for
configuring the root filesystem on a per-fs level. Two examples of its
use are:
* F2FS: mkfs.f2fs uses -l for label, rather than -L like other filesystems.
* BTRFS: Distributions can provide a script which will configure submodules
         as requiref for snapshots to work correctly.

Use of QStringList rather than a Model:
We don't need the complexities of a full model here for a list of strings
and labelModel was the wrong one anyway. At least going down that path means
the back and forward buttons work.
2021-02-21 21:12:21 +00:00
Adriaan de Groot
f2e59e611f [image-slideshow] Add an example QML slideshow for images
The default slideshow is rather complicated for a "simple" slideshow
with images, so add an extensively-documented images-only slideshow
in QML. This can easily be extended with more images, or with
text and fanciness if the designer wants to flex more QML.
2021-02-17 21:53:44 +01:00
Adriaan de Groot
a532b309b7 CI: massage message a bit and adjust naming scheme 2021-02-17 10:43:38 +01:00
Adriaan de Groot
45ae6084d8 Docs: mention the *mobile* module 2021-02-16 23:38:52 +01:00
Adriaan de Groot
e0cd044e5b CI: extract the tarball from calamares first 2021-02-16 15:34:29 +01:00
Adriaan de Groot
2c1cbb7f85 CI: try to run CI for the extensions, too 2021-02-16 15:13:12 +01:00
Adriaan de Groot
bf5e3d857a Merge pull request #11 from ollieparanoid/wait-2min
[mobile] wait screen: reword 20s -> 2 min
2021-02-16 10:53:27 +01:00
Oliver Smith
e78bd936a3 [mobile] wait screen: reword 20s -> 2 min
Change the message in the wait screen from "This may take up to 20
seconds" to "This may take up to two minutes". That's what Mobian needs,
and with "up to" in the sentence, it's not wrong, even if the actual
time is much shorter.

Creating a config option was considered (#10), but would only add
technical debt since the wait screen is already a hack (as described in
the big comment in runPartitionJobThenLeave()).
2021-02-08 22:34:16 +01:00
Adriaan de Groot
a53f9359f4 Changes: post-release housekeeping 2021-01-04 11:53:40 +01:00
21 changed files with 746 additions and 31 deletions

100
.github/workflows/nightly-neon.yml vendored Normal file
View File

@@ -0,0 +1,100 @@
name: nightly-neon-xtn
on:
schedule:
- cron: "52 1 * * *"
workflow_dispatch:
env:
BUILDDIR: /build
SRCDIR: ${{ github.workspace }}
CMAKE_ARGS: |
-DWEBVIEW_FORCE_WEBKIT=1
-DKDE_INSTALL_USE_QT_SYS_PATHS=ON
-DWITH_PYTHONQT=OFF"
-DCMAKE_BUILD_TYPE=Debug
jobs:
build:
runs-on: ubuntu-latest
container:
image: docker://kdeneon/plasma:user
options: --tmpfs /build:rw --user 0:0
steps:
- name: "fetch artifacts"
uses: dawidd6/action-download-artifact@v2
with:
workflow: nightly-neon.yml
workflow_conclusion: success
branch: calamares
name: calamares-tarball
path: ${{ env.BUILDDIR }}
repo: calamares/calamares
- name: "prepare env"
run: |
sudo apt-get update
sudo apt-get -y install git-core
sudo apt-get -y install \
build-essential \
cmake \
extra-cmake-modules \
gettext \
kio-dev \
libatasmart-dev \
libboost-python-dev \
libkf5config-dev \
libkf5coreaddons-dev \
libkf5i18n-dev \
libkf5iconthemes-dev \
libkf5parts-dev \
libkf5service-dev \
libkf5solid-dev \
libkpmcore-dev \
libparted-dev \
libpolkit-qt5-1-dev \
libqt5svg5-dev \
libqt5webkit5-dev \
libyaml-cpp-dev \
os-prober \
pkg-config \
python3-dev \
qtbase5-dev \
qtdeclarative5-dev \
qttools5-dev \
qttools5-dev-tools
- name: "prepare source"
uses: actions/checkout@v2
- name: "prepare artifacts"
run: tar xvzf "$BUILDDIR/calamares.tar.gz" -C / --strip-components 1
- name: "prepare build"
id: pre_build
run: |
test -n "$BUILDDIR" || { echo "! \$BUILDDIR not set" ; exit 1 ; }
mkdir -p $BUILDDIR
test -f $SRCDIR/CMakeLists.txt || { echo "! Missing $SRCDIR/CMakeLists.txt" ; exit 1 ; }
echo "::set-output name=message::"`git log -1 --abbrev-commit --pretty=oneline --no-decorate ${{ github.event.head_commit.id }}`
- name: "Calamares-Extensions: cmake"
working-directory: ${{ env.BUILDDIR }}
run: cmake $CMAKE_ARGS $SRCDIR
- name: "Calamares-Extensions: make"
working-directory: ${{ env.BUILDDIR }}
run: make -j2 VERBOSE=1
- name: "Calamares-Extensions: install"
working-directory: ${{ env.BUILDDIR }}
run: make install VERBOSE=1
- name: "notify: ok"
uses: rectalogic/notify-irc@v1
if: ${{ success() && github.repository == 'calamares/calamares-extensions' }}
with:
server: chat.freenode.net
nickname: cala-ci
channel: "#calamares"
message: "OK ${{ github.workflow }} in ${{ github.repository }} ${{ steps.pre_build.outputs.message }}"
- name: "notify: fail"
uses: rectalogic/notify-irc@v1
if: ${{ failure() && github.repository == 'calamares/calamares' }}
with:
server: chat.freenode.net
nickname: cala-ci
channel: "#calamares"
message: "FAIL ${{ github.workflow }} in ${{ github.repository }} ${{ steps.pre_build.outputs.message }}"

106
.github/workflows/push.yml vendored Normal file
View File

@@ -0,0 +1,106 @@
name: ci-push-xtn
on:
push:
branches:
- calamares
pull_request:
types:
- opened
- reopened
- synchronize
workflow_dispatch:
env:
BUILDDIR: /build
SRCDIR: ${{ github.workspace }}
CMAKE_ARGS: |
-DWEBVIEW_FORCE_WEBKIT=1
-DKDE_INSTALL_USE_QT_SYS_PATHS=ON
-DWITH_PYTHONQT=OFF"
-DCMAKE_BUILD_TYPE=Debug
jobs:
build:
runs-on: ubuntu-latest
container:
image: docker://kdeneon/plasma:user
options: --tmpfs /build:rw --user 0:0
steps:
- name: "fetch artifacts"
uses: dawidd6/action-download-artifact@v2
with:
workflow: nightly-neon.yml
workflow_conclusion: success
branch: calamares
name: calamares-tarball
path: ${{ env.BUILDDIR }}
repo: calamares/calamares
- name: "prepare env"
run: |
sudo apt-get update
sudo apt-get -y install git-core
sudo apt-get -y install \
build-essential \
cmake \
extra-cmake-modules \
gettext \
kio-dev \
libatasmart-dev \
libboost-python-dev \
libkf5config-dev \
libkf5coreaddons-dev \
libkf5i18n-dev \
libkf5iconthemes-dev \
libkf5parts-dev \
libkf5service-dev \
libkf5solid-dev \
libkpmcore-dev \
libparted-dev \
libpolkit-qt5-1-dev \
libqt5svg5-dev \
libqt5webkit5-dev \
libyaml-cpp-dev \
os-prober \
pkg-config \
python3-dev \
qtbase5-dev \
qtdeclarative5-dev \
qttools5-dev \
qttools5-dev-tools
- name: "prepare source"
uses: actions/checkout@v2
- name: "prepare artifacts"
run: tar xvzf "$BUILDDIR/calamares.tar.gz" -C / --strip-components 1
- name: "prepare build"
id: pre_build
run: |
test -n "$BUILDDIR" || { echo "! \$BUILDDIR not set" ; exit 1 ; }
mkdir -p $BUILDDIR
test -f $SRCDIR/CMakeLists.txt || { echo "! Missing $SRCDIR/CMakeLists.txt" ; exit 1 ; }
echo "::set-output name=message::"`git log -1 --abbrev-commit --pretty=oneline --no-decorate ${{ github.event.head_commit.id }}`
- name: "Calamares-Extensions: cmake"
working-directory: ${{ env.BUILDDIR }}
run: cmake $CMAKE_ARGS $SRCDIR
- name: "Calamares-Extensions: make"
working-directory: ${{ env.BUILDDIR }}
run: make -j2 VERBOSE=1
- name: "Calamares-Extensions: install"
working-directory: ${{ env.BUILDDIR }}
run: make install VERBOSE=1
- name: "notify: ok"
uses: rectalogic/notify-irc@v1
if: ${{ success() && github.repository == 'calamares/calamares-extensions' }}
with:
server: chat.freenode.net
nickname: cala-ci
channel: "#calamares"
message: "OK ${{ github.workflow }} in ${{ github.repository }} ${{ github.actor }} on ${{ github.event.ref }}\n.. ${{ steps.pre_build.outputs.message }}"
- name: "notify: fail"
uses: rectalogic/notify-irc@v1
if: ${{ failure() && github.repository == 'calamares/calamares' }}
with:
server: chat.freenode.net
nickname: cala-ci
channel: "#calamares"
message: "FAIL ${{ github.workflow }} in ${{ github.repository }} ${{ github.actor }} on ${{ github.event.ref }}\n.. ${{ steps.pre_build.outputs.message }}\n.. DIFF ${{ github.event.compare }}"

15
CHANGES
View File

@@ -7,6 +7,21 @@ changes and contributors are listed. Note that Calamares-Extensions does not
have a historical changelog -- this log starts with version 1.0.0.
# 1.1.1 (2021-02-23) #
This release contains contributions from (alphabetically by first name):
- Oliver Smith
- Undef
Changes and new modules in this release:
- Branding has a new example, *image-slideshow*, for a QML-based
slideshow with only images.
- CI now builds the extensions against a recent Calamares build.
- *mobile* add ability to select target filesystem.
- *mobile* rename `cmdMkfsRoot` to `cmdMkfsRootExt4`.
- *mobile* wait screen has been re-worded.
# 1.1.0 (2021-01-04) #
This release contains contributions from (alphabetically by first name):

View File

@@ -26,7 +26,7 @@
#
cmake_minimum_required(VERSION 3.3 FATAL_ERROR)
project(calamares-extensions
VERSION 1.1.0
VERSION 1.1.1
LANGUAGES CXX
)

View File

@@ -1,10 +1,11 @@
# Calamares Branding and Module Examples
> A *branding component* in Calamares is a description of the
> produce (i.e. distribution) being installed along with a "slideshow"
> product (i.e. distribution) being installed along with a "slideshow"
> that is displayed during the installation phase of Calamares.
> This shapes the **look** of your installation.
>
> A *module* adds functionality to Calamares; modules may be written
> A *module* adds **functionality** to Calamares; modules may be written
> in C++ or Python, using Qt Widgets or QML for the UI (with C++)
> if there is one. Both C++ and Python allow a full control over the
> target system during the installation.
@@ -13,13 +14,9 @@ This repository contains complete examples of branding and some
modules for Calamares.
- [Branding](#branding) documentation
- [default](branding/default/branding.desc) branding example
- [fancy](branding/fancy/branding.desc) branding example
- [KaOS](branding/kaos_branding/branding.desc) branding example
- [SameGame](branding/samegame/branding.desc) branding example
- [Module](#module) documentation
## Branding
- [Module](#modules) documentation
## Branding
> Branding shapes the **look** of Calamares to your distro
@@ -28,11 +25,20 @@ can be used for testing. The examples here show what can be done
with QML in the context of Calamares branding, and provide examples
and documentation for the framework that Calamares ships with.
- `default/` is a copy of the default branding included with Calamares.
- `fancy/` has navigation buttons and a slide counter.
- `kaos_branding/` is a copy of the KaOS branding component, which
- [`default/`](branding/default/branding.desc)
is a copy of the default branding included with Calamares.
- [`fancy/`](branding/fancy/branding.desc)
has navigation buttons and a slide counter.
- [`image-slideshow/`](branding/image-slideshow/branding.desc)
is a variant of the *default* branding that implements its
own slide element for QML that supports a single image.
This is useful for straightforward images-only slideshows
(probably moreso than the default slideshow).
- [`kaos_branding/`](branding/kaos_branding/branding.desc)
is a copy of the KaOS branding component, which
has translations and a bunch of fancy graphics.
- `samegame/` is a copy of the Qt Company "Same Game" QML demo. It
- [`samegame/` ](branding/default/branding.desc)
is a copy of the Qt Company "Same Game" QML demo. It
shows that **any** QML can be used for branding purposes.
### Writing your own Branding
@@ -62,7 +68,7 @@ and documentation for the framework that Calamares ships with.
parts of Calamares.
See the [styling paragraph](https://github.com/calamares/calamares/wiki/Deploy-Guide#styling-calamares) of the deployment guide for more details.
### Testing a Branding Component
If Calamares is installed, then the Calamares QML support files
@@ -72,7 +78,7 @@ branding component is free to do whatever is interesting in QML.
The tool for quickly viewing QML files is `qmlscene`, which is
included with the Qt development tools. It can be used to
preview a Calamares branding component (slideshow) without starting
preview a Calamares branding component (slideshow) without starting
Calamares. If the component uses translations, you will need to
build the translations first (using Qt Linguist `lrelease`, or by
using the normal build system for branding components).
@@ -87,7 +93,7 @@ qmlscene \
-translation build/calamares-fancy_nl.qm \
-I /usr/local/share/calamares/qml \
-geometry 600x400 \
fancy/show.qml
fancy/show.qml
```
This starts the viewer with the Dutch (nl) translation, using the
@@ -104,25 +110,39 @@ every time.
### Calamares Branding API
The slideshow which is configured in the branding files can have
one of two "API styles".
one of two "API styles".
- Version 1 is loaded when the slideshow starts. If the slideshow is
large, or contains remote content, then this may be slow.
The loading time may be visible as a "white flash" as the
QML component is displayed with no background until the
slideshow is loaded.
- Version 2 is loaded asynchronously from the moment Calamares is
started. This may delay startup a little, but may appear more
started. This may delay startup a little, but appears more
responsive overall.
If the slideshow QML defines functions
`onActivate()` and `onLeave()` then those functions
are called when the slideshow becomes visible and when the installation is finished.
These can be used to start and stop timers or sound effects or
whatever.
whatever.
In addition, if the slideshow QML defines a property
`activatedInCalamares` then it is set to `true`
when the slideshow becomes visible, and to `false` when
when the slideshow becomes visible, and to `false` when
the installation is finished. This can also be used to
start timers, etc.
start timers, etc. The standard `Presentation.qml` included with
Calamares has such a property.
A slideshow (`show.qml`) can be entirely independent, with bespoke code,
or it can make use of files shipped as part of Calamares: a *Presentation* and
a *Slide* element (and some others). There are also Calamares internals which
can be used from QML:
- `import calamares.slideshow 1.0` for the standard QML slideshow (e.g. *Presentation* element;
use *Slide* with this or write an API-equivalent element such as the one in `image-slideshow/`).
- `import io.calamares.ui 1.0` for a *Branding* object which has an API to
get colors and strings that are used elsewhere in Calamares (e.g. to make the
slide background the same as the background defined in `branding.desc`).
## Modules
@@ -135,6 +155,8 @@ listed in the *show* phase, and may run jobs if listed in the
*exec* phase) and a Python job module (no UI, runs in the *exec*
phase).
### Example Modules
- [filekeeper](modules/filekeeper/CMakeLists.txt) is a C++ **job** module
to copy files from the host (live) system to the target system at
the end of installation, like logfiles. (This module is made obsolete
@@ -146,6 +168,14 @@ phase).
module that just serves to slow down an installation by delaying
a configurable (default 30 seconds) amount of time.
### Functional Modules
- [mobile](modules/mobile/CMakeLists.txt) is a QML **view** that
takes over a number of other view steps. It is specific to
mobile phone use, possibly specific to PostmarketOS. It does
a number of "welcome to your new phone" things, e.g.
with PostmarketOS installed on a PinePhone.
### CMake Preparation
The single macro `calamares_add_module_subdirectory()`

View File

@@ -0,0 +1,64 @@
/* === This file is part of Calamares Extensions - <http://github.com/calamares-extensions> ===
*
* SPDX-FileCopyrightText: 2021 Adriaan de Groot <groot@kde.org>
* SPDX-License-Identifier: BSD-2-Clause
*/
/* An *ImageSlide* is a *Slide* (it offers the API that *Presentation*
* expects) while displaying only a single image. This is useful
* for presentations that are all images, with no interaction or text.
*/
import QtQuick 2.5
/* To use an *ImageSlide*, instantiate it inside your *Presentation*
* and set the *src* property to a path to an image file in a supported
* format. Relative paths are ok.
*/
Item {
id: imageslide
/* Slides should be non-visible at the start; the *Presentation*
* handles visibility (so that one slide at a time is visible).
*/
visible: false
/* Make this item fill up the parent, so that alignment of the
* image (below) works out to "middle of the parent".
*/
anchors.fill: parent
/* The *Presentation* manages visibility of children that have
* attribute *isSlide* and *isSlide* is set to *true*. Other
* children are ignored, so we need to set this so that the
* *ImageSlide* elements are treated like slides.
*/
property bool isSlide: true;
/* The *Presentation* allows slides to have notes, so just leave
* an empty string here.
*/
property string notes;
/* This is the important property for *ImageSlide*: the path to the
* image to display. When instantiating *ImageSlide*, set this for
* each instance. Relative paths are ok.
*/
property string src;
/* The image itself. It has fixed sizes (300x150px). You could set
* an aspect ratio here (e.g. `height: width / 2`) as well.
*
* This binds the image source (filename) to the string *src*
* in the *ImageSlide* element, for convenience in setting things
* up in the overall slideshow. If you want to make width and
* height configurable, add a property above and then bind to
* them from the Image element.
*/
Image {
id: image
source: src
width: 300
height: 150
anchors.centerIn: parent
}
}

View File

@@ -0,0 +1,40 @@
# SPDX-FileCopyrightText: 2021 Adriaan de Groot <groot@kde.org>
# SPDX-License-Identifier: BSD-2-Clause
---
componentName: default
# image-slideshow
# Branding must define some strings for the welcome page,
# even though this example is about the slideshow, not the rest.
strings:
productName: Mirror Linux
shortProductName: Mirror
version:
shortVersion:
versionedName: Mirror Linux 1.0
shortVersionedName: Mirror 1.0
bootloaderEntryName: Mirror
# These images do not exist in this branding example.
images:
productLogo: "logo.png"
productIcon: "logo.png"
productWelcome: "languages.png"
# Dark-mode for Calamares. The slideshow can access these color values
# through the Branding object which is always available to QML inside Calamares.
style:
sidebarBackground: "#36393e"
sidebarText: "#efefef"
sidebarTextSelect: "#2eb69b"
sidebarTextHighlight: "#313338"
# The actual slideshow. API version 2 means that the QML is loaded at
# startup. This is **slightly** slower at startup, but means that by
# the time we reach the slideshow, it is loaded and ready-to-go.
#
# A v2 slideshow **may** have an onActivate() and onLeave() function,
# although Calamares will complain if it does not.
slideshow: "show.qml"
slideshowAPI: 2

View File

@@ -0,0 +1,103 @@
/* === This file is part of Calamares Extensions - <http://github.com/calamares-extensions> ===
*
* SPDX-FileCopyrightText: 2021 Adriaan de Groot <groot@kde.org>
* SPDX-License-Identifier: BSD-2-Clause
*/
/* This is a simple slideshow for use during the *exec* phase of
* installation, that displays a handful of slides. It uses
* the *Presentation* QML components -- this allows, for instance,
* notes to be added to slides, and for arrow navigation to be
* used. But at its core it's just a bunch of images, repeating.
*
* For this kind of limited functionality, it may be better to
* use the "plain images" slideshow format in Calamares, although
* then you don't have any say in how things are animated.
*
* This slideshow is written for *slideshowAPI* version 1, so in
* `branding.desc` set that appropriately.
*/
import QtQuick 2.0 // Basic QML
import calamares.slideshow 1.0 // Calamares slideshow: Presentation
import io.calamares.ui 1.0 // Calamares internals: Branding
/* *Presentation* comes from the pre-installed calamares.slideshow
* that comes with Calamares itself. See `Presentation.qml` in the
* Calamares repository for details and documentation.
*
* The important parts of presentation are:
* - it has a property *activatedInCalamares* which is set to *true*
* when the slideshow becomes visible, *false* afterwards.
* - it expects one or more children with a property *isSlide*
* set to *true*.
* - it has a function *goToNextSlide()* to do just that (where
* "slides" is the sequence of children that have property
* *isSlide* set to *true*.
*
*/
Presentation
{
id: presentation
/* This timer ticks once per second (1000ms, set in *interval*)
* and calls *goToNextSlide()* each time. Note that it needs
* to know the *id* of the presentation, so keep *id* (above)
* matched with the function call.
*
* The timer starts when the presentation is activated; you could
* also set *running* to true, but that might cost extra resources.
*/
Timer {
interval: 1000
running: presentation.activatedInCalamares
repeat: true
onTriggered: presentation.goToNextSlide()
}
/* These functions are called when the presentation starts and
* ends, respectively. They could be used to start the timer,
* but that is done automatically through *activatedInCalamares*,
* so there's nothing **to** do.
*
* Leaving these functions out is fine, although Calamares will
* complain that they are missing, then.
*/
function onActivate() { }
function onLeave() { }
/* A presentation is an Item: it has no visual appearance at all.
* Give it a background, which fills the whole area of the presentation.
* Setting *z* to a low value places this rectangle **behind** other
* things in the presentation -- which is correct for a background.
*
* This uses the background set in the styles section of `branding.desc`.
*/
Rectangle {
id: mybackground
anchors.fill: parent
color: Branding.styleString(Branding.SidebarBackground)
z: -1
}
/* The *ImageSlide* is a component unique to this branding directory.
* The QML file `ImageSlide.qml` can be stored alongside `show.qml`
* and it will be loaded on-demand. See the documentation in that
* file for details, but it comes down to this: for each *ImageSlide*,
* set *src* to a suitable value (an image path in this directory)
* and that will be displayed.
*/
ImageSlide {
src: "slide1.png"
}
ImageSlide {
src: "slide2.png"
}
ImageSlide {
src: "slide3.png"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -10,6 +10,7 @@
# NOTE: this is largely a copy of the release script for Calamares,
# with not-applicable parts (such as translation-freeze) either
# commented-out, or skipped with if(false).
# NOTE: this script contains Linuxisms (in particular, expects GNU mktemp(1))
#
# This attempts to perform the different steps of the RELEASE.md
# document automatically. It's not tested on other machines or
@@ -31,6 +32,7 @@
# * `-B` do not build (before tagging)
# * `-P` do not package (tag, sign, tarball)
# * `-T` do not respect string freeze
# * `-C <args>` set extra arguments to pass to CMake
#
# The build / package settings can be influenced via environment variables:
# * BUILD_DEFAULT set to `false` to avoid first build with gcc

17
ci/astylerc Normal file
View File

@@ -0,0 +1,17 @@
# SPDX-FileCopyrightText: 2014 Aurélien Gâteau <agateau@kde.org>
# SPDX-FileCopyrightText: 2019 Adriaan de Groot <groot@kde.org>
# SPDX-License-Identifier: BSD-2-Clause
# Do not create a backup file
suffix=none
indent=spaces=4
# Brackets
style=break
add-brackets
# Spaces
pad-paren-in
pad-header
align-pointer=type

77
ci/calamaresstyle Executable file
View File

@@ -0,0 +1,77 @@
#!/bin/sh
#
# SPDX-FileCopyrightText: 2014 Aurélien Gâteau <agateau@kde.org>
# SPDX-FileCopyrightText: 2019 Adriaan de Groot <groot@kde.org>
# SPDX-License-Identifier: BSD-2-Clause
#
# Calls astyle with settings matching Calamares coding style
# Requires astyle >= 2.04 and clang-format-7 -8 or -9
#
# Clang-format-10 is **not** supported, since it changes a default
# that re-introduces a space into empty function bodies; this
# can be turned off with a style setting, but that breaks
# older format versions which don't recognize the setting.
#
# You can pass in directory names, in which case the files
# in that directory (NOT below it) are processed.
#
LANG=C
LC_ALL=C
LC_NUMERIC=C
export LANG LC_ALL LC_NUMERIC
AS=$( which astyle )
CF_VERSIONS="clang-format-7 clang-format-8 clang-format70 clang-format80 clang-format90 clang-format-9.0.1 clang-format"
for _cf in $CF_VERSIONS
do
# Not an error if this particular clang-format isn't found
CF=$( which $_cf 2> /dev/null || true )
test -n "$CF" && break
done
test -n "$AS" || { echo "! No astyle found in PATH"; exit 1 ; }
test -n "$CF" || { echo "! No clang-format ($CF_VERSIONS) found in PATH"; exit 1 ; }
test -x "$AS" || { echo "! $AS is not executable."; exit 1 ; }
test -x "$CF" || { echo "! $CF is not executable."; exit 1 ; }
unmangle_clang_format=""
if expr `"$CF" --version | tr -dc '[^.0-9]' | cut -d . -f 1` '<' 10 > /dev/null ; then
:
else
unmangle_clang_format=$( dirname $0 )/../.clang-format
echo "SpaceInEmptyBlock: false" >> "$unmangle_clang_format"
fi
set -e
any_dirs=no
for d in "$@"
do
test -d "$d" && any_dirs=yes
done
style_some()
{
if test -n "$*" ; then
$AS --options=$(dirname $0)/astylerc --quiet "$@"
$CF -i -style=file "$@"
fi
}
if test "x$any_dirs" = "xyes" ; then
for d in "$@"
do
if test -d "$d" ; then
style_some $( find "$d" -maxdepth 1 -type f -name '*.cpp' -o -name '*.h' )
else
style_some "$d"
fi
done
else
style_some "$@"
fi
if test -n "$unmangle_clang_format" ; then
sed -i.bak '/^SpaceInEmptyBlock/d' "$unmangle_clang_format"
fi

View File

@@ -27,14 +27,22 @@ Config::setConfigurationMap( const QVariantMap& cfgMap )
m_username = getString( cfgMap, "username", "user" );
m_featureSshd = getBool( cfgMap, "featureSshd", true );
m_featureFsType = getBool( cfgMap, "featureFsType", false );
m_cmdLuksFormat = getString( cfgMap, "cmdLuksFormat", "cryptsetup luksFormat --use-random" );
m_cmdLuksOpen = getString( cfgMap, "cmdLuksOpen", "cryptsetup luksOpen" );
m_cmdMkfsRoot = getString( cfgMap, "cmdMkfsRoot", "mkfs.ext4 -L 'unknownOS_root'" );
m_cmdMount = getString( cfgMap, "cmdMount", "mount" );
m_targetDeviceRoot = getString( cfgMap, "targetDeviceRoot", "/dev/unknown" );
m_targetDeviceRootInternal = getString( cfgMap, "targetDeviceRootInternal", "" );
m_cmdMkfsRootBtrfs = getString( cfgMap, "cmdMkfsRootBtrfs", "mkfs.btrfs -L 'unknownOS_root'" );
m_cmdMkfsRootExt4 = getString( cfgMap, "cmdMkfsRootExt4", "mkfs.ext4 -L 'unknownOS_root'" );
m_cmdMkfsRootF2fs = getString( cfgMap, "cmdMkfsRootF2fs", "mkfs.f2fs -l 'unknownOS_root'" );
m_fsList = getStringList( cfgMap, "fsModel", QStringList { "ext4", "f2fs", "btrfs" } );
m_defaultFs = getString( cfgMap, "defaultFs", "ext4" );
m_fsIndex = m_fsList.indexOf( m_defaultFs );
m_fsType = m_defaultFs;
m_cmdInternalStoragePrepare = getString( cfgMap, "cmdInternalStoragePrepare", "ondev-internal-storage-prepare" );
m_cmdPasswd = getString( cfgMap, "cmdPasswd", "passwd" );
m_cmdSshdEnable = getString( cfgMap, "cmdSshdEnable", "systemctl enable sshd.service" );
@@ -66,6 +74,24 @@ Config::createJobs()
void
Config::runPartitionJobThenLeave( bool b )
{
Calamares::ViewManager* v = Calamares::ViewManager::instance();
QString cmdMkfsRoot;
if ( m_fsType == QStringLiteral( "btrfs" ) )
{
cmdMkfsRoot = m_cmdMkfsRootBtrfs;
}
else if ( m_fsType == QStringLiteral( "f2fs" ) )
{
cmdMkfsRoot = m_cmdMkfsRootF2fs;
}
else if ( m_fsType == QStringLiteral( "ext4" ) )
{
cmdMkfsRoot = m_cmdMkfsRootExt4;
}
else
{
v->onInstallationFailed( "Unknown filesystem: '" + m_fsType + "'", "" );
}
/* HACK: run partition job
* The "mobile" module has two jobs, the partition job and the users job.
* If we added both of them in Config::createJobs(), Calamares would run
@@ -78,7 +104,7 @@ Config::runPartitionJobThenLeave( bool b )
Calamares::Job* j = new PartitionJob( m_cmdInternalStoragePrepare,
m_cmdLuksFormat,
m_cmdLuksOpen,
m_cmdMkfsRoot,
cmdMkfsRoot,
m_cmdMount,
m_targetDeviceRoot,
m_targetDeviceRootInternal,
@@ -87,7 +113,6 @@ Config::runPartitionJobThenLeave( bool b )
m_fdePassword );
Calamares::JobResult res = j->exec();
Calamares::ViewManager* v = Calamares::ViewManager::instance();
if ( res )
{
v->next();
@@ -143,3 +168,28 @@ Config::setInstallFromExternalToInternal( const bool val )
{
m_installFromExternalToInternal = val;
}
void
Config::setFsType( int idx )
{
if ( idx >= 0 && idx < m_fsList.length() )
{
setFsType( m_fsList[ idx ] );
}
}
void
Config::setFsType( const QString& fsType )
{
if ( fsType != m_fsType )
{
m_fsType = fsType;
emit fsTypeChanged( m_fsType );
}
}
void
Config::setFsIndex( const int fsIndex )
{
m_fsIndex = fsIndex;
emit fsIndexChanged( m_fsIndex );
}

View File

@@ -31,12 +31,18 @@ class Config : public QObject
Q_PROPERTY( QString fdePassword READ fdePassword WRITE setFdePassword NOTIFY fdePasswordChanged )
Q_PROPERTY( bool isFdeEnabled READ isFdeEnabled WRITE setIsFdeEnabled )
/* filesystem selection */
Q_PROPERTY( QString fsType READ fsType WRITE setFsType NOTIFY fsTypeChanged )
Q_PROPERTY( bool featureFsType READ featureFsType CONSTANT FINAL )
Q_PROPERTY( QStringList fsList READ fsList CONSTANT FINAL )
Q_PROPERTY( QString defaultFs READ defaultFs CONSTANT FINAL )
Q_PROPERTY( int fsIndex READ fsIndex WRITE setFsIndex NOTIFY fsIndexChanged )
/* partition job */
Q_PROPERTY( bool runPartitionJobThenLeave READ runPartitionJobThenLeaveDummy WRITE runPartitionJobThenLeave )
Q_PROPERTY( QString cmdInternalStoragePrepare READ cmdInternalStoragePrepare CONSTANT FINAL )
Q_PROPERTY( QString cmdLuksFormat READ cmdLuksFormat CONSTANT FINAL )
Q_PROPERTY( QString cmdLuksOpen READ cmdLuksOpen CONSTANT FINAL )
Q_PROPERTY( QString cmdMkfsRoot READ cmdMkfsRoot CONSTANT FINAL )
Q_PROPERTY( QString cmdMount READ cmdMount CONSTANT FINAL )
Q_PROPERTY( QString targetDeviceRoot READ targetDeviceRoot CONSTANT FINAL )
Q_PROPERTY( QString targetDeviceRootInternal READ targetDeviceRootInternal CONSTANT FINAL )
@@ -79,13 +85,25 @@ public:
void setFdePassword( const QString& fdePassword );
void setIsFdeEnabled( bool isFdeEnabled );
/* filesystem selection */
bool featureFsType() { return m_featureFsType; };
QString fsType() const { return m_fsType; };
void setFsType( int idx );
void setFsType( const QString& fsType );
QStringList fsList() const { return m_fsList; };
int fsIndex() const { return m_fsIndex; };
void setFsIndex( const int fsIndex );
QString defaultFs() const { return m_defaultFs; };
/* partition job */
bool runPartitionJobThenLeaveDummy() { return 0; }
void runPartitionJobThenLeave( bool b );
QString cmdInternalStoragePrepare() const { return m_cmdInternalStoragePrepare; }
QString cmdLuksFormat() const { return m_cmdLuksFormat; }
QString cmdLuksOpen() const { return m_cmdLuksOpen; }
QString cmdMkfsRoot() const { return m_cmdMkfsRoot; }
QString cmdMkfsRootBtrfs() const { return m_cmdMkfsRootBtrfs; }
QString cmdMkfsRootExt4() const { return m_cmdMkfsRootExt4; }
QString cmdMkfsRootF2fs() const { return m_cmdMkfsRootF2fs; }
QString cmdMount() const { return m_cmdMount; }
QString targetDeviceRoot() const { return m_targetDeviceRoot; }
QString targetDeviceRootInternal() const { return m_targetDeviceRootInternal; }
@@ -120,15 +138,25 @@ private:
QString m_fdePassword = "";
bool m_isFdeEnabled = false;
/* filesystem selection */
bool m_featureFsType;
QString m_defaultFs;
QString m_fsType;
// Index of the currently selected filesystem in UI.
int m_fsIndex;
QStringList m_fsList;
/* partition job */
QString m_cmdInternalStoragePrepare;
QString m_cmdLuksFormat;
QString m_cmdLuksOpen;
QString m_cmdMkfsRoot;
QString m_cmdMkfsRootBtrfs;
QString m_cmdMkfsRootExt4;
QString m_cmdMkfsRootF2fs;
QString m_cmdMount;
QString m_targetDeviceRoot;
QString m_targetDeviceRootInternal;
bool m_installFromExternalToInternal;
bool m_installFromExternalToInternal = false;
/* users job */
QString m_cmdPasswd;
@@ -148,4 +176,7 @@ signals:
/* full disk encryption */
void fdePasswordChanged( QString fdePassword );
void fsTypeChanged( QString fsType );
void fsIndexChanged( int fsIndex );
};

View File

@@ -0,0 +1,59 @@
/* SPDX-FileCopyrightText: 2020 Undef <calamares@undef.tools>
* SPDX-License-Identifier: GPL-3.0-or-later */
import io.calamares.core 1.0
import io.calamares.ui 1.0
import QtQuick 2.10
import QtQuick.Controls 2.10
import QtQuick.Layouts 1.3
import org.kde.kirigami 2.7 as Kirigami
import QtGraphicalEffects 1.0
import QtQuick.Window 2.3
import QtQuick.VirtualKeyboard 2.1
Item {
anchors.left: parent.left
anchors.top: parent.top
anchors.right: parent.right
width: parent.width
height: parent.height
Text {
id: mainText
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: parent.top
anchors.topMargin: 30
wrapMode: Text.WordWrap
text: "Select the filesystem for root partition. If unsure, leave the default."
width: 500
}
ComboBox {
id: fsTypeCB
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: mainText.bottom
anchors.topMargin: 40
width: 500
height: 60
editable: false
model: config.fsList
/* Save the current state on selection so it is there when the back button is pressed */
onActivated: config.fsType = fsTypeCB.currentText;
Component.onCompleted: fsTypeCB.currentIndex = find( config.fsType, Qt.MatchContains );
}
Button {
anchors.horizontalCenter: parent.horizontalCenter
anchors.top: fsTypeCB.bottom
anchors.topMargin: 40
width: 500
text: qsTr("Continue")
onClicked: {
config.fsType = fsTypeCB.currentText;
navNextFeature();
}
}
}

View File

@@ -53,6 +53,17 @@
## authentication after installation.
# featureSshd: true
## Ask the user, which filesystem to use.
# featureFsType: false
## Filesystems that the user can choose from.
#fsModel:
# - ext4
# - f2fs
# - btrfs
## Default filesystem to display in the dialog. If featureFsType is disabled,
## this gets used without asking the user.
# defaultFs: ext4
#######
### Commands running in the installer OS
#######
@@ -69,7 +80,13 @@
## Format the rootfs with a file system
## Arguments: <device>
# cmdMkfsRoot: "mkfs.ext4 -L 'unknownOS_root'"
## Btrfs: to allow snapshots to work on the root subvolume, it is recommended that this
## command be a script which will create a subvolume and make it default
## An example can be found at:
## https://gitlab.com/mobian1/calamares-settings-mobian/-/merge_requests/2/diffs#diff-content-dde34f5f1c89e3dea63608c553bbc452dedf428f
# cmdMkfsRootBtrfs: "mkfs.btrfs -L 'unknownOS_root'"
# cmdMkfsRootExt4: "mkfs.ext4 -L 'unknownOS_root'"
# cmdMkfsRootF2fs: "mkfs.f2fs -l 'unknownOS_root'"
## Mount the partition after formatting with file system
## Arguments: <device> <mountpoint>

View File

@@ -22,6 +22,7 @@ Page
"default_pin": "Lockscreen PIN",
"ssh_confirm": "SSH server",
"ssh_credentials": "SSH credentials",
"fs_selection": "Root filesystem",
"fde_confirm": "Full disk encryption",
"fde_pass": "Full disk encryption",
"install_confirm": "Ready to install",
@@ -36,6 +37,8 @@ Page
"screens": ["default_pin"]},
{"name": "sshd",
"screens": ["ssh_confirm", "ssh_credentials"]},
{"name": "fsType",
"screens": ["fs_selection"]},
{"name": "fde",
"screens": ["fde_confirm", "fde_pass"]},
{"name": "installConfirm",

View File

@@ -10,6 +10,7 @@
<file>default_pin.qml</file> <!-- default user: pin -->
<file>ssh_confirm.qml</file> <!-- sshd: enable or not? -->
<file>ssh_credentials.qml</file> <!-- sshd user: username, password -->
<file>fs_selection.qml</file> <!-- filesystem selection -->
<file>fde_confirm.qml</file> <!-- enable FDE or not? -->
<file>fde_pass.qml</file> <!-- FDE password (optional) -->

View File

@@ -38,7 +38,7 @@ Page
anchors.topMargin: 150
wrapMode: Text.WordWrap
text: "Formatting and mounting target partition. This may" +
" take up to 20 seconds, please be patient."
" take up to two minutes, please be patient."
width: 500
}
}