Compare commits

...

9 Commits

Author SHA1 Message Date
Robin Candau
5835e20136 feat(version): Disallow using the "cmd" source for nvchecker
The [cmd](https://nvchecker.readthedocs.io/en/latest/usage.html#find-with-a-command)
source allows nvchecker to use a shell command line to get versions.
Using this source within `.nvchecker.toml` would result in `pkgctl
version {check,upgrade}` to run arbitrary commands which isn't
desirable, as it can lead to various issues (e.g. missing packages /
dependencies to run said commands or even executing malicious commands
in hypothetical worst case scenarios)

Component: pkgctl version check
Signed-off-by: Levente Polyak <anthraxx@archlinux.org>
2025-10-05 20:06:24 +02:00
Levente Polyak
7c3fcf9c16 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-10-05 19:48:48 +02:00
Ivan Shapovalov
82ddc7b3bd fix(pkgctl): handle pkgver values containing regex metacharacters
`pkgbuild_set_pkgver()` used the value of `$pkgver` directly in regular
expressions, which breaks if said value happens to contain e.g. a `+`.
Fix this by escaping all possible regex metacharacters in `$pkgver`.

Component: pkgctl build
Component: pkgctl version upgrade
2025-10-05 19:26:30 +02:00
Levente Polyak
1bcbdde3fa chore(license): avoid sourcing PKGBUILD in check subcommand
We don't actually need any data from the package, except the pkgbase
which is exclusively used during logging. Simply grep the pkgbase name
and use the path during early code path issues.

Component: pkgctl license check
2025-10-05 18:47:04 +02:00
Jan Alexander Steffens (heftig)
062c678119 fix(release): Use unique partial dirs
Avoid multiple concurrent invocations of rsync clashing when creating
the partial dir.

Fixes: https://gitlab.archlinux.org/archlinux/devtools/-/issues/266
2025-10-04 21:14:46 +02:00
Rafael Fontenelle
bd4dc54fbb doc: Add pkgctl-license entry to see also
Component: pkgctl
2025-10-04 21:04:27 +02:00
Rafael Fontenelle
a46cb8150c doc: Add license sub-command to pkgctl.1
Component: pkgctl
2025-10-04 21:03:24 +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
8 changed files with 50 additions and 11 deletions

View File

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

View File

@@ -39,6 +39,17 @@ 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"]`.
This allows to chain different sources together into one result, or allow
multi stage transformation of our source via multiple regex.
Options
-------

View File

@@ -49,6 +49,9 @@ pkgctl diff::
pkgctl issue::
Work with GitLab packaging issues
pkgctl license::
Check and manage package licenses
pkgctl release::
Release step to commit, tag and upload build artifacts
@@ -70,6 +73,7 @@ pkgctl-build(1)
pkgctl-db(1)
pkgctl-diff(1)
pkgctl-issue(1)
pkgctl-license(1)
pkgctl-release(1)
pkgctl-repo(1)
pkgctl-search(1)

View File

@@ -54,7 +54,8 @@ export RSYNC_OPTS=(
--human-readable
--progress
--partial
--partial-dir=.partial
# suffix the partial dir with the PID in order to avoid clashes
--partial-dir=.partial.$$
--delay-updates
)
@@ -441,3 +442,10 @@ relative_date_unit() {
done
printf "1 second"
}
# escapes regex metacharacters in a given string
regex_escape() {
# shellcheck disable=SC2001,SC2016
sed 's/[\^.\[$()|*+?{\\]/\\&/g' <<<"$1"
}

View File

@@ -94,19 +94,19 @@ pkgctl_license_check() {
pushd "${path}" >/dev/null
if [[ ! -f PKGBUILD ]]; then
msg_error "${BOLD}${pkgbase}:${ALL_OFF} no PKGBUILD found"
msg_error "${BOLD}${path}:${ALL_OFF} no PKGBUILD found"
return 1
fi
# reset common PKGBUILD variables
unset pkgbase
# shellcheck source=contrib/makepkg/PKGBUILD.proto
if ! . ./PKGBUILD; then
msg_error "${BOLD}${pkgbase}:${ALL_OFF} failed to source PKGBUILD"
if [[ ! -f .SRCINFO ]]; then
msg_error "${BOLD}${path}:${ALL_OFF} no .SRCINFO found"
return 1
fi
if ! pkgbase=$(grep --max-count=1 --extended-regexp "pkgbase = (.+)" .SRCINFO | awk '{print $3}'); then
msg_error "${BOLD}${path}:${ALL_OFF} pkgbase not found in .SRCINFO"
return 1
fi
pkgbase=${pkgbase:-$pkgname}
if [[ ! -e LICENSE ]]; then
msg_error "${BOLD}${pkgbase}:${ALL_OFF} is missing the LICENSE file"

View File

@@ -188,6 +188,7 @@ path = [
"README.md",
"keys/**",
".SRCINFO",
".gitignore",
".nvchecker.toml",
"*.install",
"*.sysusers",

View File

@@ -6,6 +6,8 @@
DEVTOOLS_INCLUDE_UTIL_PKGBUILD_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/makepkg.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/makepkg.sh
@@ -21,6 +23,8 @@ pkgbuild_set_pkgver() {
local new_pkgver=$1
local pkgver=${pkgver}
pkgver="$(regex_escape "${pkgver}")"
if [[ $(type -t pkgver) == function ]]; then
# TODO: check if die or warn, if we provide _commit _gitcommit setter maybe?
warning 'setting pkgver variable has no effect if the PKGBUILD has a pkgver() function'

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,10 +351,16 @@ 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
# check if the config is using the 'cmd' source
if grep --extended-regexp --quiet '^\s*source\s*=\s*["'\'']cmd["'\''].*' "${config}"; then
printf "using the 'cmd' source in %s is disallowed" "${config}"
return 1
fi
}
nvchecker_check_error() {