Compare commits

...

4 Commits

Author SHA1 Message Date
Claudia Pellegrino
b9db3d3132 Merge branch 'machine-name' into 'master'
feat(makechrootpkg): use meaningful machine name

See merge request archlinux/devtools!269
2025-08-04 03:59:41 +02:00
Christian Heusel
01757e6904 fix(commitpkg): Quiet git ls-files output
So far all files in `needsversioning=(...)` have been printed to the
command line if they were found, which is not useful, especially now
that we have more files present there.

It makes sense however to keep the standard error output, as this gives
a actionable suggestion what one should to to fix the issue:

    > error: pathspec 'PKGBUILD' did not match any file(s) known to git
    > Did you forget to 'git add'?

Fixes #281

Signed-off-by: Christian Heusel <christian@heusel.eu>
2025-08-01 11:26:57 +02:00
Daniel M. Capella
c5fe8ff3e6 feat(license): Extend matches for sysusers/tmpfiles configs
Eg. to match:
- sysusers.conf
- $pkgname.sysusers
- $pkgname.sysusers.conf
2025-07-28 23:38:32 -04:00
Claudia Pellegrino
a2945b09a8 feat(makechrootpkg): use meaningful machine name
While running a longer makechrootpkg session that involves many
packages, looking at the terminal output is not always sufficient to
tell which package makechrootpkg is currently processing.

In systemd version 256, a feature was introduced in `systemd-nspawn`,
which sets the window title from the container name. [1]

To improve makechrootpkg’s UX, take advantage of systemd-nspawn’s new
feature by setting the machine name (and thus, the terminal title) to
one of the following values, depending on the step makechrootpkg is at:

1. `makechrootpkg.building.mypkg`

2. `makechrootpkg.downloading.pkg1.pkg2.pkg3-git`

3. `makechrootpkg.installing.pkg1.pkg2.pkg3-git`

4. `makechrootpkg.updating`,

followed by a dot and the shell process id, instead of the generic
`arch-nspawn` title that arch-nspawn uses by default.

5. Special case for the inspection step:

As a special case, use a shorter title for the inspection step, because
it spawns a shell, which in turn usually sets the terminal title itself,
so its title would override the one set by systemd-nspawn.

Fortunately, the shell happens to use the first subdomain of the machine
name for its window title, so use a machine name of `inspecting` here,
followed by a hyphen and the shell PID.

[1]: ab03434aa7
2025-07-25 13:39:57 +02:00
3 changed files with 49 additions and 4 deletions

View File

@@ -155,7 +155,7 @@ if (( ${#needsversioning[*]} )); then
if [[ ! -f "${file}" ]]; then
continue
fi
if ! git ls-files --error-unmatch "$file"; then
if ! git ls-files --error-unmatch "$file" >/dev/null; then
die "%s is not under version control" "$file"
fi
done

View File

@@ -191,7 +191,9 @@ path = [
".nvchecker.toml",
"*.install",
"*.sysusers",
"*sysusers.conf",
"*.tmpfiles",
"*tmpfiles.conf",
"*.logrotate",
"*.pam",
"*.service",

View File

@@ -150,7 +150,9 @@ install_packages() {
pkgnames=("${install_pkgs[@]##*/}")
cp -- "${install_pkgs[@]}" "$copydir/root/"
arch-nspawn "$copydir" "${bindmounts_ro[@]}" "${bindmounts_rw[@]}" "${bindmounts_tmpfs[@]}" \
arch-nspawn "$copydir" \
--machine="$(display_name installing "${pkgnames[@]}")" \
"${bindmounts_ro[@]}" "${bindmounts_rw[@]}" "${bindmounts_tmpfs[@]}" \
pacman -U --noconfirm --ask=4 -- "${pkgnames[@]/#//root/}"
ret=$?
rm -- "${pkgnames[@]/#/$copydir/root/}"
@@ -291,6 +293,33 @@ move_products() {
fi
done
}
# Usage: display_name verb pkgname [pkgname...]
display_name() {
local max_hostname max_pkgnames_length max_pid_digits pkgnames tool verb
max_hostname=64 # see gethostname(2)
num_joiner_chars=3 # see template string below
max_pid_digits=7 # ceil(log(2^22, 10))
tool="${0##*/}"
verb="${1?}"
shift
max_pkgnames_length=$((
max_hostname - num_joiner_chars - max_pid_digits - "${#tool}" - "${#verb}"
))
# Normalize the package name so it doubles as a valid hostname
# https://github.com/systemd/systemd/blob/v256/src/basic/hostname-util.c#L83-L136
pkgnames="$(
tr -s -c 'a-z0-9 ' - <<< "$*" | tr ' ' . | head -c ${max_pkgnames_length}
)"
if [[ $# -eq 0 ]]; then
printf '%s.%s.%s' "${tool}" "${verb}" $$
else
printf '%s.%s.%s.%s' "${tool}" "${verb}" "${pkgnames%%-}" $$
fi
}
# }}}
while getopts 'hcur:I:l:nCTD:d:U:x:t:' arg; do
@@ -368,6 +397,7 @@ if [[ ! -d $copydir ]] || (( clean_first )); then
fi
(( update_first )) && arch-nspawn "$copydir" \
--machine="$(display_name updating)" \
"${bindmounts_ro[@]}" "${bindmounts_rw[@]}" "${bindmounts_tmpfs[@]}" \
pacman -Syuu --noconfirm
@@ -396,11 +426,19 @@ nspawn_build_args=(
"${bindmounts_tmpfs[@]}"
)
{
read -r -d $'\n' pkgbase
mapfile -t pkgnames
} < <(sudo -u "$makepkg_user" bash -c '
source PKGBUILD
printf "%s\n" "${pkgbase:-${pkgname}}" "${pkgname[@]}"
')
if arch-nspawn "$copydir" \
"${nspawn_build_args[@]}" \
--machine="$(display_name building "${pkgbase}")" \
/chrootbuild "${makepkg_args[@]}"
then
mapfile -t pkgnames < <(sudo -u "$makepkg_user" bash -c 'source PKGBUILD; printf "%s\n" "${pkgname[@]}"')
move_products
else
(( ret += 1 ))
@@ -413,8 +451,11 @@ if [[ $inspect == always ]] || ( [[ $inspect == failure ]] && (( ret != 0 )) );
else
error "Build failed, inspecting %s" "$copydir"
fi
# Use a short machine name without dots so the shell picks it up
# as part of the window title
arch-nspawn "$copydir" \
"${nspawn_build_args[@]}" \
--machine="inspecting-$$" \
--user=builduser \
--chdir=/build
fi
@@ -444,7 +485,9 @@ else
for remotepkg in "${remotepkgs[@]}"; do
if [[ $remotepkg != file://* ]]; then
msg2 "Downloading current versions"
arch-nspawn "$copydir" pacman --noconfirm -Swdd "${pkgnames[@]}"
arch-nspawn "$copydir" \
--machine="$(display_name downloading "${pkgnames[@]}")" \
pacman --noconfirm -Swdd "${pkgnames[@]}"
mapfile -t remotepkgs < <(pacman --config "$copydir"/etc/pacman.conf \
--dbpath "$copydir"/var/lib/pacman \
-Sddp "${pkgnames[@]}")