Compare commits

..

6 Commits

Author SHA1 Message Date
Christian Heusel
2609e386d4 WIP: run0 support
Signed-off-by: Christian Heusel <christian@heusel.eu>
2025-10-04 20:58:39 +02:00
Rafael Fontenelle
447f7b4117 Fix typo 2025-09-29 20:00:02 -03:00
Aaron Liu
3f0ebbc6d2 fix(license): add .gitignore to REUSE defaults
36 packages use this while 26 use *.pam and 21 use *.logrotate. Seems
anecdotally common enough to add this here.
2025-08-08 14:13:32 +02:00
Jakub Klinkovský
fc56ebedf3 fix(completion): fix bash completion for the license subcommand
Signed-off-by: Jakub Klinkovský <lahwaacz@archlinux.org>
2025-08-05 17:48:12 +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
8 changed files with 44 additions and 30 deletions

View File

@@ -150,6 +150,7 @@ _pkgctl_cmds=(
db db
diff diff
issue issue
license
release release
repo repo
search search

View File

@@ -14,7 +14,7 @@ Description
Build a PKGBUILD on a remote server using makechrootpkg. Requires a remote user Build a PKGBUILD on a remote server using makechrootpkg. Requires a remote user
that can run archbuild in a non-interactive manner, e.g. must be able to that can run archbuild in a non-interactive manner, e.g. must be able to
elevate permissions using passwordless sudo. elevate permissions using passwordless run0.
Options Options
------- -------

View File

@@ -3,7 +3,7 @@ pkgctl-auth(1)
Name Name
---- ----
pkgctl-auth - Authenticate with serivces like GitLab. pkgctl-auth - Authenticate with services like GitLab.
Synopsis Synopsis
-------- --------

View File

@@ -155,7 +155,7 @@ if (( ${#needsversioning[*]} )); then
if [[ ! -f "${file}" ]]; then if [[ ! -f "${file}" ]]; then
continue continue
fi 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" die "%s is not under version control" "$file"
fi fi
done done

View File

@@ -15,7 +15,11 @@ check_root() {
local orig_argv=("$@") local orig_argv=("$@")
(( EUID == 0 )) && return (( EUID == 0 )) && return
if type -P sudo >/dev/null; then if type -P run0 >/dev/null; then
keepenv=",$keepenv"
command="run0 ${keepenv//,/ --setenv=}"
exec ${command} -- "${orig_argv[@]}"
elif type -P sudo >/dev/null; then
exec sudo --preserve-env="${keepenv}" -- "${orig_argv[@]}" exec sudo --preserve-env="${keepenv}" -- "${orig_argv[@]}"
else else
exec su root -c "$(printf ' %q' "${orig_argv[@]}")" exec su root -c "$(printf ' %q' "${orig_argv[@]}")"

View File

@@ -188,10 +188,13 @@ path = [
"README.md", "README.md",
"keys/**", "keys/**",
".SRCINFO", ".SRCINFO",
".gitignore",
".nvchecker.toml", ".nvchecker.toml",
"*.install", "*.install",
"*.sysusers", "*.sysusers",
"*sysusers.conf",
"*.tmpfiles", "*.tmpfiles",
"*tmpfiles.conf",
"*.logrotate", "*.logrotate",
"*.pam", "*.pam",
"*.service", "*.service",

View File

@@ -20,7 +20,6 @@ shopt -s nullglob
default_makepkg_args=(--syncdeps --noconfirm --log --holdver --skipinteg) default_makepkg_args=(--syncdeps --noconfirm --log --holdver --skipinteg)
makepkg_args=("${default_makepkg_args[@]}") makepkg_args=("${default_makepkg_args[@]}")
verifysource_args=() verifysource_args=()
archnspawn_args=()
chrootdir= chrootdir=
passeddir= passeddir=
makepkg_user= makepkg_user=
@@ -81,7 +80,6 @@ usage() {
echo ' Useful for maintaining multiple copies' echo ' Useful for maintaining multiple copies'
echo " Default: $copy" echo " Default: $copy"
echo '-n Run namcap on the package' echo '-n Run namcap on the package'
echo "-s Do not run setarch"
echo '-C Run checkpkg on the package' echo '-C Run checkpkg on the package'
echo '-T Build in a temporary directory' echo '-T Build in a temporary directory'
echo '-U Run makepkg as a specified user' echo '-U Run makepkg as a specified user'
@@ -152,7 +150,7 @@ install_packages() {
pkgnames=("${install_pkgs[@]##*/}") pkgnames=("${install_pkgs[@]##*/}")
cp -- "${install_pkgs[@]}" "$copydir/root/" cp -- "${install_pkgs[@]}" "$copydir/root/"
arch-nspawn "${archnspawn_args[@]}" "$copydir" "${bindmounts_ro[@]}" "${bindmounts_rw[@]}" "${bindmounts_tmpfs[@]}" \ arch-nspawn "$copydir" "${bindmounts_ro[@]}" "${bindmounts_rw[@]}" "${bindmounts_tmpfs[@]}" \
pacman -U --noconfirm --ask=4 -- "${pkgnames[@]/#//root/}" pacman -U --noconfirm --ask=4 -- "${pkgnames[@]/#//root/}"
ret=$? ret=$?
rm -- "${pkgnames[@]/#/$copydir/root/}" rm -- "${pkgnames[@]/#/$copydir/root/}"
@@ -187,10 +185,18 @@ prepare_chroot() {
echo "$x" >>"$copydir/etc/makepkg.conf" echo "$x" >>"$copydir/etc/makepkg.conf"
done done
cat > "$copydir/etc/sudoers.d/builduser-pacman" <<EOF # TODO(gromit): check if this rule is sane
builduser ALL = NOPASSWD: /usr/bin/pacman # TODO(gromit): this will require a full container
cat > "$copydir/etc/polkit-1/rules.d/10-systemd-nopasswd.rules" <<EOF
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.systemd1.manage-units") {
if (subject.isInGroup("wheel")) {
return polkit.Result.YES;
}
}
});
EOF EOF
chmod 440 "$copydir/etc/sudoers.d/builduser-pacman" chmod 440 "$copydir/etc/polkit-1/rules.d/10-systemd-nopasswd.rules"
cat > "$copydir/etc/gitconfig" <<EOF cat > "$copydir/etc/gitconfig" <<EOF
[safe] [safe]
@@ -224,17 +230,14 @@ _chrootbuild() {
# shellcheck source=/dev/null # shellcheck source=/dev/null
. /etc/profile . /etc/profile
# Beware, there are some stupid arbitrary rules on how you can run0 --setenv=SOURCE_DATE_EPOCH \
# use "$" in arguments to commands with "sudo -i". ${foo} or --setenv=BUILDTOOL \
# ${1} is OK, but $foo or $1 isn't. --setenv=BUILDTOOLVER \
# https://bugzilla.sudo.ws/show_bug.cgi?id=765 --via-shell --chdir='~' \
sudo --preserve-env=SOURCE_DATE_EPOCH \ --user=builduser -- bash -c 'cd /startdir; makepkg "$@"' -bash "$@"
--preserve-env=BUILDTOOL \
--preserve-env=BUILDTOOLVER \
-iu builduser bash -c 'cd /startdir; makepkg "$@"' -bash "$@"
ret=$? ret=$?
case $ret in case $ret in
0|14) 0)
return 0;; return 0;;
*) *)
return $ret;; return $ret;;
@@ -245,7 +248,7 @@ _chrootnamcap() {
pacman -S --needed --noconfirm namcap pacman -S --needed --noconfirm namcap
for pkgfile in /startdir/PKGBUILD /pkgdest/*; do for pkgfile in /startdir/PKGBUILD /pkgdest/*; do
echo "Checking ${pkgfile##*/}" echo "Checking ${pkgfile##*/}"
sudo -u builduser namcap "$pkgfile" 2>&1 | tee "/logdest/${pkgfile##*/}-namcap.log" run0 --user=builduser -- namcap "$pkgfile" 2>&1 | tee "/logdest/${pkgfile##*/}-namcap.log"
done done
} }
@@ -254,8 +257,12 @@ download_sources() {
chown "$makepkg_user:" "$WORKDIR" chown "$makepkg_user:" "$WORKDIR"
# Ensure sources are downloaded # Ensure sources are downloaded
sudo -u "$makepkg_user" --preserve-env=GNUPGHOME,SSH_AUTH_SOCK \ run0 --user="$makepkg_user" \
env SRCDEST="$SRCDEST" BUILDDIR="$WORKDIR" \ --setenv=GNUPGHOME \
--setenv=SSH_AUTH_SOCK \
--setenv=SRCDEST="$SRCDEST" \
--setenv=BUILDDIR="$WORKDIR" \
--chdir=. -- \
makepkg --config="$copydir/etc/makepkg.conf" --verifysource -o "${verifysource_args[@]}" || makepkg --config="$copydir/etc/makepkg.conf" --verifysource -o "${verifysource_args[@]}" ||
die "Could not download sources." die "Could not download sources."
} }
@@ -295,7 +302,7 @@ move_products() {
} }
# }}} # }}}
while getopts 'hcur:sI:l:nCTD:d:U:x:t:' arg; do while getopts 'hcur:I:l:nCTD:d:U:x:t:' arg; do
case "$arg" in case "$arg" in
c) clean_first=1 ;; c) clean_first=1 ;;
D) bindmounts_ro+=("--bind-ro=$OPTARG") ;; D) bindmounts_ro+=("--bind-ro=$OPTARG") ;;
@@ -303,7 +310,6 @@ while getopts 'hcur:sI:l:nCTD:d:U:x:t:' arg; do
t) bindmounts_tmpfs+=("--tmpfs=$OPTARG") ;; t) bindmounts_tmpfs+=("--tmpfs=$OPTARG") ;;
u) update_first=1 ;; u) update_first=1 ;;
r) passeddir="$OPTARG" ;; r) passeddir="$OPTARG" ;;
s) archnspawn_args+=("-s") ;;
I) install_pkgs+=("$OPTARG") ;; I) install_pkgs+=("$OPTARG") ;;
l) copy="$OPTARG" ;; l) copy="$OPTARG" ;;
n) run_namcap=1; makepkg_args+=(--install) ;; n) run_namcap=1; makepkg_args+=(--install) ;;
@@ -370,7 +376,7 @@ if [[ ! -d $copydir ]] || (( clean_first )); then
sync_chroot "$chrootdir" "$copydir" "$copy" sync_chroot "$chrootdir" "$copydir" "$copy"
fi fi
(( update_first )) && arch-nspawn "${archnspawn_args[@]}" "$copydir" \ (( update_first )) && arch-nspawn "$copydir" \
"${bindmounts_ro[@]}" "${bindmounts_rw[@]}" "${bindmounts_tmpfs[@]}" \ "${bindmounts_ro[@]}" "${bindmounts_rw[@]}" "${bindmounts_tmpfs[@]}" \
pacman -Syuu --noconfirm pacman -Syuu --noconfirm
@@ -399,11 +405,11 @@ nspawn_build_args=(
"${bindmounts_tmpfs[@]}" "${bindmounts_tmpfs[@]}"
) )
if arch-nspawn "${archnspawn_args[@]}" "$copydir" \ if arch-nspawn "$copydir" \
"${nspawn_build_args[@]}" \ "${nspawn_build_args[@]}" \
/chrootbuild "${makepkg_args[@]}" /chrootbuild "${makepkg_args[@]}"
then then
mapfile -t pkgnames < <(sudo -u "$makepkg_user" bash -c 'source PKGBUILD; printf "%s\n" "${pkgname[@]}"') mapfile -t pkgnames < <(run0 --user="$makepkg_user" -- bash -c 'source PKGBUILD; printf "%s\n" "${pkgname[@]}"')
move_products move_products
else else
(( ret += 1 )) (( ret += 1 ))
@@ -447,7 +453,7 @@ else
for remotepkg in "${remotepkgs[@]}"; do for remotepkg in "${remotepkgs[@]}"; do
if [[ $remotepkg != file://* ]]; then if [[ $remotepkg != file://* ]]; then
msg2 "Downloading current versions" msg2 "Downloading current versions"
arch-nspawn "${archnspawn_args[@]}" "$copydir" pacman --noconfirm -Swdd "${pkgnames[@]}" arch-nspawn "$copydir" pacman --noconfirm -Swdd "${pkgnames[@]}"
mapfile -t remotepkgs < <(pacman --config "$copydir"/etc/pacman.conf \ mapfile -t remotepkgs < <(pacman --config "$copydir"/etc/pacman.conf \
--dbpath "$copydir"/var/lib/pacman \ --dbpath "$copydir"/var/lib/pacman \
-Sddp "${pkgnames[@]}") -Sddp "${pkgnames[@]}")
@@ -456,7 +462,7 @@ else
done done
msg2 "Checking packages" msg2 "Checking packages"
sudo -u "$makepkg_user" checkpkg --rmdir --warn --makepkg-config "$copydir/etc/makepkg.conf" "${remotepkgs[@]/#file:\/\//}" run0 --user="$makepkg_user" -- checkpkg --rmdir --warn --makepkg-config "$copydir/etc/makepkg.conf" "${remotepkgs[@]/#file:\/\//}"
fi fi
true true
fi fi

View File

@@ -192,7 +192,7 @@ for p in "$@"; do
pkgfile=${pkgfile_remote#file://} pkgfile=${pkgfile_remote#file://}
if [[ ! -f ${pkgfile} ]]; then if [[ ! -f ${pkgfile} ]]; then
msg "Downloading package '%s' into pacman's cache" "${pkgfile}" msg "Downloading package '%s' into pacman's cache" "${pkgfile}"
sudo pacman -Swdd --noconfirm --logfile /dev/null "${p}" || exit 1 run0 -- pacman -Swdd --noconfirm --logfile /dev/null "${p}" || exit 1
pkgfile_remote=$(pacman -Sddp "${p}" 2>/dev/null) pkgfile_remote=$(pacman -Sddp "${p}" 2>/dev/null)
pkgfile="${pkgfile_remote#file://}" pkgfile="${pkgfile_remote#file://}"
fi fi