Compare commits

..

2 Commits

Author SHA1 Message Date
keypair
c738d84e23 Merge branch 'master' into 'master'
feat(pkgctl_auth_login): generate the login token via SSH

Closes #262

See merge request archlinux/devtools!309
2025-08-02 02:00:38 +00:00
keypair
34c7f0053f feat(pkgctl_auth_login): generate the login token via SSH 2025-03-05 05:36:28 +00:00
10 changed files with 32 additions and 58 deletions

View File

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

View File

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

View File

@@ -39,17 +39,6 @@ placed in the `$XDG_CONFIG_HOME`/nvchecker` directory. This keyfile is
used for providing the necessary authentication tokens required for used for providing the necessary authentication tokens required for
accessing the GitHub or GitLab API. 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 Options
------- -------

View File

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

View File

@@ -33,11 +33,13 @@ pkgctl_auth_login_usage() {
OPTIONS OPTIONS
-g, --gen-access-token Open the URL to generate a new personal access token -g, --gen-access-token Open the URL to generate a new personal access token
-s, --gen-ssh-token Directly generate the token via SSH (only works if your gitlab is already configured with SSH)
-h, --help Show this help text -h, --help Show this help text
EXAMPLES EXAMPLES
$ ${COMMAND} $ ${COMMAND}
$ ${COMMAND} --gen-access-token $ ${COMMAND} --gen-access-token
$ ${COMMAND} --gen-ssh-token
_EOF_ _EOF_
} }
@@ -53,6 +55,10 @@ pkgctl_auth_login() {
pkgctl_auth_login_usage pkgctl_auth_login_usage
exit 0 exit 0
;; ;;
-s|--gen-ssh-token)
USE_SSH=1
shift
;;
-g|--gen-access-token) -g|--gen-access-token)
GEN_ACESS_TOKEN=1 GEN_ACESS_TOKEN=1
shift shift
@@ -76,10 +82,17 @@ pkgctl_auth_login() {
environment variable using a vault, see pkgctl-auth-login(1) for details. environment variable using a vault, see pkgctl-auth-login(1) for details.
_EOF_ _EOF_
if (( GEN_ACESS_TOKEN )); then if (( USE_SSH )); then
xdg-open "${personal_access_token_url}" 2>/dev/null token=$(ssh git@gitlab.archlinux.org personal_access_token pkgctl api,write_repository 30)
if [[ $? -ne 0 ]]; then
msg_error " Failed to generate token via SSH"
exit 1
fi
token=$(echo "$token" | grep 'Token:' | awk '{print $2}')
fi fi
if (( GEN_ACESS_TOKEN )); then
xdg-open "${personal_access_token_url}" 2>/dev/null
# read token from stdin # read token from stdin
read -s -r -p "${GREEN}?${ALL_OFF} ${BOLD}Paste your authentication token:${ALL_OFF} " token read -s -r -p "${GREEN}?${ALL_OFF} ${BOLD}Paste your authentication token:${ALL_OFF} " token
echo echo
@@ -88,6 +101,7 @@ _EOF_
msg_error " No token provided" msg_error " No token provided"
exit 1 exit 1
fi fi
fi
# check if the passed token works # check if the passed token works
GITLAB_TOKEN="${token}" GITLAB_TOKEN="${token}"

View File

@@ -54,8 +54,7 @@ export RSYNC_OPTS=(
--human-readable --human-readable
--progress --progress
--partial --partial
# suffix the partial dir with the PID in order to avoid clashes --partial-dir=.partial
--partial-dir=.partial.$$
--delay-updates --delay-updates
) )
@@ -442,10 +441,3 @@ relative_date_unit() {
done done
printf "1 second" 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 pushd "${path}" >/dev/null
if [[ ! -f PKGBUILD ]]; then if [[ ! -f PKGBUILD ]]; then
msg_error "${BOLD}${path}:${ALL_OFF} no PKGBUILD found" msg_error "${BOLD}${pkgbase}:${ALL_OFF} no PKGBUILD found"
return 1 return 1
fi fi
if [[ ! -f .SRCINFO ]]; then # reset common PKGBUILD variables
msg_error "${BOLD}${path}:${ALL_OFF} no .SRCINFO found" unset pkgbase
return 1
fi
if ! pkgbase=$(grep --max-count=1 --extended-regexp "pkgbase = (.+)" .SRCINFO | awk '{print $3}'); then # shellcheck source=contrib/makepkg/PKGBUILD.proto
msg_error "${BOLD}${path}:${ALL_OFF} pkgbase not found in .SRCINFO" if ! . ./PKGBUILD; then
msg_error "${BOLD}${pkgbase}:${ALL_OFF} failed to source PKGBUILD"
return 1 return 1
fi fi
pkgbase=${pkgbase:-$pkgname}
if [[ ! -e LICENSE ]]; then if [[ ! -e LICENSE ]]; then
msg_error "${BOLD}${pkgbase}:${ALL_OFF} is missing the LICENSE file" msg_error "${BOLD}${pkgbase}:${ALL_OFF} is missing the LICENSE file"

View File

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

View File

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

View File

@@ -304,11 +304,6 @@ get_upstream_version() {
return 1 return 1
fi 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 if ! upstream_version=$(jq --raw-output --exit-status '.version' <<< "${output}"); then
printf "failed to select version from result" printf "failed to select version from result"
return 1 return 1
@@ -351,16 +346,10 @@ nvchecker_check_config() {
fi fi
# check if the config contains any section other than pkgbase # 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}" printf "non-pkgbase section not supported in %s: %s" "${config}" "${property}"
return 1 return 1
fi 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() { nvchecker_check_error() {