Commit graph

2679 commits

Author SHA1 Message Date
Caleb Connolly
2a7c769e14
core: introduce global context (MR 2252)
We can't totally escape the need for some runtime state defined by args.
To make the migration easier, introduce a global "Context" class and
move some of the read-only global options there.

Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
2024-06-23 12:38:37 +02:00
Caleb Connolly
b82c4eb167
chroot: always run apk static (MR 2252)
Testing by building postmarketos-initramfs (which installs >100 packages
but is very fast to build, so a worst-case scenario) this results in a
~15-20% speedup (which everything cached and doing multiple back to back
runs). From 32 seconds down to 25.

Doing a full install with --no-image, this takes us from 70 seconds on
my laptop down to 40s!

This also lets us drastically simplify pmb/helpers/apk.py!

Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
2024-06-23 12:38:37 +02:00
Caleb Connolly
cf651e56d5
chroot: combine user.py and root.py into run.py (MR 2252)
These are small related utility functions, combine them together.

Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
2024-06-23 12:38:37 +02:00
Caleb Connolly
1d9bbd613e
chroot: require explicit initialisation (MR 2252)
We currently lazily initialize the chroot's on first use, plus a few
bonus calls to init. However, there are some instances where we actually
don't want the chroot to be initialised (mostly to break recursion
loops).

Simplify the codebase by removing all of this, and just calling
pmb.chroot.init() where it's needed.

In addition, print a warning if init() is called multiple times for one
chroot. This should help us catch these instances if they crop up again.

Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
2024-06-23 12:38:37 +02:00
Caleb Connolly
22f805a325
frontend: deprecate --install-blockdev with the chroot command (MR 2252)
This was used for testing the on device installer, but doesn't seem to
be super useful anymore. Let's deprecate it and remove it at some point.

Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
2024-06-23 12:38:37 +02:00
Caleb Connolly
2e68f40dd4
pmb.chroot: install() make chroot a required argument (MR 2252)
Defaulting to the native chroot isn't necessarily intuitive. Let's
require this be specified in full.

Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
2024-06-23 12:38:37 +02:00
Caleb Connolly
3322eab30c
pmb.chroot: merge_usr earlier (MR 2252)
We currently do stuff in the chroot before merging /usr, this could lead
to weird side effects due to the recursive nature of chroot.init being
called every time we run a command. Let's reorder a bit to reduce the
risk of weirdness here.

Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
2024-06-23 12:38:37 +02:00
Caleb Connolly
2d232200f8
pmb.core.chroot: make type a property (MR 2252)
Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
2024-06-23 12:38:37 +02:00
Caleb Connolly
1d5eda75b5
pmb.chroot.apk: fastpath when all packages are already installed (MR 2252)
Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
2024-06-23 12:38:37 +02:00
Caleb Connolly
75c2b1f8e3
pmb.chroot: only init once (MR 2252)
We don't need to re-init the chroot this often, cache on first init and
skip all subsequent ones. Even though we take a shortcut if the chroot
already exists we still do a bunch of additional checks which we only
really need to do once.

Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
2024-06-23 12:38:37 +02:00
Caleb Connolly
2a0ca33770
WIP: test: start fixing mypy errors (MR 2252)
Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
2024-06-23 12:38:37 +02:00
Caleb Connolly
1232c35e48
pmb.build: use pigz instead of gzip (MR 2252)
This is multithreaded, and by consequence much much faster than default
gzip. Since we switched to running gzip from the native chroot we also
changed from running it in the fastest mode, now we're running it with
-9 it can be pretty slow on any kind of mobile hardware.

Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
2024-06-23 12:38:37 +02:00
Caleb Connolly
31cc898dd5
treewide: adopt pathlib.Path and type hinting (MR 2252)
With the new chroot type, we can now write fancy paths in the pythonic
way. Convert most of the codebase over, as well as adding various other
type hints.

Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
2024-06-23 12:38:37 +02:00
Caleb Connolly
00383bf354
pmb.install: clean up initialization of recommends/selected (MR 2252)
Avoid passing in a boolean to decide if this is the first time the
function has been called and instead just initialise the globals at the
top of the file.

We can figure out the state management if/when we want
to handle doing multiple installs in a single invocation of pmb.

Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
2024-06-23 12:38:37 +02:00
Caleb Connolly
50c7983d26
pmb.install: demote recommends logging (MR 2252)
Debug is the default loglevel, demote the "already visited" message to
verbose, as it isn't generally useful.

Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
2024-06-23 12:38:37 +02:00
Caleb Connolly
71e7af57e6
pmb.helpers.logging: wrap logging module (MR 2252)
We use a custom verbose log level in pmbootstrap, unfortunately it isn't
possible to correctly type this due to some limitations in the logging
library [1], [2].

Given that our usecase is fairly simple, we can just wrap the module
with our own so we only have to tell mypy to ignore the error once
instead of at every callsite.

[1]: https://github.com/cryptax/droidlysis/issues/15
[2]: https://github.com/python/typing/discussions/980

Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
2024-06-23 12:38:37 +02:00
Caleb Connolly
4b6c198ca4
pmb: type hint main() (MR 2252)
Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
2024-06-23 12:38:37 +02:00
Caleb Connolly
425b61f7db
pmb.core.chroot: add a chroot glob helper (MR 2252)
Add a static method to glob all the chroot directories that exist on the
filesystem.

Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
2024-06-23 12:38:37 +02:00
Caleb Connolly
233cbdadeb
pmb.qemu: add ncpus fallback (MR 2252)
According to the type hints for os.cpu_count(), it might return None...
To be safe, add a warning and a fallback in this case (though it seems
incredibly unlikely this would ever be hit)

Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
2024-06-23 12:38:37 +02:00
Caleb Connolly
7ed08e74d3
pmb.helpers.other.cache: simplify (MR 2252)
The init_cache() function just assigned some default constants, simplify
this by just declaring it that way to begin with, as well as adding type
hints.

Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
2024-06-23 12:38:37 +02:00
Caleb Connolly
3bfc6474bb
WIP: test: type annotate suffix + pathlib (MR 2252)
Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
2024-06-23 12:38:37 +02:00
Caleb Connolly
9301412f90
pmb.helpers: remove check for old device paths (MR 2252)
The migration to the new pmaports device layout was 3 years ago, I think
it's reasonable that this check is no longer needed.
2024-06-23 12:38:37 +02:00
Caleb Connolly
7b14ef597b
treewide: type hint args (MR 2252)
Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
2024-06-23 12:38:37 +02:00
Caleb Connolly
198f302a36
treewide: add a Chroot type and adopt pathlib.Path (MR 2252)
Introduce a new module: pmb.core to contain explicitly typed pmbootstrap
API. The first component being Suffix and SuffixType. This explicitly
defines what suffixes are possible, future changes should aim to further
constrain this API (e.g. by validating against available device
codenames or architectures for buildroot suffixes).

Additionally, migrate the entire codebase over to using pathlib.Path.
This is a relatively new part of the Python standard library that uses a
more object oriented model for path handling. It also uses strong type
hinting and has other features that make it much cleaner and easier to
work with than pure f-strings. The Chroot class overloads the "/"
operator the same way the Path object does, allowing one to write paths
relative to a given chroot as:

builddir = chroot / "home/pmos/build"

The Chroot class also has a string representation ("native", or
"rootfs_valve-jupiter"), and a .path property for directly accessing the
absolute path (as a Path object).

The general idea here is to encapsulate common patterns into type hinted
code, and gradually reduce the amount of assumptions made around the
codebase so that future changes are easier to implement.

As the chroot suffixes are now part of the Chroot class, we also
implement validation for them, this encodes the rules on suffix naming
and will cause a runtime exception if a suffix doesn't follow the rules.
2024-06-23 12:38:37 +02:00
Caleb Connolly
b31dee9ec3
pmb.chroot.zap: don't calculate size (MR 2252)
It's nice to know how much space gets free'd when zapping, but I often
find myself with a lot of chroot's and other junk, and on my laptop
running "du" across all of this takes quite a few seconds. As this is
purely cosmetic, it doesn't justify taking such a long time.

Remove the size calculation code to substantially speed up zap.

Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
2024-06-23 12:38:36 +02:00
Caleb Connolly
a76cd92bcb
pmb.config: support ssh urls for (pm)aports (MR 2252)
HTTP auth is heavily discouraged, and becoming annoying to set up and
use. Let folks reconfigure pmaports origin remote using the SSH URL.

Signed-off-by: Caleb Connolly <caleb@postmarketos.org>
2024-06-23 12:38:36 +02:00
Clayton Craft
a8c24ae867
.gitlab-ci: save pmb log.txt on pytest failure (MR 2306)
Currently there is very little info from test failures when the test
fails in some call to pmbootstrap. By saving the log file to CI
artifacts on failure, we can make it really easy to find/obtain
important stuff to help with debugging.
2024-06-14 10:11:41 -07:00
Luca Weiss
048f24cf50
CI: Add docs deployment job (MR 2316)
Tweaked-By: Oliver Smith <ollieparanoid@postmarketos.org>
2024-06-06 18:09:56 +02:00
Luca Weiss
e9faee3747
CI: correct yaml indentation (MR 2316)
Seems GitLab CI doesn't really care but still fix it.
2024-06-06 18:06:48 +02:00
Newbyte
c1ffe85749
CI: Use latest (stable) Alpine instead of Edge (MR 2317)
Alpine 3.20 has released now which should contain everything we need to
run our CI.

Closes https://gitlab.com/postmarketOS/pmaports/-/issues/2747
2024-05-29 01:24:00 +02:00
Oliver Smith
d1aca8630f
PMB_APK_FORCE_MISSING_REPOSITORIES: 1 -> "1"
Fixes: 0d6c03b2 ("PMB_APK_FORCE_MISSING_REPOSITORIES: new env var (MR 2318)")
2024-05-29 01:10:42 +02:00
Oliver Smith
0d6c03b201
PMB_APK_FORCE_MISSING_REPOSITORIES: new env var (MR 2318)
This is needed to bring up the v24.06 repositories at
build.postmarketos.org. With the latest apk version, apk refuses to
operate if an URL from /etc/apk/repositories cannot be fetched.

Before the repositories are created for the first time, they do not
exist, so we will just set PMB_APK_FORCE_MISSING_REPOSITORIES=1 in bpo
to be not blocked here.

I've also spent significant time on alternative implementations, but
they have problems:
- Let bpo create an empty APKINDEX before building the first package,
  but this was a larger code change, leading to lots of adjustments in
  the tests, and ultimately it seems it didn't work properly (it seems
  apk/abuild doesn't create a valid signed APKINDEX for one that has no
  packages).
- Do not set the --mirror-pmOS argument for the "final" repository, only
  the "wip" repository, until the "final" repository is available for
  the first time. This works fine for x86_64, but not for foreign arch
  repositories because then the cross compilers from the x86_64
  repository are not available. I've also tried to make a different env
  var that ensures we don't write the non-existing repository to
  /etc/apk/repositories from within pmbootstrap if initializing a
  foreign arch chroot, but then we would find a sane way to do this only
  for the "final" repository and not for the "wip" repository which
  leads to a lot more complexity than this patch.

So this is not the nicest solution (apk still tries to fetch the indexes
and gets a 404), but it is the simplest one and unblocks us from working
on v24.06. Also it doesn't add more complexity which is important in the
middle of the feature freeze we are currently in.

Related: bpo issue 137
Related: d76213e643
Related: https://postmarketos.org/blog/2024/05/19/pmOS-update-2024-05/#pmbootstrap-230-and-feature-freeze
2024-05-29 00:12:55 +02:00
Clayton Craft
3eca24f1ed
kconfigcheck: add NLS_ASCII for efi check (MR 2310)
This option is required for kernels to support mounting the ESP as /boot
after pmaports bb6d7a05b
2024-05-19 19:20:22 +02:00
Val Packett
1b2024e7d8
pmb: install: unbreak rsync option (MR 2311)
Fixes "UnboundLocalError: cannot access local variable 'filesystem'
where it is not associated with a value".
2024-05-19 18:58:34 +02:00
Newbyte
9252400292
Prepare 2.3.1 release 2024-05-18 18:34:09 +02:00
Robert Eckelmann
e7c8b2d5dc
pyproject.toml: add docs to the parts to be excluded (MR 2312)
as reported in #2355 pmmbootstrap wheel installs files to /usr/lib/python3.12/site-packages/docs
2024-05-18 18:21:04 +02:00
Oliver Smith
fd73ecbfd3
pmb.config.apk_tools_min_version: add v3.20
Prepare for postmarketOS v24.06.
2024-05-15 20:54:16 +02:00
Oliver Smith
e64583458c
pmb.config.apk_tools_min_version: update
Set the current apk versions as min version.
2024-05-15 20:54:11 +02:00
Newbyte
6dce84647b
Prepare 2.3.0 release 2024-05-15 18:43:22 +02:00
Newbyte
0df75422b4
treewide: Rename unmaintained to archived (MR 2308)
See https://gitlab.com/postmarketOS/pmaports/-/merge_requests/5046
2024-05-15 17:06:37 +02:00
Robert Eckelmann
d28174bf95
ci: add job to generate docs (MR 2266) 2024-05-14 14:36:24 +02:00
Robert Eckelmann
974b76c00a
docs: add new configuration for generating docs using sphinx (MR 2266) 2024-05-14 14:36:23 +02:00
Robert Eckelmann
044d3b5a6a
pmb.*: various comment reformatting to assist with generating docs (MR 2266) 2024-05-14 14:36:22 +02:00
Clayton Craft
415e7364f4
pmb.parse: add get_parser for returning ArgumentParser obj (MR 2266)
This is needed for sphinx autoprogram since that expects an
argparse.ArgumentParser, and arguments() returns some argparse
"Namespace" obj. Useful for sphinx/autoprogram and maybe other things
later that want to get at pmb's full args.
2024-05-14 14:36:18 +02:00
Pablo Correa Gómez
a5575a28f9
pmb: install: add options for default charset in vfat /boot partitions (MR 2304)
linux-lts and linux-edge in alpine use "utf-8", that might change, but
add the options regardless, so we can be safe (people can always edit them!)

Fixes https://gitlab.com/postmarketOS/pmaports/-/issues/2782
[ci:skip-build]: already built successfully in CI
2024-05-07 10:00:12 -07:00
Pablo Correa Gómez
93a9cea50f
pmb: install: add some sane mount options to default /boot in /etc/fstab (MR 2304)
We don't want executables, suid executables, or devices. We neither
want symbolic links in fat partitions. These have been taken from
systemd

Ref: pmaports#2782
2024-05-07 10:00:12 -07:00
Pablo Correa Gómez
d6b9ffbc78
pmb: install: allow to mount fat{16,32} /boot from /etc/fstab (MR 2304)
The "fat16" and "fat32" mount types do not exist. It is "vfat"
2024-05-07 10:00:12 -07:00
Clayton Craft
70a5e6ebf7
pmb.config: kconfig check: turn off RT_GROUP_SCHED in 'community' (MR 2305)
See: https://gitlab.com/postmarketOS/pmaports/-/issues/2652
2024-05-06 10:21:41 -07:00
Clayton Craft
69cb189bdb
test: disable cross compile test (MR 2307)
This test is *only* failing in gitlab CI and I haven't been able to
figure out why (see [1]). Everything else (e.g. bpo, building packages
locally) seems to work fine. Since this is blocking pmbootstrap MRs, I'm
going to disable the test until we can figure out wtf is going on with
running it in gitlab CI.

1. https://gitlab.com/postmarketOS/pmbootstrap/-/issues/2346
[ci:skip-build]: already built successfully in CI
2024-05-02 10:38:47 -07:00
Brandon Boese
a2f9d780e3
gitignore: Ignore KDevelop files and folder (MR 2302) 2024-04-30 08:15:31 +02:00