Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package arch-install-scripts for
openSUSE:Factory checked in at 2026-01-28 15:08:24
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/arch-install-scripts (Old)
and /work/SRC/openSUSE:Factory/.arch-install-scripts.new.1928 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "arch-install-scripts"
Wed Jan 28 15:08:24 2026 rev:7 rq:1329450 version:30
Changes:
--------
---
/work/SRC/openSUSE:Factory/arch-install-scripts/arch-install-scripts.changes
2024-12-04 15:27:01.660984872 +0100
+++
/work/SRC/openSUSE:Factory/.arch-install-scripts.new.1928/arch-install-scripts.changes
2026-01-28 15:09:32.083953807 +0100
@@ -1,0 +2,11 @@
+Tue Jan 27 09:30:58 UTC 2026 - Bruno Pitrus <[email protected]>
+
+- New upstream release 30
+ * arch-chroot: introduce a systemd-run mode
+ * arch-chroot: switch to X-mount.nocanonicalize= for mounting over symlink
+ * arch-chroot: use -L rather than -h
+ * genfstab: Add fuse.portal to pseudofs list
+ * genfstab: Fix zram skipping during fstab generation
+ * Require util-linux 2.41
+
+-------------------------------------------------------------------
Old:
----
arch-install-scripts-v29.tar.bz2
New:
----
arch-install-scripts-v30.tar.bz2
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ arch-install-scripts.spec ++++++
--- /var/tmp/diff_new_pack.ibhd4X/_old 2026-01-28 15:09:32.979991027 +0100
+++ /var/tmp/diff_new_pack.ibhd4X/_new 2026-01-28 15:09:32.983991193 +0100
@@ -17,7 +17,7 @@
Name: arch-install-scripts
-Version: 29
+Version: 30
Release: 0
Summary: Scripts aimed at automating some menial installation/recovery
tasks
License: GPL-2.0-only
@@ -30,7 +30,7 @@
Requires: awk
Requires: bash >= 4.1
Requires: coreutils >= 8.15
-Requires: util-linux >= 2.39
+Requires: util-linux >= 2.41
Requires: util-linux-systemd >= 2.23
BuildArch: noarch
++++++ arch-install-scripts-v29.tar.bz2 -> arch-install-scripts-v30.tar.bz2
++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/arch-install-scripts-v29/README.md
new/arch-install-scripts-v30/README.md
--- old/arch-install-scripts-v29/README.md 2024-10-20 20:40:09.000000000
+0200
+++ new/arch-install-scripts-v30/README.md 2025-09-23 00:23:53.000000000
+0200
@@ -6,9 +6,10 @@
## Requirements
* GNU coreutils (>= v8.15)
-* util-linux (>= 2.39)
+* util-linux (>= 2.41)
* POSIX awk
* bash (>= 4.1)
+* systemd (>= 257, for arch-chroot -S)
* asciidoc (for generating man pages)
## License
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/arch-install-scripts-v29/arch-chroot.in
new/arch-install-scripts-v30/arch-chroot.in
--- old/arch-install-scripts-v29/arch-chroot.in 2024-10-20 20:40:09.000000000
+0200
+++ new/arch-install-scripts-v30/arch-chroot.in 2025-09-23 00:23:53.000000000
+0200
@@ -3,6 +3,7 @@
shopt -s extglob
+use_systemd=0
unshare=0
keepresolvconf=0
@@ -13,6 +14,7 @@
usage: ${0##*/} chroot-dir [command] [arguments...]
-h Print this help message
+ -S Perform chroot using systemd-run
-N Run in unshare mode as a regular user
-u <user>[:group] Specify non-root user and optional group to use
-r Do not change the resolv.conf within the chroot
@@ -29,40 +31,83 @@
EOF
}
-resolve_link() {
- local target=$1
- local root=$2
-
- # If a root was given, make sure it ends in a slash.
- [[ -n $root && $root != */ ]] && root=$root/
-
- while [[ -L $target ]]; do
- target=$(readlink -m "$target")
- # If a root was given, make sure the target is under it.
- # Make sure to strip any leading slash from target first.
- [[ -n $root && $target != $root* ]] && target=$root${target#/}
- done
-
- printf %s "$target"
-}
-
chroot_add_resolv_conf() {
- local chrootdir=$1
- local src
local dest="$chrootdir/etc/resolv.conf"
- src=$(resolve_link /etc/resolv.conf)
-
# If we don't have a source resolv.conf file, there's nothing useful we can
do.
- [[ -e $src ]] || return 0
+ [[ -e /etc/resolv.conf ]] || return 0
- if [[ ! -e "$dest" && ! -h "$dest" ]]; then
+ if [[ ! -e "$dest" && ! -L "$dest" ]]; then
# There may be no resolv.conf in the chroot. In this case, we'll just exit.
# The chroot environment must not be concerned with DNS resolution.
return 0
fi
- chroot_add_mount "$src" "$dest" -c --bind
+ chroot_add_mount /etc/resolv.conf "$dest" --bind -o
X-mount.nocanonicalize=target
+}
+
+systemd_sanity_check() {
+ local systemd_ver
+
+ command -v systemd-run &>/dev/null || die 'systemd-run is not available'
+
+ IFS=' .-~^' read -r _ systemd_ver _ < <(SYSTEMD_COLORS=0 systemd-run
--version)
+ (( systemd_ver >= 257 )) || die 'Unsupported systemd version: %s (requires
>= 257)' "$systemd_ver"
+
+ [[ -d /run/systemd/system ]] || die 'System is not booted with systemd'
+}
+
+systemd_mode() {
+ local user=root group="" sd_args
+
+ systemd_sanity_check
+
+ # NB: we always have systemd spawn the service main process as root
+ # and call into setpriv later. The reason is two-fold:
+ # systemd resolves users using the host's passwd/groups database,
+ # while we want to resolve inside the chroot. Plus, setpriv
+ # does us a favor of clearing extraneous envvars from systemd,
+ # notably SYSTEMD_EXEC_PID which might confuse some programs.
+
+ if [[ $userspec ]]; then
+ IFS=':' read -r user group <<< "$userspec"
+ [[ $user ]] || die 'Invalid -u argument: %s' "$userspec"
+ fi
+
+ sd_args=(systemd-run --unit="arch-chroot-$$_$(systemd-escape --path
"$chrootdir")"
+ --description="[arch-chroot] $chrootdir (as $user)"
+ --service-type=exec --collect
+ --pty --pipe --send-sighup
+ --expand-environment=no
+ -p RootDirectory="$chrootdir"
+ -p MountAPIVFS=yes
+ -p ProtectControlGroupsEx=private
+ -p BindLogSockets=no
+ -p BindReadOnlyPaths=/run/udev #
https://github.com/archlinux/arch-install-scripts/pull/52
+ -p TemporaryFileSystem=/tmp
+ -p IgnoreSIGPIPE=no)
+
+ if ! [[ -t 0 && -t 1 ]]; then
+ sd_args+=(--quiet)
+ fi
+
+ sd_args+=(setpriv --reset-env --reuid="$user" --regid="${group:-"$user"}"
--init-groups)
+
+ if [[ ! -v args ]]; then
+ args=(/bin/bash -i)
+ fi
+
+ "${sd_args[@]}" -- "${args[@]}"
+}
+
+offline_mode() {
+ local chroot_args=()
+
+ $setup "$chrootdir" || die "failed to setup chroot %s" "$chrootdir"
+
+ [[ $userspec ]] && chroot_args+=(--userspec "$userspec")
+
+ SHELL=/bin/bash SYSTEMD_IN_CHROOT=1 $pid_unshare chroot "${chroot_args[@]}"
-- "$chrootdir" "${args[@]}"
}
arch-chroot() {
@@ -70,27 +115,31 @@
[[ -d $chrootdir ]] || die "Can't create chroot on non-directory %s"
"$chrootdir"
- $setup "$chrootdir" || die "failed to setup chroot %s" "$chrootdir"
- if (( ! keepresolvconf )); then
- chroot_add_resolv_conf "$chrootdir" || die "failed to setup resolv.conf"
- fi
-
if ! mountpoint -q "$chrootdir"; then
warning "$chrootdir is not a mountpoint. This may have undesirable side
effects."
fi
- chroot_args=()
- [[ $userspec ]] && chroot_args+=(--userspec "$userspec")
+ chroot_init
+ if (( ! keepresolvconf )); then
+ chroot_add_resolv_conf || die "failed to setup resolv.conf"
+ fi
- SHELL=/bin/bash $pid_unshare chroot "${chroot_args[@]}" -- "$chrootdir"
"${args[@]}"
+ if (( use_systemd )); then
+ systemd_mode
+ else
+ offline_mode
+ fi
}
-while getopts ':hNu:r' flag; do
+while getopts ':hSNu:r' flag; do
case $flag in
h)
usage
exit 0
;;
+ S)
+ use_systemd=1
+ ;;
N)
unshare=1
;;
@@ -116,6 +165,10 @@
args=("$@")
if (( unshare )); then
+ if (( use_systemd )); then
+ die 'systemd mode (-S) cannot be used in conjunction with unshare (-N)'
+ fi
+
setup=unshare_setup
$mount_unshare bash -c "$(declare_all); arch-chroot"
else
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/arch-install-scripts-v29/common
new/arch-install-scripts-v30/common
--- old/arch-install-scripts-v29/common 2024-10-20 20:40:09.000000000 +0200
+++ new/arch-install-scripts-v30/common 2025-09-23 00:23:53.000000000 +0200
@@ -24,11 +24,32 @@
fi
}
-chroot_setup() {
+chroot_init() {
CHROOT_ACTIVE_MOUNTS=()
+ CHROOT_ACTIVE_LAZY=()
+ CHROOT_ACTIVE_FILES=()
[[ $(trap -p EXIT) ]] && die '(BUG): attempting to overwrite existing EXIT
trap'
trap 'chroot_teardown' EXIT
+}
+
+chroot_teardown() {
+ if (( ${#CHROOT_ACTIVE_MOUNTS[@]} )); then
+ umount "${CHROOT_ACTIVE_MOUNTS[@]}"
+ fi
+ unset CHROOT_ACTIVE_MOUNTS
+ if (( ${#CHROOT_ACTIVE_LAZY[@]} )); then
+ umount --lazy "${CHROOT_ACTIVE_LAZY[@]}"
+ fi
+ unset CHROOT_ACTIVE_LAZY
+
+ if (( ${#CHROOT_ACTIVE_FILES[@]} )); then
+ rm "${CHROOT_ACTIVE_FILES[@]}"
+ fi
+ unset CHROOT_ACTIVE_FILES
+}
+
+chroot_setup() {
chroot_add_mount proc "$1/proc" -t proc -o nosuid,noexec,nodev &&
chroot_add_mount sys "$1/sys" -t sysfs -o nosuid,noexec,nodev,ro &&
ignore_error chroot_maybe_add_mount "[[ -d '$1/sys/firmware/efi/efivars' ]]"
\
@@ -40,13 +61,6 @@
chroot_add_mount tmp "$1/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid
}
-chroot_teardown() {
- if (( ${#CHROOT_ACTIVE_MOUNTS[@]} )); then
- umount "${CHROOT_ACTIVE_MOUNTS[@]}"
- fi
- unset CHROOT_ACTIVE_MOUNTS
-}
-
chroot_add_mount_lazy() {
mount "$@" && CHROOT_ACTIVE_LAZY=("$2" "${CHROOT_ACTIVE_LAZY[@]}")
}
@@ -61,12 +75,6 @@
}
unshare_setup() {
- CHROOT_ACTIVE_MOUNTS=()
- CHROOT_ACTIVE_LAZY=()
- CHROOT_ACTIVE_FILES=()
- [[ $(trap -p EXIT) ]] && die '(BUG): attempting to overwrite existing EXIT
trap'
- trap 'unshare_teardown' EXIT
-
chroot_add_mount_lazy "$1" "$1" --bind &&
chroot_add_mount proc "$1/proc" -t proc -o nosuid,noexec,nodev &&
chroot_add_mount_lazy /sys "$1/sys" --rbind &&
@@ -84,20 +92,6 @@
chroot_add_mount tmp "$1/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid
}
-unshare_teardown() {
- chroot_teardown
-
- if (( ${#CHROOT_ACTIVE_LAZY[@]} )); then
- umount --lazy "${CHROOT_ACTIVE_LAZY[@]}"
- fi
- unset CHROOT_ACTIVE_LAZY
-
- if (( ${#CHROOT_ACTIVE_FILES[@]} )); then
- rm "${CHROOT_ACTIVE_FILES[@]}"
- fi
- unset CHROOT_ACTIVE_FILES
-}
-
pid_unshare="unshare --fork --pid"
mount_unshare="$pid_unshare --mount --map-auto --map-root-user --setuid 0
--setgid 0"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/arch-install-scripts-v29/doc/arch-chroot.8.asciidoc
new/arch-install-scripts-v30/doc/arch-chroot.8.asciidoc
--- old/arch-install-scripts-v29/doc/arch-chroot.8.asciidoc 2024-10-20
20:40:09.000000000 +0200
+++ new/arch-install-scripts-v30/doc/arch-chroot.8.asciidoc 2025-09-23
00:23:53.000000000 +0200
@@ -32,6 +32,11 @@
Options
-------
+*-S*::
+ Run in systemd mode. This will spawn a transient systemd service via
+ linkman:systemd-run[1] and delegates namespace/chroot management to
+ the service manager.
+
*-N*::
Run in unshare mode. This will use linkman:unshare[1] to create a new
mount and user namespace, allowing regular users to create new system
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/arch-install-scripts-v29/fstab-helpers
new/arch-install-scripts-v30/fstab-helpers
--- old/arch-install-scripts-v29/fstab-helpers 2024-10-20 20:40:09.000000000
+0200
+++ new/arch-install-scripts-v30/fstab-helpers 2025-09-23 00:23:53.000000000
+0200
@@ -29,6 +29,7 @@
[fuse.gvfs-fuse-daemon]=1
[fuse.gvfsd-fuse]=1
[fuse.lxcfs]=1
+ [fuse.portal]=1
[fuse.rofiles-fuse]=1
[fuse.vmware-vmblock]=1
[fuse.xwmfs]=1
@@ -95,7 +96,7 @@
}
mangle() {
- local i= chr= out=
+ local i=0 chr="" out=""
local {a..f}= {A..F}=
for (( i = 0; i < ${#1}; i++ )); do
@@ -113,7 +114,7 @@
}
unmangle() {
- local i= chr= out= len=$(( ${#1} - 4 ))
+ local i=0 chr="" out="" len=$(( ${#1} - 4 ))
local {a..f}= {A..F}=
for (( i = 0; i < len; i++ )); do
@@ -187,8 +188,6 @@
}
optstring_prepend_option() {
- local options_=$1
-
if ! optstring_has_option "$1" "$2"; then
declare -g "$1=$2,${!1}"
fi
@@ -217,7 +216,7 @@
}
dm_name_for_devnode() {
- read dm_name <"/sys/class/block/${1#/dev/}/dm/name"
+ read -r dm_name <"/sys/class/block/${1#/dev/}/dm/name"
if [[ $dm_name ]]; then
printf '/dev/mapper/%s' "$dm_name"
else
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/arch-install-scripts-v29/genfstab.in
new/arch-install-scripts-v30/genfstab.in
--- old/arch-install-scripts-v29/genfstab.in 2024-10-20 20:40:09.000000000
+0200
+++ new/arch-install-scripts-v30/genfstab.in 2025-09-23 00:23:53.000000000
+0200
@@ -6,7 +6,7 @@
m4_include(fstab-helpers)
write_source() {
- local src=$1 spec= label= uuid= comment=()
+ local src=$1 spec="" label="" uuid="" comment=()
label=$(lsblk -rno LABEL "$1" 2>/dev/null)
uuid=$(lsblk -rno UUID "$1" 2>/dev/null)
@@ -34,7 +34,7 @@
;;
esac
- [[ $comment ]] && printf '# %s\n' "${comment[*]}"
+ [[ -v comment ]] && printf '# %s\n' "${comment[*]}"
if [[ $spec ]]; then
printf '%-20s' "$bytag=$(mangle "$spec")"
@@ -78,8 +78,9 @@
;;
vfat)
# Before Linux v3.8, "cp" is prepended to the value of the codepage.
- if optstring_get_option "$varname" codepage && [[ $codepage = cp* ]];
then
- optstring_remove_option "$varname" codepage
+ # shellcheck disable=SC2154 # codepage is implicitly declared through
optstring_get_option
+ if optstring_get_option "$varname" "codepage" && [[ "$codepage" = cp*
]]; then
+ optstring_remove_option "$varname" "codepage"
optstring_append_option "$varname" "codepage=${codepage#cp}"
fi
;;
@@ -162,7 +163,7 @@
src=$(unmangle "$src")
target=$(unmangle "$target")
- target=${target#$root}
+ target=${target#"$root"}
if (( !foundroot )) && findmnt "$src" "$root" >/dev/null; then
# this is root. we can't possibly have more than one...
@@ -177,7 +178,7 @@
if [[ $fsroot != / && $fstype != btrfs ]]; then
# it's a bind mount
src=$(findmnt -funcevo TARGET "$src")$fsroot
- src="/${src#$root/}"
+ src="/${src#"${root}/"}"
if [[ $src -ef $target ]]; then
# hrmm, this is weird. we're probably looking at a file or directory
# that was bound into a chroot from the host machine. Ignore it,
@@ -216,7 +217,7 @@
# handle swaps devices
{
# ignore header
- read
+ read -r
while read -r device type _ _ prio; do
options=defaults
@@ -230,8 +231,11 @@
# skip devices not part of the prefix
[[ $device = "$prefixfilter"* ]] || continue
+ # skip zram devices
+ [[ $device == *'zram'* ]] && continue
+
if [[ $type = file ]]; then
- printf '%-20s' "${device#${root%/}}"
+ printf '%-20s' "${device#"${root%/}"}"
elif [[ $device = /dev/dm-+([0-9]) ]]; then
# device mapper doesn't allow characters we need to worry
# about being mangled, and it does the escaping of dashes
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/arch-install-scripts-v29/pacstrap.in
new/arch-install-scripts-v30/pacstrap.in
--- old/arch-install-scripts-v29/pacstrap.in 2024-10-20 20:40:09.000000000
+0200
+++ new/arch-install-scripts-v30/pacstrap.in 2025-09-23 00:23:53.000000000
+0200
@@ -50,29 +50,43 @@
pacstrap() {
(( EUID == 0 )) || die 'This script must be run with root privileges'
+ db_dir="$(pacman-conf -c "$pacman_config" DBPath)"
+ cache_dir="$(pacman-conf -c "$pacman_config" CacheDir)"
+ hook_dir="$(pacman-conf -c "$pacman_config" HookDir)"
+ gpg_dir="$(pacman-conf -c "$pacman_config" GPGDir)"
+ log_dir="$(dirname "$(pacman-conf -c "$pacman_config" LogFile)")"
+
+ host_gpg_dir="$(pacman-conf GPGDir)"
+
# create obligatory directories
msg 'Creating install root at %s' "$newroot"
# shellcheck disable=SC2174 # permissions are perfectly fine here
- mkdir -m 0755 -p "$newroot"/var/{cache/pacman/pkg,lib/pacman,log}
"$newroot"/{dev,run,etc/pacman.d}
+ mkdir -m 0755 -p "$newroot/$db_dir" \
+ "$newroot/$cache_dir" \
+ "$newroot/$hook_dir" \
+ "$newroot/$gpg_dir" \
+ "$newroot/$log_dir" \
+ "$newroot"/etc/pacman.d
# shellcheck disable=SC2174 # permissions are perfectly fine here
- mkdir -m 1777 -p "$newroot"/tmp
+ mkdir -m 0555 -p "$newroot"/{run,dev,sys,proc}
# shellcheck disable=SC2174 # permissions are perfectly fine here
- mkdir -m 0555 -p "$newroot"/{sys,proc}
+ mkdir -m 1777 -p "$newroot"/tmp
# mount API filesystems
+ chroot_init
$setup "$newroot" || die "failed to setup chroot %s" "$newroot"
- if [[ ! -d $newroot/etc/pacman.d/gnupg ]]; then
+ if [[ ! -d $newroot/$gpg_dir ]]; then
if (( initkeyring )); then
- pacman-key --gpgdir "$newroot"/etc/pacman.d/gnupg --init
- elif (( copykeyring )) && [[ -d /etc/pacman.d/gnupg ]]; then
+ pacman-key --gpgdir "$newroot/$gpg_dir" --init
+ elif (( copykeyring )) && [[ -d $host_gpg_dir ]]; then
# if there's a keyring on the host, copy it into the new root
- cp -a --no-preserve=ownership /etc/pacman.d/gnupg
"$newroot/etc/pacman.d/"
+ cp -a --no-preserve=ownership "$host_gpg_dir" "$newroot/$gpg_dir"
fi
fi
msg 'Installing packages to %s' "$newroot"
- if ! $pid_unshare pacman -r "$newroot" "${pacman_args[@]}"; then
+ if ! $pid_unshare pacman -b "$newroot/$db_dir" -r "$newroot"
"${pacman_args[@]}"; then
die 'Failed to install packages to new root'
fi
@@ -144,10 +158,11 @@
sed -i 's/^DownloadUser/#&/' "$tmpfile"
pacman_config="$tmpfile"
+pacman_cache_dir="$(pacman-conf -c "$pacman_config" CacheDir)"
pacman_args+=("$pacmode" "${@:-base}" --config="$pacman_config"
--disable-sandbox)
if (( ! hostcache )); then
- pacman_args+=(--cachedir="$newroot/var/cache/pacman/pkg")
+ pacman_args+=(--cachedir="$newroot/$pacman_cache_dir")
fi
if (( ! interactive )); then