Compare commits

...

4 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
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
Jakub Klinkovský
fc56ebedf3 fix(completion): fix bash completion for the license subcommand
Signed-off-by: Jakub Klinkovský <lahwaacz@archlinux.org>
2025-08-05 17:48:12 +02: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
5 changed files with 158 additions and 0 deletions

View File

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

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

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

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

@@ -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