From 194d169335d548aa8ff3dc825942da498bfe1ddf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82?= Date: Tue, 7 Jul 2026 18:17:14 +0200 Subject: [PATCH 01/11] docs: add GitLab-specific README with the full story --- README.md | 165 ++++++++++++++++-------------------------------------- 1 file changed, 47 insertions(+), 118 deletions(-) diff --git a/README.md b/README.md index 5fcec2b..e1d90be 100644 --- a/README.md +++ b/README.md @@ -1,134 +1,63 @@ -# Antergos NeXT ISO +# 🌙 Antergos NeXT -> Looking for the old Arch/systemd version? See the [`before-systemd-change` branch](https://github.com/Antergos-NeXT/antergos-iso/tree/before-systemd-change). - -[![Build ISO](https://github.com/Antergos-NeXT/antergos-iso/actions/workflows/build.yml/badge.svg)](https://github.com/Antergos-NeXT/antergos-iso/actions/workflows/build.yml) -[![License](https://img.shields.io/badge/license-GPL--3.0-blue.svg)](LICENSE) -[![Maintenance](https://img.shields.io/maintenance/yes/2026.svg)]() -[![Artix Linux](https://img.shields.io/badge/Artix%20Linux-rolling-1793d1.svg)](https://artixlinux.org) -[![DE-KDE](https://img.shields.io/badge/DE-KDE%20Plasma-4A86CF.svg)]() -[![Init](https://img.shields.io/badge/init-Dinit-brightgreen.svg)]() -[![Docs](https://img.shields.io/badge/docs-site-blue.svg)](https://antergos-next.github.io/antergos-iso/) -[![Dla mojego narodu](https://img.shields.io/badge/README-Polski-crimson.svg)](README.pl.md) - -A community revival of Antergos — built on **Artix Linux** with **Dinit**, **KDE Plasma** desktop, and the **Calamares** installer (offline + online modes). - -## What changed - -| Before | After | -|--------|-------| -| Arch Linux (systemd) | Artix Linux (Dinit / OpenRC / Runit / S6) | -| GNOME desktop | KDE Plasma desktop | -| archiso build system | artools (`buildiso`) | -| Custom Cnchi installer | Calamares (mature, upstream-supported) | -| Symlinked overlays | Resolved, self-contained profile overlays | - -## Why Artix? - -The systemd migration in the Linux ecosystem has been controversial, and the original Antergos community had a strong preference for alternatives. Artix Linux provides a clean Arch-like experience without systemd, with your choice of Dinit, OpenRC, Runit, or S6. This keeps the familiar Pacman/Arch ecosystem while giving users the init freedom they want. - -> **Why Dinit?** We originally shipped OpenRC. Then Calamares kidnapped our pacman resolver and forced us to switch. Every `--noconfirm` call picked `elogind-dinit` (alphabetically before `elogind-openrc`), pulling in `dinit-rc` which conflicts with `openrc`. We tried `--ignore`, `--assume-installed`, `--ask=12`, and even a dummy package. Pacman laughed at all of them. Dinit works great. Stop asking. +> *February → July 2026* > -> Proof (our descent into madness): -> ``` -> fe4e862 fix: use --ignore instead of separate provider call ← --ignore: pacman ignored it -> 69da290 fix: add --ask=12 safety net ← --ask=12: infinite loop -> 64b08a9 fix: replace with --assume-installed=init-logind ← assume-installed: not checked for virtuals -> 2c0d242 fix: add --ignore to packages module too ← same failure, other file -> 8a6fa3f docs: update AGENTS.md with --ignore approach ← documented the failure -> ``` -> The conflict was `dinit-rc` vs `openrc` both providing+conflicting with virtual `init-rc`. Pacman `--noconfirm` picks `elogind-dinit` first alphabetically → `dinit` → `dinit-rc` → conflict. No flag in pacman can pin a virtual provider on a fresh install. Dinit wins by alphabetical destiny. +> *MoonlightOS walked so Solara could run. Solara ran so Antergos NeXT could exist.* +> *And here we are.* + +--- + +**Antergos NeXT** is not just a distribution — it's the final form of a journey that started with a 14-year-old's distro hobby and ended up covered by [9to5Linux](https://9to5linux.com), DistroWatch, Linuxiac, and more. + +From a janky custom `mkarchiso` called MoonlightOS NoVa, through the EndeavourOS-based Solara, to a fully-fledged Artix Linux-based ISO with KDE Plasma, Calamares installer (online + offline), Dinit as default init (OpenRC/Runit/S6 still selectable), and proper CI that uploads to the Internet Archive. + +**This is the one that worked.** + +--- + +## The Timeline + +| Era | Period | Base | Init | DE | +|-----|--------|------|------|----| +| 🌙 MoonlightOS NoVa | ~Feb 2025 | Arch | systemd | KDE | +| 🐱 MoonlightOS meow-v7 | ~2025 | EndeavourOS | systemd | KDE | +| ☀️ Solara | ~2025 | EndeavourOS | systemd | KDE | +| 🟢 Antergos NeXT (systemd) | ~2026 | Arch | systemd | GNOME | +| 🔄 Antergos NeXT (OpenRC) | ~2026 | Artix | OpenRC | KDE | +| ⚡ **Antergos NeXT (Dinit)** | **Now** | **Artix** | **Dinit** | **KDE** | + +--- + +## What's Inside + +- **KDE Plasma** live environment — polished, familiar, ready +- **Calamares** installer in two modes: + - *Online* — init system selection, package chooser, DM picker + - *Offline* — fully self-contained, no network needed +- **Artix Linux** base — rolling release, pacman, no systemd +- **Dinit** as default init — fast, clean, modern +- **Multi-init support** — OpenRC, Runit, S6 still selectable +- **antergos-pkgs** custom repo — curated packages, Calamares branding, themes + +--- ## Building -Requires an **Artix-based** system: - ```bash -# Install build deps -pacman -S artools squashfs-tools -modprobe loop - -# Clone and enter -git clone https://github.com/Antergos-NeXT/antergos-iso.git -cd antergos-iso - -# Set workspace to repo root export WORKSPACE_DIR="$PWD" - -# Must use our pacman.conf (has antergos-pkgs repo) -mkdir -p ~/.config/artools/pacman.conf.d -cp pacman.conf.d/iso-x86_64.conf ~/.config/artools/pacman.conf.d/ - -# Build -sudo ./buildiso -p antergos +sudo -E ./buildiso -p antergos ``` -> **⚠️ VERY IMPORTANT**: Use `./buildiso`, not `buildiso`. The Artix system `buildiso` at `/usr/bin/buildiso` lacks the `--overwrite='*'` flag passed to `basestrap`, causing file conflicts (e.g. `calamares` vs `calamares-branding-antergos-next` both claiming `/usr/share/calamares/branding/default/`). Our repo's `./buildiso` has it. - -The `.iso` appears in `/var/lib/artools/buildiso/iso/antergos/`. - -First build pulls ~5 GB from the internet. Subsequent builds use pacman cache. - -### Custom packages - -The ISO pulls custom packages (branding, Calamares config, wallpapers) from our repo. Add it to your system: - -```ini -[antergos-pkgs] -SigLevel = Optional TrustAll -Server = https://antergos-next.github.io/antergos-packages -``` - -## Profile structure - -``` -iso-profiles/ -├── antergos/ -│ ├── profile.yaml # Packages, services, build config -│ ├── root-overlay/ # Files merged into rootfs (os-release, pacman.conf, sddm) -│ └── live-overlay/ # Files for the live environment (Calamares configs, etc.) -├── common/ -│ └── common.yaml # Shared base packages -├── pacman.conf.d/ -│ └── iso-x86_64.conf # Pacman config used during ISO build -└── buildiso # Modified buildiso with Antergos branding -``` - -Overlays are self-contained (no symlinks to external directories) so the repo builds standalone. - -## Installer modes - -| Mode | Description | -|------|-------------| -| **Offline** | Unpacks a KDE Plasma squashfs — no internet needed | -| **Online** | Netinstall with init system choice (Dinit, OpenRC, Runit, S6) + desktop selection | - -The launcher (`calamares-next`) presents a mode picker before launching Calamares. - -## Download - -No prebuilt ISOs yet. See [Building](#building) above. - -## Sources - -- [Artix Linux](https://artixlinux.org) — base distribution -- [artools](https://gitea.artixlinux.org/artix/artools) — ISO build tools -- [Calamares](https://codeberg.org/calamares/calamares) — installer framework -- [antergos-packages](https://github.com/Antergos-NeXT/antergos-packages) — custom PKGBUILDs -- [Antergos wallpapers](https://github.com/Antergos/wallpapers) — original wallpapers - -## License - -[GPL-3.0](LICENSE) +ISO lands at `/var/lib/artools/buildiso/iso/antergos/`. --- -## A Note to the "Branding Police" +## Why This Exists -If you came here to hate and you're about to type "why are you using Antergos's branding" — pack your bags and go to **Manjaro**. We have Dustin's blessing. We are respectful. We are not them. Move on. +Because rolling your own distro at 14 is funny. Because giving up is boring. And because after six iterations, countless broken packages, three init systems, two ISO builders, and one very patient maintainer — you eventually end up with something that actually works. + +**MoonlightOS walked. Solara ran. Antergos NeXT flies.** --- -*Antergos launched in 2012 as **Cinnarch** (Cinnamon + Arch), renamed in 2013, and ran until 2019. NeXT continues the spirit with a modernized, Artix-based foundation — KDE Plasma, Calamares, and the same multi-desktop ambition you remember.* - -*Dustin Falgout, one of the original Antergos developers, has given his blessing for this community revival ([see NOTICES](NOTICES)). Antergos NeXT is not affiliated with, endorsed by, or connected to the original Antergos project.* +*25-01-2026 → 07-07-2026* From f931f74fa915e3567bbf0cf0bfe720932d9566ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82?= Date: Tue, 7 Jul 2026 18:21:02 +0200 Subject: [PATCH 02/11] docs: add real press links --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e1d90be..81929d3 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ --- -**Antergos NeXT** is not just a distribution — it's the final form of a journey that started with a 14-year-old's distro hobby and ended up covered by [9to5Linux](https://9to5linux.com), DistroWatch, Linuxiac, and more. +**Antergos NeXT** is not just a distribution — it's the final form of a journey that started with a 14-year-old's distro hobby and ended up covered by [9to5Linux](https://9to5linux.com), [Tux Machines](https://news.tuxmachines.org/n/2026/06/12/First_Look_at_Antergos_NeXT_A_Modern_Revival_of_Antergos_Linux_.shtml), [OpenSourceFeed](https://www.opensourcefeed.org/antergos-next-revival/), [linux.org](https://www.linux.org/threads/9to5linux-first-look-at-antergos-next-a-modern-revival-of-antergos-linux-with-kde-plasma.67691/), and the [EndeavourOS forum](https://forum.endeavouros.com/t/attempt-to-revive-antergos-now-antergos-next/80152). From a janky custom `mkarchiso` called MoonlightOS NoVa, through the EndeavourOS-based Solara, to a fully-fledged Artix Linux-based ISO with KDE Plasma, Calamares installer (online + offline), Dinit as default init (OpenRC/Runit/S6 still selectable), and proper CI that uploads to the Internet Archive. From a381290740708e4e144efe7bfc30fdd3c72b99ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82?= Date: Tue, 7 Jul 2026 19:05:47 +0200 Subject: [PATCH 03/11] fix: install antergos-release/grub-theme via basestrap (online), enable dinit-user-spawn, add dbus-dinit-user --- .../calamares-online/modules/basestrap.conf | 4 ++ .../etc/calamares/modules/netinstall.yaml | 43 ++++++++---- .../etc/calamares/modules/packagechooser.conf | 1 + .../calamares/modules/packagechooser_dm.conf | 67 +------------------ .../etc/calamares/modules/services-artix.conf | 2 + iso-profiles/antergos/profile.yaml | 8 +++ 6 files changed, 46 insertions(+), 79 deletions(-) diff --git a/iso-profiles/antergos/live-overlay/etc/calamares-online/modules/basestrap.conf b/iso-profiles/antergos/live-overlay/etc/calamares-online/modules/basestrap.conf index 6f43bc8..94f019e 100644 --- a/iso-profiles/antergos/live-overlay/etc/calamares-online/modules/basestrap.conf +++ b/iso-profiles/antergos/live-overlay/etc/calamares-online/modules/basestrap.conf @@ -24,9 +24,13 @@ pacman: mode: "0o755" keyrings: - artix + - antergos-next base_init: elogind operations: - install: - base + - antergos-next-keyring + - antergos-release + - antergos-grub-theme diff --git a/iso-profiles/antergos/live-overlay/etc/calamares/modules/netinstall.yaml b/iso-profiles/antergos/live-overlay/etc/calamares/modules/netinstall.yaml index 2c091a8..91ef00f 100644 --- a/iso-profiles/antergos/live-overlay/etc/calamares/modules/netinstall.yaml +++ b/iso-profiles/antergos/live-overlay/etc/calamares/modules/netinstall.yaml @@ -23,19 +23,7 @@ - pipewire-alsa - pipewire-pulse - wireplumber - - networkmanager-dinit - - pipewire-dinit - - pipewire-pulse-dinit - - wireplumber-dinit - - dbus-dinit - - sddm-dinit - - syslog-ng-dinit - - acpid-dinit - - bluez-dinit - - cronie-dinit - - cups-dinit - - dhcpcd-dinit - - power-profiles-daemon-dinit + - name: "Kernel" description: "Kernel and modules" @@ -261,3 +249,32 @@ packages: - hyprland - xdg-desktop-portal-hyprland + +- name: "SDDM" + description: "SDDM display manager" + selected: false + packages: + - sddm + - sddm-dinit + - antergos-sddm-theme + +- name: "LightDM" + description: "LightDM display manager" + selected: false + packages: + - lightdm + - lightdm-dinit + +- name: "LXDM" + description: "LXDM display manager" + selected: false + packages: + - lxdm + - lxdm-dinit + +- name: "LY" + description: "LY display manager" + selected: false + packages: + - ly + - ly-dinit diff --git a/iso-profiles/antergos/live-overlay/etc/calamares/modules/packagechooser.conf b/iso-profiles/antergos/live-overlay/etc/calamares/modules/packagechooser.conf index 28e51e8..aee0d95 100644 --- a/iso-profiles/antergos/live-overlay/etc/calamares/modules/packagechooser.conf +++ b/iso-profiles/antergos/live-overlay/etc/calamares/modules/packagechooser.conf @@ -78,6 +78,7 @@ items: - lm_sensors-dinit - openvpn-dinit - pipewire-dinit + - pipewire-pulse-dinit - power-profiles-daemon-dinit - rsync-dinit - wireplumber-dinit diff --git a/iso-profiles/antergos/live-overlay/etc/calamares/modules/packagechooser_dm.conf b/iso-profiles/antergos/live-overlay/etc/calamares/modules/packagechooser_dm.conf index d8445d3..a63a656 100644 --- a/iso-profiles/antergos/live-overlay/etc/calamares/modules/packagechooser_dm.conf +++ b/iso-profiles/antergos/live-overlay/etc/calamares/modules/packagechooser_dm.conf @@ -1,7 +1,7 @@ --- mode: required -method: netinstall-add +method: netinstall-select labels: step: "Display Manager" @@ -14,83 +14,18 @@ items: name: sddm description: "QML-based display manager (KDE default)" screenshot: "" - netinstall: - name: "sddm" - description: "SDDM display manager" - selected: true - critical: true - immutable: false - expanded: true - hidden: false - subgroups: - - name: "SDDM" - description: "SDDM packages" - selected: true - hidden: true - packages: - - sddm - - sddm-dinit - - antergos-sddm-theme - id: LightDM name: lightdm description: "Cross-desktop display manager (GTK)" screenshot: "" - netinstall: - name: "lightdm" - description: "LightDM display manager" - selected: false - critical: true - immutable: false - expanded: true - hidden: false - subgroups: - - name: "LightDM" - description: "LightDM packages" - selected: true - hidden: true - packages: - - lightdm - - lightdm-dinit - id: LXDM name: lxdm description: "Lightweight display manager (LXDE)" screenshot: "" - netinstall: - name: "lxdm" - description: "LXDM display manager" - selected: false - critical: true - immutable: false - expanded: true - hidden: false - subgroups: - - name: "LXDM" - description: "LXDM packages" - selected: true - hidden: true - packages: - - lxdm - - lxdm-dinit - id: LY name: ly description: "Minimal TUI display manager" screenshot: "" - netinstall: - name: "ly" - description: "LY display manager" - selected: false - critical: true - immutable: false - expanded: true - hidden: false - subgroups: - - name: "LY" - description: "LY packages" - selected: true - hidden: true - packages: - - ly - - ly-dinit diff --git a/iso-profiles/antergos/live-overlay/etc/calamares/modules/services-artix.conf b/iso-profiles/antergos/live-overlay/etc/calamares/modules/services-artix.conf index e5114bb..2cac80c 100644 --- a/iso-profiles/antergos/live-overlay/etc/calamares/modules/services-artix.conf +++ b/iso-profiles/antergos/live-overlay/etc/calamares/modules/services-artix.conf @@ -22,3 +22,5 @@ services: action: "enable" - name: "syslog-ng" action: "enable" + - name: "dinit-user-spawn" + action: "enable" diff --git a/iso-profiles/antergos/profile.yaml b/iso-profiles/antergos/profile.yaml index 19fa8ee..2257511 100644 --- a/iso-profiles/antergos/profile.yaml +++ b/iso-profiles/antergos/profile.yaml @@ -20,6 +20,7 @@ live-session: - wireplumber rootfs: packages: + - antergos-release - qt6-multimedia-ffmpeg - firefox - vlc @@ -54,6 +55,7 @@ rootfs: - bluez-dinit - cronie-dinit - dbus-dinit + - dbus-dinit-user - dhcpcd-dinit - power-profiles-daemon-dinit openrc: @@ -99,6 +101,12 @@ livefs: - okular - partitionmanager - tesseract-data-eng + - pipewire + - pipewire-pulse + - wireplumber + - sof-firmware + - alsa-firmware + - alsa-utils packages-init: dinit: - antergos-live-dinit From 9dff90ef4655cbc0febd537d631a687cd9845751 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82?= Date: Tue, 7 Jul 2026 19:25:35 +0200 Subject: [PATCH 04/11] fix: set OpenRC critical to false (broken, should not block install) --- .../etc/calamares-online/modules/packagechooser.conf | 2 +- .../live-overlay/etc/calamares/modules/packagechooser.conf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/iso-profiles/antergos/live-overlay/etc/calamares-online/modules/packagechooser.conf b/iso-profiles/antergos/live-overlay/etc/calamares-online/modules/packagechooser.conf index a02eecd..65c4811 100644 --- a/iso-profiles/antergos/live-overlay/etc/calamares-online/modules/packagechooser.conf +++ b/iso-profiles/antergos/live-overlay/etc/calamares-online/modules/packagechooser.conf @@ -88,7 +88,7 @@ items: name: "openrc" description: "OpenRC init system" selected: false - critical: true + critical: false immutable: false expanded: true hidden: false diff --git a/iso-profiles/antergos/live-overlay/etc/calamares/modules/packagechooser.conf b/iso-profiles/antergos/live-overlay/etc/calamares/modules/packagechooser.conf index aee0d95..a120773 100644 --- a/iso-profiles/antergos/live-overlay/etc/calamares/modules/packagechooser.conf +++ b/iso-profiles/antergos/live-overlay/etc/calamares/modules/packagechooser.conf @@ -91,7 +91,7 @@ items: name: "openrc" description: "OpenRC init system" selected: false - critical: true + critical: false immutable: false expanded: true hidden: false From db809e689888613ff3115f676b898915f213e79d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82?= Date: Tue, 7 Jul 2026 19:26:44 +0200 Subject: [PATCH 05/11] fix: address basestrap module findings (callback, -Sy->-S, umask guard, operations guard) --- .../lib/calamares/modules/basestrap/main.py | 37 ++++++++++++------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/iso-profiles/antergos/live-overlay/usr/lib/calamares/modules/basestrap/main.py b/iso-profiles/antergos/live-overlay/usr/lib/calamares/modules/basestrap/main.py index 74ba773..40a003f 100644 --- a/iso-profiles/antergos/live-overlay/usr/lib/calamares/modules/basestrap/main.py +++ b/iso-profiles/antergos/live-overlay/usr/lib/calamares/modules/basestrap/main.py @@ -302,7 +302,7 @@ class PMPacman(PackageManager): """ Call pacman in a loop until it is successful or the number of retries is exceeded :param command: The pacman command to run - :param callback: An optional boolean that indicates if this pacman run should use the callback + :param callback: If True, process output using self.line_cb :return: """ @@ -310,7 +310,10 @@ class PMPacman(PackageManager): while pacman_count <= self.pacman_num_retries: pacman_count += 1 try: - host_env_process_output(command) + if callback: + host_env_process_output(command, callback=self.line_cb) + else: + host_env_process_output(command) return except subprocess.CalledProcessError: if pacman_count > self.pacman_num_retries: @@ -343,7 +346,7 @@ class PMPacman(PackageManager): if from_local: command.append("-U") else: - command.append("-Sy") + command.append("-S") command.append("--overwrite=*") command += pkgs @@ -376,17 +379,19 @@ class PMPacman(PackageManager): def setup_requirements(self, rootdir): cal_umask = os.umask(0) - for target in self.pacman_requirements: - dest = rootdir + target["dest"] - if not os.path.exists(dest): - mod = int(target["mode"],8) - os.mkdir(dest, mode=mod) - libcalamares.utils.debug("Mode: {!s}".format(oct(mod))) - libcalamares.utils.debug("Created: {!s}".format(dest)) + try: + for target in self.pacman_requirements: + dest = rootdir + target["dest"] + if not os.path.exists(dest): + mod = int(target["mode"],8) + os.mkdir(dest, mode=mod) + libcalamares.utils.debug("Mode: {!s}".format(oct(mod))) + libcalamares.utils.debug("Created: {!s}".format(dest)) - path = join(rootdir, "run") - os.chmod(path, 0o755) - os.umask(cal_umask) + path = join(rootdir, "run") + os.chmod(path, 0o755) + finally: + os.umask(cal_umask) def copy_file(self, rootdir, f): if os.path.exists(join("/",f)): @@ -533,7 +538,11 @@ def run(): if provider in known_inits: init_pkg = "-".join([base_init, provider]) libcalamares.utils.debug("Init provider package added: {!s}".format(init_pkg)) - operations[0]["install"].append(init_pkg) + if operations and isinstance(operations[0], dict) and isinstance(operations[0].get("install"), list): + operations[0]["install"].append(init_pkg) + else: + libcalamares.utils.warning( + "Cannot add init provider package: missing operations[0]['install'] list") libcalamares.globalstorage.insert("initProvider", provider) libcalamares.globalstorage.insert("baseInit", base_init) break From 0f3adc70b98d828650e417b015471d0460040af6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82?= Date: Tue, 7 Jul 2026 19:30:26 +0200 Subject: [PATCH 06/11] fix: address basestrap findings (format safety, umask removal, non-list guard) --- .../lib/calamares/modules/basestrap/main.py | 56 +++++++++---------- 1 file changed, 26 insertions(+), 30 deletions(-) diff --git a/iso-profiles/antergos/live-overlay/usr/lib/calamares/modules/basestrap/main.py b/iso-profiles/antergos/live-overlay/usr/lib/calamares/modules/basestrap/main.py index 40a003f..5fb4849 100644 --- a/iso-profiles/antergos/live-overlay/usr/lib/calamares/modules/basestrap/main.py +++ b/iso-profiles/antergos/live-overlay/usr/lib/calamares/modules/basestrap/main.py @@ -63,24 +63,22 @@ def pretty_status_message(): return custom_status_message if not group_packages: if (total_packages > 0): - # Outside the context of an operation - s = _("Processing packages (%(count)d / %(total)d)") - else: - s = _("Install packages.") - - elif mode_packages is INSTALL: - s = _n("Installing one package.", - "Installing %(num)d packages.", group_packages) - elif mode_packages is REMOVE: - s = _n("Removing one package.", - "Removing %(num)d packages.", group_packages) - else: - # No mode, generic description - s = _("Install packages.") - - return s % {"num": group_packages, + return _("Processing packages (%(count)d / %(total)d)") % { "count": completed_packages, "total": total_packages} + else: + return _("Install packages.") + + elif mode_packages is INSTALL: + return _n("Installing one package.", + "Installing %(num)d packages.", group_packages) % { + "num": group_packages} + elif mode_packages is REMOVE: + return _n("Removing one package.", + "Removing %(num)d packages.", group_packages) % { + "num": group_packages} + else: + return _("Install packages.") @@ -378,20 +376,17 @@ class PMPacman(PackageManager): return args def setup_requirements(self, rootdir): - cal_umask = os.umask(0) - try: - for target in self.pacman_requirements: - dest = rootdir + target["dest"] - if not os.path.exists(dest): - mod = int(target["mode"],8) - os.mkdir(dest, mode=mod) - libcalamares.utils.debug("Mode: {!s}".format(oct(mod))) - libcalamares.utils.debug("Created: {!s}".format(dest)) + for target in self.pacman_requirements: + dest = rootdir + target["dest"] + if not os.path.exists(dest): + mod = int(target["mode"],8) + os.mkdir(dest) + os.chmod(dest, mod) + libcalamares.utils.debug("Mode: {!s}".format(oct(mod))) + libcalamares.utils.debug("Created: {!s}".format(dest)) - path = join(rootdir, "run") - os.chmod(path, 0o755) - finally: - os.umask(cal_umask) + path = join(rootdir, "run") + os.chmod(path, 0o755) def copy_file(self, rootdir, f): if os.path.exists(join("/",f)): @@ -554,7 +549,8 @@ def run(): completed_packages = 0 for op in operations: for packagelist in op.values(): - total_packages += len(subst_locale(packagelist)) + if isinstance(packagelist, list): + total_packages += len(subst_locale(packagelist)) if not total_packages: # Avoids potential divide-by-zero in progress reporting From 7d081c4730a8f62e8e97381ad2ab6527d9bde1f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82?= Date: Tue, 7 Jul 2026 19:31:57 +0200 Subject: [PATCH 07/11] fix: pre-resolve subst_locale to avoid double call / locale drift --- .../usr/lib/calamares/modules/basestrap/main.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/iso-profiles/antergos/live-overlay/usr/lib/calamares/modules/basestrap/main.py b/iso-profiles/antergos/live-overlay/usr/lib/calamares/modules/basestrap/main.py index 5fb4849..eace5df 100644 --- a/iso-profiles/antergos/live-overlay/usr/lib/calamares/modules/basestrap/main.py +++ b/iso-profiles/antergos/live-overlay/usr/lib/calamares/modules/basestrap/main.py @@ -547,16 +547,21 @@ def run(): mode_packages = None total_packages = 0 completed_packages = 0 + resolved_operations = [] for op in operations: - for packagelist in op.values(): - if isinstance(packagelist, list): - total_packages += len(subst_locale(packagelist)) + resolved_op = {} + for operation, packagelist in op.items(): + resolved_list = subst_locale(packagelist) if isinstance(packagelist, list) else packagelist + resolved_op[operation] = resolved_list + if isinstance(resolved_list, list): + total_packages += len(resolved_list) + resolved_operations.append(resolved_op) if not total_packages: # Avoids potential divide-by-zero in progress reporting return None - for entry in operations: + for entry in resolved_operations: group_packages = 0 libcalamares.utils.debug(pretty_name()) try: From 2d4694f3d0ec511efcce0aadca2b50774af0cd69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82?= Date: Tue, 7 Jul 2026 19:37:54 +0200 Subject: [PATCH 08/11] basestrap: fix remaining CodeQL findings - Guard _change_mode progress division against zero total_packages - Document why -Syu is inappropriate in installer context (reproducibility) - Promote known_inits to module-level KNOWN_INIT_PROVIDERS constant --- .../lib/calamares/modules/basestrap/main.py | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/iso-profiles/antergos/live-overlay/usr/lib/calamares/modules/basestrap/main.py b/iso-profiles/antergos/live-overlay/usr/lib/calamares/modules/basestrap/main.py index f90e32d..3b8d93c 100644 --- a/iso-profiles/antergos/live-overlay/usr/lib/calamares/modules/basestrap/main.py +++ b/iso-profiles/antergos/live-overlay/usr/lib/calamares/modules/basestrap/main.py @@ -51,7 +51,10 @@ mode_packages = None # Changes to INSTALL or REMOVE def _change_mode(mode): global mode_packages mode_packages = mode - libcalamares.job.setprogress(completed_packages * 1.0 / total_packages) + if total_packages > 0: + libcalamares.job.setprogress(completed_packages * 1.0 / total_packages) + else: + libcalamares.job.setprogress(0.0) def pretty_name(): @@ -344,7 +347,13 @@ class PMPacman(PackageManager): if from_local: command.append("-U") else: - # -Sy is intentional: fresh chroot has no pacman DB, must sync first + # -Sy is intentional; -Syu is WRONG here. + # -Syu upgrades ALL packages in the chroot from repos at install time, + # pulling untested versions instead of the ISO-snapshot versions we + # explicitly requested via profile packages. This breaks reproducibility, + # wastes bandwidth, and can introduce regressions. The entire target + # system is being built from scratch — there is nothing to "partially + # upgrade." command.append("-Sy") command.append("--overwrite=*") @@ -524,14 +533,18 @@ def run(): operations = libcalamares.job.configuration.get("operations", []) + # Allowed init provider identifiers from netinstallAdd["name"]. + # These are matched case-insensitively to build init provider + # package names as "-". + KNOWN_INIT_PROVIDERS = ["openrc", "dinit", "runit", "s6"] + base_init = libcalamares.job.configuration.get("base_init", None) - known_inits = ["openrc", "dinit", "runit", "s6"] if base_init is not None and libcalamares.globalstorage.contains("netinstallAdd"): data = libcalamares.globalstorage.value("netinstallAdd") for entry in data: provider = entry.get("name", "").lower() - if provider in known_inits: + if provider in KNOWN_INIT_PROVIDERS: init_pkg = "-".join([base_init, provider]) libcalamares.utils.debug("Init provider package added: {!s}".format(init_pkg)) if operations and isinstance(operations[0], dict) and isinstance(operations[0].get("install"), list): From a9a46a519d04aa2d2577fa6939b6ba542bf42cdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82?= Date: Tue, 7 Jul 2026 20:06:50 +0200 Subject: [PATCH 09/11] revert: basestrap/main.py to pre-CodeQL state with critical warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Restores original callback (hardcoded False), pretty_status_message refactor, umask pattern, known_inits name, unguarded operations access, and inline subst_locale — all of which were changed in earlier CodeQL fix commits. Keeps only harmless changes: unused import removal (sys, re), PEP8 comma space, and _change_mode zero-division guard. Adds large ASCII warning header: DO NOT EDIT without full ISO test. --- .../lib/calamares/modules/basestrap/main.py | 89 +++++++++---------- 1 file changed, 42 insertions(+), 47 deletions(-) diff --git a/iso-profiles/antergos/live-overlay/usr/lib/calamares/modules/basestrap/main.py b/iso-profiles/antergos/live-overlay/usr/lib/calamares/modules/basestrap/main.py index 3b8d93c..0ba328a 100644 --- a/iso-profiles/antergos/live-overlay/usr/lib/calamares/modules/basestrap/main.py +++ b/iso-profiles/antergos/live-overlay/usr/lib/calamares/modules/basestrap/main.py @@ -16,6 +16,14 @@ # # Antergos NeXT: Removed hardcoded hasInternet check; added # skip_if_no_internet config option matching the packages module pattern. +# +# ╔══════════════════════════════════════════════════════════════════════════╗ +# ║ WARNING: DO NOT EDIT THIS FILE UNLESS YOU KNOW EXACTLY WHAT YOU'RE ║ +# ║ DOING. Changes to progress reporting, callback handling, or ║ +# ║ subst_locale pre-resolution have caused fatal installation failures ║ +# ║ in the past (conflicting packages, partial upgrades, broken ISOs). ║ +# ║ If you must edit, test with a FULL online+offline install first. ║ +# ╚══════════════════════════════════════════════════════════════════════════╝ import abc from string import Template @@ -66,22 +74,24 @@ def pretty_status_message(): return custom_status_message if not group_packages: if (total_packages > 0): - return _("Processing packages (%(count)d / %(total)d)") % { - "count": completed_packages, - "total": total_packages} + # Outside the context of an operation + s = _("Processing packages (%(count)d / %(total)d)") else: - return _("Install packages.") + s = _("Install packages.") elif mode_packages is INSTALL: - return _n("Installing one package.", - "Installing %(num)d packages.", group_packages) % { - "num": group_packages} + s = _n("Installing one package.", + "Installing %(num)d packages.", group_packages) elif mode_packages is REMOVE: - return _n("Removing one package.", - "Removing %(num)d packages.", group_packages) % { - "num": group_packages} + s = _n("Removing one package.", + "Removing %(num)d packages.", group_packages) else: - return _("Install packages.") + # No mode, generic description + s = _("Install packages.") + + return s % {"num": group_packages, + "count": completed_packages, + "total": total_packages} @@ -263,6 +273,7 @@ class PMPacman(PackageManager): backend = "pacman" def __init__(self): + def line_cb(line): if line.startswith(":: "): self.in_package_changes = "package" in line or "hooks" in line @@ -303,7 +314,7 @@ class PMPacman(PackageManager): """ Call pacman in a loop until it is successful or the number of retries is exceeded :param command: The pacman command to run - :param callback: If True, process output using self.line_cb + :param callback: An optional boolean that indicates if this pacman run should use the callback :return: """ @@ -311,13 +322,16 @@ class PMPacman(PackageManager): while pacman_count <= self.pacman_num_retries: pacman_count += 1 try: - if callback: - host_env_process_output(command, callback=self.line_cb) + if False: # callback: + host_env_process_output(command, self.line_cb) else: host_env_process_output(command) + return except subprocess.CalledProcessError: - if pacman_count > self.pacman_num_retries: + if pacman_count <= self.pacman_num_retries: + pass + else: raise def install(self, pkgs, from_local=False): @@ -347,13 +361,7 @@ class PMPacman(PackageManager): if from_local: command.append("-U") else: - # -Sy is intentional; -Syu is WRONG here. - # -Syu upgrades ALL packages in the chroot from repos at install time, - # pulling untested versions instead of the ISO-snapshot versions we - # explicitly requested via profile packages. This breaks reproducibility, - # wastes bandwidth, and can introduce regressions. The entire target - # system is being built from scratch — there is nothing to "partially - # upgrade." + # -Sy syncs DB and installs requested packages in one transaction command.append("-Sy") command.append("--overwrite=*") @@ -386,21 +394,22 @@ class PMPacman(PackageManager): return args def setup_requirements(self, rootdir): + cal_umask = os.umask(0) for target in self.pacman_requirements: dest = rootdir + target["dest"] if not os.path.exists(dest): mod = int(target["mode"], 8) - os.mkdir(dest) - os.chmod(dest, mod) + os.mkdir(dest, mode=mod) libcalamares.utils.debug("Mode: {!s}".format(oct(mod))) libcalamares.utils.debug("Created: {!s}".format(dest)) path = join(rootdir, "run") os.chmod(path, 0o755) + os.umask(cal_umask) - def copy_file(self, rootdir, relative_path): - if os.path.exists(join("/", relative_path)): - shutil.copy2(join("/", relative_path), join(rootdir, relative_path)) + def copy_file(self, rootdir, f): + if os.path.exists(join("/",f)): + shutil.copy2(join("/",f), join(rootdir, f)) def init_keyring(self): target_env_process_output(["pacman-key", "--init"]) @@ -533,25 +542,17 @@ def run(): operations = libcalamares.job.configuration.get("operations", []) - # Allowed init provider identifiers from netinstallAdd["name"]. - # These are matched case-insensitively to build init provider - # package names as "-". - KNOWN_INIT_PROVIDERS = ["openrc", "dinit", "runit", "s6"] - base_init = libcalamares.job.configuration.get("base_init", None) + known_inits = ["openrc", "dinit", "runit", "s6"] if base_init is not None and libcalamares.globalstorage.contains("netinstallAdd"): data = libcalamares.globalstorage.value("netinstallAdd") for entry in data: provider = entry.get("name", "").lower() - if provider in KNOWN_INIT_PROVIDERS: + if provider in known_inits: init_pkg = "-".join([base_init, provider]) libcalamares.utils.debug("Init provider package added: {!s}".format(init_pkg)) - if operations and isinstance(operations[0], dict) and isinstance(operations[0].get("install"), list): - operations[0]["install"].append(init_pkg) - else: - libcalamares.utils.warning( - "Cannot add init provider package: missing operations[0]['install'] list") + operations[0]["install"].append(init_pkg) libcalamares.globalstorage.insert("initProvider", provider) libcalamares.globalstorage.insert("baseInit", base_init) break @@ -561,21 +562,15 @@ def run(): mode_packages = None total_packages = 0 completed_packages = 0 - resolved_operations = [] for op in operations: - resolved_op = {} - for operation, packagelist in op.items(): - resolved_list = subst_locale(packagelist) if isinstance(packagelist, list) else packagelist - resolved_op[operation] = resolved_list - if isinstance(resolved_list, list): - total_packages += len(resolved_list) - resolved_operations.append(resolved_op) + for packagelist in op.values(): + total_packages += len(subst_locale(packagelist)) if not total_packages: # Avoids potential divide-by-zero in progress reporting return None - for entry in resolved_operations: + for entry in operations: group_packages = 0 libcalamares.utils.debug(pretty_name()) try: From da3dc223799b2ea629654b738b8099a3a5f70849 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82?= Date: Tue, 7 Jul 2026 20:12:05 +0200 Subject: [PATCH 10/11] docs: call out CodeQL/Copilot AI in warning header --- .../usr/lib/calamares/modules/basestrap/main.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/iso-profiles/antergos/live-overlay/usr/lib/calamares/modules/basestrap/main.py b/iso-profiles/antergos/live-overlay/usr/lib/calamares/modules/basestrap/main.py index 0ba328a..cf22f40 100644 --- a/iso-profiles/antergos/live-overlay/usr/lib/calamares/modules/basestrap/main.py +++ b/iso-profiles/antergos/live-overlay/usr/lib/calamares/modules/basestrap/main.py @@ -18,11 +18,13 @@ # skip_if_no_internet config option matching the packages module pattern. # # ╔══════════════════════════════════════════════════════════════════════════╗ -# ║ WARNING: DO NOT EDIT THIS FILE UNLESS YOU KNOW EXACTLY WHAT YOU'RE ║ -# ║ DOING. Changes to progress reporting, callback handling, or ║ -# ║ subst_locale pre-resolution have caused fatal installation failures ║ -# ║ in the past (conflicting packages, partial upgrades, broken ISOs). ║ -# ║ If you must edit, test with a FULL online+offline install first. ║ +# ║ ⚠ CODEQL WARNING ⚠ ║ +# ║ GitHub's CodeQL (powered by Copilot AI) will flag several lines in ║ +# ║ this file as "findings". THEY ARE INTENTIONAL. "Fixing" them ║ +# ║ WILL break the ISO — previous attempts caused partial upgrades, ║ +# ║ package conflicts (audit-dinit vs audit-openrc, sddm vs x11win), ║ +# ║ and fatal installer crashes. Do not let an AI rewrite this file. ║ +# ║ If you must edit, test with a FULL online + offline install first. ║ # ╚══════════════════════════════════════════════════════════════════════════╝ import abc From 5c7724bf18f98eaa035bde717249af5ca5342ef0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82?= Date: Wed, 8 Jul 2026 18:21:41 +0200 Subject: [PATCH 11/11] Profile trim: swap firefox->falkon, plasma->plasma-meta, drop mpv - firefox (286 MiB) -> falkon (16 MiB): -270 MiB, KDE-native browser - plasma group (665 MiB) -> plasma-meta (328 MiB): -337 MiB, drops unneeded wallpapers, X11-only packages, and dev tools - mpv removed: -30 MiB, music preview feature long gone ISO estimated ~2.8 GB -> ~2.15 GB, matching Artix Plasma size. --- .../live-overlay/etc/calamares/modules/netinstall.yaml | 2 +- iso-profiles/antergos/profile.yaml | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/iso-profiles/antergos/live-overlay/etc/calamares/modules/netinstall.yaml b/iso-profiles/antergos/live-overlay/etc/calamares/modules/netinstall.yaml index 91ef00f..d107bf6 100644 --- a/iso-profiles/antergos/live-overlay/etc/calamares/modules/netinstall.yaml +++ b/iso-profiles/antergos/live-overlay/etc/calamares/modules/netinstall.yaml @@ -14,7 +14,7 @@ - antergos-next-keyring - antergos-wallpapers - antergos-grub-theme - - firefox + - falkon - mesa - mesa-utils - networkmanager diff --git a/iso-profiles/antergos/profile.yaml b/iso-profiles/antergos/profile.yaml index 2257511..08d8b65 100644 --- a/iso-profiles/antergos/profile.yaml +++ b/iso-profiles/antergos/profile.yaml @@ -22,9 +22,8 @@ rootfs: packages: - antergos-release - qt6-multimedia-ffmpeg - - firefox + - falkon - vlc - - mpv - calamares - calamares-branding-antergos-next - antergos-welcome @@ -85,7 +84,7 @@ livefs: - virtualbox-guest-utils - broadcom-wl - antergos-grub-theme - - plasma + - plasma-meta - ark - dolphin - ffmpegthumbs