Compare commits

..

2 Commits

Author SHA1 Message Date
Josephine Pfeiffer
3d907512e8 Merge branch 'gl-139-add-gitlab-star-feature' into 'master'
[GL#139] add gitlab project star/unstar feature

Closes #139

See merge request archlinux/devtools!305
2025-08-10 23:59:58 +00:00
Josephine Pfeiffer
65e277d9b2 add gitlab project star/unstar feature
Signed-off-by: Josephine Pfeiffer <hi@josie.lol>
2025-02-22 09:57:50 +01:00
10 changed files with 166 additions and 48 deletions

View File

@@ -3,7 +3,7 @@ pkgctl-auth(1)
Name
----
pkgctl-auth - Authenticate with services like GitLab.
pkgctl-auth - Authenticate with serivces like GitLab.
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
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,9 +49,6 @@ 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
@@ -73,7 +70,6 @@ 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

@@ -901,3 +901,61 @@ gitlab_issue_state_color() {
fi
printf "%s" "${state_color}"
}
# Star a GitLab project
gitlab_api_star() {
local pkgbase=$1
local outfile project_path project_id
[[ -z ${WORKDIR:-} ]] && setup_workdir
outfile=$(mktemp --tmpdir="${WORKDIR}" pkgctl-gitlab-api.XXXXXXXXXX)
project_path=$(gitlab_project_name_to_path "${pkgbase}")
# Get project details first
if ! gitlab_api_call "${outfile}" GET "projects/archlinux%2fpackaging%2fpackages%2f${project_path}/"; then
return 1
fi
# Extract project ID
if ! project_id=$(jq --raw-output --exit-status '.id' < "${outfile}"); then
msg_error " failed to get project ID: $(cat "${outfile}")"
return 1
fi
# Star the project
if ! gitlab_api_call "${outfile}" POST "/projects/${project_id}/star"; then
return 1
fi
return 0
}
# Unstar a GitLab project
gitlab_api_unstar() {
local pkgbase=$1
local outfile project_path project_id
[[ -z ${WORKDIR:-} ]] && setup_workdir
outfile=$(mktemp --tmpdir="${WORKDIR}" pkgctl-gitlab-api.XXXXXXXXXX)
project_path=$(gitlab_project_name_to_path "${pkgbase}")
# Get project details first
if ! gitlab_api_call "${outfile}" GET "projects/archlinux%2fpackaging%2fpackages%2f${project_path}/"; then
return 1
fi
# Extract project ID
if ! project_id=$(jq --raw-output --exit-status '.id' < "${outfile}"); then
msg_error " failed to get project ID: $(cat "${outfile}")"
return 1
fi
# Unstar the project
if ! gitlab_api_call "${outfile}" POST "/projects/${project_id}/unstar"; then
return 1
fi
return 0
}

View File

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

89
src/lib/star.sh Normal file
View File

@@ -0,0 +1,89 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_STAR_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_STAR_SH=1
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/api/gitlab.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/api/gitlab.sh
set -e
pkgctl_star_usage() {
local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
cat <<- _EOF_
Usage: ${COMMAND} [OPTIONS] [PKGBASE...]
Star a package's GitLab project.
If no package is specified, the current directory's package will be used.
Multiple packages can be specified to star multiple projects at once.
Every usage of the star command must be authenticated. Consult the
'pkgctl auth' command to authenticate with GitLab or view the
authentication status.
OPTIONS
-h, --help Show this help text
-u, --unstar Remove star from the project instead
EXAMPLES
$ ${COMMAND} pacman
$ ${COMMAND} --unstar pacman
$ ${COMMAND} libfoo libbar
_EOF_
}
pkgctl_star() {
if (( $# == 0 )) && [[ ! -f PKGBUILD ]]; then
pkgctl_star_usage
exit 1
fi
# Check authentication
if [[ -z ${GITLAB_TOKEN} ]]; then
die "GitLab authentication required. Run 'pkgctl auth login' first"
fi
local unstar=0
local pkgbases=()
# option checking
while (( $# )); do
case $1 in
-h|--help)
pkgctl_star_usage
exit 0
;;
-u|--unstar)
unstar=1
shift
;;
-*)
die "invalid argument: %s" "$1"
;;
*)
pkgbases+=("$1")
shift
;;
esac
done
# Use current directory if no packages specified
if (( ${#pkgbases[@]} == 0 )); then
pkgbases=("$(basename "$PWD")")
fi
# Star/unstar each package
for pkgbase in "${pkgbases[@]}"; do
if (( unstar )); then
msg "Unstarring %s..." "${pkgbase}"
gitlab_api_unstar "${pkgbase}"
else
msg "Starring %s..." "${pkgbase}"
gitlab_api_star "${pkgbase}"
fi
done
}

View File

@@ -6,8 +6,6 @@
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
@@ -23,8 +21,6 @@ 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,11 +304,6 @@ 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
@@ -351,16 +346,10 @@ 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() {

View File

@@ -29,6 +29,7 @@ usage() {
release Release step to commit, tag and upload build artifacts
repo Manage Git packaging repositories and their configuration
search Search for an expression across the GitLab packaging group
star Star a package's GitLab project
version Check and manage package versions against upstream
OPTIONS
@@ -138,6 +139,14 @@ while (( $# )); do
pkgctl_search "$@"
exit 0
;;
star)
_DEVTOOLS_COMMAND+=" $1"
shift
# shellcheck source=src/lib/star.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/star.sh
pkgctl_star "$@"
exit 0
;;
version)
_DEVTOOLS_COMMAND+=" $1"
shift