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

Reply via email to