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
9 changed files with 164 additions and 59 deletions

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

@@ -312,7 +312,7 @@ pkgctl_build() {
# Update pacman cache for auto-detection
if [[ -z ${REPO} ]]; then
update_pacman_repo_cache stable
update_pacman_repo_cache multilib
# Check valid repos if not resolved dynamically
elif ! in_array "${REPO}" "${DEVTOOLS_VALID_REPOS[@]}"; then
die "Invalid repository target: %s" "${REPO}"

View File

@@ -51,6 +51,7 @@ pkgctl_db_remove() {
local partial=0
local confirm=1
local dbscripts_options=()
local lookup_repo=multilib
local pkgname
# option checking
@@ -105,13 +106,13 @@ pkgctl_db_remove() {
update_pacman_repo_cache unstable
;;
*-staging)
update_pacman_repo_cache staging
update_pacman_repo_cache multilib-staging
;;
*-testing)
update_pacman_repo_cache testing
update_pacman_repo_cache multilib-testing
;;
*)
update_pacman_repo_cache stable
update_pacman_repo_cache multilib
;;
esac

View File

@@ -124,7 +124,7 @@ pkgctl_release() {
# Update pacman cache for auto-detection
if [[ -z ${REPO} ]]; then
update_pacman_repo_cache stable
update_pacman_repo_cache multilib
# Check valid repos if not resolved dynamically
elif ! in_array "${REPO}" "${DEVTOOLS_VALID_REPOS[@]}"; then
die "Invalid repository target: %s" "${REPO}"

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

@@ -1,26 +0,0 @@
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later
[[ -z ${DEVTOOLS_INCLUDE_UTIL_MACHINE_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_UTIL_MACHINE_SH=1
_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@}
# shellcheck source=src/lib/common.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh
set -eo pipefail
machine_get_hardware_name() {
uname --machine
}
machine_has_multilib() {
case "$(machine_get_hardware_name)" in
x86_64*)
return 0
;;
esac
return 1
}

View File

@@ -8,8 +8,6 @@ DEVTOOLS_INCLUDE_UTIL_PACMAN_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/machine.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/machine.sh
set -e
@@ -20,8 +18,7 @@ readonly _DEVTOOLS_MAKEPKG_CONF_DIR=${_DEVTOOLS_LIBRARY_DIR}/makepkg.conf.d
update_pacman_repo_cache() {
local repo=${1:-stable}
repo=$(pacman_resolve_virtual_repo_name "${repo}")
local repo=${1:-multilib}
mkdir -p "${_DEVTOOLS_PACMAN_CACHE_DIR}"
msg "Updating pacman database cache"
@@ -35,8 +32,7 @@ update_pacman_repo_cache() {
get_pacman_repo_from_pkgbuild() {
local path=${1:-PKGBUILD}
local repo=${2:-stable}
repo=$(pacman_resolve_virtual_repo_name "${repo}")
local repo=${2:-multilib}
local -a pkgnames
# shellcheck source=contrib/makepkg/PKGBUILD.proto
@@ -76,7 +72,6 @@ get_pkgnames_from_repo_pkgbase() {
# update the pacman repo cache if it doesn't exist yet
if [[ ! -d "${_DEVTOOLS_PACMAN_CACHE_DIR}" ]]; then
# TODO: universe includes multilib, switch for architecture
update_pacman_repo_cache universe
fi
@@ -96,23 +91,3 @@ get_pkgnames_from_repo_pkgbase() {
printf "%s\n" "${pkgnames[@]}"
return 0
}
pacman_resolve_virtual_repo_name() {
local repo=$1
local repo_class=extra
if machine_has_multilib; then
repo_class=multilib
fi
case "${repo}" in
stable)
repo=${repo_class}
;;
testing|staging)
repo="${repo_class}-${repo}"
;;
esac
printf "%s" "${repo}"
}

View File

@@ -6,7 +6,6 @@
# shellcheck disable=2034
DEVTOOLS_VALID_BINARY_ARCHES=(
x86_64
aarch64
)
# shellcheck disable=2034

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