Compare commits

..

1 Commits

Author SHA1 Message Date
Levente Polyak
7bccfc7d99 feat(version): support combiner source for version check commands
This allows more flexibility and chaining by being able to define
multiple sources per pkgbase and chain them together to achieve the
final result. This may also be helpful to combine multiple from/to
patterns into a chain to achieve the final pkgver to compare against.

To utilize the combiner source, the `pkgbase` section must be declared
as the combiner source. Additionally, individual sections should be
added using a quoted table key consisting of the `pkgbase` followed by
the stage name, separated by double colons.
For example: `["sudo:stage1"]`.

Fixes #216

Component: pkgctl version check
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2025-01-25 17:17:27 +01:00
21 changed files with 30 additions and 379 deletions

View File

@@ -1,6 +1,6 @@
SHELL=/bin/bash -o pipefail
V=1.3.2
V=1.3.1
BUILDTOOLVER ?= $(V)
PREFIX = /usr/local
@@ -106,7 +106,7 @@ $(BUILDDIR)/doc/man/%: doc/man/%.asciidoc doc/man/include/footer.asciidoc
conf:
@install -d $(BUILDDIR)/makepkg.conf.d
@cp -ra $(MAKEPKG_CONFIGS) $(BUILDDIR)/makepkg.conf.d
@cp -a $(MAKEPKG_CONFIGS) $(BUILDDIR)/makepkg.conf.d
@install -d $(BUILDDIR)/pacman.conf.d
@cp -a $(PACMAN_CONFIGS) $(BUILDDIR)/pacman.conf.d
@install -d $(BUILDDIR)/git.conf.d
@@ -124,7 +124,7 @@ install: all
install -dm0755 $(DESTDIR)$(DATADIR)/lib
cp -ra $(BUILDDIR)/lib/* $(DESTDIR)$(DATADIR)/lib
cp -a $(BUILDDIR)/git.conf.d -t $(DESTDIR)$(DATADIR)
cp -ra $(BUILDDIR)/makepkg.conf.d -t $(DESTDIR)$(DATADIR)
for conf in $(notdir $(MAKEPKG_CONFIGS)); do install -Dm0644 $(BUILDDIR)/makepkg.conf.d/$$conf $(DESTDIR)$(DATADIR)/makepkg.conf.d/$${conf##*/}; done
for conf in $(notdir $(PACMAN_CONFIGS)); do install -Dm0644 $(BUILDDIR)/pacman.conf.d/$$conf $(DESTDIR)$(DATADIR)/pacman.conf.d/$${conf##*/}; done
for a in ${SETARCH_ALIASES}; do install -m0644 $$a -t $(DESTDIR)$(DATADIR)/setarch-aliases.d; done
for l in ${COMMITPKG_LINKS}; do ln -sf commitpkg $(DESTDIR)$(PREFIX)/bin/$$l; done
@@ -142,7 +142,7 @@ uninstall:
for f in $(notdir $(LIBRARY)); do rm -f $(DESTDIR)$(DATADIR)/lib/$$f; done
rm -rf $(DESTDIR)$(DATADIR)/lib
rm -rf $(DESTDIR)$(DATADIR)/git.conf.d
rm -rf $(DESTDIR)$(DATADIR)/makepkg.conf.d
for conf in $(notdir $(MAKEPKG_CONFIGS)); do rm -f $(DESTDIR)$(DATADIR)/makepkg.conf.d/$${conf##*/}; done
for conf in $(notdir $(PACMAN_CONFIGS)); do rm -f $(DESTDIR)$(DATADIR)/pacman.conf.d/$${conf##*/}; done
for f in $(notdir $(SETARCH_ALIASES)); do rm -f $(DESTDIR)$(DATADIR)/setarch-aliases.d/$$f; done
for l in ${COMMITPKG_LINKS}; do rm -f $(DESTDIR)$(PREFIX)/bin/$$l; done
@@ -154,6 +154,7 @@ uninstall:
for manfile in $(notdir $(MANS)); do rm -f $(DESTDIR)$(MANDIR)/man$${manfile##*.}/$${manfile}; done;
rmdir --ignore-fail-on-non-empty \
$(DESTDIR)$(DATADIR)/setarch-aliases.d \
$(DESTDIR)$(DATADIR)/makepkg.conf.d \
$(DESTDIR)$(DATADIR)/pacman.conf.d \
$(DESTDIR)$(DATADIR)

View File

@@ -1,18 +0,0 @@
#!/hint/bash
#
# /etc/makepkg.conf.d/fortran.conf
#
#########################################################################
# FORTRAN LANGUAGE SUPPORT
#########################################################################
# Flags used for the Fortran compiler, similar in spirit to CFLAGS. Read
# linkman:gfortran[1] for more details on the available flags.
#FFLAGS="-O2 -pipe"
#FCFLAGS="$FFLAGS"
# Additional compiler flags appended to `FFLAGS` and `FCFLAGS` for use in debugging. Usually
# this would include: ``-g''. Read linkman:gfortran[1] for more details on the wide
# variety of compiler flags available.
#DEBUG_FFLAGS="-g"

View File

@@ -1,19 +0,0 @@
#!/hint/bash
# shellcheck disable=2034
#
# /etc/makepkg.conf.d/rust.conf
#
#########################################################################
# RUST LANGUAGE SUPPORT
#########################################################################
# Flags used for the Rust compiler, similar in spirit to CFLAGS. Read
# linkman:rustc[1] for more details on the available flags.
RUSTFLAGS="-C force-frame-pointers=yes"
# Additional compiler flags appended to `RUSTFLAGS` for use in debugging.
# Usually this would include: ``-C debuginfo=2''. Read linkman:rustc[1] for
# more details on the available flags.
DEBUG_RUSTFLAGS="-C debuginfo=2"

View File

@@ -1 +0,0 @@
../conf.d/fortran.conf

View File

@@ -1 +0,0 @@
../conf.d/rust.conf

View File

@@ -1 +0,0 @@
../conf.d/fortran.conf

View File

@@ -1 +0,0 @@
../conf.d/rust.conf

View File

@@ -305,7 +305,6 @@ _pkgctl_repo_cmds=(
clone
configure
create
pull
switch
web
)
@@ -335,19 +334,6 @@ _pkgctl_repo_clean_args=(
)
_pkgctl_repo_clean_opts() { _filedir -d; }
_pkgctl_repo_pull_args=(
--discard-changes
--show-diff
--quiet
--autostash
-f --force
-j --jobs
-h --help
)
_pkgctl_repo_pull_args__jobs_opts() { :; }
_pkgctl_repo_pull_args_j_opts() { _pkgctl_repo_pull_args__jobs_opts; }
_pkgctl_repo_pull_opts() { _filedir -d; }
_pkgctl_repo_configure_args=(
--protocol
-j --jobs

View File

@@ -202,7 +202,7 @@ _pkgctl_issue_view_args=(
_pkgctl_release_args=(
'(-m --message=)'{-m,--message=}"[Use the given <msg> as the commit message]:message:"
'(-r --repo)'{-r,--repo}"[Specify a target repository for new packages]:repo:($DEVTOOLS_VALID_REPOS[*])"
'(-r --repo=)'{-r,--repo=}"[Specify a target repository for new packages]:repo:($DEVTOOLS_VALID_REPOS[*])"
'(-s --staging)'{-s,--staging}'[Release to the staging counterpart of the auto-detected repo]'
'(-t --testing)'{-t,--testing}'[Release to the testing counterpart of the auto-detected repo]'
'(-u --db-update)'{-u,--db-update}'[Automatically update the pacman database after uploading]'
@@ -228,7 +228,6 @@ _pkgctl_repo_cmds=(
"clone[Clone a package repository]"
"configure[Configure a clone according to distro specs]"
"create[Create a new GitLab package repository]"
"pull[Update package repositories from their git remote]"
"switch[Switch a package repository to a specified version]"
"web[Open the packaging repository's website]"
)
@@ -257,17 +256,6 @@ _pkgctl_repo_clone_args=(
'*:packages:_devtools_completions_all_packages'
)
_pkgctl_repo_pull_args=(
'--discard-changes[Discard changes if index or working tree is dirty]'
'--quiet[Disable printing longer terminal output]'
'--show-diff[Always enable showing the diff]'
'--autostash[Stash before pulling and unstash afterwards]'
'(-f --force)'{-f,--force}'[Alias for --discard-changes]'
'(-j --jobs)'{-j,--jobs}'[Run up to N jobs in parallel (default: number of processing units)]:jobs:'
'(-h --help)'{-h,--help}'[Display usage]'
'*:git_dir:_files -/'
)
_pkgctl_repo_configure_args=(
'--protocol[Configure remote url to use https]:proto:(https)'
'(-j --jobs)'{-j,--jobs}'[Run up to N jobs in parallel (default: number of processing units)]:jobs:'

View File

@@ -23,8 +23,7 @@ Options
Location of a pacman config file
*-M* <file>::
Location of a makepkg config file. Specific additions (e.g. build flags for
additional languages) can be placed in '<file>.d/*.conf'.
Location of a makepkg config file
*-c* <dir>::
Set pacman cache, if no directory is specified the passed pacman.conf's cachedir is used with a fallback to '/etc/pacman.conf'

View File

@@ -49,8 +49,7 @@ Options
Set the pacman cache directory.
*-M* <file>::
Location of a makepkg config file. Specific additions (e.g. build flags for
additional languages) can be placed in '<file>.d/*.conf'.
Location of a makepkg config file.
*-l* <chroot>::
The directory name to use as the chroot namespace

View File

@@ -1,50 +0,0 @@
pkgctl-repo-pull(1)
===================
Name
----
pkgctl-repo-pull - Pull in git changes
Synopsis
--------
pkgctl repo pull [OPTIONS] [PATH...]
Description
-----------
Update package repositories from their git remotes.
If only a single package is given the command also automatically shows a diff
of what has changed since the last time the repository was updated.
Options
-------
*--discard-changes*::
Discard changes if the index or working tree was modified. Otherwise abort
if anything was modified.
*--autostash*::
Stash before pulling and unstash afterwards
*--quiet*::
Do not show any longer terminal output like diffs.
*--show-diff*::
Show what has changed since the last time the repository was updated. Is
automatically set when only one 'PATH' is given.
*-j, --jobs* 'N'::
Run up to N jobs in parallel. By default the number of jobs is equal to the
number of available processing units. For sequential processing this option
needs to be passed with 1.
*-h, --help*::
Show a help text
See Also
--------
git-pull(1)
include::include/footer.asciidoc[]

View File

@@ -44,9 +44,6 @@ pkgctl repo configure::
pkgctl repo create::
Create a new GitLab package repository
pkgctl repo pull::
Update package repositories from their git remotes
pkgctl repo switch::
Switch a package repository to a specified version
@@ -60,7 +57,6 @@ pkgctl-repo-clean(1)
pkgctl-repo-clone(1)
pkgctl-repo-configure(1)
pkgctl-repo-create(1)
pkgctl-repo-pull(1)
pkgctl-repo-switch(1)
pkgctl-repo-web(1)

View File

@@ -39,6 +39,14 @@ placed in the `$XDG_CONFIG_HOME`/nvchecker` directory. This keyfile is
used for providing the necessary authentication tokens required for
accessing the GitHub or GitLab API.
Combiner Source
---------------
To utilize the combiner source, the `pkgbase` section must be declared as the
combiner source. Additionally, individual sections should be added using a
quoted table key consisting of the `pkgbase` followed by the stage name,
separated by double colons. For example: `["sudo:stage1"]`.
Options
-------

View File

@@ -112,13 +112,7 @@ copy_hostconf () {
[[ -n $host_cachemirrors ]] && printf 'CacheServer = %s\n' "${host_cachemirrors[@]}" >>"$working_dir/etc/pacman.d/mirrorlist"
[[ -n $pac_conf ]] && cp "$pac_conf" "$working_dir/etc/pacman.conf"
if [[ -n $makepkg_conf ]]; then
cp "$makepkg_conf" "$working_dir/etc/makepkg.conf"
if [[ -d "${makepkg_conf}.d" ]] && is_globfile "${makepkg_conf}.d"/*.conf; then
mkdir --parents "$working_dir/etc/makepkg.conf.d/"
cp "${makepkg_conf}.d/"*.conf "$working_dir/etc/makepkg.conf.d/"
fi
fi
[[ -n $makepkg_conf ]] && cp "$makepkg_conf" "$working_dir/etc/makepkg.conf"
local file
for file in "${files[@]}"; do

View File

@@ -79,13 +79,6 @@ check_root SOURCE_DATE_EPOCH,SRCDEST,SRCPKGDEST,PKGDEST,LOGDEST,MAKEFLAGS,PACKAG
# Pass all arguments after -- right to makepkg
makechrootpkg_args+=("${@:$OPTIND}")
# Automatically recreate the root chroot if a version mismatch is detected
CURRENT_CHROOT_VERSION=$(cat "${chroots}/${repo}-${arch}/root/.arch-chroot")
if [[ -f "${chroots}/${repo}-${arch}/root/.arch-chroot" ]] && [[ "$CURRENT_CHROOT_VERSION" != "$CHROOT_VERSION" ]]; then
warning "Recreating chroot '%s' (%s) as it is not at version %s" "${chroots}/${repo}-${arch}/root" "$CURRENT_CHROOT_VERSION" "$CHROOT_VERSION"
clean_first=true
fi
if ${clean_first} || [[ ! -d "${chroots}/${repo}-${arch}" ]]; then
msg "Creating chroot for [%s] (%s)..." "${repo}" "${arch}"

View File

@@ -4,7 +4,7 @@
:
# shellcheck disable=2034
CHROOT_VERSION='v6'
CHROOT_VERSION='v5'
##
# usage : check_root $keepenv

View File

@@ -31,7 +31,6 @@ pkgctl_repo_usage() {
clone Clone a package repository
configure Configure a clone according to distro specs
create Create a new GitLab package repository
pull Update package repositories from their git remote
switch Switch a package repository to a specified version
web Open the packaging repository's website
@@ -41,7 +40,6 @@ pkgctl_repo_usage() {
EXAMPLES
$ ${COMMAND} clean --interactive *
$ ${COMMAND} clone libfoo linux libbar
$ ${COMMAND} pull libfoo linux libbar
$ ${COMMAND} clone --maintainer mynickname
$ ${COMMAND} configure *
$ ${COMMAND} create libfoo
@@ -103,14 +101,6 @@ pkgctl_repo() {
pkgctl_repo_switch "$@"
exit 0
;;
pull)
_DEVTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/repo/pull.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/repo/pull.sh
pkgctl_repo_pull "$@"
exit 0
;;
web)
_DEVTOOLS_COMMAND+=" $1"
shift

View File

@@ -1,195 +0,0 @@
#!/bin/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_REPO_PULL_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_REPO_PULL_SH=1
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
# shellcheck source=src/lib/util/git.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/git.sh
source /usr/share/makepkg/util/message.sh
set -eo pipefail
pkgctl_repo_pull_usage() {
local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [PKGBASE]...
Update package repositories from their git remotes.
OPTIONS
--discard-changes Discard changes if index or working tree is dirty
--show-diff Always enable showing the diff
--autostash Stash before pulling and unstash afterwards
-j, --jobs N Run up to N jobs in parallel (default: $(nproc))
--quiet Disable printing longer terminal output
-h, --help Show this help text
EXAMPLES
$ ${COMMAND} gopass gopass-jsonapi
_EOF_
}
pkgctl_repo_pull() {
# options
local paths path pkgbase branch jobs remote
jobs=$(nproc)
local command=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
local git_rebase_options=()
local SHOW_DIFF=0
local QUIET=0
local DISCARD_CHANGES=0
local AUTOSTASH=0
while (( $# )); do
case $1 in
-h|--help)
pkgctl_repo_pull_usage
exit 0
;;
--discard-changes)
DISCARD_CHANGES=1
shift
;;
--show-diff)
SHOW_DIFF=1
shift
;;
--quiet)
QUIET=1
shift
;;
--autostash)
AUTOSTASH=1
git_rebase_options+=(--autostash)
shift
;;
-j|--jobs)
(( $# <= 1 )) && die "missing argument for %s" "$1"
jobs=$2
shift 2
;;
--)
shift
break
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
paths=("$@")
break
;;
esac
done
# check if invoked without any path from within a packaging repo
if (( ${#paths[@]} == 0 )); then
paths=(".")
fi
# check if we are only working on one repo and enable
if (( ${#paths[@]} == 1 )) && (( ! QUIET )); then
SHOW_DIFF=1
fi
# parallelization
if [[ ${jobs} != 1 ]] && (( ${#paths[@]} > 1 )); then
if [[ -n ${BOLD} ]]; then
export DEVTOOLS_COLOR=always
fi
# warm up ssh connection as it may require user input (key unlock, hostkey verification etc)
git_warmup_ssh_connection
# disable diffs if not enabled explicitly
if (( ! SHOW_DIFF )); then
command+=" --quiet"
fi
if (( DISCARD_CHANGES )); then
command+=" --discard-changes"
fi
if (( AUTOSTASH )); then
command+=" --autostash"
fi
if ! parallel --bar --jobs "${jobs}" "${command}" ::: "${paths[@]}"; then
die 'Failed to pull some packages, please check the previous output'
fi
exit 0
fi
for path in "${paths[@]}"; do
# skip paths that are not directories
if [[ ! -d "${path}" ]]; then
continue
fi
if [[ ! -f "${path}/PKGBUILD" ]]; then
msg_error " Not a package repository: ${path}"
continue
fi
if [[ ! -d "${path}/.git" ]]; then
msg_error " Not a Git repository: ${path}"
continue
fi
pkgbase=$(basename "$(realpath "${path}")")
pkgbase=${pkgbase%.git}
msg "Updating ${pkgbase}"
branch=$(git -C "${path}" symbolic-ref --quiet --short HEAD)
if [[ ${branch} != main ]]; then
msg_warn " Current branch is ${branch}, not updating from canonical upstream: ${pkgbase}"
fi
if ! git -C "${path}" diff-files --quiet && (( ! AUTOSTASH )) && (( ! DISCARD_CHANGES )); then
msg_error " Index contains unstaged changes, please stash them or pass --autostash before pulling: ${pkgbase}"
continue
fi
if ! git -C "${path}" diff-index --cached --quiet HEAD && (( ! AUTOSTASH )) && (( ! DISCARD_CHANGES )); then
msg_error " Index contains uncommited changes, please commit or stash them before pulling: ${pkgbase}"
continue
fi
remote=$(git -C "${path}" config "branch.${branch}.remote")
if [[ -z "${remote}" ]]; then
msg_error " No upstream tracking branch configured: ${pkgbase}"
continue
fi
if ! git -C "${path}" fetch --quiet "${remote}"; then
msg_error " Error while fetching: ${pkgbase}"
continue
fi
if [[ $(git -C "${path}" rev-parse HEAD) == $(git -C "${path}" rev-parse FETCH_HEAD) ]]; then
msg2 "Repo is up to date, nothing to do"
continue
fi
# discard any local modifications
if (( DISCARD_CHANGES )); then
git -C "${path}" restore --staged --worktree -- .
fi
if (( SHOW_DIFF )) && (( ! QUIET )); then
git -C "${path}" --no-pager diff --color --patch-with-stat HEAD..FETCH_HEAD
fi
if ! git -C "${path}" rebase --quiet "${git_rebase_options[@]}" "${remote}/${branch}"; then
msg_error " Error while pulling in the changes for ${pkgbase}"
exit 1
fi
done
}

View File

@@ -304,6 +304,11 @@ get_upstream_version() {
return 1
fi
if ! output=$(jq --raw-output --exit-status 'select(.name == "'"${pkgbase}"'")' <<< "${output}"); then
printf "failed to select pkgbase result from output"
return 1
fi
if ! upstream_version=$(jq --raw-output --exit-status '.version' <<< "${output}"); then
printf "failed to select version from result"
return 1
@@ -346,7 +351,7 @@ nvchecker_check_config() {
fi
# check if the config contains any section other than pkgbase
if [[ -n ${pkgbase} ]] && property=$(grep --max-count=1 --perl-regexp "^\\[(?!\"?${pkgbase//+/\\+}\"?\\]).+\\]" < "${config}"); then
if [[ -n ${pkgbase} ]] && property=$(grep --max-count=1 --perl-regexp "^\\[(?!\"?${pkgbase//+/\\+}(:.+)?\"?\\]).+\\]" < "${config}"); then
printf "non-pkgbase section not supported in %s: %s" "${config}" "${property}"
return 1
fi

View File

@@ -93,36 +93,14 @@ get_makepkg_conf() {
local fname=${1}
local arch="${2}"
local makepkg_conf="${3}"
if ! buildtool_file=$(get_pkgfile "${fname}"); then
error "failed to retrieve ${fname}"
return 1
fi
buildtool_file="${buildtool_file/file:\/\//}"
msg "using makepkg.conf from ${fname}"
# try to handle config of legacy devtools
if bsdtar --list --file "${buildtool_file}" "usr/share/devtools/makepkg-${arch}.conf" &>/dev/null; then
bsdtar --extract --to-stdout --fast-read --file "${buildtool_file}" "usr/share/devtools/makepkg-${arch}.conf" > "${makepkg_conf}"
return $?
msg2 "using makepkg.conf from ${fname}"
if ! bsdtar xOqf "${buildtool_file/file:\/\//}" "usr/share/devtools/makepkg.conf.d/${arch}.conf" > "${makepkg_conf}"; then
bsdtar xOqf "${buildtool_file/file:\/\//}" "usr/share/devtools/makepkg-${arch}.conf" > "${makepkg_conf}"
fi
msg2 "extracting ${arch}.conf from devtools archive"
if ! bsdtar --extract --to-stdout --fast-read --file "${buildtool_file}" "usr/share/devtools/makepkg.conf.d/${arch}.conf" > "${makepkg_conf}"; then
error "failed to extract 'usr/share/devtools/makepkg.conf.d/${arch}.conf' from devtools archive"
return 1
fi
mkdir --parents "${makepkg_conf}.d"
if bsdtar --list --file "${buildtool_file}" "usr/share/devtools/makepkg.conf.d/conf.d" &>/dev/null; then
msg2 "extracting conf.d from devtools archive"
bsdtar --extract --file "${buildtool_file}" --cd "${makepkg_conf}.d" --strip-components 4 "usr/share/devtools/makepkg.conf.d/conf.d"
fi
if bsdtar --list --file "${buildtool_file}" "usr/share/devtools/makepkg.conf.d/${arch}.conf.d" &>/dev/null; then
msg2 "extracting ${arch}.conf.d from devtools archive"
bsdtar --extract --file "${buildtool_file}" --cd "${makepkg_conf}.d" --strip-components 4 "usr/share/devtools/makepkg.conf.d/${arch}.conf.d"
fi
return 0
}