Merging in quality of life improvements from 2.2.0 into 2.1.4 (master)

Selectively bringing in quality of life improvements from v2.2.0 work into master
This commit is contained in:
Anton Hvornum 2021-04-08 14:53:04 +00:00 committed by GitHub
commit d988d81690
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 99 additions and 47 deletions

View File

@ -52,7 +52,7 @@ class Installer():
'user' : False # Root counts as a user, if additional users are skipped.
}
self.base_packages = base_packages.split(' ')
self.base_packages = base_packages.split(' ') if type(base_packages) is str else base_packages
self.post_base_install = []
storage['session'] = self

View File

@ -177,6 +177,52 @@ class Profile(Script):
if hasattr(imported, '_prep_function'):
return True
return False
"""
def has_post_install(self):
with open(self.path, 'r') as source:
source_data = source.read()
# Some crude safety checks, make sure the imported profile has
# a __name__ check and if so, check if it's got a _prep_function()
# we can call to ask for more user input.
#
# If the requirements are met, import with .py in the namespace to not
# trigger a traditional:
# if __name__ == 'moduleName'
if '__name__' in source_data and '_post_install' in source_data:
with self.load_instructions(namespace=f"{self.namespace}.py") as imported:
if hasattr(imported, '_post_install'):
return True
"""
def is_top_level_profile(self):
with open(self.path, 'r') as source:
source_data = source.read()
# TODO: I imagine that there is probably a better way to write this.
return 'top_level_profile = True' in source_data
@property
def packages(self) -> list:
"""
Returns a list of packages baked into the profile definition.
If no package definition has been done, .packages() will return None.
"""
with open(self.path, 'r') as source:
source_data = source.read()
# Some crude safety checks, make sure the imported profile has
# a __name__ check before importing.
#
# If the requirements are met, import with .py in the namespace to not
# trigger a traditional:
# if __name__ == 'moduleName'
if '__name__' in source_data and '__packages__' in source_data:
with self.load_instructions(namespace=f"{self.namespace}.py") as imported:
if hasattr(imported, '__packages__'):
return imported.__packages__
return None
class Application(Profile):
def __repr__(self, *args, **kwargs):

View File

@ -24,6 +24,9 @@ Locale related
.. autofunction:: archinstall.set_keyboard_language
..
autofunction:: archinstall.Installer.set_keyboard_layout
Services
========

View File

@ -2,7 +2,7 @@ python-archinstall Documentation
================================
| **python-archinstall** *(or, archinstall for short)* is a helper library to install Arch Linux and manage services, packages and other things.
| It comes packaged with different pre-configured installers, such as the :ref:`guided <installing.guided>` installer.
| It comes packaged with different pre-configured installers, such as the `Guided installation`_ installer.
|
| A demo can be viewed here: `https://www.youtube.com/watch?v=9Xt7X_Iqg6E <https://www.youtube.com/watch?v=9Xt7X_Iqg6E>`_ which uses the default guided installer.

View File

@ -1,5 +1,3 @@
.. _installing.guided:
Guided installation
===================

View File

@ -1,5 +1,7 @@
import getpass, time, json, sys, signal, os
import archinstall
from archinstall.lib.hardware import hasUEFI
from archinstall.lib.profiles import Profile
"""
This signal-handler chain (and global variable)
@ -166,7 +168,7 @@ def ask_user_questions():
# Ask for archinstall-specific profiles (such as desktop environments etc)
if not archinstall.arguments.get('profile', None):
archinstall.arguments['profile'] = archinstall.select_profile(archinstall.list_profiles())
archinstall.arguments['profile'] = archinstall.select_profile(filter(lambda profile: (Profile(None, profile).is_top_level_profile()), archinstall.list_profiles()))
else:
archinstall.arguments['profile'] = archinstall.list_profiles()[archinstall.arguments['profile']]

View File

@ -1,7 +0,0 @@
import archinstall
packages = "plasma-meta kde-applications-meta plasma-wayland-session sddm"
# if the package selection can be reduced go for it
if "nvidia" in _gfx_driver_packages:
packages = packages + " egl-wayland"
installation.add_additional_packages(packages)
# We'll support plasma-desktop-wayland (minimal) later

View File

@ -1,2 +1,5 @@
import archinstall
installation.add_additional_packages("plasma-meta kde-applications-meta sddm") # We'll support plasma-desktop (minimal) later iirc sddm should be part of plasma-meta
packages = "plasma-meta konsole kate dolphin sddm plasma-wayland-session"
if "nvidia" in _gfx_driver_packages:
packages = packages + " egl-wayland"
installation.add_additional_packages(packages)

View File

@ -2,6 +2,11 @@
import archinstall
is_top_level_profile = False
# New way of defining packages for a profile, which is iterable and can be used out side
# of the profile to get a list of "what packages will be installed".
__packages__ = ['nano', 'nemo', 'gpicview-gtk3', 'openssh', 'sshfs', 'htop', 'scrot', 'wget']
def _prep_function(*args, **kwargs):
"""

View File

@ -2,6 +2,8 @@
import archinstall, os
is_top_level_profile = True
def _prep_function(*args, **kwargs):
"""
Magic function called by the importing installer

View File

@ -2,6 +2,8 @@
import archinstall
is_top_level_profile = False
def _prep_function(*args, **kwargs):
"""
Magic function called by the importing installer

View File

@ -1,34 +0,0 @@
# A desktop environment using "KDE".
import archinstall, os
# TODO: Remove hard dependency of bash (due to .bash_profile)
def _prep_function(*args, **kwargs):
"""
Magic function called by the importing installer
before continuing any further. It also avoids executing any
other code in this stage. So it's a safe way to ask the user
for more input before any other installer steps start.
"""
# KDE requires a functioning Xorg installation.
profile = archinstall.Profile(None, 'xorg')
with profile.load_instructions(namespace='xorg.py') as imported:
if hasattr(imported, '_prep_function'):
return imported._prep_function()
else:
print('Deprecated (??): xorg profile has no _prep_function() anymore')
# Ensures that this code only gets executed if executed
# through importlib.util.spec_from_file_location("kde", "/somewhere/kde.py")
# or through conventional import kde
if __name__ == 'kde-wayland':
# Install dependency profiles
installation.install_profile('xorg')
# Install the application kde from the template under /applications/
kde = archinstall.Application(installation, 'kde-wayland')
kde.install()
print("when you login, select Plasma (Wayland) for the wayland session")
# Enable autostart of KDE for all users
installation.enable_service('sddm')

View File

@ -2,6 +2,8 @@
import archinstall, os
is_top_level_profile = False
# TODO: Remove hard dependency of bash (due to .bash_profile)
def _prep_function(*args, **kwargs):
@ -20,6 +22,14 @@ def _prep_function(*args, **kwargs):
else:
print('Deprecated (??): xorg profile has no _prep_function() anymore')
"""
def _post_install(*args, **kwargs):
if "nvidia" in _gfx_driver_packages:
print("Plasma Wayland has known compatibility issues with the proprietary Nvidia driver")
print("After booting, you can choose between Wayland and Xorg using the drop-down menu")
return True
"""
# Ensures that this code only gets executed if executed
# through importlib.util.spec_from_file_location("kde", "/somewhere/kde.py")
# or through conventional import kde

20
profiles/minimal.py Normal file
View File

@ -0,0 +1,20 @@
# Used to do a minimal install
import archinstall, os
is_top_level_profile = True
def _prep_function(*args, **kwargs):
"""
Magic function called by the importing installer
before continuing any further. For minimal install,
we don't need to do anything special here, but it
needs to exist and return True.
"""
return True # Do nothing and just return True
if __name__ == 'minimal':
"""
This "profile" is a meta-profile.
It is used for a custom minimal installation, without any desktop-specific packages.
"""

View File

@ -2,6 +2,8 @@
import archinstall, os
is_top_level_profile = True
AVAILABLE_DRIVERS = {
# Sub-dicts are layer-2 options to be selected
# and lists are a list of packages to be installed