From 0ea7e9e0e586d092bcc991789dbf23b5981204a3 Mon Sep 17 00:00:00 2001 From: Christian Heusel Date: Mon, 12 Jun 2023 19:14:24 +0200 Subject: chore(doc): fix spelling typo in pkgrel detection Signed-off-by: Christian Heusel Signed-off-by: Levente Polyak --- src/lib/build/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/lib') diff --git a/src/lib/build/build.sh b/src/lib/build/build.sh index 3394395..aa2293c 100644 --- a/src/lib/build/build.sh +++ b/src/lib/build/build.sh @@ -329,7 +329,7 @@ pkgctl_build() { # increment pkgrel on rebuild if (( REBUILD )); then - # try to figure out of pkgrel has been changed + # try to figure out if pkgrel has been changed if ! old_pkgrel=$(git_diff_tree HEAD PKGBUILD | grep --perl-regexp --only-matching --max-count=1 '^-pkgrel=\K\w+'); then old_pkgrel=${pkgrel} fi -- cgit v1.2.3-70-g09d2 From 720b7c9b0524fd2dfb8b811985b55237ffe2de69 Mon Sep 17 00:00:00 2001 From: Christian Heusel Date: Thu, 15 Jun 2023 11:05:12 +0200 Subject: chore(build): skip invalid architectures on autodetection This is done so that pkgctl can be better used to build aur packages which can have arch=(...) settings for which we do not have a clean chroot builder. Signed-off-by: Christian Heusel --- src/lib/build/build.sh | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'src/lib') diff --git a/src/lib/build/build.sh b/src/lib/build/build.sh index aa2293c..ecdeaad 100644 --- a/src/lib/build/build.sh +++ b/src/lib/build/build.sh @@ -129,7 +129,7 @@ pkgctl_build() { local WORKER_SLOT= # variables - local path pkgbase pkgrepo source + local loop_arch path pkgbase pkgrepo source while (( $# )); do case $1 in @@ -318,7 +318,13 @@ pkgctl_build() { if in_array any "${arch[@]}"; then BUILD_ARCH=("${_arch[0]}") else - BUILD_ARCH+=("${arch[@]}") + for loop_arch in "${arch[@]}"; do + if in_array "${loop_arch}" "${_arch[@]}"; then + BUILD_ARCH+=("$loop_arch") + else + warning 'invalid architecture, not building for: %s' "${loop_arch}" + fi + done fi fi -- cgit v1.2.3-70-g09d2 From 030e6af88063e0a03067cf2bed1e3c6dc070d333 Mon Sep 17 00:00:00 2001 From: Christian Heusel Date: Thu, 6 Jul 2023 15:30:49 +0200 Subject: chore: fix spelling mistake packge -> package it seems like the mistake was copied to a few locations, this commit fixes it. Signed-off-by: Christian Heusel --- contrib/completion/zsh/_devtools.in | 2 +- doc/man/pkgctl.1.asciidoc | 2 +- src/lib/db.sh | 2 +- src/pkgctl.in | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) (limited to 'src/lib') diff --git a/contrib/completion/zsh/_devtools.in b/contrib/completion/zsh/_devtools.in index a473bc2..bd17466 100644 --- a/contrib/completion/zsh/_devtools.in +++ b/contrib/completion/zsh/_devtools.in @@ -241,7 +241,7 @@ _pkgctl_cmds=( "pkgctl command" "auth[Authenticate with services like GitLab]" "build[Build packages inside a clean chroot]" - "db[Pacman database modification for packge update, move etc]" + "db[Pacman database modification for package update, move etc]" "diff[Compare package files using different modes]" "release[Release step to commit, tag and upload build artifacts]" "repo[Manage Git packaging repositories and their configuration]" diff --git a/doc/man/pkgctl.1.asciidoc b/doc/man/pkgctl.1.asciidoc index 72cda1e..74edf68 100644 --- a/doc/man/pkgctl.1.asciidoc +++ b/doc/man/pkgctl.1.asciidoc @@ -33,7 +33,7 @@ pkgctl build:: Build packages inside a clean chroot pkgctl db:: - Pacman database modification for packge update, move etc + Pacman database modification for package update, move etc pkgctl diff:: Compare package files using different modes diff --git a/src/lib/db.sh b/src/lib/db.sh index 397ff0d..91e4da5 100644 --- a/src/lib/db.sh +++ b/src/lib/db.sh @@ -15,7 +15,7 @@ pkgctl_db_usage() { cat <<- _EOF_ Usage: ${COMMAND} [COMMAND] [OPTIONS] - Pacman database modification for packge update, move etc + Pacman database modification for package update, move etc COMMANDS move Move packages between pacman repositories diff --git a/src/pkgctl.in b/src/pkgctl.in index 1797b32..07242a3 100644 --- a/src/pkgctl.in +++ b/src/pkgctl.in @@ -21,7 +21,7 @@ usage() { COMMANDS auth Authenticate with services like GitLab build Build packages inside a clean chroot - db Pacman database modification for packge update, move etc + db Pacman database modification for package update, move etc diff Compare package files using different modes release Release step to commit, tag and upload build artifacts repo Manage Git packaging repositories and their configuration -- cgit v1.2.3-70-g09d2 From 9f7808c26e4270370bb878de56004ddda49b7ce9 Mon Sep 17 00:00:00 2001 From: Christian Heusel Date: Thu, 27 Jul 2023 11:53:11 +0200 Subject: fix(build): installing packages into the chroot fails for relative links As the relative links are relative to the pkgctl invocations PWD and not necessarily relative to the location where makechrootpkg is invoked from this fails unexpectedly. This commit fixes this by just using the full path when passing the location to makechrootpkg. Fixes https://gitlab.archlinux.org/archlinux/devtools/-/issues/181 Signed-off-by: Christian Heusel --- src/lib/build/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/lib') diff --git a/src/lib/build/build.sh b/src/lib/build/build.sh index ecdeaad..a5a272d 100644 --- a/src/lib/build/build.sh +++ b/src/lib/build/build.sh @@ -200,7 +200,7 @@ pkgctl_build() { ;; -I|--install) (( $# <= 1 )) && die "missing argument for %s" "$1" - MAKECHROOT_OPTIONS+=("-I" "$2") + MAKECHROOT_OPTIONS+=("-I" "$(realpath "$2")") warning 'installing packages into the chroot may break reproducible builds, use with caution!' shift 2 ;; -- cgit v1.2.3-70-g09d2 From f31ea3a48ebea33f85bcd682c72848cadebb7ad1 Mon Sep 17 00:00:00 2001 From: Christian Heusel Date: Sat, 29 Jul 2023 12:05:35 +0200 Subject: fix(build): fix repo detection for special chars in package name Currently we used grep -E, in a way that special characters in the package name such as the '+' in 'ls++' also became part of the regex. This commit switches this to become a literal string matching using awk. Signed-off-by: Christian Heusel --- src/lib/util/pacman.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/lib') diff --git a/src/lib/util/pacman.sh b/src/lib/util/pacman.sh index f6c2d5f..541147c 100644 --- a/src/lib/util/pacman.sh +++ b/src/lib/util/pacman.sh @@ -44,7 +44,7 @@ get_pacman_repo_from_pkgbuild() { -S \ --print \ --print-format '%n %r' \ - "${pkgnames[0]}" | grep -E "^${pkgnames[0]} " | awk '{print $2}' + "${pkgnames[0]}" | awk '$1=="'"${pkgnames[0]}"'"{print $2}' ) lock_close 10 -- cgit v1.2.3-70-g09d2 From 547961681a1941bbe480dba3de8a1d6743965e71 Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Tue, 5 Sep 2023 00:00:56 +0200 Subject: fix(pkgctl): avoid pacman db dependency checks during repo detection By default the sync operation enables dependency checks during the preparation of the transaction. This isn't necessary for the print option, but is done nevertheless, which leads to issues for example during soname dependency problems. The result is a none functional automatic repo detection. Fix this by explicitly disabling dependency version checks. We specify this option twice to skip all dependency checks. Fixes #189 Signed-off-by: Levente Polyak --- src/lib/util/pacman.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src/lib') diff --git a/src/lib/util/pacman.sh b/src/lib/util/pacman.sh index 541147c..82a227b 100644 --- a/src/lib/util/pacman.sh +++ b/src/lib/util/pacman.sh @@ -39,9 +39,12 @@ get_pacman_repo_from_pkgbuild() { fi slock 10 "${_DEVTOOLS_PACMAN_CACHE_DIR}.lock" "Locking pacman database cache" + # query repo of passed pkgname, specify --nodeps twice to skip all dependency checks mapfile -t repos < <(pacman --config "${_DEVTOOLS_PACMAN_CONF_DIR}/multilib.conf" \ --dbpath "${_DEVTOOLS_PACMAN_CACHE_DIR}" \ - -S \ + --sync \ + --nodeps \ + --nodeps \ --print \ --print-format '%n %r' \ "${pkgnames[0]}" | awk '$1=="'"${pkgnames[0]}"'"{print $2}' -- cgit v1.2.3-70-g09d2 From f632659563acb7b8d481fdff9acd8305acf29b98 Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Tue, 26 Sep 2023 22:09:41 +0200 Subject: fix(clone): ssh connection may require user input (key unlocking etc) Anything that requires user input (such as a key unlock or hostkey verify) will block the terminal and wait for input which will never come. When cloning or configuring a repo via ssh we therefore initially connect to gitlab to warm the connection. Afterwards users are expected to either have setup a ssh ControlMaster or use something like a ssh agent. Fixes #148 Component: pkgctl repo clone/configure Co-Authored-by: Christian Heusel Signed-off-by: Christian Heusel Signed-off-by: Levente Polyak --- src/lib/repo/clone.sh | 11 +++++++++++ src/lib/repo/configure.sh | 8 ++++++++ src/lib/util/git.sh | 10 ++++++++++ 3 files changed, 29 insertions(+) (limited to 'src/lib') diff --git a/src/lib/repo/clone.sh b/src/lib/repo/clone.sh index 08bded4..fb927d2 100644 --- a/src/lib/repo/clone.sh +++ b/src/lib/repo/clone.sh @@ -12,6 +12,8 @@ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/api/gitlab.sh # shellcheck source=src/lib/repo/configure.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/repo/configure.sh +# shellcheck source=src/lib/util/git.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/git.sh source /usr/share/makepkg/util/message.sh @@ -52,6 +54,7 @@ pkgctl_repo_clone() { fi # options + local protocol=ssh local GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_SSH} local CLONE_ALL=0 local MAINTAINER= @@ -72,6 +75,7 @@ pkgctl_repo_clone() { ;; --protocol=https) GIT_REPO_BASE_URL=${GIT_PACKAGING_URL_HTTPS} + protocol=https CONFIGURE_OPTIONS+=("$1") shift ;; @@ -82,6 +86,7 @@ pkgctl_repo_clone() { else die "unsupported protocol: %s" "$2" fi + protocol="$2" CONFIGURE_OPTIONS+=("$1" "$2") shift 2 ;; @@ -171,6 +176,12 @@ pkgctl_repo_clone() { if [[ -n "${VERSION}" ]]; then command+=" --switch '${VERSION}'" fi + + # warm up ssh connection as it may require user input (key unlock, hostkey verification etc) + if [[ ${protocol} == ssh ]]; then + git_warmup_ssh_connection + fi + if ! parallel --bar --jobs "${jobs}" "${command}" ::: "${pkgbases[@]}"; then die 'Failed to clone some packages, please check the output' exit 1 diff --git a/src/lib/repo/configure.sh b/src/lib/repo/configure.sh index 73300ae..1ddb1b8 100644 --- a/src/lib/repo/configure.sh +++ b/src/lib/repo/configure.sh @@ -10,6 +10,8 @@ _DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@} source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh # shellcheck source=src/lib/api/gitlab.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/api/gitlab.sh +# shellcheck source=src/lib/util/git.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/git.sh source /usr/share/makepkg/util/config.sh source /usr/share/makepkg/util/message.sh @@ -188,6 +190,12 @@ pkgctl_repo_configure() { if [[ -n ${BOLD} ]]; then export DEVTOOLS_COLOR=always fi + + # warm up ssh connection as it may require user input (key unlock, hostkey verification etc) + if [[ ${proto} == ssh ]]; then + git_warmup_ssh_connection + fi + if ! parallel --bar --jobs "${jobs}" "${command}" ::: "${paths[@]}"; then die 'Failed to configure some packages, please check the output' exit 1 diff --git a/src/lib/util/git.sh b/src/lib/util/git.sh index c4af662..82e4beb 100644 --- a/src/lib/util/git.sh +++ b/src/lib/util/git.sh @@ -7,6 +7,9 @@ DEVTOOLS_INCLUDE_UTIL_GIT_SH=1 _DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@} +# shellcheck source=src/lib/common.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh + git_diff_tree() { local commit=$1 @@ -22,3 +25,10 @@ git_diff_tree() { "${commit}" \ -- "${path}" } + +git_warmup_ssh_connection() { + msg 'Establishing ssh connection to git@%s' "${GITLAB_HOST}" + if ! ssh -T "git@${GITLAB_HOST}" >/dev/null; then + die 'Failed to establish ssh connection to git@%s' "${GITLAB_HOST}" + fi +} -- cgit v1.2.3-70-g09d2 From 0669315821ea0af00fcc2c6271eb474174173e0a Mon Sep 17 00:00:00 2001 From: Christian Heusel Date: Fri, 21 Jul 2023 11:04:13 +0200 Subject: chore: refactor variable names in valid-{tags,repos}.sh Even though the variables in these files are globablly used they have a weirdly local sounding name. This commit fixes this by refactoring all usages throughout our codebase. Signed-off-by: Christian Heusel --- contrib/completion/bash/devtools.in | 8 ++++---- contrib/completion/zsh/_devtools.in | 20 ++++++++++---------- src/archrelease.in | 2 +- src/lib/build/build.sh | 2 +- src/lib/release.sh | 2 +- src/lib/valid-repos.sh | 4 ++-- src/lib/valid-tags.sh | 4 ++-- src/sogrep.in | 8 ++++---- 8 files changed, 25 insertions(+), 25 deletions(-) (limited to 'src/lib') diff --git a/contrib/completion/bash/devtools.in b/contrib/completion/bash/devtools.in index 3faad27..b28258f 100644 --- a/contrib/completion/bash/devtools.in +++ b/contrib/completion/bash/devtools.in @@ -8,7 +8,7 @@ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-tags.sh # shellcheck source=src/lib/valid-repos.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh -_binary_arch=${_arch[*]:0:-1} +_binary_arch=${DEVTOOLS_VALID_ARCHES[*]:0:-1} _colors=(never always auto) @@ -355,14 +355,14 @@ _devtools_completions_color() { mapfile -t COMPREPLY < <(compgen -W "${_colors[*]}" -- "$cur") } _devtools_completions_arch() { - mapfile -t COMPREPLY < <(compgen -W "${_arch[*]}" -- "$cur") + mapfile -t COMPREPLY < <(compgen -W "${DEVTOOLS_VALID_ARCHES[*]}" -- "$cur") } _devtools_completions_repo() { local optional=${1:-} - mapfile -t COMPREPLY < <(compgen -W "${optional} ${_repos[*]}" -- "$cur") + mapfile -t COMPREPLY < <(compgen -W "${optional} ${DEVTOOLS_VALID_REPOS[*]}" -- "$cur") } _devtools_completions_build_repo() { - mapfile -t COMPREPLY < <(compgen -W "${_build_repos[*]}" -- "$cur") + mapfile -t COMPREPLY < <(compgen -W "${DEVTOOLS_VALID_BUILDREPOS[*]}" -- "$cur") } _devtools_completions_all_packages() { mapfile -t COMPREPLY < <(compgen -W "$(pacman -Sql)" -- "$cur") diff --git a/contrib/completion/zsh/_devtools.in b/contrib/completion/zsh/_devtools.in index bd17466..49c4113 100644 --- a/contrib/completion/zsh/_devtools.in +++ b/contrib/completion/zsh/_devtools.in @@ -8,7 +8,7 @@ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-tags.sh # shellcheck source=src/lib/valid-repos.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh -_binary_arch=${_arch[*]:0:-1} +_binary_arch=${DEVTOOLS_VALID_ARCHES[*]:0:-1} _colors=(never always auto) _archbuild_args=( @@ -36,7 +36,7 @@ _pkgctl_auth_status_args=( _pkgctl_build_args=( "--arch=[Specify architectures to build for (disables auto-detection)]:arch:($_arch[*])" - "--repo=[Specify a target repository (disables auto-detection)]:repo:($_repos[*])" + "--repo=[Specify a target repository (disables auto-detection)]:repo:($DEVTOOLS_VALID_REPOS[*])" '(-s --staging)'{-s,--staging}'[Build against the staging counterpart of the auto-detected repo]' '(-t --testing)'{-t,--testing}'[Build against the testing counterpart of the auto-detected repo]' '(-o --offload)'{-o,--offload}'[Build on a remote server and transfer artifacts afterwards]' @@ -64,15 +64,15 @@ _pkgctl_db_cmds=( _pkgctl_db_move_args=( '(-h --help)'{-h,--help}'[Display usage]' - "1:src-repo:($_repos[*])" - "2:target-repo:($_repos[*])" + "1:src-repo:($DEVTOOLS_VALID_REPOS[*])" + "2:target-repo:($DEVTOOLS_VALID_REPOS[*])" '*:pkgbase:_devtools_completions_all_packages' ) _pkgctl_db_remove_args=( '(-a --arch=)'{-a,--arch=}"[Override the architecture (disables auto-detection)]:arch:($_arch[*])" '(-h --help)'{-h,--help}'[Display usage]' - "1:repo:($_repos[*])" + "1:repo:($DEVTOOLS_VALID_REPOS[*])" '*:pkgbase:_devtools_completions_all_packages' ) @@ -82,7 +82,7 @@ _pkgctl_db_update_args=( _pkgctl_release_args=( '(-m --message=)'{-m,--message=}"[Use the given as the commit message]:message:" - '(-r --repo=)'{-r,--repo=}"[Specify a target repository (disables auto-detection)]:repo:($_repos[*])" + '(-r --repo=)'{-r,--repo=}"[Specify a target repository (disables auto-detection)]:repo:($DEVTOOLS_VALID_REPOS[*])" '(-s --staging)'{-s,--staging}'[Release to the staging counterpart of the auto-detected repo]' '(-t --testing)'{-t,--testing}'[Release to the testing counterpart of the auto-detected repo]' '(-u --db-update)'{-u,--db-update}'[Automatically update the pacman database after uploading]' @@ -146,14 +146,14 @@ _arch_nspawn_args=( _archrelease_args=( '-f[Force release without checks]' - "*:arch:($_tags[*])" + "*:arch:($DEVTOOLS_VALID_TAGS[*])" ) _commitpkg_args=( '-f[Force release without checks]' '-s[Target repo server]' '-l[Set bandwidth limit]:limit' - "-a[Release to a specific architecture only]:arch:($_arch[*])" + "-a[Release to a specific architecture only]:arch:($DEVTOOLS_VALID_ARCHES[*])" '1:commit_msg' ) @@ -212,12 +212,12 @@ _sogrep_args=( '(-v --verbose)'{-v,--verbose}'[Show matched links in addition to pkgname]' '(-r --refresh)'{-r,--refresh}'[Refresh the links databases]' '(-h --help)'{-h,--help}'[Display usage]' - '1:repo:(all $_repos[*])' + '1:repo:(all $DEVTOOLS_VALID_REPOS[*])' '2:libname' ) _offload_build_args=( - '(-r --repo)'{-r,--repo}'[Build against a specific repository]:repo:($_build_repos[*])' + '(-r --repo)'{-r,--repo}'[Build against a specific repository]:repo:($DEVTOOLS_VALID_BUILDREPOS[*])' '(-a --arch)'{-a,--arch}'[Build against a specific architecture]:arch:(${_binary_arch[*]})' '(-s --server)'{-s,--server}'[Offload to a specific Build server]:server:' '(-h --help)'{-h,--help}'[Display usage]' diff --git a/src/archrelease.in b/src/archrelease.in index 818b0ca..84aed28 100644 --- a/src/archrelease.in +++ b/src/archrelease.in @@ -35,7 +35,7 @@ fi # validate repo is really repo-arch if [[ -z $FORCE ]]; then for tag in "$@"; do - if ! in_array "$tag" "${_tags[@]}"; then + if ! in_array "$tag" "${DEVTOOLS_VALID_TAGS[@]}"; then die "archrelease: Invalid tag: '%s' (use -f to force release)" "$tag" fi done diff --git a/src/lib/build/build.sh b/src/lib/build/build.sh index a5a272d..f2549f2 100644 --- a/src/lib/build/build.sh +++ b/src/lib/build/build.sh @@ -274,7 +274,7 @@ pkgctl_build() { if [[ -z ${REPO} ]]; then update_pacman_repo_cache # Check valid repos if not resolved dynamically - elif ! in_array "${REPO}" "${_repos[@]}"; then + elif ! in_array "${REPO}" "${DEVTOOLS_VALID_REPOS[@]}"; then die "Invalid repository target: %s" "${REPO}" fi diff --git a/src/lib/release.sh b/src/lib/release.sh index aabbd35..028d92e 100644 --- a/src/lib/release.sh +++ b/src/lib/release.sh @@ -126,7 +126,7 @@ pkgctl_release() { if [[ -z ${REPO} ]]; then update_pacman_repo_cache # Check valid repos if not resolved dynamically - elif ! in_array "${REPO}" "${_repos[@]}"; then + elif ! in_array "${REPO}" "${DEVTOOLS_VALID_REPOS[@]}"; then die "Invalid repository target: %s" "${REPO}" fi diff --git a/src/lib/valid-repos.sh b/src/lib/valid-repos.sh index 14f90ce..af8a552 100644 --- a/src/lib/valid-repos.sh +++ b/src/lib/valid-repos.sh @@ -4,7 +4,7 @@ : # shellcheck disable=2034 -_repos=( +DEVTOOLS_VALID_REPOS=( core core-staging core-testing extra extra-staging extra-testing multilib multilib-staging multilib-testing @@ -13,7 +13,7 @@ _repos=( ) # shellcheck disable=2034 -_build_repos=( +DEVTOOLS_VALID_BUILDREPOS=( core-staging core-testing extra extra-staging extra-testing multilib multilib-staging multilib-testing diff --git a/src/lib/valid-tags.sh b/src/lib/valid-tags.sh index ca8d7d7..cef0cc6 100644 --- a/src/lib/valid-tags.sh +++ b/src/lib/valid-tags.sh @@ -4,13 +4,13 @@ : # shellcheck disable=2034 -_arch=( +DEVTOOLS_VALID_ARCHES=( x86_64 any ) # shellcheck disable=2034 -_tags=( +DEVTOOLS_VALID_TAGS=( core-x86_64 core-any core-staging-x86_64 core-staging-any core-testing-x86_64 core-testing-any diff --git a/src/sogrep.in b/src/sogrep.in index 0ee05cc..9f51e53 100644 --- a/src/sogrep.in +++ b/src/sogrep.in @@ -31,7 +31,7 @@ recache() { (( VERBOSE )) && verbosity=--progress-bar - for repo in "${_repos[@]}"; do + for repo in "${DEVTOOLS_VALID_REPOS[@]}"; do if [[ -n "$SOLINKS_MIRROR" ]]; then mirror="$SOLINKS_MIRROR" elif ! mirror="$(set -o pipefail; pacman-conf --repo "$repo" Server 2>/dev/null | head -n1)"; then @@ -72,7 +72,7 @@ is_outdated_cache() { # links databases are generated at about the same time every day; we should # attempt to check for new database files if any of them are over a day old - for repo in "${_repos[@]}"; do + for repo in "${DEVTOOLS_VALID_REPOS[@]}"; do for arch in "${arches[@]}"; do local dbpath=${SOCACHE_DIR}/${arch}/${repo}.links.tar.gz if [[ ! -f ${dbpath} ]] || [[ $(find "${dbpath}" -mtime +0) ]]; then @@ -85,10 +85,10 @@ is_outdated_cache() { } search() { - local repo=$1 arch lib=$2 srepos=("${_repos[@]}") + local repo=$1 arch lib=$2 srepos=("${DEVTOOLS_VALID_REPOS[@]}") if [[ $repo != all ]]; then - if ! in_array "${repo}" "${_repos[@]}"; then + if ! in_array "${repo}" "${DEVTOOLS_VALID_REPOS[@]}"; then echo "${BASH_SOURCE[0]##*/}: unrecognized repo '$repo'" echo "Try '${BASH_SOURCE[0]##*/} --help' for more information." exit 1 -- cgit v1.2.3-70-g09d2 From 6f106e7cd6c19d8666d25676afc8dcc5975d124b Mon Sep 17 00:00:00 2001 From: Christian Heusel Date: Fri, 21 Jul 2023 11:37:27 +0200 Subject: chore: refactor loop variable name Component: pkgctl build Signed-off-by: Christian Heusel --- src/lib/build/build.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src/lib') diff --git a/src/lib/build/build.sh b/src/lib/build/build.sh index f2549f2..d6b530d 100644 --- a/src/lib/build/build.sh +++ b/src/lib/build/build.sh @@ -129,7 +129,7 @@ pkgctl_build() { local WORKER_SLOT= # variables - local loop_arch path pkgbase pkgrepo source + local _arch path pkgbase pkgrepo source while (( $# )); do case $1 in @@ -318,11 +318,11 @@ pkgctl_build() { if in_array any "${arch[@]}"; then BUILD_ARCH=("${_arch[0]}") else - for loop_arch in "${arch[@]}"; do - if in_array "${loop_arch}" "${_arch[@]}"; then - BUILD_ARCH+=("$loop_arch") + for _arch in "${arch[@]}"; do + if in_array "${_arch}" "${_arch[@]}"; then + BUILD_ARCH+=("$_arch") else - warning 'invalid architecture, not building for: %s' "${loop_arch}" + warning 'invalid architecture, not building for: %s' "${_arch}" fi done fi -- cgit v1.2.3-70-g09d2 From 5cbe9ad61296c91251299bcb0f32aa2e0b3dd5ea Mon Sep 17 00:00:00 2001 From: Antonio Rojas Date: Fri, 13 Oct 2023 20:13:31 +0000 Subject: fix(build): allow using --install and --offload simultaneously Don't take the full (local) path of the package to install when using --offload. Fixes #194 Component: pkgctl build --- src/lib/build/build.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'src/lib') diff --git a/src/lib/build/build.sh b/src/lib/build/build.sh index d6b530d..bf6339a 100644 --- a/src/lib/build/build.sh +++ b/src/lib/build/build.sh @@ -200,7 +200,11 @@ pkgctl_build() { ;; -I|--install) (( $# <= 1 )) && die "missing argument for %s" "$1" - MAKECHROOT_OPTIONS+=("-I" "$(realpath "$2")") + if (( OFFLOAD )); then + MAKECHROOT_OPTIONS+=("-I" "$2") + else + MAKECHROOT_OPTIONS+=("-I" "$(realpath "$2")") + fi warning 'installing packages into the chroot may break reproducible builds, use with caution!' shift 2 ;; -- cgit v1.2.3-70-g09d2 From e0ab20d05c7cf1807194d40b222970700f9f92fc Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Tue, 17 Oct 2023 23:23:36 +0200 Subject: fix(build): use correct variable to reference available architectures The referenced places were missing in a previous refactoring commit and hence broke the build command in multiple ways. Fixes 0669315821ea0af00fcc2c6271eb474174173e0a --- src/lib/build/build.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src/lib') diff --git a/src/lib/build/build.sh b/src/lib/build/build.sh index bf6339a..455f38a 100644 --- a/src/lib/build/build.sh +++ b/src/lib/build/build.sh @@ -146,11 +146,11 @@ pkgctl_build() { --arch) (( $# <= 1 )) && die "missing argument for %s" "$1" if [[ ${2} == all ]]; then - BUILD_ARCH=("${_arch[@]::${#_arch[@]}-1}") + BUILD_ARCH=("${DEVTOOLS_VALID_ARCHES[@]::${#DEVTOOLS_VALID_ARCHES[@]}-1}") elif [[ ${2} == any ]]; then - BUILD_ARCH=("${_arch[0]}") + BUILD_ARCH=("${DEVTOOLS_VALID_ARCHES[0]}") elif ! in_array "${2}" "${BUILD_ARCH[@]}"; then - if ! in_array "${2}" "${_arch[@]}"; then + if ! in_array "${2}" "${DEVTOOLS_VALID_ARCHES[@]}"; then die 'invalid architecture: %s' "${2}" fi BUILD_ARCH+=("${2}") @@ -320,10 +320,10 @@ pkgctl_build() { BUILD_ARCH=("") elif (( ${#BUILD_ARCH[@]} == 0 )); then if in_array any "${arch[@]}"; then - BUILD_ARCH=("${_arch[0]}") + BUILD_ARCH=("${DEVTOOLS_VALID_ARCHES[0]}") else for _arch in "${arch[@]}"; do - if in_array "${_arch}" "${_arch[@]}"; then + if in_array "${_arch}" "${DEVTOOLS_VALID_ARCHES[@]}"; then BUILD_ARCH+=("$_arch") else warning 'invalid architecture, not building for: %s' "${_arch}" -- cgit v1.2.3-70-g09d2 From e7b82f36ef586127453e8c68660e0ef7826d0127 Mon Sep 17 00:00:00 2001 From: Christian Heusel Date: Tue, 25 Jul 2023 11:19:11 +0200 Subject: feat(build): add --updpkgsums option This is useful so people who update patches etc. can update their checksums on building. The functionality itself was already implemented for --pkgver, but was not available separately. Fixes #168 Component: pkgctl build Signed-off-by: Christian Heusel --- contrib/completion/bash/devtools.in | 1 + contrib/completion/zsh/_devtools.in | 1 + doc/man/pkgctl-build.1.asciidoc | 3 +++ src/lib/build/build.sh | 5 +++++ 4 files changed, 10 insertions(+) (limited to 'src/lib') diff --git a/contrib/completion/bash/devtools.in b/contrib/completion/bash/devtools.in index b28258f..e0fca51 100644 --- a/contrib/completion/bash/devtools.in +++ b/contrib/completion/bash/devtools.in @@ -173,6 +173,7 @@ _pkgctl_build_args=( --pkgver --pkgrel --rebuild + --updpkgsums -e --edit -r --release diff --git a/contrib/completion/zsh/_devtools.in b/contrib/completion/zsh/_devtools.in index 49c4113..d3d6df0 100644 --- a/contrib/completion/zsh/_devtools.in +++ b/contrib/completion/zsh/_devtools.in @@ -47,6 +47,7 @@ _pkgctl_build_args=( '--pkgver=[Set pkgver, reset pkgrel and update checksums]:pkgver:' '--pkgrel=[Set pkgrel to a given value]:pkgrel:' '--rebuild[Increment the pkgrel variable]' + '--updpkgsums[Regenerate the checksums]' '(-e --edit)'{-e,--edit}'[Edit the PKGBUILD before building]' '(-r --release)'{-r,--release}'[Automatically commit, tag and release after building]' '(-m --message=)'{-m,--message=}"[Use the given as the commit message]:message:" diff --git a/doc/man/pkgctl-build.1.asciidoc b/doc/man/pkgctl-build.1.asciidoc index f68e7cf..2637ebc 100644 --- a/doc/man/pkgctl-build.1.asciidoc +++ b/doc/man/pkgctl-build.1.asciidoc @@ -59,6 +59,9 @@ PKGBUILD Options *--rebuild*:: Increment the current pkgrel variable +*--updpkgsums*:: + Regenerate the checksums + *-e, --edit*:: Edit the PKGBUILD before building diff --git a/src/lib/build/build.sh b/src/lib/build/build.sh index 455f38a..8d58b63 100644 --- a/src/lib/build/build.sh +++ b/src/lib/build/build.sh @@ -55,6 +55,7 @@ pkgctl_build_usage() { --pkgver=PKGVER Set pkgver, reset pkgrel and update checksums --pkgrel=PKGREL Set pkgrel to a given value --rebuild Increment the current pkgrel variable + --updpkgsums Regenerate the checksums -e, --edit Edit the PKGBUILD before building RELEASE OPTIONS @@ -169,6 +170,10 @@ pkgctl_build() { PKGREL="${1#*=}" shift ;; + --updpkgsums) + UPDPKGSUMS=1 + shift + ;; --rebuild) # shellcheck source=src/lib/util/git.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/git.sh -- cgit v1.2.3-70-g09d2 From cc369e86d2e060d8b65c7dbbb0c933d18f8aa6b0 Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Thu, 23 Mar 2023 23:38:29 +0100 Subject: feat(makechrootpkg): add option to interactively inspect the chroot Implement the -x option for makechrootpkg which allows to get an interactive shell in the chroot after building the package. Useful to ease the debugging of a package build. Depending on the argument, the interactive shell is either always spawned or only when an error occurred during build. This option is also forwarded from `pkgctl build` via the `--inspect` flag. Component: pkgctl build Component: makechrootpkg Signed-off-by: Levente Polyak --- contrib/completion/bash/devtools.in | 9 +++++++++ contrib/completion/zsh/_devtools.in | 4 ++++ doc/man/makechrootpkg.1.asciidoc | 4 ++++ doc/man/pkgctl-build.1.asciidoc | 4 ++++ src/lib/build/build.sh | 11 +++++++++++ src/lib/valid-inspect.sh | 10 ++++++++++ src/makechrootpkg.in | 38 ++++++++++++++++++++++++++++++++----- 7 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 src/lib/valid-inspect.sh (limited to 'src/lib') diff --git a/contrib/completion/bash/devtools.in b/contrib/completion/bash/devtools.in index e0fca51..b347b31 100644 --- a/contrib/completion/bash/devtools.in +++ b/contrib/completion/bash/devtools.in @@ -7,6 +7,8 @@ _DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@} source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-tags.sh # shellcheck source=src/lib/valid-repos.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh +# shellcheck source=src/lib/valid-inspect.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-inspect.sh _binary_arch=${DEVTOOLS_VALID_ARCHES[*]:0:-1} _colors=(never always auto) @@ -24,6 +26,7 @@ _makechrootpkg_args=( -n -T -U + -x ) _makechrootpkg_args_d_opts() { _filedir -d; } _makechrootpkg_args_D_opts() { _filedir -d; } @@ -31,6 +34,7 @@ _makechrootpkg_args_r_opts() { _filedir -d; } _makechrootpkg_args_I_opts() { _filedir '*.pkg.tar.*'; } _makechrootpkg_args_l_opts() { _filedir -d; } _makechrootpkg_args_U_opts() { :; } +_makechrootpkg_args_x_opts() { _devtools_completions_inspect; } _makechrootpkg() { __devtools_complete _makechrootpkg; } complete -F _makechrootpkg makechrootpkg @@ -169,6 +173,7 @@ _pkgctl_build_args=( -o --offload -c --clean -w --worker + --inspect --pkgver --pkgrel @@ -186,6 +191,7 @@ _pkgctl_build_args__arch_opts() { _devtools_completions_arch; } _pkgctl_build_args__repo_opts() { _devtools_completions_repo; } _pkgctl_build_args__worker_opts() { :; } _pkgctl_build_args_w_opts() { _pkgctl_build_args__worker_opts; } +_pkgctl_build_args__inspect_opts() { _devtools_completions_inspect; } _pkgctl_build_args__pkgver_opts() { :; } _pkgctl_build_args__pkgrel_opts() { :; } _pkgctl_build_args__message_opts() { :; } @@ -371,6 +377,9 @@ _devtools_completions_all_packages() { _devtools_completions_protocol() { mapfile -t COMPREPLY < <(compgen -W "https" -- "$cur") } +_devtools_completions_inspect() { + mapfile -t COMPREPLY < <(compgen -W "${DEVTOOLS_VALID_INSPECT_MODES[*]}" -- "$cur") +} __devtools_complete() { local service=$1 diff --git a/contrib/completion/zsh/_devtools.in b/contrib/completion/zsh/_devtools.in index d3d6df0..feeb2c2 100644 --- a/contrib/completion/zsh/_devtools.in +++ b/contrib/completion/zsh/_devtools.in @@ -7,6 +7,8 @@ _DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@} source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-tags.sh # shellcheck source=src/lib/valid-repos.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh +# shellcheck source=src/lib/valid-inspect.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-inspect.sh _binary_arch=${DEVTOOLS_VALID_ARCHES[*]:0:-1} _colors=(never always auto) @@ -42,6 +44,7 @@ _pkgctl_build_args=( '(-o --offload)'{-o,--offload}'[Build on a remote server and transfer artifacts afterwards]' '(-c --clean)'{-c,--clean}'[Recreate the chroot before building]' '(-I --install)'{-I,--install}'[Install a package into the working copy of the chroot]:target:_files -g "*.pkg.tar.*(.)"' + "--inspect[Spawn an interactive shell to inspect the chroot (never, always, failure)]:inspect:($DEVTOOLS_VALID_INSPECT_MODES[*])" '(-w --worker)'{-w,--worker}'[Name of the worker slot, useful for concurrent builds (disables auto-detection)]:slot:' '--nocheck[Do not run the check() function in the PKGBUILD]' '--pkgver=[Set pkgver, reset pkgrel and update checksums]:pkgver:' @@ -190,6 +193,7 @@ _makechrootpkg_args=( '-n[Run namcap on the package]' '-T[Build in a temporary directory]' '-U[Run makepkg as a specified user]:makepkg_user' + "-x[Spawn an interactive shell to inspect the chroot (never, always, failure)]:inspect:($DEVTOOLS_VALID_INSPECT_MODES[*])" ) _mkarchroot_args=( diff --git a/doc/man/makechrootpkg.1.asciidoc b/doc/man/makechrootpkg.1.asciidoc index 12d32f1..3aa1be5 100644 --- a/doc/man/makechrootpkg.1.asciidoc +++ b/doc/man/makechrootpkg.1.asciidoc @@ -73,4 +73,8 @@ Options *-U*:: Run makepkg as a specified user +*-x* :: + Inspect chroot after build, possible modes are 'never' (default), 'always' or 'failure' + + include::include/footer.asciidoc[] diff --git a/doc/man/pkgctl-build.1.asciidoc b/doc/man/pkgctl-build.1.asciidoc index 2637ebc..3f2d44e 100644 --- a/doc/man/pkgctl-build.1.asciidoc +++ b/doc/man/pkgctl-build.1.asciidoc @@ -38,6 +38,10 @@ Build Options *-I, --install* 'FILE':: Install a package into the working copy of the chroot +*--inspect* 'WHEN':: + Spawn an interactive shell to inspect the chroot after building. Useful to ease the debugging of a package build. + + Possible values for 'WHEN' are `'never'`, `'always'` or `'failure'` + *-w, --worker* 'SLOT':: Name of the worker slot, useful for concurrent builds. By default the slot is automatically assigned to the current tty pts number. In case the caller diff --git a/src/lib/build/build.sh b/src/lib/build/build.sh index 8d58b63..2b9d4cf 100644 --- a/src/lib/build/build.sh +++ b/src/lib/build/build.sh @@ -20,6 +20,8 @@ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/pacman.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh # shellcheck source=src/lib/valid-tags.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-tags.sh +# shellcheck source=src/lib/valid-inspect.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-inspect.sh source /usr/share/makepkg/util/config.sh source /usr/share/makepkg/util/message.sh @@ -48,6 +50,7 @@ pkgctl_build_usage() { -o, --offload Build on a remote server and transfer artifacts afterwards -c, --clean Recreate the chroot before building -I, --install FILE Install a package into the working copy of the chroot + --inspect WHEN Spawn an interactive shell to inspect the chroot (never, always, failure) -w, --worker SLOT Name of the worker slot, useful for concurrent builds (disables automatic names) --nocheck Do not run the check() function in the PKGBUILD @@ -218,6 +221,14 @@ pkgctl_build() { warning 'not running checks is disallowed for official packages, except for bootstrapping. Please rebuild after bootstrapping is completed!' shift ;; + --inspect) + (( $# <= 1 )) && die "missing argument for %s" "$1" + if ! in_array "${2}" "${DEVTOOLS_VALID_INSPECT_MODES[@]}"; then + die "Invalid inspect mode: %s" "${2}" + fi + MAKECHROOT_OPTIONS+=("-x" "${2}") + shift 2 + ;; -r|--release) # shellcheck source=src/lib/release.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/release.sh diff --git a/src/lib/valid-inspect.sh b/src/lib/valid-inspect.sh new file mode 100644 index 0000000..3b5dcad --- /dev/null +++ b/src/lib/valid-inspect.sh @@ -0,0 +1,10 @@ +#!/hint/bash +# +# SPDX-License-Identifier: GPL-3.0-or-later + +# shellcheck disable=2034 +DEVTOOLS_VALID_INSPECT_MODES=( + never + always + failure +) diff --git a/src/makechrootpkg.in b/src/makechrootpkg.in index 2cfd849..14b8f11 100644 --- a/src/makechrootpkg.in +++ b/src/makechrootpkg.in @@ -8,9 +8,12 @@ _DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@} source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh # shellcheck source=src/lib/archroot.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/archroot.sh +# shellcheck source=src/lib/valid-inspect.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-inspect.sh source /usr/share/makepkg/util/config.sh +source /usr/share/makepkg/util/util.sh shopt -s nullglob @@ -31,6 +34,8 @@ run_checkpkg=0 temp_chroot=0 tmp_opts="nosuid,nodev,size=50%,nr_inodes=2m" +inspect=never + bindmounts_ro=() bindmounts_rw=() @@ -76,6 +81,7 @@ usage() { echo '-C Run checkpkg on the package' echo '-T Build in a temporary directory' echo '-U Run makepkg as a specified user' + echo '-x Inspect chroot after build (never, always, failure)' exit 1 } @@ -280,7 +286,7 @@ move_products() { } # }}} -while getopts 'hcur:I:l:nCTD:d:U:' arg; do +while getopts 'hcur:I:l:nCTD:d:U:x:' arg; do case "$arg" in c) clean_first=1 ;; D) bindmounts_ro+=("--bind-ro=$OPTARG") ;; @@ -293,6 +299,7 @@ while getopts 'hcur:I:l:nCTD:d:U:' arg; do C) run_checkpkg=1 ;; T) temp_chroot=1; copy+="-$$" ;; U) makepkg_user="$OPTARG" ;; + x) inspect="$OPTARG" ;; h|*) usage ;; esac done @@ -314,6 +321,10 @@ else copydir="$chrootdir/$copy" fi +if ! in_array "${inspect}" "${DEVTOOLS_VALID_INSPECT_MODES[@]}"; then + die "Invalid inspect mode: %s" "${inspect}" +fi + # Pass all arguments after -- right to makepkg makepkg_args+=("${@:$OPTIND}") @@ -368,11 +379,16 @@ download_sources prepare_chroot +nspawn_build_args=( + --bind="${PWD//:/\\:}:/startdir" + --bind="${SRCDEST//:/\\:}:/srcdest" + --tmpfs="/tmp:${tmp_opts}" + "${bindmounts_ro[@]}" + "${bindmounts_rw[@]}" +) + if arch-nspawn "$copydir" \ - --bind="${PWD//:/\\:}:/startdir" \ - --bind="${SRCDEST//:/\\:}:/srcdest" \ - --tmpfs="/tmp:${tmp_opts}" \ - "${bindmounts_ro[@]}" "${bindmounts_rw[@]}" \ + "${nspawn_build_args[@]}" \ /chrootbuild "${makepkg_args[@]}" then mapfile -t pkgnames < <(sudo -u "$makepkg_user" bash -c 'source PKGBUILD; printf "%s\n" "${pkgname[@]}"') @@ -382,6 +398,18 @@ else move_logfiles fi +if [[ $inspect == always ]] || ( [[ $inspect == failure ]] && (( ret != 0 )) ); then + if (( ret == 0 )); then + msg "Build succeeded, inspecting %s" "$copydir" + else + error "Build failed, inspecting %s" "$copydir" + fi + arch-nspawn "$copydir" \ + "${nspawn_build_args[@]}" \ + --user=builduser \ + --chdir=/build +fi + (( temp_chroot )) && delete_chroot "$copydir" "$copy" if (( ret != 0 )); then -- cgit v1.2.3-70-g09d2 From 9a356eae828ce0e75d49e3efdb42bac089eb528a Mon Sep 17 00:00:00 2001 From: Christian Heusel Date: Sat, 2 Sep 2023 12:31:12 +0200 Subject: feat(web): implement option to print the URL instead of opening it In certain situations, users may encounter limitations when unable to utilize xdg-open (e.g., when connected to an Arch machine via SSH). Consequently, this commit introduces the option to simply print the repository link to copy or click on it. Signed-off-by: Christian Heusel Signed-off-by: Levente Polyak --- contrib/completion/bash/devtools.in | 1 + contrib/completion/zsh/_devtools.in | 1 + doc/man/pkgctl-repo-web.1.asciidoc | 3 +++ src/lib/repo/web.sh | 23 ++++++++++++++++++++--- 4 files changed, 25 insertions(+), 3 deletions(-) (limited to 'src/lib') diff --git a/contrib/completion/bash/devtools.in b/contrib/completion/bash/devtools.in index 78f0741..83264ce 100644 --- a/contrib/completion/bash/devtools.in +++ b/contrib/completion/bash/devtools.in @@ -325,6 +325,7 @@ _pkgctl_repo_switch_opts() { _pkgctl_repo_web_args=( + --print -h --help ) _pkgctl_repo_web_opts() { _filedir -d; } diff --git a/contrib/completion/zsh/_devtools.in b/contrib/completion/zsh/_devtools.in index 372f07b..b82ece4 100644 --- a/contrib/completion/zsh/_devtools.in +++ b/contrib/completion/zsh/_devtools.in @@ -134,6 +134,7 @@ _pkgctl_repo_create_args=( ) _pkgctl_repo_web_args=( + '--print[Print the url instead of opening it with xdg-open]' '(-h --help)'{-h,--help}'[Display usage]' '*:git_dir:_files -/' ) diff --git a/doc/man/pkgctl-repo-web.1.asciidoc b/doc/man/pkgctl-repo-web.1.asciidoc index 8769be7..ba7106a 100644 --- a/doc/man/pkgctl-repo-web.1.asciidoc +++ b/doc/man/pkgctl-repo-web.1.asciidoc @@ -18,6 +18,9 @@ no arguments, open the package cloned in the current working directory. Options ------- +*--print*:: + Print the url instead of opening it with xdg-open + *-h, --help*:: Show a help text diff --git a/src/lib/repo/web.sh b/src/lib/repo/web.sh index 45ea53b..ab3d8c7 100644 --- a/src/lib/repo/web.sh +++ b/src/lib/repo/web.sh @@ -23,6 +23,7 @@ pkgctl_repo_web_usage() { no arguments, open the package cloned in the current working directory. OPTIONS + --print Print the url instead of opening it with xdg-open -h, --help Show this help text EXAMPLES @@ -32,7 +33,8 @@ _EOF_ pkgctl_repo_web() { local pkgbases=() - local path giturl pkgbase + local path giturl pkgbase url + local mode=open # option checking while (( $# )); do @@ -41,6 +43,10 @@ pkgctl_repo_web() { pkgctl_repo_web_usage exit 0 ;; + --print) + mode=print + shift + ;; --) shift break @@ -56,7 +62,7 @@ pkgctl_repo_web() { done # Check if web mode has xdg-open - if ! command -v xdg-open &>/dev/null; then + if [[ ${mode} == open ]] && ! command -v xdg-open &>/dev/null; then die "The web command requires 'xdg-open'" fi @@ -78,7 +84,18 @@ pkgctl_repo_web() { fi for pkgbase in "${pkgbases[@]}"; do + pkgbase=$(basename "${pkgbase}") path=$(gitlab_project_name_to_path "${pkgbase}") - xdg-open "${GIT_PACKAGING_URL_HTTPS}/${path}" + url="${GIT_PACKAGING_URL_HTTPS}/${path}" + case ${mode} in + open) + xdg-open "${url}" + ;; + print) + printf "%s\n" "${url}" + ;; + *) + die "Unknown mode: ${mode}" + esac done } -- cgit v1.2.3-70-g09d2 From f2cafa3cb0941be8235025434620adbf5849a432 Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Sun, 3 Dec 2023 19:46:09 +0100 Subject: feat(clone): speedup maintainer and universe clone query There is a single endpoint now to list all pkgbases and their current maintainers. Use this endpoint for speeding up the clone of all packages of a maintainer by only issuing a single API call. Component: pkgctl repo clone Signed-off-by: Levente Polyak --- src/lib/api/archweb.sh | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib/common.sh | 15 +++++++++++++ src/lib/repo/clone.sh | 30 ++++++++------------------ src/pkgctl.in | 2 ++ 4 files changed, 83 insertions(+), 21 deletions(-) create mode 100644 src/lib/api/archweb.sh (limited to 'src/lib') diff --git a/src/lib/api/archweb.sh b/src/lib/api/archweb.sh new file mode 100644 index 0000000..34c7a9c --- /dev/null +++ b/src/lib/api/archweb.sh @@ -0,0 +1,57 @@ +#!/hint/bash +# +# SPDX-License-Identifier: GPL-3.0-or-later + +[[ -z ${DEVTOOLS_INCLUDE_API_ARCHWEB_SH:-} ]] || return 0 +DEVTOOLS_INCLUDE_API_ARCHWEB_SH=1 + +_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@} +# shellcheck source=src/lib/common.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh + +set -e +set -o pipefail + + +archweb_query_all_packages() { + [[ -z ${WORKDIR:-} ]] && setup_workdir + + stat_busy "Query all released packages" + mapfile -t pkgbases < <( + curl --location --show-error --no-progress-meter --fail --retry 3 --retry-delay 3 \ + "${PKGBASE_MAINTAINER_URL}" 2> "${WORKDIR}/error" \ + | jq --raw-output --exit-status 'keys[]' 2> "${WORKDIR}/error" + ) + if ! wait $!; then + stat_failed + print_workdir_error + return 1 + fi + stat_done + + printf "%s\n" "${pkgbases[@]}" + return 0 +} + + +archweb_query_maintainer_packages() { + local maintainer=$1 + + [[ -z ${WORKDIR:-} ]] && setup_workdir + + stat_busy "Query maintainer packages" + mapfile -t pkgbases < <( + curl --location --show-error --no-progress-meter --fail --retry 3 --retry-delay 3 \ + "${PKGBASE_MAINTAINER_URL}" 2> "${WORKDIR}/error" \ + | jq --raw-output --exit-status '. as $parent | keys[] | select(. as $key | $parent[$key] | index("'"${maintainer}"'"))' 2> "${WORKDIR}/error" + ) + if ! wait $!; then + stat_failed + print_workdir_error + return 1 + fi + stat_done + + printf "%s\n" "${pkgbases[@]}" + return 0 +} diff --git a/src/lib/common.sh b/src/lib/common.sh index 3d1ee56..7589120 100644 --- a/src/lib/common.sh +++ b/src/lib/common.sh @@ -28,6 +28,7 @@ export GIT_PACKAGING_NAMESPACE_ID=11323 export GIT_PACKAGING_URL_SSH="git@${GITLAB_HOST}:${GIT_PACKAGING_NAMESPACE}" export GIT_PACKAGING_URL_HTTPS="https://${GITLAB_HOST}/${GIT_PACKAGING_NAMESPACE}" export PACKAGING_REPO_RELEASE_HOST=repos.archlinux.org +export PKGBASE_MAINTAINER_URL=https://archlinux.org/packages/pkgbase-maintainer # check if messages are to be printed using color if [[ -t 2 && "$TERM" != dumb ]] || [[ ${DEVTOOLS_COLOR} == always ]]; then @@ -53,6 +54,11 @@ stat_done() { printf "${BOLD}done${ALL_OFF}\n" >&2 } +stat_failed() { + # shellcheck disable=2059 + printf "${BOLD}${RED}failed${ALL_OFF}\n" >&2 +} + msg_success() { local msg=$1 local padding @@ -77,6 +83,15 @@ msg_warn() { printf "%s %s\n" "${padding}${YELLOW}!${ALL_OFF}" "${msg}" >&2 } +print_workdir_error() { + if [[ ! -f "${WORKDIR}"/error ]]; then + return + fi + while read -r LINE; do + error '%s' "${LINE}" + done < "${WORKDIR}/error" +} + _setup_workdir=false setup_workdir() { [[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX") diff --git a/src/lib/repo/clone.sh b/src/lib/repo/clone.sh index fb927d2..ef6a0e2 100644 --- a/src/lib/repo/clone.sh +++ b/src/lib/repo/clone.sh @@ -8,6 +8,8 @@ DEVTOOLS_INCLUDE_REPO_CLONE_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/api/archweb.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/api/archweb.sh # shellcheck source=src/lib/api/gitlab.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/api/gitlab.sh # shellcheck source=src/lib/repo/configure.sh @@ -18,6 +20,7 @@ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/git.sh source /usr/share/makepkg/util/message.sh set -e +set -o pipefail pkgctl_repo_clone_usage() { @@ -137,33 +140,18 @@ pkgctl_repo_clone() { # Query packages of a maintainer if [[ -n ${MAINTAINER} ]]; then - stat_busy "Query packages" - max_pages=$(curl --silent --location --fail --retry 3 --retry-delay 3 "https://archlinux.org/packages/search/json/?sort=name&maintainer=${MAINTAINER}" | jq -r '.num_pages') - if [[ ! ${max_pages} =~ ([[:digit:]]) ]]; then - stat_done - warning "found no packages for maintainer ${MAINTAINER}" - exit 0 + mapfile -t pkgbases < <(archweb_query_maintainer_packages "${MAINTAINER}") + if ! wait $!; then + die "Failed to query maintainer packages" fi - mapfile -t pkgbases < <(for page in $(seq "${max_pages}"); do - curl --silent --location --fail --retry 3 --retry-delay 3 "https://archlinux.org/packages/search/json/?sort=name&maintainer=${MAINTAINER}&page=${page}" | jq -r '.results[].pkgbase' - stat_progress - done | sort --unique) - stat_done fi # Query all released packages if (( CLONE_ALL )); then - stat_busy "Query all released packages" - max_pages=$(curl --silent --location --fail --retry 3 --retry-delay 3 "https://archlinux.org/packages/search/json/?sort=name" | jq -r '.num_pages') - if [[ ! ${max_pages} =~ ([[:digit:]]) ]]; then - stat_done - die "failed to query packages" + mapfile -t pkgbases < <(archweb_query_all_packages) + if ! wait $!; then + die "Failed to query all packages" fi - mapfile -t pkgbases < <(for page in $(seq "${max_pages}"); do - curl --silent --location --fail --retry 3 --retry-delay 3 "https://archlinux.org/packages/search/json/?sort=name&page=${page}" | jq -r '.results[].pkgbase' - stat_progress - done | sort --unique) - stat_done fi # parallelization diff --git a/src/pkgctl.in b/src/pkgctl.in index 07242a3..ad215ac 100644 --- a/src/pkgctl.in +++ b/src/pkgctl.in @@ -39,6 +39,8 @@ fi export _DEVTOOLS_COMMAND='pkgctl' +setup_workdir + load_devtools_config # command checking -- cgit v1.2.3-70-g09d2 From d00a2b989044fe452792e108a15b6c901a1a1d4c Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Sun, 11 Jun 2023 23:31:18 +0200 Subject: feat(configure): ship default ignore via exclude BREAKING CHANGE: Increments the repo spec version which requires to reconfigure all existing packaging repo clones. Fixes #129 Component: pkgctl repo configure Signed-off-by: Levente Polyak --- Makefile | 8 +++++++- config/git/template/hooks/applypatch-msg | 1 + config/git/template/hooks/commit-msg | 1 + config/git/template/hooks/post-applypatch | 1 + config/git/template/hooks/post-checkout | 1 + config/git/template/hooks/post-commit | 1 + config/git/template/hooks/post-merge | 1 + config/git/template/hooks/pre-applypatch | 1 + config/git/template/hooks/pre-commit | 1 + config/git/template/hooks/pre-merge-commit | 1 + config/git/template/hooks/pre-push | 1 + config/git/template/hooks/pre-rebase | 1 + config/git/template/hooks/prepare-commit-msg | 1 + config/git/template/info/exclude | 28 ++++++++++++++++++++++++++++ doc/man/pkgctl-repo-configure.1.asciidoc | 2 ++ src/commitpkg.in | 6 ++++++ src/lib/common.sh | 2 +- src/lib/repo/configure.sh | 25 ++++++++++++++++++++++++- 18 files changed, 80 insertions(+), 3 deletions(-) create mode 100755 config/git/template/hooks/applypatch-msg create mode 100755 config/git/template/hooks/commit-msg create mode 100755 config/git/template/hooks/post-applypatch create mode 100755 config/git/template/hooks/post-checkout create mode 100755 config/git/template/hooks/post-commit create mode 100755 config/git/template/hooks/post-merge create mode 100755 config/git/template/hooks/pre-applypatch create mode 100755 config/git/template/hooks/pre-commit create mode 100755 config/git/template/hooks/pre-merge-commit create mode 100755 config/git/template/hooks/pre-push create mode 100755 config/git/template/hooks/pre-rebase create mode 100755 config/git/template/hooks/prepare-commit-msg create mode 100644 config/git/template/info/exclude (limited to 'src/lib') diff --git a/Makefile b/Makefile index 36f1b9b..afdb602 100644 --- a/Makefile +++ b/Makefile @@ -16,6 +16,7 @@ LIBRARY_SRC = $(call rwildcard,src/lib,*.sh) LIBRARY = $(addprefix $(BUILDDIR)/,$(patsubst src/%,%,$(patsubst %.in,%,$(LIBRARY_SRC)))) MAKEPKG_CONFIGS=$(wildcard config/makepkg/*) PACMAN_CONFIGS=$(wildcard config/pacman/*) +GIT_CONFIGS = $(wildcard config/git/*) SETARCH_ALIASES = $(wildcard config/setarch-aliases.d/*) MANS = $(addprefix $(BUILDDIR)/,$(patsubst %.asciidoc,%,$(wildcard doc/man/*.asciidoc))) @@ -97,9 +98,12 @@ $(BUILDDIR)/doc/man/%: doc/man/%.asciidoc doc/asciidoc.conf doc/man/include/foot @a2x --no-xmllint --asciidoc-opts="-f doc/asciidoc.conf" -d manpage -f manpage --destination-dir=$(BUILDDIR)/doc/man -a pkgdatadir=$(DATADIR) $< conf: - @install -d $(BUILDDIR)/makepkg.conf.d $(BUILDDIR)/pacman.conf.d + @install -d $(BUILDDIR)/makepkg.conf.d @cp -a $(MAKEPKG_CONFIGS) $(BUILDDIR)/makepkg.conf.d + @install -d $(BUILDDIR)/pacman.conf.d @cp -a $(PACMAN_CONFIGS) $(BUILDDIR)/pacman.conf.d + @install -d $(BUILDDIR)/git.conf.d + cp -a $(GIT_CONFIGS) $(BUILDDIR)/git.conf.d clean: rm -rf $(BUILDDIR) @@ -112,6 +116,7 @@ install: all install -m0755 ${BINPROGS} $(DESTDIR)$(PREFIX)/bin install -dm0755 $(DESTDIR)$(DATADIR)/lib cp -ra $(BUILDDIR)/lib/* $(DESTDIR)$(DATADIR)/lib + cp -a $(BUILDDIR)/git.conf.d -t $(DESTDIR)$(DATADIR) for conf in $(notdir $(MAKEPKG_CONFIGS)); do install -Dm0644 $(BUILDDIR)/makepkg.conf.d/$$conf $(DESTDIR)$(DATADIR)/makepkg.conf.d/$${conf##*/}; done for conf in $(notdir $(PACMAN_CONFIGS)); do install -Dm0644 $(BUILDDIR)/pacman.conf.d/$$conf $(DESTDIR)$(DATADIR)/pacman.conf.d/$${conf##*/}; done for a in ${SETARCH_ALIASES}; do install -m0644 $$a -t $(DESTDIR)$(DATADIR)/setarch-aliases.d; done @@ -129,6 +134,7 @@ uninstall: for f in $(notdir $(BINPROGS)); do rm -f $(DESTDIR)$(PREFIX)/bin/$$f; done for f in $(notdir $(LIBRARY)); do rm -f $(DESTDIR)$(DATADIR)/lib/$$f; done rm -rf $(DESTDIR)$(DATADIR)/lib + rm -rf $(DESTDIR)$(DATADIR)/git.conf.d for conf in $(notdir $(MAKEPKG_CONFIGS)); do rm -f $(DESTDIR)$(DATADIR)/makepkg.conf.d/$${conf##*/}; done for conf in $(notdir $(PACMAN_CONFIGS)); do rm -f $(DESTDIR)$(DATADIR)/pacman.conf.d/$${conf##*/}; done for f in $(notdir $(SETARCH_ALIASES)); do rm -f $(DESTDIR)$(DATADIR)/setarch-aliases.d/$$f; done diff --git a/config/git/template/hooks/applypatch-msg b/config/git/template/hooks/applypatch-msg new file mode 100755 index 0000000..1a24852 --- /dev/null +++ b/config/git/template/hooks/applypatch-msg @@ -0,0 +1 @@ +#!/bin/sh diff --git a/config/git/template/hooks/commit-msg b/config/git/template/hooks/commit-msg new file mode 100755 index 0000000..1a24852 --- /dev/null +++ b/config/git/template/hooks/commit-msg @@ -0,0 +1 @@ +#!/bin/sh diff --git a/config/git/template/hooks/post-applypatch b/config/git/template/hooks/post-applypatch new file mode 100755 index 0000000..1a24852 --- /dev/null +++ b/config/git/template/hooks/post-applypatch @@ -0,0 +1 @@ +#!/bin/sh diff --git a/config/git/template/hooks/post-checkout b/config/git/template/hooks/post-checkout new file mode 100755 index 0000000..1a24852 --- /dev/null +++ b/config/git/template/hooks/post-checkout @@ -0,0 +1 @@ +#!/bin/sh diff --git a/config/git/template/hooks/post-commit b/config/git/template/hooks/post-commit new file mode 100755 index 0000000..1a24852 --- /dev/null +++ b/config/git/template/hooks/post-commit @@ -0,0 +1 @@ +#!/bin/sh diff --git a/config/git/template/hooks/post-merge b/config/git/template/hooks/post-merge new file mode 100755 index 0000000..1a24852 --- /dev/null +++ b/config/git/template/hooks/post-merge @@ -0,0 +1 @@ +#!/bin/sh diff --git a/config/git/template/hooks/pre-applypatch b/config/git/template/hooks/pre-applypatch new file mode 100755 index 0000000..1a24852 --- /dev/null +++ b/config/git/template/hooks/pre-applypatch @@ -0,0 +1 @@ +#!/bin/sh diff --git a/config/git/template/hooks/pre-commit b/config/git/template/hooks/pre-commit new file mode 100755 index 0000000..1a24852 --- /dev/null +++ b/config/git/template/hooks/pre-commit @@ -0,0 +1 @@ +#!/bin/sh diff --git a/config/git/template/hooks/pre-merge-commit b/config/git/template/hooks/pre-merge-commit new file mode 100755 index 0000000..1a24852 --- /dev/null +++ b/config/git/template/hooks/pre-merge-commit @@ -0,0 +1 @@ +#!/bin/sh diff --git a/config/git/template/hooks/pre-push b/config/git/template/hooks/pre-push new file mode 100755 index 0000000..1a24852 --- /dev/null +++ b/config/git/template/hooks/pre-push @@ -0,0 +1 @@ +#!/bin/sh diff --git a/config/git/template/hooks/pre-rebase b/config/git/template/hooks/pre-rebase new file mode 100755 index 0000000..1a24852 --- /dev/null +++ b/config/git/template/hooks/pre-rebase @@ -0,0 +1 @@ +#!/bin/sh diff --git a/config/git/template/hooks/prepare-commit-msg b/config/git/template/hooks/prepare-commit-msg new file mode 100755 index 0000000..1a24852 --- /dev/null +++ b/config/git/template/hooks/prepare-commit-msg @@ -0,0 +1 @@ +#!/bin/sh diff --git a/config/git/template/info/exclude b/config/git/template/info/exclude new file mode 100644 index 0000000..ba46529 --- /dev/null +++ b/config/git/template/info/exclude @@ -0,0 +1,28 @@ +/pkg +/src +/*/ +!/keys/ + +/*.log +/*.tar.* +/*.tar +/*.tgz +/*.zst +/*.gz +/*.xz +/*.bz2 +/*.zip +/*.xpi +/*.jar +/*.whl +/*.war +/*.deb +/*.ttf +/*.dat +/*.iso +/*.asc +/*.sig +/*.signature +/*.sign +/*.SHA256SUMS +/*.sha256 diff --git a/doc/man/pkgctl-repo-configure.1.asciidoc b/doc/man/pkgctl-repo-configure.1.asciidoc index 6bdea93..12d879c 100644 --- a/doc/man/pkgctl-repo-configure.1.asciidoc +++ b/doc/man/pkgctl-repo-configure.1.asciidoc @@ -22,6 +22,8 @@ The remote protocol is automatically determined from the author email address by choosing SSH for all official packager identities and read-only HTTPS otherwise. +Git default excludes and hooks are applied to the configured repo. + Options ------- diff --git a/src/commitpkg.in b/src/commitpkg.in index 6d4b014..016ab22 100644 --- a/src/commitpkg.in +++ b/src/commitpkg.in @@ -71,6 +71,12 @@ if ! repo_spec=$(git config --local devtools.version) || [[ ${repo_spec} != "${G exit 1 fi +if ! repo_variant=$(git config --local devtools.variant) || [[ ${repo_variant} != canonical ]]; then + error "cannot release from a repository with none canonical specs (%s), try:" "${repo_variant:-development}" + msg2 'pkgctl repo configure' + exit 1 +fi + if [[ "$(git symbolic-ref --short HEAD)" != main ]]; then die 'must be run from the main branch' fi diff --git a/src/lib/common.sh b/src/lib/common.sh index 7589120..82fdd2e 100644 --- a/src/lib/common.sh +++ b/src/lib/common.sh @@ -22,7 +22,7 @@ export BUILDTOOLVER=@buildtoolver@ # Set common properties export PACMAN_KEYRING_DIR=/etc/pacman.d/gnupg export GITLAB_HOST=gitlab.archlinux.org -export GIT_REPO_SPEC_VERSION=1 +export GIT_REPO_SPEC_VERSION=2 export GIT_PACKAGING_NAMESPACE=archlinux/packaging/packages export GIT_PACKAGING_NAMESPACE_ID=11323 export GIT_PACKAGING_URL_SSH="git@${GITLAB_HOST}:${GIT_PACKAGING_NAMESPACE}" diff --git a/src/lib/repo/configure.sh b/src/lib/repo/configure.sh index 1ddb1b8..b3c188c 100644 --- a/src/lib/repo/configure.sh +++ b/src/lib/repo/configure.sh @@ -17,6 +17,7 @@ source /usr/share/makepkg/util/config.sh source /usr/share/makepkg/util/message.sh set -e +shopt -s nullglob pkgctl_repo_configure_usage() { @@ -34,6 +35,8 @@ pkgctl_repo_configure_usage() { address by choosing SSH for all official packager identities and read-only HTTPS otherwise. + Git default excludes and hooks are applied to the configured repo. + OPTIONS --protocol https Configure remote url to use https -j, --jobs N Run up to N jobs in parallel (default: $(nproc)) @@ -104,7 +107,7 @@ pkgctl_repo_configure() { # variables local -r command=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} - local path realpath pkgbase remote_url project_path + local path realpath pkgbase remote_url project_path hook local PACKAGER GPGKEY packager_name packager_email while (( $# )); do @@ -230,7 +233,15 @@ pkgctl_repo_configure() { git config branch.main.merge refs/heads/main fi + # configure spec version and variant to avoid using development hooks in production git config devtools.version "${GIT_REPO_SPEC_VERSION}" + if [[ ${_DEVTOOLS_LIBRARY_DIR} == /usr/share/devtools ]]; then + git config devtools.variant canonical + else + warning "Configuring with development version of pkgctl, do not use this repo in production" + git config devtools.variant development + fi + git config pull.rebase true git config branch.autoSetupRebase always git config branch.main.remote origin @@ -257,6 +268,18 @@ pkgctl_repo_configure() { git config user.signingKey "${GPGKEY}" fi + # set default git exclude + mkdir -p .git/info + ln -sf "${_DEVTOOLS_LIBRARY_DIR}/git.conf.d/template/info/exclude" \ + .git/info/exclude + + # set default git hooks + mkdir -p .git/hooks + rm -f .git/hooks/*.sample + for hook in "${_DEVTOOLS_LIBRARY_DIR}"/git.conf.d/template/hooks/*; do + ln -sf "${hook}" ".git/hooks/$(basename "${hook}")" + done + if ! git ls-remote origin &>/dev/null; then warning "configured remote origin may not exist, run:" msg2 "pkgctl repo create ${pkgbase}" -- cgit v1.2.3-70-g09d2 From 4425913e4f3bfd3cb346c38e13a10f0002615a55 Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Thu, 21 Dec 2023 21:40:57 +0100 Subject: chore(build): use more intuitive update-checksums option for humans The philosophy of our CLI is to provide options that better match human expectations in an intuitive way rather than mimic wording of previous tools with abbreviation. Component: pkgctl build Signed-off-by: Levente Polyak --- contrib/completion/bash/devtools.in | 2 +- contrib/completion/zsh/_devtools.in | 2 +- doc/man/pkgctl-build.1.asciidoc | 8 ++++++-- src/lib/build/build.sh | 12 ++++++------ 4 files changed, 14 insertions(+), 10 deletions(-) (limited to 'src/lib') diff --git a/contrib/completion/bash/devtools.in b/contrib/completion/bash/devtools.in index 83264ce..b974257 100644 --- a/contrib/completion/bash/devtools.in +++ b/contrib/completion/bash/devtools.in @@ -179,7 +179,7 @@ _pkgctl_build_args=( --pkgver --pkgrel --rebuild - --updpkgsums + --update-checksums -e --edit -r --release diff --git a/contrib/completion/zsh/_devtools.in b/contrib/completion/zsh/_devtools.in index b82ece4..35ab2dc 100644 --- a/contrib/completion/zsh/_devtools.in +++ b/contrib/completion/zsh/_devtools.in @@ -50,7 +50,7 @@ _pkgctl_build_args=( '--pkgver=[Set pkgver, reset pkgrel and update checksums]:pkgver:' '--pkgrel=[Set pkgrel to a given value]:pkgrel:' '--rebuild[Increment the pkgrel variable]' - '--updpkgsums[Regenerate the checksums]' + '--update-checksums[Force computation and update of the checksums (disables auto-detection)]' '(-e --edit)'{-e,--edit}'[Edit the PKGBUILD before building]' '(-r --release)'{-r,--release}'[Automatically commit, tag and release after building]' '(-m --message=)'{-m,--message=}"[Use the given as the commit message]:message:" diff --git a/doc/man/pkgctl-build.1.asciidoc b/doc/man/pkgctl-build.1.asciidoc index 3f2d44e..12deaaa 100644 --- a/doc/man/pkgctl-build.1.asciidoc +++ b/doc/man/pkgctl-build.1.asciidoc @@ -63,8 +63,12 @@ PKGBUILD Options *--rebuild*:: Increment the current pkgrel variable -*--updpkgsums*:: - Regenerate the checksums +*--update-checksums*:: + Force computation and update of the checksums by disabling auto-detection. + + Should only be used in special circumstances, like when adding new patch + files to the source array. During regular packaging operations, checksums + are either automatically updated when upgrading a package using `--pkgver` + or should remain immutable during rebuilds. *-e, --edit*:: Edit the PKGBUILD before building diff --git a/src/lib/build/build.sh b/src/lib/build/build.sh index 2b9d4cf..e0982e4 100644 --- a/src/lib/build/build.sh +++ b/src/lib/build/build.sh @@ -58,7 +58,7 @@ pkgctl_build_usage() { --pkgver=PKGVER Set pkgver, reset pkgrel and update checksums --pkgrel=PKGREL Set pkgrel to a given value --rebuild Increment the current pkgrel variable - --updpkgsums Regenerate the checksums + --update-checksums Force computation and update of the checksums (disables auto-detection) -e, --edit Edit the PKGBUILD before building RELEASE OPTIONS @@ -108,7 +108,7 @@ pkgctl_build() { exit 1 fi - local UPDPKGSUMS=0 + local UPDATE_CHECKSUMS=0 local EDIT=0 local REBUILD=0 local OFFLOAD=0 @@ -165,7 +165,7 @@ pkgctl_build() { pkgctl_build_check_option_group_ver '--pkgver' "${PKGVER}" "${PKGREL}" "${REBUILD}" PKGVER="${1#*=}" PKGREL=1 - UPDPKGSUMS=1 + UPDATE_CHECKSUMS=1 shift ;; --pkgrel=*) @@ -173,8 +173,8 @@ pkgctl_build() { PKGREL="${1#*=}" shift ;; - --updpkgsums) - UPDPKGSUMS=1 + --update-checksums) + UPDATE_CHECKSUMS=1 shift ;; --rebuild) @@ -407,7 +407,7 @@ pkgctl_build() { # update checksums if any sources are declared - if (( UPDPKGSUMS )) && (( ${#source[@]} >= 1 )); then + if (( UPDATE_CHECKSUMS )) && (( ${#source[@]} >= 1 )); then updpkgsums fi -- cgit v1.2.3-70-g09d2 From 4673ad6c89bbdca632b22edfc2ef35486b7a635b Mon Sep 17 00:00:00 2001 From: Jelle van der Waa Date: Sat, 1 Jul 2023 15:21:32 +0200 Subject: feat(search): add subcommand to search across the packaging group Search for an expression across the GitLab packaging group. To use a filter, include it in your query. You may use wildcards (*) to use glob matching. Available filters for the blobs scope: path, extension. Every usage of the search command must be authenticated. Consult the 'pkgctl auth' command to authenticate with GitLab or view the authentication status. This command uses bats for pretty printing the results including line numbers and syntax highlighting. Component: pkgctl search Co-authored-by: Christian Heusel Co-authored-by: Levente Polyak --- README.md | 1 + contrib/completion/bash/devtools.in | 9 ++ contrib/completion/zsh/_devtools.in | 8 ++ doc/man/pkgctl-search.1.asciidoc | 58 ++++++++++ doc/man/pkgctl.1.asciidoc | 4 + src/lib/api/gitlab.sh | 174 ++++++++++++++++++++++++++-- src/lib/cache.sh | 22 ++++ src/lib/search.sh | 221 ++++++++++++++++++++++++++++++++++++ src/pkgctl.in | 9 ++ 9 files changed, 499 insertions(+), 7 deletions(-) create mode 100644 doc/man/pkgctl-search.1.asciidoc create mode 100644 src/lib/cache.sh create mode 100644 src/lib/search.sh (limited to 'src/lib') diff --git a/README.md b/README.md index a1b6d42..6c36a37 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,7 @@ Component: pkgctl db remove - arch-install-scripts - awk - bash +- bats - binutils - coreutils - diffutils diff --git a/contrib/completion/bash/devtools.in b/contrib/completion/bash/devtools.in index b974257..155bb7e 100644 --- a/contrib/completion/bash/devtools.in +++ b/contrib/completion/bash/devtools.in @@ -139,6 +139,7 @@ _pkgctl_cmds=( diff release repo + search version ) _pkgctl_args=( @@ -331,6 +332,14 @@ _pkgctl_repo_web_args=( _pkgctl_repo_web_opts() { _filedir -d; } +_pkgctl_search_args=( + --json + --no-default-filter + -h --help +) +_pkgctl_search_opts() { :; } + + _pkgctl_diff_args=( -l --list -d --diffoscope diff --git a/contrib/completion/zsh/_devtools.in b/contrib/completion/zsh/_devtools.in index 35ab2dc..120b47a 100644 --- a/contrib/completion/zsh/_devtools.in +++ b/contrib/completion/zsh/_devtools.in @@ -139,6 +139,13 @@ _pkgctl_repo_web_args=( '*:git_dir:_files -/' ) +_pkgctl_search_args=( + '--json[Enable printing results in JSON]' + '--no-default-filter[Do not apply default filter (like -path:keys/pgp/*.asc)]' + '(-h --help)'{-h,--help}'[Display usage]' + '1:query' +) + _arch_nspawn_args=( '-C[Location of a pacman config file]:pacman_config:_files -g "*.conf(.)"' '-M[Location of a makepkg config file]:makepkg_config:_files -g "*.conf(.)"' @@ -252,6 +259,7 @@ _pkgctl_cmds=( "diff[Compare package files using different modes]" "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]" "version[Show pkgctl version information]" ) diff --git a/doc/man/pkgctl-search.1.asciidoc b/doc/man/pkgctl-search.1.asciidoc new file mode 100644 index 0000000..fb79b88 --- /dev/null +++ b/doc/man/pkgctl-search.1.asciidoc @@ -0,0 +1,58 @@ +pkgctl-search(1) +================ + +Name +---- +pkgctl-search - Search for an expression across the GitLab packaging group + +Synopsis +-------- +pkgctl search [OPTIONS] QUERY + +Description +----------- + +Search for an expression across the GitLab packaging group. + +To use a filter, include it in your query. You may use wildcards (*) to +use glob matching. + +Available filters for the blobs scope: path, extension + +Every usage of the search command must be authenticated. Consult the +'pkgctl auth' command to authenticate with GitLab or view the authentication +status. + +Search Tips +----------- + + Syntax Description Example + ─────────────────────────────────────── + " Exact search "gem sidekiq" + ~ Fuzzy search J~ Doe + | Or display | banner + + And display +banner + - Exclude display -banner + * Partial bug error 50* + \ Escape \*md + # Issue ID #23456 + ! Merge request !23456 + +Options +------- + +*--json*:: + Enable printing results in JSON + +*--no-default-filter*:: + Do not apply default filter (like -path:keys/pgp/*.asc) + +*-h, --help*:: + Show a help text + +See Also +-------- + +linkman:pkgctl-auth[1] + +include::include/footer.asciidoc[] diff --git a/doc/man/pkgctl.1.asciidoc b/doc/man/pkgctl.1.asciidoc index 74edf68..1164561 100644 --- a/doc/man/pkgctl.1.asciidoc +++ b/doc/man/pkgctl.1.asciidoc @@ -44,6 +44,9 @@ pkgctl release:: pkgctl repo:: Manage Git packaging repositories and their configuration +pkgctl search:: + Search for an expression across the GitLab packaging group + pkgctl version:: Show pkgctl version information @@ -56,6 +59,7 @@ linkman:pkgctl-db[1] linkman:pkgctl-diff[1] linkman:pkgctl-release[1] linkman:pkgctl-repo[1] +linkman:pkgctl-search[1] linkman:pkgctl-version[1] include::include/footer.asciidoc[] diff --git a/src/lib/api/gitlab.sh b/src/lib/api/gitlab.sh index e5f4237..e4b8a9d 100644 --- a/src/lib/api/gitlab.sh +++ b/src/lib/api/gitlab.sh @@ -13,13 +13,63 @@ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/config.sh set -e +graphql_api_call() { + local outfile=$1 + local request=$2 + local node_type=$3 + local data=$4 + local hasNextPage cursor + + # empty token + if [[ -z "${GITLAB_TOKEN}" ]]; then + msg_error " api call failed: No token provided" + return 1 + fi + + [[ -z ${WORKDIR:-} ]] && setup_workdir + api_workdir=$(mktemp --tmpdir="${WORKDIR}" --directory pkgctl-gitlab-api.XXXXXXXXXX) + + # normalize graphql data and prepare query + data="${data//\"/\\\"}" + data='{ + "query": "'"${data}"'" + }' + data="${data//$'\t'/ }" + data="${data//$'\n'/}" + + cursor="" + hasNextPage=true + while [[ ${hasNextPage} == true ]]; do + data=$(sed -E 's|after: \\"[a-zA-Z0-9]*\\"|after: \\"'"${cursor}"'\\"|' <<< "${data}") + result="${api_workdir}/result.${cursor}" + + if ! curl --request "${request}" \ + --url "https://${GITLAB_HOST}/api/graphql" \ + --header "Authorization: Bearer ${GITLAB_TOKEN}" \ + --header "Content-Type: application/json" \ + --data "${data}" \ + --output "${result}" \ + --silent; then + msg_error " api call failed: $(cat "${outfile}")" + return 1 + fi + + hasNextPage=$(jq --raw-output ".data | .${node_type} | .pageInfo | .hasNextPage" < "${result}") + cursor=$(jq --raw-output ".data | .${node_type} | .pageInfo | .endCursor" < "${result}") + + cp "${result}" "${api_workdir}/tmp" + jq ".data.${node_type}.nodes" "${api_workdir}/tmp" > "${result}" + done + + jq --slurp add "${api_workdir}"/result.* > "${outfile}" + return 0 +} gitlab_api_call() { local outfile=$1 local request=$2 local endpoint=$3 local data=${4:-} - local error # empty token if [[ -z "${GITLAB_TOKEN}" ]]; then @@ -38,27 +88,102 @@ gitlab_api_call() { return 1 fi + if ! gitlab_check_api_errors "${outfile}"; then + return 1 + fi + + return 0 +} + +gitlab_api_call_paged() { + local outfile=$1 + local request=$2 + local endpoint=$3 + local data=${4:-} + local result header + + # empty token + if [[ -z "${GITLAB_TOKEN}" ]]; then + msg_error " api call failed: No token provided" + return 1 + fi + + [[ -z ${WORKDIR:-} ]] && setup_workdir + api_workdir=$(mktemp --tmpdir="${WORKDIR}" --directory pkgctl-gitlab-api.XXXXXXXXXX) + + next_page=1 + while [[ -n "${next_page}" ]]; do + result="${api_workdir}/result.${next_page}" + header="${api_workdir}/header" + if ! curl --request "${request}" \ + --get \ + --url "https://${GITLAB_HOST}/api/v4/${endpoint}&per_page=100&page=${next_page}" \ + --header "PRIVATE-TOKEN: ${GITLAB_TOKEN}" \ + --header "Content-Type: application/json" \ + --data-urlencode "${data}" \ + --dump-header "${header}" \ + --output "${result}" \ + --silent; then + msg_error " api call failed: $(cat "${result}")" + return 1 + fi + + if ! gitlab_check_api_errors "${result}"; then + return 1 + fi + + next_page=$(grep "x-next-page" "${header}" | tr -d '\r' | awk '{ print $2 }') + done + + jq --slurp add "${api_workdir}"/result.* > "${outfile}" + return 0 +} + +gitlab_check_api_errors() { + local file=$1 + local error + + # search API only returns an array, no errors + if [[ $(jq --raw-output 'type' < "${file}") == "array" ]]; then + return 0 + fi + # check for general purpose api error - if error=$(jq --raw-output --exit-status '.error' < "${outfile}"); then + if error=$(jq --raw-output --exit-status '.error' < "${file}"); then msg_error " api call failed: ${error}" return 1 fi # check for api specific error messages - if ! jq --raw-output --exit-status '.id' < "${outfile}" >/dev/null; then - if jq --raw-output --exit-status '.message | keys[]' < "${outfile}" &>/dev/null; then + if ! jq --raw-output --exit-status '.id' < "${file}" >/dev/null; then + if jq --raw-output --exit-status '.message | keys[]' < "${file}" &>/dev/null; then while read -r error; do msg_error " api call failed: ${error}" - done < <(jq --raw-output --exit-status '.message|to_entries|map("\(.key) \(.value[])")[]' < "${outfile}") - elif error=$(jq --raw-output --exit-status '.message' < "${outfile}"); then + done < <(jq --raw-output --exit-status '.message|to_entries|map("\(.key) \(.value[])")[]' < "${file}") + elif error=$(jq --raw-output --exit-status '.message' < "${file}"); then msg_error " api call failed: ${error}" fi return 1 fi - return 0 } +graphql_check_api_errors() { + local file=$1 + local error + + # early exit if we do not have errors + if ! jq --raw-output --exit-status '.errors[]' < "${file}" &>/dev/null; then + return 0 + fi + + # check for api specific error messages + while read -r error; do + msg_error " api call failed: ${error}" + done < <(jq --raw-output --exit-status '.errors[].message' < "${file}") + return 1 +} + gitlab_api_get_user() { local outfile username @@ -81,6 +206,23 @@ gitlab_api_get_user() { return 0 } +gitlab_api_get_project_name_mapping() { + local query=$1 + local outfile + + [[ -z ${WORKDIR:-} ]] && setup_workdir + outfile=$(mktemp --tmpdir="${WORKDIR}" pkgctl-gitlab-api.XXXXXXXXXX) + + # query user details + if ! graphql_api_call "${outfile}" POST projects "${query}"; then + msg_warn " Invalid token provided?" + exit 1 + fi + + cat "${outfile}" + return 0 +} + # Convert arbitrary project names to GitLab valid path names. # # GitLab has several limitations on project and group names and also maintains @@ -130,3 +272,21 @@ gitlab_api_create_project() { printf "%s" "${path}" return 0 } + +# TODO: parallelize +# https://docs.gitlab.com/ee/api/search.html#scope-blobs +gitlab_api_search() { + local search=$1 + local outfile + + [[ -z ${WORKDIR:-} ]] && setup_workdir + outfile=$(mktemp --tmpdir="${WORKDIR}" pkgctl-gitlab-api.XXXXXXXXXX) + + if ! gitlab_api_call_paged "${outfile}" GET "/groups/archlinux%2fpackaging%2fpackages/search?scope=blobs" "search=${search}"; then + return 1 + fi + + cat "${outfile}" + + return 0 +} diff --git a/src/lib/cache.sh b/src/lib/cache.sh new file mode 100644 index 0000000..24056fa --- /dev/null +++ b/src/lib/cache.sh @@ -0,0 +1,22 @@ +#!/hint/bash +# +# SPDX-License-Identifier: GPL-3.0-or-later + +[[ -z ${DEVTOOLS_INCLUDE_CACHE_SH:-} ]] || return 0 +DEVTOOLS_INCLUDE_CACHE_SH=1 + +set -e + +readonly XDG_DEVTOOLS_CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/devtools" + +get_cache_file() { + local filename=$1 + local path="${XDG_DEVTOOLS_CACHE_DIR}/${filename}" + + mkdir --parents -- "$(dirname -- "$path")" + if [[ ! -f ${path} ]]; then + touch -- "${path}" + fi + + printf '%s' "${path}" +} diff --git a/src/lib/search.sh b/src/lib/search.sh new file mode 100644 index 0000000..cf64db3 --- /dev/null +++ b/src/lib/search.sh @@ -0,0 +1,221 @@ +#!/bin/bash +# +# SPDX-License-Identifier: GPL-3.0-or-later + +[[ -z ${DEVTOOLS_INCLUDE_SEARCH_SH:-} ]] || return 0 +DEVTOOLS_INCLUDE_SEARCH_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/cache.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/cache.sh +# shellcheck source=src/lib/api/gitlab.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/api/gitlab.sh + +source /usr/share/makepkg/util/message.sh + +set -eo pipefail + + +pkgctl_search_usage() { + local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} + cat <<- _EOF_ + Usage: ${COMMAND} [OPTIONS] QUERY + + Search for an expression across the GitLab packaging group. + + To use a filter, include it in your query. You may use wildcards (*) to + use glob matching. + + Available filters for the blobs scope: path, extension + + Every usage of the search command must be authenticated. Consult the + 'pkgctl auth' command to authenticate with GitLab or view the + authentication status. + + SEARCH TIPS + Syntax Description Example + ─────────────────────────────────────── + " Exact search "gem sidekiq" + ~ Fuzzy search J~ Doe + | Or display | banner + + And display +banner + - Exclude display -banner + * Partial bug error 50* + \\ Escape \\*md + # Issue ID #23456 + ! Merge request !23456 + + OPTIONS + --json Enable printing results in JSON + --no-default-filter Do not apply default filter (like -path:keys/pgp/*.asc) + -h, --help Show this help text + + EXAMPLES + $ ${COMMAND} linux + $ ${COMMAND} '"pytest -v" +PYTHONPATH' +_EOF_ +} + +pkgctl_search() { + if (( $# < 1 )); then + pkgctl_search_usage + exit 0 + fi + + # options + local search + local formatter=pretty + local use_default_filter=1 + + # variables + local default_filter="-path:keys/pgp/*.asc" + local graphql_lookup_batch=200 + local output result query entries from until length + local project_name_cache_file project_name_lookup project_ids project_id project_name project_slice + local mapping_output path startline data + + while (( $# )); do + case $1 in + -h|--help) + pkgctl_search_usage + exit 0 + ;; + --json) + formatter=json + shift + ;; + --no-default-filter) + use_default_filter=0 + shift + ;; + --) + shift + break + ;; + -*) + die "invalid argument: %s" "$1" + ;; + *) + break + ;; + esac + done + + if (( $# == 0 )); then + pkgctl_search_usage + exit 1 + fi + + # assign search parameter + search="${*}" + if (( use_default_filter )); then + search+=" ${default_filter}" + fi + + stat_busy "Querying gitlab search api" + output=$(gitlab_api_search "${search}") + stat_done + + project_name_cache_file=$(get_cache_file gitlab/project_id_to_name) + lock 11 "${project_name_cache_file}" "Locking project name cache" + mapfile -t project_ids < <( + jq --raw-output '[.[].project_id] | unique[]' <<< "${output}" | \ + grep --invert-match --file <(awk '{ print $1 }' < "${project_name_cache_file}" )) + + stat_busy "Querying project names" + local entries="${#project_ids[@]}" + local until=0 + while (( until < entries )); do + from=${until} + until=$(( until + graphql_lookup_batch )) + if (( until > entries )); then + until=${entries} + fi + length=$(( until - from )) + + project_slice=("${project_ids[@]:${from}:${length}}") + printf -v projects '"gid://gitlab/Project/%s",' "${project_slice[@]}" + query='{ + projects(after: "" ids: ['"${projects}"']) { + pageInfo { + startCursor + endCursor + hasNextPage + } + nodes { + id + name + } + } + }' + mapping_output=$(gitlab_api_get_project_name_mapping "${query}") + + # update cache + while read -r project_id project_name; do + printf "%s %s\n" "${project_id}" "${project_name}" >> "${project_name_cache_file}" + done < <(jq --raw-output \ + '.[] | "\(.id | rindex("/") as $lastSlash | .[$lastSlash+1:]) \(.name)"' \ + <<< "${mapping_output}") + done + stat_done + + # read project_id to name mapping from cache + declare -A project_name_lookup=() + while read -r project_id project_name; do + project_name_lookup[${project_id}]=${project_name} + done < "${project_name_cache_file}" + + # close project name cache lock + lock_close 11 + + # output mode JSON + if [[ ${formatter} == json ]]; then + jq --from-file <( + for project_id in $(jq '.[].project_id' <<< "${output}"); do + project_name=${project_name_lookup[${project_id}]} + printf 'map(if .project_id == %s then . + {"project_name": "%s"} else . end) | ' \ + "${project_id}" "${project_name}" + done + printf . + ) <<< "${output}" + exit 0 + fi + + # pretty print each result + while read -r result; do + # read properties from search result + mapfile -t data < <(jq --raw-output ".data" <<< "${result}") + { read -r project_id; read -r path; read -r startline; } < <( + jq --raw-output ".project_id, .path, .startline" <<< "${result}" + ) + project_name=${project_name_lookup[${project_id}]} + + # remove trailing newline for multiline results + if (( ${#data[@]} > 1 )) && [[ ${data[-1]} == "" ]]; then + unset "data[${#data[@]}-1]" + fi + + # prepend empty lines to match startline + if (( startline > 1 )); then + mapfile -t data < <( + printf '%.0s\n' $(seq 1 "$(( startline - 1 ))") + printf "%s\n" "${data[@]}" + ) + fi + + bat \ + --file-name="${project_name}/${path}" \ + --line-range "${startline}:" \ + --paging=never \ + --force-colorization \ + --map-syntax "PKGBUILD:Bourne Again Shell (bash)" \ + --map-syntax ".SRCINFO:INI" \ + --map-syntax "*install:Bourne Again Shell (bash)" \ + --map-syntax "*sysusers*:Bourne Again Shell (bash)" \ + --map-syntax "*tmpfiles*:Bourne Again Shell (bash)" \ + --map-syntax "*.hook:INI" \ + <(printf "%s\n" "${data[@]}") + done < <(jq --compact-output '.[]' <<< "${output}") +} diff --git a/src/pkgctl.in b/src/pkgctl.in index ad215ac..10a2348 100644 --- a/src/pkgctl.in +++ b/src/pkgctl.in @@ -25,6 +25,7 @@ usage() { diff Compare package files using different modes 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 version Show pkgctl version information OPTIONS @@ -96,6 +97,14 @@ while (( $# )); do pkgctl_release "$@" exit 0 ;; + search) + _DEVTOOLS_COMMAND+=" $1" + shift + # shellcheck source=src/lib/release.sh + source "${_DEVTOOLS_LIBRARY_DIR}"/lib/search.sh + pkgctl_search "$@" + exit 0 + ;; version|--version|-V) _DEVTOOLS_COMMAND+=" $1" shift -- cgit v1.2.3-70-g09d2 From 0e538cf4983f27548077c0a2a272ecd8deebacb1 Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Fri, 5 Jan 2024 13:38:19 +0100 Subject: fix(util): open lock file in append mode to avoid overwriting files Previously if we opened a lock on an existing file with useful content we overwrote it with an empty file. This is obviously not desired, hence open the file handle in append mode preserving its content. Signed-off-by: Levente Polyak --- src/lib/common.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/lib') diff --git a/src/lib/common.sh b/src/lib/common.sh index 82fdd2e..29b0343 100644 --- a/src/lib/common.sh +++ b/src/lib/common.sh @@ -135,7 +135,7 @@ lock() { # Only reopen the FD if it wasn't handed to us if ! [[ "/dev/fd/$1" -ef "$2" ]]; then mkdir -p -- "$(dirname -- "$2")" - eval "exec $1>"'"$2"' + eval "exec $1>>"'"$2"' fi if ! flock -n "$1"; then -- cgit v1.2.3-70-g09d2 From d0dc0e1a32d6ed9b166eca777f7fb7071c4c2df1 Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Fri, 5 Jan 2024 19:23:52 +0100 Subject: feat(search): add optional plain output formatting This allows to run the search command without bats, which is not used in the default pretty output format. Component: pkgctl search Signed-off-by: Levente Polyak --- README.md | 5 +- contrib/completion/bash/devtools.in | 11 ++++- contrib/completion/zsh/_devtools.in | 6 ++- doc/man/pkgctl-search.1.asciidoc | 23 +++++++-- src/lib/common.sh | 4 +- src/lib/search.sh | 93 +++++++++++++++++++++++++++++++++---- src/lib/valid-search.sh | 11 +++++ 7 files changed, 134 insertions(+), 19 deletions(-) create mode 100644 src/lib/valid-search.sh (limited to 'src/lib') diff --git a/README.md b/README.md index 6c36a37..ca761db 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,6 @@ Component: pkgctl db remove - arch-install-scripts - awk - bash -- bats - binutils - coreutils - diffutils @@ -87,6 +86,10 @@ Component: pkgctl db remove - mercurial - subversion +### Optional Dependencies + +- bats (pretty printing) + ### Development Dependencies - asciidoc diff --git a/contrib/completion/bash/devtools.in b/contrib/completion/bash/devtools.in index 155bb7e..4c7b73a 100644 --- a/contrib/completion/bash/devtools.in +++ b/contrib/completion/bash/devtools.in @@ -9,6 +9,8 @@ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-tags.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh # shellcheck source=src/lib/valid-inspect.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-inspect.sh +# shellcheck source=src/lib/valid-search.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-search.sh _binary_arch=${DEVTOOLS_VALID_ARCHES[*]:0:-1} _colors=(never always auto) @@ -333,11 +335,15 @@ _pkgctl_repo_web_opts() { _filedir -d; } _pkgctl_search_args=( - --json --no-default-filter + --json + -F --format + -N --no-line-number -h --help ) _pkgctl_search_opts() { :; } +_pkgctl_search_args__format_opts() { _devtools_completions_search_format; } +_pkgctl_search_args_F_opts() { _devtools_completions_search_format; } _pkgctl_diff_args=( @@ -391,6 +397,9 @@ _devtools_completions_protocol() { _devtools_completions_inspect() { mapfile -t COMPREPLY < <(compgen -W "${DEVTOOLS_VALID_INSPECT_MODES[*]}" -- "$cur") } +_devtools_completions_search_format() { + mapfile -t COMPREPLY < <(compgen -W "${valid_search_output_format[*]}" -- "$cur") +} __devtools_complete() { local service=$1 diff --git a/contrib/completion/zsh/_devtools.in b/contrib/completion/zsh/_devtools.in index 120b47a..448fbed 100644 --- a/contrib/completion/zsh/_devtools.in +++ b/contrib/completion/zsh/_devtools.in @@ -9,6 +9,8 @@ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-tags.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh # shellcheck source=src/lib/valid-inspect.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-inspect.sh +# shellcheck source=src/lib/valid-search.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-search.sh _binary_arch=${DEVTOOLS_VALID_ARCHES[*]:0:-1} _colors=(never always auto) @@ -140,8 +142,10 @@ _pkgctl_repo_web_args=( ) _pkgctl_search_args=( - '--json[Enable printing results in JSON]' '--no-default-filter[Do not apply default filter (like -path:keys/pgp/*.asc)]' + '--json[Enable printing results in JSON]' + '(-F --format)'{-F,--format}"[Controls the formatting of the results]:format:($valid_search_output_format[*])" + '(-N --no-line-number)'{-N,--no-line-number}"[Don't show line numbers when formatting results]" '(-h --help)'{-h,--help}'[Display usage]' '1:query' ) diff --git a/doc/man/pkgctl-search.1.asciidoc b/doc/man/pkgctl-search.1.asciidoc index fb79b88..8172b00 100644 --- a/doc/man/pkgctl-search.1.asciidoc +++ b/doc/man/pkgctl-search.1.asciidoc @@ -20,7 +20,7 @@ use glob matching. Available filters for the blobs scope: path, extension Every usage of the search command must be authenticated. Consult the -'pkgctl auth' command to authenticate with GitLab or view the authentication +`'pkgctl auth'` command to authenticate with GitLab or view the authentication status. Search Tips @@ -41,14 +41,27 @@ Search Tips Options ------- -*--json*:: - Enable printing results in JSON +*-h, --help*:: + Show a help text + +Filter Options +-------------- *--no-default-filter*:: Do not apply default filter (like -path:keys/pgp/*.asc) -*-h, --help*:: - Show a help text +Output Options +-------------- + +*--json*:: + Enable printing in JSON; Shorthand for `'--format json'` + +*-F, --format* 'FORMAT':: + Controls the formatting of the results; `FORMAT` is `'pretty'`, `'plain'`, + or `'json'` (default `pretty`) + +*-N, --no-line-number*:: + Don't show line numbers when formatting results See Also -------- diff --git a/src/lib/common.sh b/src/lib/common.sh index 29b0343..17b91bc 100644 --- a/src/lib/common.sh +++ b/src/lib/common.sh @@ -33,9 +33,11 @@ export PKGBASE_MAINTAINER_URL=https://archlinux.org/packages/pkgbase-maintainer # check if messages are to be printed using color if [[ -t 2 && "$TERM" != dumb ]] || [[ ${DEVTOOLS_COLOR} == always ]]; then colorize + PURPLE="$(tput setaf 5)" + DARK_GREEN="$(tput setaf 2)" else # shellcheck disable=2034 - declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' PURPLE='' fi stat_busy() { diff --git a/src/lib/search.sh b/src/lib/search.sh index cf64db3..862af25 100644 --- a/src/lib/search.sh +++ b/src/lib/search.sh @@ -12,7 +12,10 @@ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/cache.sh # shellcheck source=src/lib/api/gitlab.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/api/gitlab.sh +# shellcheck source=src/lib/valid-search.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-search.sh +source /usr/share/makepkg/util/util.sh source /usr/share/makepkg/util/message.sh set -eo pipefail @@ -48,16 +51,33 @@ pkgctl_search_usage() { ! Merge request !23456 OPTIONS - --json Enable printing results in JSON - --no-default-filter Do not apply default filter (like -path:keys/pgp/*.asc) - -h, --help Show this help text + -h, --help Show this help text + + FILTER OPTIONS + --no-default-filter Do not apply default filter (like -path:keys/pgp/*.asc) + + OUTPUT OPTIONS + --json Enable printing in JSON; Shorthand for '--format json' + -F, --format FORMAT Controls the formatting of the results; FORMAT is 'pretty', + 'plain', or 'json' (default: pretty) + -N, --no-line-number Don't show line numbers when formatting results EXAMPLES $ ${COMMAND} linux - $ ${COMMAND} '"pytest -v" +PYTHONPATH' + $ ${COMMAND} --json '"pytest -v" +PYTHONPATH' _EOF_ } +pkgctl_search_check_option_group_format() { + local option=$1 + local output_format=$2 + if [[ -n ${output_format} ]]; then + die "The argument '%s' cannot be used with one or more of the other specified arguments" "${option}" + exit 1 + fi + return 0 +} + pkgctl_search() { if (( $# < 1 )); then pkgctl_search_usage @@ -66,15 +86,17 @@ pkgctl_search() { # options local search - local formatter=pretty + local output_format= local use_default_filter=1 + local line_numbers=1 # variables + local bats_style="header,grid" local default_filter="-path:keys/pgp/*.asc" local graphql_lookup_batch=200 local output result query entries from until length local project_name_cache_file project_name_lookup project_ids project_id project_name project_slice - local mapping_output path startline data + local mapping_output path startline currentline data line while (( $# )); do case $1 in @@ -82,12 +104,26 @@ pkgctl_search() { pkgctl_search_usage exit 0 ;; + --no-default-filter) + use_default_filter=0 + shift + ;; --json) - formatter=json + pkgctl_search_check_option_group_format "$1" "${output_format}" + output_format=json shift ;; - --no-default-filter) - use_default_filter=0 + -F|--format) + (( $# <= 1 )) && die "missing argument for %s" "$1" + pkgctl_search_check_option_group_format "$1" "${output_format}" + output_format="${2}" + if ! in_array "${output_format}" "${valid_search_output_format[@]}"; then + die "Unknown output format: %s" "${output_format}" + fi + shift 2 + ;; + -N|--no-line-number) + line_numbers=0 shift ;; --) @@ -114,16 +150,35 @@ pkgctl_search() { search+=" ${default_filter}" fi + # assign default output format + if [[ -z ${output_format} ]]; then + output_format=pretty + fi + + # check for optional dependencies + if [[ ${output_format} == pretty ]] && ! command -v bats &>/dev/null; then + warning "Failed to find optional dependency 'bats': falling back to plain output" + output_format=plain + fi + + # populate line numbers option + if (( line_numbers )); then + bats_style="numbers,${bats_style}" + fi + + # call the gitlab search API stat_busy "Querying gitlab search api" output=$(gitlab_api_search "${search}") stat_done + # collect project ids whose name needs to be looked up project_name_cache_file=$(get_cache_file gitlab/project_id_to_name) lock 11 "${project_name_cache_file}" "Locking project name cache" mapfile -t project_ids < <( jq --raw-output '[.[].project_id] | unique[]' <<< "${output}" | \ grep --invert-match --file <(awk '{ print $1 }' < "${project_name_cache_file}" )) + # look up project names stat_busy "Querying project names" local entries="${#project_ids[@]}" local until=0 @@ -171,7 +226,7 @@ pkgctl_search() { lock_close 11 # output mode JSON - if [[ ${formatter} == json ]]; then + if [[ ${output_format} == json ]]; then jq --from-file <( for project_id in $(jq '.[].project_id' <<< "${output}"); do project_name=${project_name_lookup[${project_id}]} @@ -197,6 +252,23 @@ pkgctl_search() { unset "data[${#data[@]}-1]" fi + # output mode plain + if [[ ${output_format} == plain ]]; then + printf "%s%s%s\n" "${PURPLE}" "${project_name}/${path}" "${ALL_OFF}" + + currentline=${startline} + for line in "${data[@]}"; do + if (( line_numbers )); then + line="${DARK_GREEN}${currentline}${ALL_OFF}: ${line}" + currentline=$(( currentline + 1 )) + fi + printf "%s\n" "${line}" + done + printf "\n" + + continue + fi + # prepend empty lines to match startline if (( startline > 1 )); then mapfile -t data < <( @@ -210,6 +282,7 @@ pkgctl_search() { --line-range "${startline}:" \ --paging=never \ --force-colorization \ + --style "${bats_style}" \ --map-syntax "PKGBUILD:Bourne Again Shell (bash)" \ --map-syntax ".SRCINFO:INI" \ --map-syntax "*install:Bourne Again Shell (bash)" \ diff --git a/src/lib/valid-search.sh b/src/lib/valid-search.sh new file mode 100644 index 0000000..43799a5 --- /dev/null +++ b/src/lib/valid-search.sh @@ -0,0 +1,11 @@ +#!/hint/bash +# +# SPDX-License-Identifier: GPL-3.0-or-later +: + +# shellcheck disable=2034 +valid_search_output_format=( + pretty + plain + json +) -- cgit v1.2.3-70-g09d2 From 2b8033b91132d303603f370a54eef02949703750 Mon Sep 17 00:00:00 2001 From: Christian Heusel Date: Thu, 8 Jun 2023 14:47:29 +0200 Subject: feat(aur): add subcommand to drop a package from the repos to the AUR Add an aur command to interact with the Arch User Repository including the drop-from-repo subommand which allows to drop packages from the official repository to the Arch User Repository in one go. Related to #143 Component: pkgctl aur drop-from-repo Co-authored-by: Levente Polyak Signed-off-by: Christian Heusel --- contrib/completion/bash/devtools.in | 13 ++- contrib/completion/zsh/_devtools.in | 13 +++ doc/man/pkgctl-aur-drop-from-repo.1.asciidoc | 41 +++++++ doc/man/pkgctl-aur.1.asciidoc | 37 ++++++ doc/man/pkgctl.1.asciidoc | 4 + src/lib/aur.sh | 65 +++++++++++ src/lib/aur/drop-from-repo.sh | 166 +++++++++++++++++++++++++++ src/lib/common.sh | 1 + src/pkgctl.in | 9 ++ 9 files changed, 348 insertions(+), 1 deletion(-) create mode 100644 doc/man/pkgctl-aur-drop-from-repo.1.asciidoc create mode 100644 doc/man/pkgctl-aur.1.asciidoc create mode 100644 src/lib/aur.sh create mode 100644 src/lib/aur/drop-from-repo.sh (limited to 'src/lib') diff --git a/contrib/completion/bash/devtools.in b/contrib/completion/bash/devtools.in index 4c7b73a..1fbd46c 100644 --- a/contrib/completion/bash/devtools.in +++ b/contrib/completion/bash/devtools.in @@ -135,6 +135,7 @@ complete -F _offload_build offload-build _pkgctl_cmds=( + aur auth build db @@ -264,6 +265,17 @@ _pkgctl_release_args__repo_opts() { _devtools_completions_repo; } _pkgctl_release_args_r_opts() { _pkgctl_release_args__repo_opts; } _pkgctl_release_opts() { _filedir -d; } +_pkgctl_aur_cmds=( + drop-from-repo +) + +_pkgctl_aur_drop_from_repo_args=( + --no-disown + -f --force + -h --help +) +_pkgctl_aur_drop_from_repo_opts() { _filedir -d; } + _pkgctl_repo_cmds=( clone @@ -308,7 +320,6 @@ _pkgctl_repo_create_args=( -h --help ) - _pkgctl_repo_switch_args=( --discard-changes -f --force diff --git a/contrib/completion/zsh/_devtools.in b/contrib/completion/zsh/_devtools.in index b316346..5b51aff 100644 --- a/contrib/completion/zsh/_devtools.in +++ b/contrib/completion/zsh/_devtools.in @@ -96,6 +96,18 @@ _pkgctl_release_args=( '*:git_dir:_files -/' ) +_pkgctl_aur_cmds=( + "pkgctl aur command" + "drop-from-repo[Drop a package from the official repository to the AUR]" +) + +_pkgctl_aur_drop_from_repo_args=( + '(-f --force)'{-f,--force}'[Force push to the AUR overwriting the remote repository]' + '--no-disown[Do not disown the package on the AUR]' + '(-h --help)'{-h,--help}'[Display usage]' + '*:git_dir:_files -/' +) + _pkgctl_repo_cmds=( "pkgctl repo command" "clone[Clone a package repository]" @@ -257,6 +269,7 @@ _devtools_completions_all_packages() { _pkgctl_cmds=( "pkgctl command" + "aur[Interact with the Arch User Repository (AUR)]" "auth[Authenticate with services like GitLab]" "build[Build packages inside a clean chroot]" "db[Pacman database modification for package update, move etc]" diff --git a/doc/man/pkgctl-aur-drop-from-repo.1.asciidoc b/doc/man/pkgctl-aur-drop-from-repo.1.asciidoc new file mode 100644 index 0000000..a9d39c6 --- /dev/null +++ b/doc/man/pkgctl-aur-drop-from-repo.1.asciidoc @@ -0,0 +1,41 @@ +pkgctl-aur-drop-from-repo(1) +============================ + +Name +---- +pkgctl-aur-drop-from-repo - Drop a package from the official repository to the AUR + +Synopsis +-------- +pkgctl aur drop-from-repo [OPTIONS] [PATH]... + +Description +----------- + +Drops a specified package from the official repositories to the Arch User +Repository. + +This command requires a local Git clone of the package repository. It +reconfigures the repository for AUR compatibility and pushes it to the +AUR. Afterwards, the package is removed from the official repository. + +By default, the package is automatically disowned in the AUR. + +Options +------- + +*--no-disown*:: + Do not disown the package on the AUR + +*-f, --force*:: + Force push to the AUR overwriting the remote repository + +*-h, --help*:: + Show a help text + +See Also +-------- + +linkman:pkgctl-db-remove[1] + +include::include/footer.asciidoc[] diff --git a/doc/man/pkgctl-aur.1.asciidoc b/doc/man/pkgctl-aur.1.asciidoc new file mode 100644 index 0000000..d69124a --- /dev/null +++ b/doc/man/pkgctl-aur.1.asciidoc @@ -0,0 +1,37 @@ +pkgctl-aur(1) +============= + +Name +---- +pkgctl-aur - Interact with the Arch User Repository (AUR) + +Synopsis +-------- +pkgctl aur [OPTIONS] [SUBCOMMAND] + +Description +----------- + +Provides a suite of tools designed for managing and interacting with the Arch +User Repository (AUR). It simplifies various tasks related to AUR, including +importing repositories, managing packages, and transitioning packages between +the official repositories and the AUR. + +Options +------- + +*-h, --help*:: + Show a help text + +Subcommands +----------- + +pkgctl aur drop-from-repo:: + Drop a package from the official repository to the AUR + +See Also +-------- + +linkman:pkgctl-aur-drop-from-repo[1] + +include::include/footer.asciidoc[] diff --git a/doc/man/pkgctl.1.asciidoc b/doc/man/pkgctl.1.asciidoc index 1164561..24b0613 100644 --- a/doc/man/pkgctl.1.asciidoc +++ b/doc/man/pkgctl.1.asciidoc @@ -26,6 +26,9 @@ Options Subcommands ----------- +pkgctl aur:: + Interact with the Arch User Repository + pkgctl auth:: Authenticate with services like GitLab @@ -53,6 +56,7 @@ pkgctl version:: See Also -------- +linkman:pkgctl-aur[1] linkman:pkgctl-auth[1] linkman:pkgctl-build[1] linkman:pkgctl-db[1] diff --git a/src/lib/aur.sh b/src/lib/aur.sh new file mode 100644 index 0000000..24cbb62 --- /dev/null +++ b/src/lib/aur.sh @@ -0,0 +1,65 @@ +#!/hint/bash +# +# SPDX-License-Identifier: GPL-3.0-or-later + +[[ -z ${DEVTOOLS_INCLUDE_AUR_SH:-} ]] || return 0 +DEVTOOLS_INCLUDE_AUR_SH=1 + +_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@} + +set -eo pipefail + + +pkgctl_aur_usage() { + local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} + cat <<- _EOF_ + Usage: ${COMMAND} [COMMAND] [OPTIONS] + + Interact with the Arch User Repository (AUR). + + Provides a suite of tools designed for managing and interacting with the Arch + User Repository (AUR). It simplifies various tasks related to AUR, including + importing repositories, managing packages, and transitioning packages between + the official repositories and the AUR. + + COMMANDS + drop-from-repo Drop a package from the official repository to the AUR + + OPTIONS + -h, --help Show this help text + + EXAMPLES + $ ${COMMAND} drop-from-repo libfoo +_EOF_ +} + +pkgctl_aur() { + if (( $# < 1 )); then + pkgctl_aur_usage + exit 0 + fi + + # option checking + while (( $# )); do + case $1 in + -h|--help) + pkgctl_aur_usage + exit 0 + ;; + drop-from-repo) + _DEVTOOLS_COMMAND+=" $1" + shift + # shellcheck source=src/lib/aur/drop-from-repo.sh + source "${_DEVTOOLS_LIBRARY_DIR}"/lib/aur/drop-from-repo.sh + pkgctl_aur_drop_from_repo "$@" + exit 0 + ;; + -*) + die "invalid argument: %s" "$1" + ;; + *) + die "invalid command: %s" "$1" + ;; + esac + done +} diff --git a/src/lib/aur/drop-from-repo.sh b/src/lib/aur/drop-from-repo.sh new file mode 100644 index 0000000..d70b559 --- /dev/null +++ b/src/lib/aur/drop-from-repo.sh @@ -0,0 +1,166 @@ +#!/bin/bash +# +# SPDX-License-Identifier: GPL-3.0-or-later + +[[ -z ${DEVTOOLS_INCLUDE_AUR_DROP_FROM_REPO_SH:-} ]] || return 0 +DEVTOOLS_INCLUDE_AUR_DROP_FROM_REPO_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/db/remove.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/db/remove.sh +# shellcheck source=src//lib/util/pacman.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/pacman.sh + +source /usr/share/makepkg/util/message.sh + +set -eo pipefail + + +pkgctl_aur_drop_from_repo_usage() { + local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} + cat <<- _EOF_ + Usage: ${COMMAND} [OPTIONS] [PATH]... + + Drops a specified package from the official repositories to the Arch + User Repository. + + This command requires a local Git clone of the package repository. It + reconfigures the repository for AUR compatibility and pushes it to the + AUR. Afterwards, the package is removed from the official repository. + + By default, the package is automatically disowned in the AUR. + + OPTIONS + --no-disown Do not disown the package on the AUR + -f, --force Force push to the AUR overwriting the remote repository + -h, --help Show this help text + + EXAMPLES + $ ${COMMAND} foo + $ ${COMMAND} --no-disown --force +_EOF_ +} + +pkgctl_aur_drop_from_repo() { + # options + local paths=() + local DISOWN=1 + local FORCE=0 + + # variables + local path realpath pkgbase pkgrepo remote_url + + while (( $# )); do + case $1 in + -h|--help) + pkgctl_aur_drop_from_repo_usage + exit 0 + ;; + --no-disown) + DISOWN=0 + shift + ;; + -f|--force) + FORCE=1 + shift + ;; + --) + shift + break + ;; + -*) + die "Invalid argument: %s" "$1" + ;; + *) + paths=("$@") + break + ;; + esac + done + + # check if invoked without any path from within a packaging repo + if (( ${#paths[@]} == 0 )); then + if [[ -f PKGBUILD ]]; then + paths=(".") + else + pkgctl_aur_drop_from_repo_usage + exit 1 + fi + fi + + for path in "${paths[@]}"; do + if ! realpath=$(realpath -e "${path}"); then + die "No such directory: ${path}" + fi + + pkgbase=$(basename "${realpath}") + pkgbase=${pkgbase%.git} + + if [[ ! -d "${path}/.git" ]]; then + die "Not a Git repository: ${path}" + fi + + pushd "${path}" >/dev/null + + if [[ ! -f PKGBUILD ]]; then + die 'PKGBUILD not found in %s' "${path}" + fi + + msg "Dropping ${pkgbase} to the AUR" + + remote_url="${AUR_URL_SSH}:${pkgbase}.git" + if ! git remote add origin "${remote_url}" &>/dev/null; then + git remote set-url origin "${remote_url}" + fi + + # move the main branch to master + if [[ $(git symbolic-ref --quiet --short HEAD) == main ]]; then + git branch --move master + git config branch.master.merge refs/heads/master + git remote set-head origin master + fi + + # auto generate .SRCINFO if not already present + if [[ -z "$(git ls-tree -r HEAD --name-only .SRCINFO)" ]]; then + stat_busy 'Generating .SRCINFO' + makepkg --printsrcinfo > .SRCINFO + stat_done + + git add --force -- .SRCINFO + git commit --quiet --message "Adding .SRCINFO" -- .SRCINFO + fi + + msg "Pushing ${pkgbase} to the AUR" + if (( FORCE )); then + AUR_OVERWRITE=1 \ + GIT_SSH_COMMAND="ssh -o SendEnv=AUR_OVERWRITE" \ + git push --force origin master + else + git push origin master + fi + + if (( DISOWN )); then + msg "Disowning ${pkgbase} on the AUR" + # shellcheck disable=SC2029 + ssh "${AUR_URL_SSH}" disown "${pkgbase}" + fi + + # auto-detection of the repo to remove from + if ! pkgrepo=$(get_pacman_repo_from_pkgbuild PKGBUILD); then + die 'Failed to get pacman repo' + fi + + msg "Deleting ${pkgbase} from the official repository" + if [[ -z "${pkgrepo}" ]]; then + warning 'Did not find %s in any repository, please delete manually' "${pkgbase}" + else + msg2 " repo: ${pkgrepo}" + pkgctl_db_remove "${pkgrepo}" "${pkgbase}" + fi + + popd >/dev/null + done +} diff --git a/src/lib/common.sh b/src/lib/common.sh index 17b91bc..a93e906 100644 --- a/src/lib/common.sh +++ b/src/lib/common.sh @@ -29,6 +29,7 @@ export GIT_PACKAGING_URL_SSH="git@${GITLAB_HOST}:${GIT_PACKAGING_NAMESPACE}" export GIT_PACKAGING_URL_HTTPS="https://${GITLAB_HOST}/${GIT_PACKAGING_NAMESPACE}" export PACKAGING_REPO_RELEASE_HOST=repos.archlinux.org export PKGBASE_MAINTAINER_URL=https://archlinux.org/packages/pkgbase-maintainer +export AUR_URL_SSH=aur@aur.archlinux.org # check if messages are to be printed using color if [[ -t 2 && "$TERM" != dumb ]] || [[ ${DEVTOOLS_COLOR} == always ]]; then diff --git a/src/pkgctl.in b/src/pkgctl.in index 10a2348..070e0cd 100644 --- a/src/pkgctl.in +++ b/src/pkgctl.in @@ -19,6 +19,7 @@ usage() { Unified command-line frontend for devtools. COMMANDS + aur Interact with the Arch User Repository auth Authenticate with services like GitLab build Build packages inside a clean chroot db Pacman database modification for package update, move etc @@ -51,6 +52,14 @@ while (( $# )); do usage exit 0 ;; + aur) + _DEVTOOLS_COMMAND+=" $1" + shift + # shellcheck source=src/lib/aur.sh + source "${_DEVTOOLS_LIBRARY_DIR}"/lib/aur.sh + pkgctl_aur "$@" + exit 0 + ;; build) _DEVTOOLS_COMMAND+=" $1" shift -- cgit v1.2.3-70-g09d2 From b264c7f1c771790c53561f5d3f4de589e0000c05 Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Sun, 10 Sep 2023 00:00:27 +0200 Subject: feat(util): parallelize srcinfo generation Heavily improve the runtime of huge split packages, by creating an own parallelized high level implementation of the makepkg low level building blocks for srcinfo generation. This reduces the runtine to generate the srcinfo file for thunderbird from 24 seconds down to 1 second. --- src/commitpkg.in | 10 ++++--- src/lib/build/build.sh | 5 ++-- src/lib/util/srcinfo.sh | 69 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 6 deletions(-) create mode 100644 src/lib/util/srcinfo.sh (limited to 'src/lib') diff --git a/src/commitpkg.in b/src/commitpkg.in index 016ab22..e17b270 100644 --- a/src/commitpkg.in +++ b/src/commitpkg.in @@ -5,9 +5,12 @@ _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/srcinfo.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/srcinfo.sh source /usr/share/makepkg/util/util.sh -source /usr/share/makepkg/srcinfo.sh + +set -eo pipefail check_pkgbuild_validity() { @@ -185,10 +188,9 @@ done check_pkgbuild_validity # auto generate .SRCINFO -stat_busy 'Generating .SRCINFO' -write_srcinfo_content > .SRCINFO +# shellcheck disable=SC2119 +write_srcinfo_file git add --force .SRCINFO -stat_done if [[ -n $(git status --porcelain --untracked-files=no) ]]; then stat_busy 'Staging files' diff --git a/src/lib/build/build.sh b/src/lib/build/build.sh index e0982e4..8b4240c 100644 --- a/src/lib/build/build.sh +++ b/src/lib/build/build.sh @@ -14,6 +14,8 @@ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/db/update.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/release.sh # shellcheck source=src/lib/util/git.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/git.sh +# shellcheck source=src/lib/util/srcinfo.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/srcinfo.sh # shellcheck source=src/lib/util/pacman.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/pacman.sh # shellcheck source=src/lib/valid-repos.sh @@ -26,8 +28,7 @@ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-inspect.sh source /usr/share/makepkg/util/config.sh source /usr/share/makepkg/util/message.sh -set -e -set -o pipefail +set -eo pipefail pkgctl_build_usage() { diff --git a/src/lib/util/srcinfo.sh b/src/lib/util/srcinfo.sh new file mode 100644 index 0000000..b646dc3 --- /dev/null +++ b/src/lib/util/srcinfo.sh @@ -0,0 +1,69 @@ +#!/hint/bash +# +# SPDX-License-Identifier: GPL-3.0-or-later + +[[ -z ${DEVTOOLS_INCLUDE_UTIL_SRCINFO_SH:-} ]] || return 0 +DEVTOOLS_INCLUDE_UTIL_SRCINFO_SH=1 + +_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@} +# shellcheck source=src/lib/common.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh + +source /usr/share/makepkg/util/util.sh +source /usr/share/makepkg/srcinfo.sh + +set -eo pipefail + + +print_srcinfo() { + local pkgpath=${1:-.} + local outdir pkg pid + local pids=() + + # source the PKGBUILD + # shellcheck source=contrib/makepkg/PKGBUILD.proto + . "${pkgpath}"/PKGBUILD + + # run without parallelization for single packages + if (( ${#pkgname[@]} == 1 )); then + write_srcinfo_content + return 0 + fi + + [[ -z ${WORKDIR:-} ]] && setup_workdir + outdir=$(mktemp --directory --tmpdir="${WORKDIR}" pkgctl-srcinfo.XXXXXXXXXX) + + # fork workload for each split pkgname + for pkg in "${pkgname[@]}"; do + ( + # deactivate errexit to avoid makepkg abort on grep_function + set +e + srcinfo_write_package "$pkg" > "${outdir}/${pkg}" + )& + pids+=($!) + done + + # join workload + for pid in "${pids[@]}"; do + if ! wait "${pid}"; then + return 1 + fi + done + + # collect output + srcinfo_write_global + for pkg in "${pkgname[@]}"; do + srcinfo_separate_section + cat "${outdir}/${pkg}" + done +} + +write_srcinfo_file() { + local pkgpath=${1:-.} + stat_busy 'Generating .SRCINFO' + if ! print_srcinfo "${pkgpath}" > "${pkgpath}"/.SRCINFO; then + error 'Failed to write .SRCINFO file' + return 1 + fi + stat_done +} -- cgit v1.2.3-70-g09d2 From d210079037d34fd32fc9a84e490655204bae103a Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Tue, 9 Jan 2024 00:39:43 +0100 Subject: feat(util): add library function to generate source packages --- src/lib/util/makepkg.sh | 35 +++++++++++++++++++++++++++++++++++ src/offload-build.in | 11 +++++++---- 2 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 src/lib/util/makepkg.sh (limited to 'src/lib') diff --git a/src/lib/util/makepkg.sh b/src/lib/util/makepkg.sh new file mode 100644 index 0000000..adb3af6 --- /dev/null +++ b/src/lib/util/makepkg.sh @@ -0,0 +1,35 @@ +#!/hint/bash +# +# SPDX-License-Identifier: GPL-3.0-or-later + +[[ -z ${DEVTOOLS_INCLUDE_UTIL_MAKEPKG_SH:-} ]] || return 0 +DEVTOOLS_INCLUDE_UTIL_MAKEPKG_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/srcinfo.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/srcinfo.sh + + +set -e + +makepkg_source_package() { + if (( EUID != 0 )); then + [[ -z ${WORKDIR:-} ]] && setup_workdir + export WORKDIR DEVTOOLS_INCLUDE_COMMON_SH + fakeroot -- bash -$- -c "source '${BASH_SOURCE[0]}' && ${FUNCNAME[0]}" + return + fi + ( + export LIBMAKEPKG_LINT_PKGBUILD_SH=1 + lint_pkgbuild() { :; } + + export LIBMAKEPKG_SRCINFO_SH=1 + write_srcinfo() { print_srcinfo; } + + set +e -- -F --source + # shellcheck source=/usr/bin/makepkg + source "$(command -v makepkg)" + ) +} diff --git a/src/offload-build.in b/src/offload-build.in index 0aa2e38..5238129 100644 --- a/src/offload-build.in +++ b/src/offload-build.in @@ -6,11 +6,16 @@ # # SPDX-License-Identifier: GPL-3.0-or-later +_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 + source /usr/share/makepkg/util/config.sh # Deprecation warning if [[ -z $_DEVTOOLS_COMMAND ]]; then - colorize warning "${0##*/} is deprecated and will be removed. Use 'pkgctl build --offload' instead" fi @@ -19,8 +24,6 @@ repo=extra arch=x86_64 server=build.archlinux.org -die() { printf "error: $1\n" "${@:2}"; exit 1; } - usage() { cat <<- _EOF_ Usage: ${BASH_SOURCE[0]##*/} [--repo REPO] [--arch ARCHITECTURE] [--server SERVER] -- [ARCHBUILD_ARGS] @@ -84,7 +87,7 @@ load_makepkg_config # transferred, including local sources, install scripts, and changelogs. export TEMPDIR=$(mktemp -d --tmpdir offload-build.XXXXXXXXXX) export SRCPKGDEST=${TEMPDIR} -makepkg --source || die "unable to make source package" +makepkg_source_package || die "unable to make source package" # Temporary cosmetic workaround makepkg if SRCDEST is set somewhere else # but an empty src dir is created in PWD. Remove once fixed in makepkg. -- cgit v1.2.3-70-g09d2 From ef04960b98595de8f9405d0069324b6b1fddb5ba Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Sat, 23 Dec 2023 23:49:07 +0100 Subject: feat(build): update srcinfo file after build The srcinfo file is essentially a representation of the current build recipes, hence generate an up to date version by adding it as secondary build artifact to the build process. Signed-off-by: Levente Polyak --- src/lib/build/build.sh | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src/lib') diff --git a/src/lib/build/build.sh b/src/lib/build/build.sh index 8b4240c..a19dd37 100644 --- a/src/lib/build/build.sh +++ b/src/lib/build/build.sh @@ -429,6 +429,10 @@ pkgctl_build() { fi done + # auto generate .SRCINFO + # shellcheck disable=SC2119 + write_srcinfo_file + # release the build if (( RELEASE )); then pkgctl_release --repo "${pkgrepo}" "${RELEASE_OPTIONS[@]}" -- cgit v1.2.3-70-g09d2 From e413b65df3dcddeb94da2defb53ab17ef2a8558d Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Wed, 3 Jan 2024 16:21:40 +0100 Subject: fix(build): re-source the PKGBUILD to update changed values During certain operations like --edit, --pkgver etc the PKGBUILD may change since last sourced. If a modified checksum of the PKGBUILD is detected, re-source it before processing. Signed-off-by: Levente Polyak --- src/lib/build/build.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'src/lib') diff --git a/src/lib/build/build.sh b/src/lib/build/build.sh index a19dd37..5276653 100644 --- a/src/lib/build/build.sh +++ b/src/lib/build/build.sh @@ -134,7 +134,7 @@ pkgctl_build() { local WORKER_SLOT= # variables - local _arch path pkgbase pkgrepo source + local _arch path pkgbase pkgrepo source pkgbuild_checksum while (( $# )); do case $1 in @@ -311,6 +311,7 @@ pkgctl_build() { . ./PKGBUILD pkgbase=${pkgbase:-$pkgname} pkgrepo=${REPO} + pkgbuild_checksum=$(b2sum PKGBUILD | awk '{print $1}') msg "Building ${pkgbase}" # auto-detection of build target @@ -412,6 +413,12 @@ pkgctl_build() { updpkgsums fi + # re-source the PKGBUILD if it changed + if [[ ${pkgbuild_checksum} != "$(b2sum PKGBUILD | awk '{print $1}')" ]]; then + # shellcheck source=contrib/makepkg/PKGBUILD.proto + . ./PKGBUILD + fi + # execute build for arch in "${BUILD_ARCH[@]}"; do if [[ -n $arch ]]; then -- cgit v1.2.3-70-g09d2 From e6f7aa395fabc7eca1ee4d93e454d2551cea505c Mon Sep 17 00:00:00 2001 From: Jelle van der Waa Date: Sun, 5 Nov 2023 16:11:12 +0100 Subject: feat(version): introduce version check subcommand The version subcommand handles pkgver related commands, the first subcommand being `check`. Check runs nvchecker if a `.nvchecker.toml` file exists and compares the current pkgver with the latest release. Introduces nvchecker as optional dependency which has to be installed in order to use this particular subcommand. BREAKING CHANGE: formerly pkgctl version would output the version of the pkgctl tool, now it is used as a version related subcommand. Fixes #140 Component: pkgctl version Component: pkgctl version check Co-authored-by: Christian Heusel --- README.md | 1 + contrib/completion/bash/devtools.in | 9 +++ contrib/completion/zsh/_devtools.in | 10 +++- doc/man/pkgctl-version-check.1.asciidoc | 35 ++++++++++++ doc/man/pkgctl-version.1.asciidoc | 18 +++++- doc/man/pkgctl.1.asciidoc | 2 +- src/lib/version.sh | 56 +++++++++++++++++++ src/lib/version/check.sh | 97 +++++++++++++++++++++++++++++++++ src/lib/version/version.sh | 47 ---------------- src/pkgctl.in | 20 +++++-- 10 files changed, 238 insertions(+), 57 deletions(-) create mode 100644 doc/man/pkgctl-version-check.1.asciidoc create mode 100644 src/lib/version.sh create mode 100644 src/lib/version/check.sh delete mode 100644 src/lib/version/version.sh (limited to 'src/lib') diff --git a/README.md b/README.md index ca761db..8b85bd9 100644 --- a/README.md +++ b/README.md @@ -89,6 +89,7 @@ Component: pkgctl db remove ### Optional Dependencies - bats (pretty printing) +- nvchecker (version checking) ### Development Dependencies diff --git a/contrib/completion/bash/devtools.in b/contrib/completion/bash/devtools.in index 1fbd46c..f1084ab 100644 --- a/contrib/completion/bash/devtools.in +++ b/contrib/completion/bash/devtools.in @@ -337,6 +337,15 @@ _pkgctl_repo_switch_opts() { fi } +_pkgctl_version_cmds=( + check +) + +_pkgctl_version_check_args=( + -h --help +) + +_pkgctl_version_check_opts() { _filedir -d; } _pkgctl_repo_web_args=( --print diff --git a/contrib/completion/zsh/_devtools.in b/contrib/completion/zsh/_devtools.in index 5b51aff..575c327 100644 --- a/contrib/completion/zsh/_devtools.in +++ b/contrib/completion/zsh/_devtools.in @@ -277,7 +277,7 @@ _pkgctl_cmds=( "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]" - "version[Show pkgctl version information]" + "version[Package version related commands]" ) _pkgctl_args=( @@ -285,8 +285,14 @@ _pkgctl_args=( '(-h --help)'{-h,--help}'[Display usage]' ) -_pkgctl_version_args=( +_pkgctl_version_cmds=( + "pkgctl version command" + "check[Check if there is an new upstream version available]" +) + +_pkgctl_version_check_args=( '(-h --help)'{-h,--help}'[Display usage]' + '*:git_dir:_files -/' ) _pkgctl_diff_args=("${_diffpkg_args[@]}") diff --git a/doc/man/pkgctl-version-check.1.asciidoc b/doc/man/pkgctl-version-check.1.asciidoc new file mode 100644 index 0000000..97d8c47 --- /dev/null +++ b/doc/man/pkgctl-version-check.1.asciidoc @@ -0,0 +1,35 @@ +pkgctl-version-check(1) +======================= + +Name +---- +pkgctl-version-check - Check if there is an new upstream version available + +Synopsis +-------- +pkgctl version check [OPTIONS] [PKGBASE...] + +Description +----------- + +Uses nvchecker, a .nvchecker.toml file and the version specified in the current +PKGBUILDs pkgver to check if there is a newer package version available to +which this package could possibly be upgraded. + +The current working directory is used if no PKGBASE is specified. + +See the section on configuration files in **nvchecker**(1) for possible options +which can be utilized in .nvchecker.toml. + +Options +------- + +*-h, --help*:: + Show a help text + +See Also +-------- + +linkman:nvchecker[1] + +include::include/footer.asciidoc[] diff --git a/doc/man/pkgctl-version.1.asciidoc b/doc/man/pkgctl-version.1.asciidoc index 9beebf5..53a72f3 100644 --- a/doc/man/pkgctl-version.1.asciidoc +++ b/doc/man/pkgctl-version.1.asciidoc @@ -3,16 +3,17 @@ pkgctl-version(1) Name ---- -pkgctl-version - Show pkgctl version information +pkgctl-version - Package version related commands. + Synopsis -------- -pkgctl version [OPTIONS] +pkgctl version [OPTIONS] [SUBCOMMAND] Description ----------- -Shows the current version information of pkgctl. +Package version related commands such as checking if a package is out of date. Options ------- @@ -20,4 +21,15 @@ Options *-h, --help*:: Show a help text +Subcommands +----------- + +pkgctl version check:: + Check if there is an new upstream version available + +See Also +-------- + +linkman:pkgctl-version-check[1] + include::include/footer.asciidoc[] diff --git a/doc/man/pkgctl.1.asciidoc b/doc/man/pkgctl.1.asciidoc index 24b0613..929ae9a 100644 --- a/doc/man/pkgctl.1.asciidoc +++ b/doc/man/pkgctl.1.asciidoc @@ -51,7 +51,7 @@ pkgctl search:: Search for an expression across the GitLab packaging group pkgctl version:: - Show pkgctl version information + Package version related commands See Also -------- diff --git a/src/lib/version.sh b/src/lib/version.sh new file mode 100644 index 0000000..826b306 --- /dev/null +++ b/src/lib/version.sh @@ -0,0 +1,56 @@ +#!/hint/bash +# +# SPDX-License-Identifier: GPL-3.0-or-later + +[[ -z ${DEVTOOLS_INCLUDE_VERSION_SH:-} ]] || return 0 +DEVTOOLS_INCLUDE_VERSION_SH=1 + +_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@} + +set -e + + +pkgctl_version_usage() { + local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} + cat <<- _EOF_ + Usage: ${COMMAND} [COMMAND] [OPTIONS] + + Package version related commands. + + COMMANDS + check Check if there is a newer version availble + + OPTIONS + -h, --help Show this help text + + EXAMPLES + $ ${COMMAND} check libfoo linux libbar +_EOF_ +} + +pkgctl_version() { + if (( $# < 1 )); then + pkgctl_version_usage + exit 0 + fi + + while (( $# )); do + case $1 in + -h|--help) + pkgctl_version_usage + exit 0 + ;; + check) + _DEVTOOLS_COMMAND+=" $1" + shift + # shellcheck source=src/lib/version/check.sh + source "${_DEVTOOLS_LIBRARY_DIR}"/lib/version/check.sh + pkgctl_version_check "$@" + exit 0 + ;; + *) + die "invalid argument: %s" "$1" + ;; + esac + done +} diff --git a/src/lib/version/check.sh b/src/lib/version/check.sh new file mode 100644 index 0000000..f6619c2 --- /dev/null +++ b/src/lib/version/check.sh @@ -0,0 +1,97 @@ +#!/bin/bash +# +# SPDX-License-Identifier: GPL-3.0-or-later +# +[[ -z ${DEVTOOLS_INCLUDE_VERSION_CHECK_SH:-} ]] || return 0 +DEVTOOLS_INCLUDE_VERSION_CHECK_SH=1 + +_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@} +# shellcheck source=src/lib/common.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh + +source /usr/share/makepkg/util/message.sh + +set -e + +pkgctl_version_check_usage() { + local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} + cat <<- _EOF_ + Usage: ${COMMAND} [OPTIONS] [PKGBASE]... + + Uses nvchecker, a .nvchecker.toml file and the current PKGBUILD + pkgver to check if there is a newer package version available. + + The current working directory is used if no PKGBASE is specified. + + OPTIONS + -h, --help Show this help text + + EXAMPLES + $ ${COMMAND} neovim vim +_EOF_ +} + +pkgctl_version_check() { + local path + local pkgbases=() + + while (( $# )); do + case $1 in + -h|--help) + pkgctl_version_check_usage + exit 0 + ;; + --) + shift + break + ;; + -*) + die "invalid argument: %s" "$1" + ;; + *) + pkgbases=("$@") + break + ;; + esac + done + + if ! command -v nvchecker &>/dev/null; then + die "The \"$_DEVTOOLS_COMMAND\" command requires 'nvchecker'" + fi + + # Check if used without pkgbases in a packaging directory + if (( ${#pkgbases[@]} == 0 )); then + if [[ -f PKGBUILD ]]; then + pkgbases=(".") + else + pkgctl_version_check_usage + exit 1 + fi + fi + + for path in "${pkgbases[@]}"; do + pushd "${path}" >/dev/null + run_nvchecker "${path}" + popd >/dev/null + done +} + +run_nvchecker() { + local path=$1 + local pkgbase latest_version + + if [[ ! -f ".nvchecker.toml" || ! -f "PKGBUILD" ]]; then + die "No .nvchecker.toml or PKGBUILD found for ${path}" + exit 1 + fi + + # TODO: parse .SRCINFO file + # shellcheck source=contrib/makepkg/PKGBUILD.proto + . ./PKGBUILD + pkgbase=${pkgbase:-$pkgname} + + latest_version=$(nvchecker -c .nvchecker.toml --logger json | jq --raw-output 'select( .version ) | .version') + if (( $(vercmp "${latest_version}" "${pkgver}") > 0 )); then + msg2 "New ${pkgbase} version ${latest_version} is available upstream" + fi +} diff --git a/src/lib/version/version.sh b/src/lib/version/version.sh deleted file mode 100644 index d00a460..0000000 --- a/src/lib/version/version.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/hint/bash -# -# SPDX-License-Identifier: GPL-3.0-or-later - -[[ -z ${DEVTOOLS_INCLUDE_VERSION_SH:-} ]] || return 0 -DEVTOOLS_INCLUDE_VERSION_SH=1 - -_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@} - -source /usr/share/makepkg/util/message.sh - -set -e - - -pkgctl_version_usage() { - local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} - cat <<- _EOF_ - Usage: ${COMMAND} [OPTIONS] - - Shows the current version information of pkgctl - - OPTIONS - -h, --help Show this help text -_EOF_ -} - -pkgctl_version_print() { - cat <<- _EOF_ - pkgctl @buildtoolver@ -_EOF_ -} - -pkgctl_version() { - while (( $# )); do - case $1 in - -h|--help) - pkgctl_version_usage - exit 0 - ;; - *) - die "invalid argument: %s" "$1" - ;; - esac - done - - pkgctl_version_print -} diff --git a/src/pkgctl.in b/src/pkgctl.in index 070e0cd..9deb4b2 100644 --- a/src/pkgctl.in +++ b/src/pkgctl.in @@ -27,7 +27,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 - version Show pkgctl version information + version Package version related commands OPTIONS -h, --help Show this help text @@ -39,6 +39,12 @@ if (( $# < 1 )); then exit 1 fi +pkgctl_version_print() { + cat <<- _EOF_ + pkgctl @buildtoolver@ +_EOF_ +} + export _DEVTOOLS_COMMAND='pkgctl' setup_workdir @@ -114,14 +120,20 @@ while (( $# )); do pkgctl_search "$@" exit 0 ;; - version|--version|-V) + version) _DEVTOOLS_COMMAND+=" $1" shift - # shellcheck source=src/lib/version/version.sh - source "${_DEVTOOLS_LIBRARY_DIR}"/lib/version/version.sh + # shellcheck source=src/lib/version.sh + source "${_DEVTOOLS_LIBRARY_DIR}"/lib/version.sh pkgctl_version "$@" exit 0 ;; + --version|-V) + _DEVTOOLS_COMMAND+=" $1" + shift + pkgctl_version_print + exit 0 + ;; *) die "invalid command: %s" "$1" ;; -- cgit v1.2.3-70-g09d2 From 343a2b5d4c564593402158d2e4dd35dedaf5599f Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Thu, 18 Jan 2024 19:38:42 +0100 Subject: chore(search): correct typo in optional dependency bat --- src/lib/search.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src/lib') diff --git a/src/lib/search.sh b/src/lib/search.sh index 862af25..e737dfa 100644 --- a/src/lib/search.sh +++ b/src/lib/search.sh @@ -91,7 +91,7 @@ pkgctl_search() { local line_numbers=1 # variables - local bats_style="header,grid" + local bat_style="header,grid" local default_filter="-path:keys/pgp/*.asc" local graphql_lookup_batch=200 local output result query entries from until length @@ -156,14 +156,14 @@ pkgctl_search() { fi # check for optional dependencies - if [[ ${output_format} == pretty ]] && ! command -v bats &>/dev/null; then - warning "Failed to find optional dependency 'bats': falling back to plain output" + if [[ ${output_format} == pretty ]] && ! command -v bat &>/dev/null; then + warning "Failed to find optional dependency 'bat': falling back to plain output" output_format=plain fi # populate line numbers option if (( line_numbers )); then - bats_style="numbers,${bats_style}" + bat_style="numbers,${bat_style}" fi # call the gitlab search API @@ -282,7 +282,7 @@ pkgctl_search() { --line-range "${startline}:" \ --paging=never \ --force-colorization \ - --style "${bats_style}" \ + --style "${bat_style}" \ --map-syntax "PKGBUILD:Bourne Again Shell (bash)" \ --map-syntax ".SRCINFO:INI" \ --map-syntax "*install:Bourne Again Shell (bash)" \ -- cgit v1.2.3-70-g09d2 From db8c157eeaac98d23247dac1236642c79a1d257f Mon Sep 17 00:00:00 2001 From: Christian Heusel Date: Fri, 5 Jan 2024 17:43:34 +0100 Subject: chore(build): factor out functions to modify PKGBUILDs Component: pkgctl build Signed-off-by: Christian Heusel --- src/lib/build/build.sh | 12 ++++-------- src/lib/util/pkgbuild.sh | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 src/lib/util/pkgbuild.sh (limited to 'src/lib') diff --git a/src/lib/build/build.sh b/src/lib/build/build.sh index 5276653..712be22 100644 --- a/src/lib/build/build.sh +++ b/src/lib/build/build.sh @@ -18,6 +18,8 @@ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/git.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/srcinfo.sh # shellcheck source=src/lib/util/pacman.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/pacman.sh +# shellcheck source=src/lib/util/pkgbuild.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/pkgbuild.sh # shellcheck source=src/lib/valid-repos.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh # shellcheck source=src/lib/valid-tags.sh @@ -374,20 +376,14 @@ pkgctl_build() { # update pkgver if [[ -n ${PKGVER} ]]; then - 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' - fi msg "Bumping pkgver to ${PKGVER}" - grep --extended-regexp --quiet --max-count=1 "^pkgver=${pkgver}$" PKGBUILD || die "Non-standard pkgver declaration" - sed --regexp-extended "s|^(pkgver=)${pkgver}$|\1${PKGVER}|g" -i PKGBUILD + pkgbuild_set_pkgver "${PKGVER}" fi # update pkgrel if [[ -n ${PKGREL} ]]; then msg "Bumping pkgrel to ${PKGREL}" - grep --extended-regexp --quiet --max-count=1 "^pkgrel=${pkgrel}$" PKGBUILD || die "Non-standard pkgrel declaration" - sed --regexp-extended "s|^(pkgrel=)${pkgrel}$|\1${PKGREL}|g" -i PKGBUILD + pkgbuild_set_pkgrel "${PKGREL}" fi # edit PKGBUILD diff --git a/src/lib/util/pkgbuild.sh b/src/lib/util/pkgbuild.sh new file mode 100644 index 0000000..ebf8e5f --- /dev/null +++ b/src/lib/util/pkgbuild.sh @@ -0,0 +1,43 @@ +#!/hint/bash +# +# SPDX-License-Identifier: GPL-3.0-or-later + +[[ -z ${DEVTOOLS_INCLUDE_UTIL_PKGBUILD_SH:-} ]] || return 0 +DEVTOOLS_INCLUDE_UTIL_PKGBUILD_SH=1 + +_DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@} + +source /usr/share/makepkg/util/message.sh + +set -e + + +# set the pkgver variable in a PKGBUILD +# assumes that the pkgbuild is sourced to detect the presence of a pkgver function +pkgbuild_set_pkgver() { + local new_pkgver=$1 + local pkgver=${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' + fi + + if ! grep --extended-regexp --quiet --max-count=1 "^pkgver=${pkgver}$" PKGBUILD; then + die "Non-standard pkgver declaration" + fi + sed --regexp-extended "s|^(pkgver=)${pkgver}$|\1${new_pkgver}|g" --in-place PKGBUILD +} + +# set the pkgrel variable in a PKGBUILD +# assumes that the pkgbuild is sourced so pkgrel is present +pkgbuild_set_pkgrel() { + local new_pkgrel=$1 + local pkgrel=${pkgrel} + + if ! grep --extended-regexp --quiet --max-count=1 "^pkgrel=${pkgrel}$" PKGBUILD; then + die "Non-standard pkgrel declaration" + fi + sed --regexp-extended "s|^(pkgrel=)${pkgrel}$|\1${new_pkgrel}|g" --in-place PKGBUILD +} + -- cgit v1.2.3-70-g09d2 From 313c5b4d32291e618cc136035f5e056581aec416 Mon Sep 17 00:00:00 2001 From: Christian Heusel Date: Fri, 5 Jan 2024 18:35:39 +0100 Subject: chore(check): factor out function to get upstream version Component: pkgctl version check Signed-off-by: Christian Heusel --- src/lib/version/check.sh | 42 ++++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 16 deletions(-) (limited to 'src/lib') diff --git a/src/lib/version/check.sh b/src/lib/version/check.sh index f6619c2..b93752a 100644 --- a/src/lib/version/check.sh +++ b/src/lib/version/check.sh @@ -34,6 +34,8 @@ _EOF_ pkgctl_version_check() { local path local pkgbases=() + local path pkgbase upstream_version + while (( $# )); do case $1 in @@ -71,27 +73,35 @@ pkgctl_version_check() { for path in "${pkgbases[@]}"; do pushd "${path}" >/dev/null - run_nvchecker "${path}" + + if [[ ! -f "PKGBUILD" ]]; then + die "No PKGBUILD found for ${path}" + fi + + # shellcheck disable=SC2119 + upstream_version=$(get_upstream_version) + + # TODO: parse .SRCINFO file + # shellcheck source=contrib/makepkg/PKGBUILD.proto + . ./PKGBUILD + pkgbase=${pkgbase:-$pkgname} + + if (( $(vercmp "${upstream_version}" "${pkgver}") > 0 )); then + msg2 "New ${pkgbase} version ${upstream_version} is available upstream" + fi + popd >/dev/null done } -run_nvchecker() { - local path=$1 - local pkgbase latest_version +get_upstream_version() { + local config=${1:-.nvchecker.toml} + local upstream_version - if [[ ! -f ".nvchecker.toml" || ! -f "PKGBUILD" ]]; then - die "No .nvchecker.toml or PKGBUILD found for ${path}" - exit 1 + if [[ ! -f $config ]]; then + die "No $config found" fi - # TODO: parse .SRCINFO file - # shellcheck source=contrib/makepkg/PKGBUILD.proto - . ./PKGBUILD - pkgbase=${pkgbase:-$pkgname} - - latest_version=$(nvchecker -c .nvchecker.toml --logger json | jq --raw-output 'select( .version ) | .version') - if (( $(vercmp "${latest_version}" "${pkgver}") > 0 )); then - msg2 "New ${pkgbase} version ${latest_version} is available upstream" - fi + upstream_version=$(nvchecker -c "$config" --logger json | jq --raw-output 'select( .version ) | .version') + printf "%s" "$upstream_version" } -- cgit v1.2.3-70-g09d2 From 6054c869e1b9b853aa7408261e477dcb187ff498 Mon Sep 17 00:00:00 2001 From: Christian Heusel Date: Fri, 5 Jan 2024 19:10:38 +0100 Subject: feat(upgrade): introduce the version upgrade subcommand This subcommand applies the detected upstream version upgrades to a PKGBUILD. Component: pkgctl version upgrade Co-authored-by: Levente Polyak Signed-off-by: Christian Heusel --- contrib/completion/bash/devtools.in | 7 ++ contrib/completion/zsh/_devtools.in | 6 ++ doc/man/pkgctl-version-upgrade.1.asciidoc | 33 +++++++++ doc/man/pkgctl-version.1.asciidoc | 4 ++ src/lib/version.sh | 11 ++- src/lib/version/upgrade.sh | 108 ++++++++++++++++++++++++++++++ 6 files changed, 168 insertions(+), 1 deletion(-) create mode 100644 doc/man/pkgctl-version-upgrade.1.asciidoc create mode 100644 src/lib/version/upgrade.sh (limited to 'src/lib') diff --git a/contrib/completion/bash/devtools.in b/contrib/completion/bash/devtools.in index f1084ab..101bd78 100644 --- a/contrib/completion/bash/devtools.in +++ b/contrib/completion/bash/devtools.in @@ -339,6 +339,7 @@ _pkgctl_repo_switch_opts() { _pkgctl_version_cmds=( check + upgrade ) _pkgctl_version_check_args=( @@ -347,6 +348,12 @@ _pkgctl_version_check_args=( _pkgctl_version_check_opts() { _filedir -d; } +_pkgctl_version_upgrade_args=( + -h --help +) + +_pkgctl_version_upgrade_opts() { _filedir -d; } + _pkgctl_repo_web_args=( --print -h --help diff --git a/contrib/completion/zsh/_devtools.in b/contrib/completion/zsh/_devtools.in index 575c327..38bf582 100644 --- a/contrib/completion/zsh/_devtools.in +++ b/contrib/completion/zsh/_devtools.in @@ -288,6 +288,7 @@ _pkgctl_args=( _pkgctl_version_cmds=( "pkgctl version command" "check[Check if there is an new upstream version available]" + "upgrade[Upgrade the PKGBUILD according to the latest available upstream version]" ) _pkgctl_version_check_args=( @@ -295,6 +296,11 @@ _pkgctl_version_check_args=( '*:git_dir:_files -/' ) +_pkgctl_version_upgrade_args=( + '(-h --help)'{-h,--help}'[Display usage]' + '*:git_dir:_files -/' +) + _pkgctl_diff_args=("${_diffpkg_args[@]}") _handle_subcommands() { diff --git a/doc/man/pkgctl-version-upgrade.1.asciidoc b/doc/man/pkgctl-version-upgrade.1.asciidoc new file mode 100644 index 0000000..3d5d882 --- /dev/null +++ b/doc/man/pkgctl-version-upgrade.1.asciidoc @@ -0,0 +1,33 @@ +pkgctl-version-upgrade(1) +========================= + +Name +---- +pkgctl-version-upgrade - Upgrade the PKGBUILD according to the latest available upstream version + +Synopsis +-------- +pkgctl version upgrade [OPTIONS] [PKGBASE...] + +Description +----------- + +Upgrade the PKGBUILD according to the latest available upstream version. + +Uses nvchecker, a .nvchecker.toml file and the current PKGBUILD pkgver to check +if there is a newer package version available. + +The current working directory is used if no PKGBASE is specified. + +Options +------- + +*-h, --help*:: + Show a help text + +See Also +-------- + +linkman:nvchecker[1] + +include::include/footer.asciidoc[] diff --git a/doc/man/pkgctl-version.1.asciidoc b/doc/man/pkgctl-version.1.asciidoc index 53a72f3..e71becd 100644 --- a/doc/man/pkgctl-version.1.asciidoc +++ b/doc/man/pkgctl-version.1.asciidoc @@ -27,9 +27,13 @@ Subcommands pkgctl version check:: Check if there is an new upstream version available +pkgctl version upgrade:: + Upgrade the PKGBUILD according to the latest available upstream version + See Also -------- linkman:pkgctl-version-check[1] +linkman:pkgctl-version-upgrade[1] include::include/footer.asciidoc[] diff --git a/src/lib/version.sh b/src/lib/version.sh index 826b306..14cd810 100644 --- a/src/lib/version.sh +++ b/src/lib/version.sh @@ -18,7 +18,8 @@ pkgctl_version_usage() { Package version related commands. COMMANDS - check Check if there is a newer version availble + check Check if there is a newer version availble + upgrade Upgrade the PKGBUILD according to the latest available upstream version OPTIONS -h, --help Show this help text @@ -48,6 +49,14 @@ pkgctl_version() { pkgctl_version_check "$@" exit 0 ;; + upgrade) + _DEVTOOLS_COMMAND+=" $1" + shift + # shellcheck source=src/lib/version/upgrade.sh + source "${_DEVTOOLS_LIBRARY_DIR}"/lib/version/upgrade.sh + pkgctl_version_upgrade "$@" + exit 0 + ;; *) die "invalid argument: %s" "$1" ;; diff --git a/src/lib/version/upgrade.sh b/src/lib/version/upgrade.sh new file mode 100644 index 0000000..704431a --- /dev/null +++ b/src/lib/version/upgrade.sh @@ -0,0 +1,108 @@ +#!/bin/bash +# +# SPDX-License-Identifier: GPL-3.0-or-later +# +[[ -z ${DEVTOOLS_INCLUDE_VERSION_UPGRADE_SH:-} ]] || return 0 +DEVTOOLS_INCLUDE_VERSION_UPGRADE_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/version/check.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/version/check.sh +# shellcheck source=src/lib/util/pkgbuild.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/pkgbuild.sh + +source /usr/share/makepkg/util/message.sh + +set -e + +pkgctl_version_upgrade_usage() { + local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} + cat <<- _EOF_ + Usage: ${COMMAND} [OPTIONS] [PKGBASE]... + + Upgrade the PKGBUILD according to the latest available upstream version + + Uses nvchecker, a .nvchecker.toml file and the current PKGBUILD + pkgver to check if there is a newer package version available. + + The current working directory is used if no PKGBASE is specified. + + OPTIONS + -h, --help Show this help text + + EXAMPLES + $ ${COMMAND} neovim vim +_EOF_ +} + +pkgctl_version_upgrade() { + local path upstream_version result + local pkgbases=() + + while (( $# )); do + case $1 in + -h|--help) + pkgctl_version_upgrade_usage + exit 0 + ;; + --) + shift + break + ;; + -*) + die "invalid argument: %s" "$1" + ;; + *) + pkgbases=("$@") + break + ;; + esac + done + + if ! command -v nvchecker &>/dev/null; then + die "The \"$_DEVTOOLS_COMMAND\" command requires 'nvchecker'" + fi + + # Check if used without pkgbases in a packaging directory + if (( ${#pkgbases[@]} == 0 )); then + if [[ -f PKGBUILD ]]; then + pkgbases=(".") + else + pkgctl_version_upgrade_usage + exit 1 + fi + fi + + for path in "${pkgbases[@]}"; do + pushd "${path}" >/dev/null + + if [[ ! -f "PKGBUILD" ]]; then + die "No PKGBUILD found for ${path}" + fi + + # reset common PKGBUILD variables + unset pkgbase pkgname arch source pkgver pkgrel validpgpkeys + # shellcheck source=contrib/makepkg/PKGBUILD.proto + . ./PKGBUILD + pkgbase=${pkgbase:-$pkgname} + + if ! upstream_version=$(get_upstream_version); then + die "Failed to get latest upstream version for %s" "${pkgbase}" + fi + + if ! result=$(vercmp "${upstream_version}" "${pkgver}"); then + die "Failed to compare version %s against %s" "${upstream_version}" "${pkgver}" + fi + + if (( result > 0 )); then + msg_success "${BOLD}${pkgbase}${ALL_OFF}: upgrading from version ${PURPLE}${pkgver}${ALL_OFF} to ${DARK_GREEN}${upstream_version}${ALL_OFF}" + + pkgbuild_set_pkgver "${upstream_version}" + pkgbuild_set_pkgrel 1 + fi + + popd >/dev/null + done +} -- cgit v1.2.3-70-g09d2 From 03d5c928cf01e2aee56a4520ac5896c602fb1f75 Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Sat, 13 Jan 2024 14:33:09 +0100 Subject: fix(version): add error handling to version check subcommand Add defensive programming to the execution chain of the version check subcommand for graceful error handling of subprocesses as well as errors returned from nvchecker itself indicated in the returned JSON. Furthermore this fixes a bug when processing multiple packages where the pkgbase variable is stuck for subsequent packages that do not declare a pkgbase variable itself. Component: pkgctl version check Signed-off-by: Levente Polyak --- src/lib/version/check.sh | 107 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 93 insertions(+), 14 deletions(-) (limited to 'src/lib') diff --git a/src/lib/version/check.sh b/src/lib/version/check.sh index b93752a..c78e364 100644 --- a/src/lib/version/check.sh +++ b/src/lib/version/check.sh @@ -11,7 +11,7 @@ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh source /usr/share/makepkg/util/message.sh -set -e +set -eo pipefail pkgctl_version_check_usage() { local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} @@ -34,8 +34,7 @@ _EOF_ pkgctl_version_check() { local path local pkgbases=() - local path pkgbase upstream_version - + local path pkgbase upstream_version result while (( $# )); do case $1 in @@ -78,15 +77,28 @@ pkgctl_version_check() { die "No PKGBUILD found for ${path}" fi - # shellcheck disable=SC2119 - upstream_version=$(get_upstream_version) - - # TODO: parse .SRCINFO file + # reset common PKGBUILD variables + unset pkgbase pkgname arch source pkgver pkgrel validpgpkeys # shellcheck source=contrib/makepkg/PKGBUILD.proto . ./PKGBUILD pkgbase=${pkgbase:-$pkgname} - if (( $(vercmp "${upstream_version}" "${pkgver}") > 0 )); then + if ! result=$(get_upstream_version); then + msg_error "${pkgbase}: ${result}" + popd >/dev/null + continue + fi + upstream_version=${result} + + if ! result=$(vercmp "${upstream_version}" "${pkgver}"); then + result="${BOLD}${pkgbase}${ALL_OFF}: failed to compare version ${upstream_version} against ${pkgver}" + msg_error "${result}" + + popd >/dev/null + continue + fi + + if (( result > 0 )); then msg2 "New ${pkgbase} version ${upstream_version} is available upstream" fi @@ -95,13 +107,80 @@ pkgctl_version_check() { } get_upstream_version() { - local config=${1:-.nvchecker.toml} - local upstream_version + local config=.nvchecker.toml + local output errors upstream_version + local output + + # check nvchecker config file + if ! errors=$(nvchecker_check_config "${config}"); then + printf "%s" "${errors}" + return 1 + fi + + if ! output=$(nvchecker --file "${config}" --logger json 2>&1 | \ + jq --raw-output 'select(.level != "debug")'); then + printf "failed to run nvchecker: %s" "${output}" + return 1 + fi + + if ! errors=$(nvchecker_check_error "${output}"); then + printf "%s" "${errors}" + return 1 + fi + + if ! upstream_version=$(jq --raw-output --exit-status '.version' <<< "${output}"); then + printf "failed to select version from result" + return 1 + fi + + printf "%s" "${upstream_version}" + return 0 +} + +nvchecker_check_config() { + local config=$1 + + local restricted_properties=(keyfile httptoken token) + local property + + # check if the config file exists + if [[ ! -f ${config} ]]; then + printf "configuration file not found: %s" "${config}" + return 1 + fi + + # check if config contains any restricted properties like secrets + for property in "${restricted_properties[@]}"; do + if grep --max-count=1 --quiet "^${property}" < "${config}"; then + printf "restricted property in %s: %s" "${config}" "${property}" + return 1 + fi + done + + # check if the config contains a pkgbase section + if [[ -n ${pkgbase} ]] && ! grep --max-count=1 --quiet "^\\[${pkgbase}\\]" < "${config}"; then + printf "missing pkgbase section in %s: %s" "${config}" "${pkgbase}" + return 1 + fi + + # check if the config contains any section other than pkgbase + if [[ -n ${pkgbase} ]] && property=$(grep --max-count=1 --perl-regexp "^\\[(?!${pkgbase}\\]).+\\]" < "${config}"); then + printf "none pkgbase section not supported in %s: %s" "${config}" "${property}" + return 1 + fi +} + +nvchecker_check_error() { + local result=$1 + local errors - if [[ ! -f $config ]]; then - die "No $config found" + if ! errors=$(jq --raw-output --exit-status \ + 'select(.level == "error") | "\(.event)" + if .error then ": \(.error)" else "" end' \ + <<< "${result}"); then + return 0 fi - upstream_version=$(nvchecker -c "$config" --logger json | jq --raw-output 'select( .version ) | .version') - printf "%s" "$upstream_version" + mapfile -t errors <<< "${errors}" + printf "%s\n" "${errors[@]}" + return 1 } -- cgit v1.2.3-70-g09d2 From 96f39525bf60a499aa840015159d9040b53be69a Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Sat, 13 Jan 2024 15:27:34 +0100 Subject: feat(version): support nvchecker keyfile from user config home This adds support for global keyfile from the user config home XDG_CONFIG_HOME which allows to set tokens for GitHub and GitLab for certain nvchecker configuration. When ~/.config/nvchecker/keyfile.toml exists, it will automatically be appended as keyfile of the local .nvchecker.toml file. Component: pkgctl version check Signed-off-by: Levente Polyak --- doc/man/pkgctl-version-check.1.asciidoc | 8 +++++++- src/lib/version/check.sh | 12 +++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) (limited to 'src/lib') diff --git a/doc/man/pkgctl-version-check.1.asciidoc b/doc/man/pkgctl-version-check.1.asciidoc index 97d8c47..ed9abdf 100644 --- a/doc/man/pkgctl-version-check.1.asciidoc +++ b/doc/man/pkgctl-version-check.1.asciidoc @@ -18,7 +18,13 @@ which this package could possibly be upgraded. The current working directory is used if no PKGBASE is specified. -See the section on configuration files in **nvchecker**(1) for possible options +Configuration +------------- + +To provide GitHub or GitLab tokens to nvchecker, a `keyfile.toml` will be +supplied from `$XDG_CONFIG_HOME`/nvchecker. + +See the section on configuration files in linkman:nvchecker[1] for possible options which can be utilized in .nvchecker.toml. Options diff --git a/src/lib/version/check.sh b/src/lib/version/check.sh index c78e364..600a346 100644 --- a/src/lib/version/check.sh +++ b/src/lib/version/check.sh @@ -23,6 +23,9 @@ pkgctl_version_check_usage() { The current working directory is used if no PKGBASE is specified. + To provide GitHub or GitLab tokens to nvchecker, a keyfile.toml + will be supplied from \${XDG_CONFIG_HOME}/nvchecker. + OPTIONS -h, --help Show this help text @@ -110,6 +113,8 @@ get_upstream_version() { local config=.nvchecker.toml local output errors upstream_version local output + local opts=() + local keyfile="${XDG_CONFIG_HOME:-${HOME}/.config}/nvchecker/keyfile.toml" # check nvchecker config file if ! errors=$(nvchecker_check_config "${config}"); then @@ -117,7 +122,12 @@ get_upstream_version() { return 1 fi - if ! output=$(nvchecker --file "${config}" --logger json 2>&1 | \ + # populate keyfile to nvchecker opts + if [[ -f ${keyfile} ]]; then + opts+=(--keyfile "${keyfile}") + fi + + if ! output=$(nvchecker --file "${config}" --logger json "${opts[@]}" 2>&1 | \ jq --raw-output 'select(.level != "debug")'); then printf "failed to run nvchecker: %s" "${output}" return 1 -- cgit v1.2.3-70-g09d2 From 66e83c950cfa1c51820f04130abfacaf7c6b4c4c Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Thu, 18 Jan 2024 02:29:27 +0100 Subject: feat(version): pretty print and group together version check results Collect all check results in arrays and pretty print the results after grouping them together based on out-of-date, up-to-date and failures. Print a summary that shows a brief statistic about the results when processing multiple check items. Component: pkgctl version check Component: pkgctl version upgrade Signed-off-by: Levente Polyak --- src/lib/common.sh | 3 +- src/lib/version/check.sh | 72 +++++++++++++++++++++++++++++++++++++--- src/lib/version/upgrade.sh | 82 ++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 145 insertions(+), 12 deletions(-) (limited to 'src/lib') diff --git a/src/lib/common.sh b/src/lib/common.sh index a93e906..9d5622e 100644 --- a/src/lib/common.sh +++ b/src/lib/common.sh @@ -36,9 +36,10 @@ if [[ -t 2 && "$TERM" != dumb ]] || [[ ${DEVTOOLS_COLOR} == always ]]; then colorize PURPLE="$(tput setaf 5)" DARK_GREEN="$(tput setaf 2)" + UNDERLINE="$(tput smul)" else # shellcheck disable=2034 - declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' PURPLE='' + declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' PURPLE='' DARK_GREEN='' UNDERLINE='' fi stat_busy() { diff --git a/src/lib/version/check.sh b/src/lib/version/check.sh index 600a346..ddd400d 100644 --- a/src/lib/version/check.sh +++ b/src/lib/version/check.sh @@ -39,6 +39,11 @@ pkgctl_version_check() { local pkgbases=() local path pkgbase upstream_version result + local up_to_date=() + local out_of_date=() + local failure=() + local section_separator='' + while (( $# )); do case $1 in -h|--help) @@ -87,7 +92,8 @@ pkgctl_version_check() { pkgbase=${pkgbase:-$pkgname} if ! result=$(get_upstream_version); then - msg_error "${pkgbase}: ${result}" + result="${BOLD}${pkgbase}${ALL_OFF}: ${result}" + failure+=("${result}") popd >/dev/null continue fi @@ -95,18 +101,49 @@ pkgctl_version_check() { if ! result=$(vercmp "${upstream_version}" "${pkgver}"); then result="${BOLD}${pkgbase}${ALL_OFF}: failed to compare version ${upstream_version} against ${pkgver}" - msg_error "${result}" - + failure+=("${result}") popd >/dev/null continue fi - if (( result > 0 )); then - msg2 "New ${pkgbase} version ${upstream_version} is available upstream" + if (( result == 0 )); then + result="${BOLD}${pkgbase}${ALL_OFF}: current version ${PURPLE}${pkgver}${ALL_OFF} is latest" + up_to_date+=("${result}") + elif (( result < 0 )); then + result="${BOLD}${pkgbase}${ALL_OFF}: current version ${PURPLE}${pkgver}${ALL_OFF} is never than ${DARK_GREEN}${upstream_version}${ALL_OFF}" + up_to_date+=("${result}") + elif (( result > 0 )); then + result="${BOLD}${pkgbase}${ALL_OFF}: upgrade from version ${PURPLE}${pkgver}${ALL_OFF} to ${DARK_GREEN}${upstream_version}${ALL_OFF}" + out_of_date+=("${result}") fi popd >/dev/null done + + if (( ${#failure[@]} > 0 )); then + printf "%sFailure%s\n" "${section_separator}${BOLD}${UNDERLINE}" "${ALL_OFF}" + section_separator=$'\n' + for result in "${failure[@]}"; do + msg_error " ${result}" + done + fi + + if (( ${#out_of_date[@]} > 0 )); then + printf "%sOut-of-date%s\n" "${section_separator}${BOLD}${UNDERLINE}" "${ALL_OFF}" + section_separator=$'\n' + for result in "${out_of_date[@]}"; do + msg_warn " ${result}" + done + fi + + # Show summary when processing multiple packages + if (( ${#pkgbases[@]} > 1 )); then + printf '%s' "${section_separator}" + pkgctl_version_check_summary \ + "${#up_to_date[@]}" \ + "${#out_of_date[@]}" \ + "${#failure[@]}" + fi } get_upstream_version() { @@ -194,3 +231,28 @@ nvchecker_check_error() { printf "%s\n" "${errors[@]}" return 1 } + +pkgctl_version_check_summary() { + local up_to_date_count=$1 + local out_of_date_count=$2 + local failure_count=$3 + + # print nothing if all stats are zero + if (( up_to_date_count == 0 )) && \ + (( out_of_date_count == 0 )) && \ + (( failure_count == 0 )); then + return 0 + fi + + # print summary for all none zero stats + printf "%sSummary%s\n" "${BOLD}${UNDERLINE}" "${ALL_OFF}" + if (( up_to_date_count > 0 )); then + msg_success " Up-to-date: ${BOLD}${up_to_date_count}${ALL_OFF}" 2>&1 + fi + if (( failure_count > 0 )); then + msg_error " Failure: ${BOLD}${failure_count}${ALL_OFF}" 2>&1 + fi + if (( out_of_date_count > 0 )); then + msg_warn " Out-of-date: ${BOLD}${out_of_date_count}${ALL_OFF}" 2>&1 + fi +} diff --git a/src/lib/version/upgrade.sh b/src/lib/version/upgrade.sh index 704431a..26a5ccb 100644 --- a/src/lib/version/upgrade.sh +++ b/src/lib/version/upgrade.sh @@ -40,6 +40,7 @@ _EOF_ pkgctl_version_upgrade() { local path upstream_version result local pkgbases=() + local exit_code=0 while (( $# )); do case $1 in @@ -88,21 +89,90 @@ pkgctl_version_upgrade() { . ./PKGBUILD pkgbase=${pkgbase:-$pkgname} - if ! upstream_version=$(get_upstream_version); then - die "Failed to get latest upstream version for %s" "${pkgbase}" + if ! result=$(get_upstream_version); then + result="${BOLD}${pkgbase}${ALL_OFF}: ${result}" + failure+=("${result}") + popd >/dev/null + continue fi + upstream_version=${result} if ! result=$(vercmp "${upstream_version}" "${pkgver}"); then - die "Failed to compare version %s against %s" "${upstream_version}" "${pkgver}" + result="${BOLD}${pkgbase}${ALL_OFF}: failed to compare version ${upstream_version} against ${pkgver}" + failure+=("${result}") + popd >/dev/null + continue fi - if (( result > 0 )); then - msg_success "${BOLD}${pkgbase}${ALL_OFF}: upgrading from version ${PURPLE}${pkgver}${ALL_OFF} to ${DARK_GREEN}${upstream_version}${ALL_OFF}" - + if (( result == 0 )); then + result="${BOLD}${pkgbase}${ALL_OFF}: current version ${PURPLE}${pkgver}${ALL_OFF} is latest" + up_to_date+=("${result}") + elif (( result < 0 )); then + result="${BOLD}${pkgbase}${ALL_OFF}: current version ${PURPLE}${pkgver}${ALL_OFF} is never than ${DARK_GREEN}${upstream_version}${ALL_OFF}" + up_to_date+=("${result}") + elif (( result > 0 )); then + result="${BOLD}${pkgbase}${ALL_OFF}: upgraded from version ${PURPLE}${pkgver}${ALL_OFF} to ${DARK_GREEN}${upstream_version}${ALL_OFF}" + out_of_date+=("${result}") + + # change the PKGBUILD pkgbuild_set_pkgver "${upstream_version}" pkgbuild_set_pkgrel 1 fi popd >/dev/null done + + if (( ${#failure[@]} > 0 )); then + exit_code=1 + printf "%sFailure%s\n" "${section_separator}${BOLD}${UNDERLINE}" "${ALL_OFF}" + section_separator=$'\n' + for result in "${failure[@]}"; do + msg_error " ${result}" + done + fi + + if (( ${#out_of_date[@]} > 0 )); then + printf "%sUpgraded%s\n" "${section_separator}${BOLD}${UNDERLINE}" "${ALL_OFF}" + section_separator=$'\n' + for result in "${out_of_date[@]}"; do + msg_warn " ${result}" + done + fi + + # Show summary when processing multiple packages + if (( ${#pkgbases[@]} > 1 )); then + printf '%s' "${section_separator}" + pkgctl_version_upgrade_summary \ + "${#up_to_date[@]}" \ + "${#out_of_date[@]}" \ + "${#failure[@]}" + fi + + # return status based on results + return "${exit_code}" +} + +pkgctl_version_upgrade_summary() { + local up_to_date_count=$1 + local out_of_date_count=$2 + local failure_count=$3 + + # print nothing if all stats are zero + if (( up_to_date_count == 0 )) && \ + (( out_of_date_count == 0 )) && \ + (( failure_count == 0 )); then + return 0 + fi + + # print summary for all none zero stats + printf "%sSummary%s\n" "${BOLD}${UNDERLINE}" "${ALL_OFF}" + if (( up_to_date_count > 0 )); then + msg_success " Up-to-date: ${BOLD}${up_to_date_count}${ALL_OFF}" 2>&1 + fi + if (( failure_count > 0 )); then + msg_error " Failure: ${BOLD}${failure_count}${ALL_OFF}" 2>&1 + fi + if (( out_of_date_count > 0 )); then + msg_warn " Upgraded: ${BOLD}${out_of_date_count}${ALL_OFF}" 2>&1 + fi } -- cgit v1.2.3-70-g09d2 From fedfc80ca15a196d565b9f5dc5159be594f74da3 Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Thu, 18 Jan 2024 02:39:34 +0100 Subject: feat(term): add terminal utils to handle a dynamic spinner The spinner uses a status file that can be used to dynamically update the message. The spinner itself buffers the output in a frame buffer variable before flushing a frame in one go. Signed-off-by: Levente Polyak --- src/lib/common.sh | 3 +- src/lib/util/term.sh | 182 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 src/lib/util/term.sh (limited to 'src/lib') diff --git a/src/lib/common.sh b/src/lib/common.sh index 9d5622e..63f43f1 100644 --- a/src/lib/common.sh +++ b/src/lib/common.sh @@ -13,7 +13,7 @@ set +u +o posix $DEVTOOLS_INCLUDE_COMMON_SH # Avoid any encoding problems -export LANG=C +export LANG=C.UTF-8 # Set buildtool properties export BUILDTOOL=devtools @@ -108,6 +108,7 @@ cleanup() { if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then rm -rf "$WORKDIR" fi + tput cnorm >&2 exit "${1:-0}" } diff --git a/src/lib/util/term.sh b/src/lib/util/term.sh new file mode 100644 index 0000000..853dccf --- /dev/null +++ b/src/lib/util/term.sh @@ -0,0 +1,182 @@ +#!/hint/bash +# +# SPDX-License-Identifier: GPL-3.0-or-later + +[[ -z ${DEVTOOLS_INCLUDE_UTIL_TERM_SH:-} ]] || return 0 +DEVTOOLS_INCLUDE_UTIL_TERM_SH=1 + +set -eo pipefail + + +readonly PKGCTL_TERM_SPINNER_DOTS=Dots +export PKGCTL_TERM_SPINNER_DOTS +readonly PKGCTL_TERM_SPINNER_DOTS12=Dots12 +export PKGCTL_TERM_SPINNER_DOTS12 +readonly PKGCTL_TERM_SPINNER_LINE=Line +export PKGCTL_TERM_SPINNER_LINE +readonly PKGCTL_TERM_SPINNER_SIMPLE_DOTS_SCROLLING=SimpleDotsScrolling +export PKGCTL_TERM_SPINNER_SIMPLE_DOTS_SCROLLING +readonly PKGCTL_TERM_SPINNER_TRIANGLE=Triangle +export PKGCTL_TERM_SPINNER_TRIANGLE +readonly PKGCTL_TERM_SPINNER_RANDOM=Random +export PKGCTL_TERM_SPINNER_RANDOM + +readonly PKGCTL_TERM_SPINNER_TYPES=( + "${PKGCTL_TERM_SPINNER_DOTS}" + "${PKGCTL_TERM_SPINNER_DOTS12}" + "${PKGCTL_TERM_SPINNER_LINE}" + "${PKGCTL_TERM_SPINNER_SIMPLE_DOTS_SCROLLING}" + "${PKGCTL_TERM_SPINNER_TRIANGLE}" +) +export PKGCTL_TERM_SPINNER_TYPES + + +term_cursor_hide() { + tput civis >&2 +} + +term_cursor_show() { + tput cnorm >&2 +} + +term_cursor_up() { + tput cuu1 +} + +term_carriage_return() { + tput cr +} + +term_erase_line() { + tput el +} + +term_erase_lines() { + local lines=$1 + + local cursor_up erase_line + cursor_up=$(term_cursor_up) + erase_line="$(term_carriage_return)$(term_erase_line)" + + local prefix='' + for _ in $(seq 1 "${lines}"); do + printf '%s' "${prefix}${erase_line}" + prefix="${cursor_up}" + done +} + +_pkgctl_spinner_type=${PKGCTL_TERM_SPINNER_RANDOM} +term_spinner_set_type() { + _pkgctl_spinner_type=$1 +} + +# takes a status directory that can be used to dynamically update the spinner +# by writing to the `status` file inside that directory atomically. +# replace the placeholder %spinner% with the currently configured spinner type +term_spinner_start() { + local status_dir=$1 + local parent_pid=$$ + ( + local spinner_type=${_pkgctl_spinner_type} + local spinner_offset=0 + local frame_buffer='' + local spinner status_message line + + local status_file="${status_dir}/status" + local next_file="${status_dir}/next" + local drawn_file="${status_dir}/drawn" + + # assign random spinner type + if [[ ${spinner_type} == "${PKGCTL_TERM_SPINNER_RANDOM}" ]]; then + spinner_type=${PKGCTL_TERM_SPINNER_TYPES[$((RANDOM % ${#PKGCTL_TERM_SPINNER_TYPES[@]}))]} + fi + + # select spinner based on the named type + case "${spinner_type}" in + "${PKGCTL_TERM_SPINNER_DOTS}") + spinner=("⠋" "⠙" "⠹" "⠸" "⠼" "⠴" "⠦" "⠧" "⠇" "⠏") + update_interval=0.08 + ;; + "${PKGCTL_TERM_SPINNER_DOTS12}") + spinner=("⢀⠀" "⡀⠀" "⠄⠀" "⢂⠀" "⡂⠀" "⠅⠀" "⢃⠀" "⡃⠀" "⠍⠀" "⢋⠀" "⡋⠀" "⠍⠁" "⢋⠁" "⡋⠁" "⠍⠉" "⠋⠉" "⠋⠉" "⠉⠙" "⠉⠙" "⠉⠩" "⠈⢙" "⠈⡙" "⢈⠩" "⡀⢙" "⠄⡙" "⢂⠩" "⡂⢘" "⠅⡘" "⢃⠨" "⡃⢐" "⠍⡐" "⢋⠠" "⡋⢀" "⠍⡁" "⢋⠁" "⡋⠁" "⠍⠉" "⠋⠉" "⠋⠉" "⠉⠙" "⠉⠙" "⠉⠩" "⠈⢙" "⠈⡙" "⠈⠩" "⠀⢙" "⠀⡙" "⠀⠩" "⠀⢘" "⠀⡘" "⠀⠨" "⠀⢐" "⠀⡐" "⠀⠠" "⠀⢀" "⠀⡀") + update_interval=0.08 + ;; + "${PKGCTL_TERM_SPINNER_LINE}") + spinner=("⎯" "\\" "|" "/") + update_interval=0.13 + ;; + "${PKGCTL_TERM_SPINNER_SIMPLE_DOTS_SCROLLING}") + spinner=(". " ".. " "..." " .." " ." " ") + update_interval=0.2 + ;; + "${PKGCTL_TERM_SPINNER_TRIANGLE}") + spinner=("◢" "◣" "◤" "◥") + update_interval=0.05 + ;; + esac + + # hide the cursor while spinning + term_cursor_hide + + # run the spinner as long as the parent process didn't terminate + while ps -p "${parent_pid}" &>/dev/null; do + # cache the new status template if it exists + if mv "${status_file}" "${next_file}" &>/dev/null; then + status_message="$(cat "$next_file")" + elif [[ -z "${status_message}" ]]; then + # wait until we either have a new or cached status + sleep 0.05 + fi + + # fill the frame buffer with the current status + local prefix='' + while IFS= read -r line; do + # replace spinner placeholder + line=${line//%spinner%/${spinner[spinner_offset%${#spinner[@]}]}} + + # append the current line to the frame buffer + frame_buffer+="${prefix}${line}" + prefix=$'\n' + done <<< "${status_message}" + + # print current frame buffer + echo -n "${frame_buffer}" >&2 + mv "${next_file}" "${drawn_file}" &>/dev/null ||: + + # setup next frame buffer to clear current content + frame_buffer=$(term_erase_lines "$(awk 'END {print NR}' <<< "${status_message}")") + + # advance the spinner animation offset + (( ++spinner_offset )) + + # sleep for the spinner update interval + sleep "${update_interval}" + done + )& + _pkgctl_spinner_pid=$! + disown +} + +term_spinner_stop() { + local status_dir=$1 + local frame_buffer status_file + + # kill the spinner process + if ! kill "${_pkgctl_spinner_pid}" > /dev/null 2>&1; then + return 1 + fi + unset _pkgctl_spinner_pid + + # acquire last drawn status + status_file="${status_dir}/drawn" + if [[ ! -f ${status_file} ]]; then + return 0 + fi + + # clear terminal based on last status line + frame_buffer=$(term_erase_lines "$(awk 'END {print NR}' < "${status_file}")") + echo -n "${frame_buffer}" >&2 + + # show the cursor after stopping the spinner + term_cursor_show +} -- cgit v1.2.3-70-g09d2 From 08ece1640b360d741bd08dc6dc028a42682aa4ed Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Thu, 18 Jan 2024 02:57:55 +0100 Subject: feat(version): add spinner while checking upstream versions It may take quite some time to check a lot of upstream versions. However, we still want to nicely group the results together. To avoid just showing a static status message it makes much more sense to show a dynamic spinner with a summary of the progress. Component: pkgctl version check Component: pkgctl version upgrade Signed-off-by: Levente Polyak --- src/lib/version/check.sh | 49 +++++++++++++++++++++++++++++++++++++++++++++- src/lib/version/upgrade.sh | 47 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+), 1 deletion(-) (limited to 'src/lib') diff --git a/src/lib/version/check.sh b/src/lib/version/check.sh index ddd400d..fba2d1a 100644 --- a/src/lib/version/check.sh +++ b/src/lib/version/check.sh @@ -8,6 +8,8 @@ DEVTOOLS_INCLUDE_VERSION_CHECK_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/term.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/term.sh source /usr/share/makepkg/util/message.sh @@ -37,11 +39,12 @@ _EOF_ pkgctl_version_check() { local path local pkgbases=() - local path pkgbase upstream_version result + local status_file path pkgbase upstream_version result local up_to_date=() local out_of_date=() local failure=() + local current_item=0 local section_separator='' while (( $# )); do @@ -78,6 +81,10 @@ pkgctl_version_check() { fi fi + # start a terminal spinner as checking versions takes time + status_dir=$(mktemp --tmpdir="${WORKDIR}" --directory pkgctl-version-check-spinner.XXXXXXXXXX) + term_spinner_start "${status_dir}" + for path in "${pkgbases[@]}"; do pushd "${path}" >/dev/null @@ -85,6 +92,16 @@ pkgctl_version_check() { die "No PKGBUILD found for ${path}" fi + # update the current terminal spinner status + (( ++current_item )) + pkgctl_version_check_spinner \ + "${status_dir}" \ + "${#up_to_date[@]}" \ + "${#out_of_date[@]}" \ + "${#failure[@]}" \ + "${current_item}" \ + "${#pkgbases[@]}" + # reset common PKGBUILD variables unset pkgbase pkgname arch source pkgver pkgrel validpgpkeys # shellcheck source=contrib/makepkg/PKGBUILD.proto @@ -120,6 +137,9 @@ pkgctl_version_check() { popd >/dev/null done + # stop the terminal spinner after all checks + term_spinner_stop "${status_dir}" + if (( ${#failure[@]} > 0 )); then printf "%sFailure%s\n" "${section_separator}${BOLD}${UNDERLINE}" "${ALL_OFF}" section_separator=$'\n' @@ -256,3 +276,30 @@ pkgctl_version_check_summary() { msg_warn " Out-of-date: ${BOLD}${out_of_date_count}${ALL_OFF}" 2>&1 fi } + +pkgctl_version_check_spinner() { + local status_dir=$1 + local up_to_date_count=$2 + local out_of_date_count=$3 + local failure_count=$4 + local current=$5 + local total=$6 + + local percentage=$(( 100 * current / total )) + local tmp_file="${status_dir}/tmp" + local status_file="${status_dir}/status" + + # print the current summary + pkgctl_version_check_summary \ + "${up_to_date_count}" \ + "${out_of_date_count}" \ + "${failure_count}" > "${tmp_file}" + + # print the progress status + printf "📡 Checking: %s/%s [%s] %%spinner%%" \ + "${BOLD}${current}" "${total}" "${percentage}%${ALL_OFF}" \ + >> "${tmp_file}" + + # swap the status file + mv "${tmp_file}" "${status_file}" +} diff --git a/src/lib/version/upgrade.sh b/src/lib/version/upgrade.sh index 26a5ccb..9f884d0 100644 --- a/src/lib/version/upgrade.sh +++ b/src/lib/version/upgrade.sh @@ -12,6 +12,8 @@ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/common.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/version/check.sh # shellcheck source=src/lib/util/pkgbuild.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/pkgbuild.sh +# shellcheck source=src/lib/util/term.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/term.sh source /usr/share/makepkg/util/message.sh @@ -41,6 +43,7 @@ pkgctl_version_upgrade() { local path upstream_version result local pkgbases=() local exit_code=0 + local current_item=0 while (( $# )); do case $1 in @@ -76,6 +79,10 @@ pkgctl_version_upgrade() { fi fi + # start a terminal spinner as checking versions takes time + status_dir=$(mktemp --tmpdir="${WORKDIR}" --directory pkgctl-version-check-spinner.XXXXXXXXXX) + term_spinner_start "${status_dir}" + for path in "${pkgbases[@]}"; do pushd "${path}" >/dev/null @@ -83,6 +90,16 @@ pkgctl_version_upgrade() { die "No PKGBUILD found for ${path}" fi + # update the current terminal spinner status + (( ++current_item )) + pkgctl_version_upgrade_spinner \ + "${status_dir}" \ + "${#up_to_date[@]}" \ + "${#out_of_date[@]}" \ + "${#failure[@]}" \ + "${current_item}" \ + "${#pkgbases[@]}" + # reset common PKGBUILD variables unset pkgbase pkgname arch source pkgver pkgrel validpgpkeys # shellcheck source=contrib/makepkg/PKGBUILD.proto @@ -122,6 +139,9 @@ pkgctl_version_upgrade() { popd >/dev/null done + # stop the terminal spinner after all checks + term_spinner_stop "${status_dir}" + if (( ${#failure[@]} > 0 )); then exit_code=1 printf "%sFailure%s\n" "${section_separator}${BOLD}${UNDERLINE}" "${ALL_OFF}" @@ -176,3 +196,30 @@ pkgctl_version_upgrade_summary() { msg_warn " Upgraded: ${BOLD}${out_of_date_count}${ALL_OFF}" 2>&1 fi } + +pkgctl_version_upgrade_spinner() { + local status_dir=$1 + local up_to_date_count=$2 + local out_of_date_count=$3 + local failure_count=$4 + local current=$5 + local total=$6 + + local percentage=$(( 100 * current / total )) + local tmp_file="${status_dir}/tmp" + local status_file="${status_dir}/status" + + # print the current summary + pkgctl_version_upgrade_summary \ + "${up_to_date_count}" \ + "${out_of_date_count}" \ + "${failure_count}" > "${tmp_file}" + + # print the progress status + printf "📡 Upgrading: %s/%s [%s] %%spinner%%" \ + "${BOLD}${current}" "${total}" "${percentage}%${ALL_OFF}" \ + >> "${tmp_file}" + + # swap the status file + mv "${tmp_file}" "${status_file}" +} -- cgit v1.2.3-70-g09d2 From b258bb3b7c55d06bad108400450acd32cff05366 Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Thu, 18 Jan 2024 03:33:13 +0100 Subject: feat(version): add verbose option to display up-to-date versions Sometimes it can be desired to get a results for each entry even if the current version is up-to-date. Add a --verbose option to print this optional detail. Component: pkgctl version check Component: pkgctl version upgrade Signed-off-by: Levente Polyak --- contrib/completion/bash/devtools.in | 2 ++ contrib/completion/zsh/_devtools.in | 2 ++ doc/man/pkgctl-version-check.1.asciidoc | 3 +++ doc/man/pkgctl-version-upgrade.1.asciidoc | 3 +++ src/lib/version/check.sh | 25 ++++++++++++++++++++++--- src/lib/version/upgrade.sh | 21 ++++++++++++++++++++- 6 files changed, 52 insertions(+), 4 deletions(-) (limited to 'src/lib') diff --git a/contrib/completion/bash/devtools.in b/contrib/completion/bash/devtools.in index 101bd78..f8b1c9f 100644 --- a/contrib/completion/bash/devtools.in +++ b/contrib/completion/bash/devtools.in @@ -343,12 +343,14 @@ _pkgctl_version_cmds=( ) _pkgctl_version_check_args=( + -v --verbose -h --help ) _pkgctl_version_check_opts() { _filedir -d; } _pkgctl_version_upgrade_args=( + -v --verbose -h --help ) diff --git a/contrib/completion/zsh/_devtools.in b/contrib/completion/zsh/_devtools.in index 38bf582..b427d20 100644 --- a/contrib/completion/zsh/_devtools.in +++ b/contrib/completion/zsh/_devtools.in @@ -292,11 +292,13 @@ _pkgctl_version_cmds=( ) _pkgctl_version_check_args=( + '(-v --verbose)'{-v,--verbose}'[Display results including up-to-date versions]' '(-h --help)'{-h,--help}'[Display usage]' '*:git_dir:_files -/' ) _pkgctl_version_upgrade_args=( + '(-v --verbose)'{-v,--verbose}'[Display results including up-to-date versions]' '(-h --help)'{-h,--help}'[Display usage]' '*:git_dir:_files -/' ) diff --git a/doc/man/pkgctl-version-check.1.asciidoc b/doc/man/pkgctl-version-check.1.asciidoc index ed9abdf..3113afa 100644 --- a/doc/man/pkgctl-version-check.1.asciidoc +++ b/doc/man/pkgctl-version-check.1.asciidoc @@ -30,6 +30,9 @@ which can be utilized in .nvchecker.toml. Options ------- +*-v, --verbose*:: + Display results including up-to-date versions + *-h, --help*:: Show a help text diff --git a/doc/man/pkgctl-version-upgrade.1.asciidoc b/doc/man/pkgctl-version-upgrade.1.asciidoc index 3d5d882..7f9cd96 100644 --- a/doc/man/pkgctl-version-upgrade.1.asciidoc +++ b/doc/man/pkgctl-version-upgrade.1.asciidoc @@ -22,6 +22,9 @@ The current working directory is used if no PKGBASE is specified. Options ------- +*-v, --verbose*:: + Display results including up-to-date versions + *-h, --help*:: Show a help text diff --git a/src/lib/version/check.sh b/src/lib/version/check.sh index fba2d1a..9bc29c1 100644 --- a/src/lib/version/check.sh +++ b/src/lib/version/check.sh @@ -29,7 +29,8 @@ pkgctl_version_check_usage() { will be supplied from \${XDG_CONFIG_HOME}/nvchecker. OPTIONS - -h, --help Show this help text + -v, --verbose Display results including up-to-date versions + -h, --help Show this help text EXAMPLES $ ${COMMAND} neovim vim @@ -37,9 +38,10 @@ _EOF_ } pkgctl_version_check() { - local path local pkgbases=() - local status_file path pkgbase upstream_version result + local verbose=0 + + local path status_file path pkgbase upstream_version result local up_to_date=() local out_of_date=() @@ -53,6 +55,10 @@ pkgctl_version_check() { pkgctl_version_check_usage exit 0 ;; + -v|--verbose) + verbose=1 + shift + ;; --) shift break @@ -81,6 +87,11 @@ pkgctl_version_check() { fi fi + # enable verbose mode when we only have a single item to check + if (( ${#pkgbases[@]} == 1 )); then + verbose=1 + fi + # start a terminal spinner as checking versions takes time status_dir=$(mktemp --tmpdir="${WORKDIR}" --directory pkgctl-version-check-spinner.XXXXXXXXXX) term_spinner_start "${status_dir}" @@ -140,6 +151,14 @@ pkgctl_version_check() { # stop the terminal spinner after all checks term_spinner_stop "${status_dir}" + if (( verbose )) && (( ${#up_to_date[@]} > 0 )); then + printf "%sUp-to-date%s\n" "${section_separator}${BOLD}${UNDERLINE}" "${ALL_OFF}" + section_separator=$'\n' + for result in "${up_to_date[@]}"; do + msg_success " ${result}" + done + fi + if (( ${#failure[@]} > 0 )); then printf "%sFailure%s\n" "${section_separator}${BOLD}${UNDERLINE}" "${ALL_OFF}" section_separator=$'\n' diff --git a/src/lib/version/upgrade.sh b/src/lib/version/upgrade.sh index 9f884d0..70513ce 100644 --- a/src/lib/version/upgrade.sh +++ b/src/lib/version/upgrade.sh @@ -32,7 +32,8 @@ pkgctl_version_upgrade_usage() { The current working directory is used if no PKGBASE is specified. OPTIONS - -h, --help Show this help text + -v, --verbose Display results including up-to-date versions + -h, --help Show this help text EXAMPLES $ ${COMMAND} neovim vim @@ -42,6 +43,7 @@ _EOF_ pkgctl_version_upgrade() { local path upstream_version result local pkgbases=() + local verbose=0 local exit_code=0 local current_item=0 @@ -51,6 +53,10 @@ pkgctl_version_upgrade() { pkgctl_version_upgrade_usage exit 0 ;; + -v|--verbose) + verbose=1 + shift + ;; --) shift break @@ -79,6 +85,11 @@ pkgctl_version_upgrade() { fi fi + # enable verbose mode when we only have a single item to check + if (( ${#pkgbases[@]} == 1 )); then + verbose=1 + fi + # start a terminal spinner as checking versions takes time status_dir=$(mktemp --tmpdir="${WORKDIR}" --directory pkgctl-version-check-spinner.XXXXXXXXXX) term_spinner_start "${status_dir}" @@ -142,6 +153,14 @@ pkgctl_version_upgrade() { # stop the terminal spinner after all checks term_spinner_stop "${status_dir}" + if (( verbose )) && (( ${#up_to_date[@]} > 0 )); then + printf "%sUp-to-date%s\n" "${section_separator}${BOLD}${UNDERLINE}" "${ALL_OFF}" + section_separator=$'\n' + for result in "${up_to_date[@]}"; do + msg_success " ${result}" + done + fi + if (( ${#failure[@]} > 0 )); then exit_code=1 printf "%sFailure%s\n" "${section_separator}${BOLD}${UNDERLINE}" "${ALL_OFF}" -- cgit v1.2.3-70-g09d2 From e3edf25554c78e28679b100e24c55c87ee65a22d Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Thu, 18 Jan 2024 19:15:22 +0100 Subject: feat(version): use exit code for check to indicate out-of-date versions It can be handy to have an exit code that allows better status indication or chaining. On exit, return one of the following codes: - 0: Normal exit condition, all checked versions are up-to-date - 1: Unknown cause of failure - 2: Normal exit condition, but there are out-of-date versions - 3: Failed to run some version checks Component: pkgctl version check Signed-off-by: Levente Polyak --- doc/man/pkgctl-version-check.1.asciidoc | 17 +++++++++++++++++ src/lib/version.sh | 4 ++-- src/lib/version/check.sh | 14 ++++++++++++++ 3 files changed, 33 insertions(+), 2 deletions(-) (limited to 'src/lib') diff --git a/doc/man/pkgctl-version-check.1.asciidoc b/doc/man/pkgctl-version-check.1.asciidoc index 3113afa..fa5401f 100644 --- a/doc/man/pkgctl-version-check.1.asciidoc +++ b/doc/man/pkgctl-version-check.1.asciidoc @@ -36,6 +36,23 @@ Options *-h, --help*:: Show a help text +Errors +------ + +On exit, return one of the following codes: + +*0*:: + Normal exit condition, all checked versions are up-to-date + +*1*:: + Unknown cause of failure + +*2*:: + Normal exit condition, but there are out-of-date versions + +*3*:: + Failed to run some version checks + See Also -------- diff --git a/src/lib/version.sh b/src/lib/version.sh index 14cd810..4340fca 100644 --- a/src/lib/version.sh +++ b/src/lib/version.sh @@ -47,7 +47,7 @@ pkgctl_version() { # shellcheck source=src/lib/version/check.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/version/check.sh pkgctl_version_check "$@" - exit 0 + exit $? ;; upgrade) _DEVTOOLS_COMMAND+=" $1" @@ -55,7 +55,7 @@ pkgctl_version() { # shellcheck source=src/lib/version/upgrade.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/version/upgrade.sh pkgctl_version_upgrade "$@" - exit 0 + exit $? ;; *) die "invalid argument: %s" "$1" diff --git a/src/lib/version/check.sh b/src/lib/version/check.sh index 9bc29c1..cc8827d 100644 --- a/src/lib/version/check.sh +++ b/src/lib/version/check.sh @@ -15,6 +15,14 @@ source /usr/share/makepkg/util/message.sh set -eo pipefail +readonly PKGCTL_VERSION_CHECK_EXIT_UP_TO_DATE=0 +export PKGCTL_VERSION_CHECK_EXIT_UP_TO_DATE +readonly PKGCTL_VERSION_CHECK_EXIT_OUT_OF_DATE=2 +export PKGCTL_VERSION_CHECK_EXIT_OUT_OF_DATE +readonly PKGCTL_VERSION_CHECK_EXIT_FAILURE=3 +export PKGCTL_VERSION_CHECK_EXIT_FAILURE + + pkgctl_version_check_usage() { local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} cat <<- _EOF_ @@ -48,6 +56,7 @@ pkgctl_version_check() { local failure=() local current_item=0 local section_separator='' + local exit_code=${PKGCTL_VERSION_CHECK_EXIT_UP_TO_DATE} while (( $# )); do case $1 in @@ -160,6 +169,7 @@ pkgctl_version_check() { fi if (( ${#failure[@]} > 0 )); then + exit_code=${PKGCTL_VERSION_CHECK_EXIT_FAILURE} printf "%sFailure%s\n" "${section_separator}${BOLD}${UNDERLINE}" "${ALL_OFF}" section_separator=$'\n' for result in "${failure[@]}"; do @@ -168,6 +178,7 @@ pkgctl_version_check() { fi if (( ${#out_of_date[@]} > 0 )); then + exit_code=${PKGCTL_VERSION_CHECK_EXIT_OUT_OF_DATE} printf "%sOut-of-date%s\n" "${section_separator}${BOLD}${UNDERLINE}" "${ALL_OFF}" section_separator=$'\n' for result in "${out_of_date[@]}"; do @@ -183,6 +194,9 @@ pkgctl_version_check() { "${#out_of_date[@]}" \ "${#failure[@]}" fi + + # return status based on results + return "${exit_code}" } get_upstream_version() { -- cgit v1.2.3-70-g09d2 From 4d72f4560c3a64b38dcdb705ec633c3c2ba1f20c Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Fri, 19 Jan 2024 01:57:18 +0100 Subject: doc(version): extensively revamp documentation for version subcommands Enhanced and overhauled the documentation for the 'version' subcommand. The improvements include comprehensive details on the subcommand's behavior, usage, and a variety of scenarios it handles. Added a central section within the pkgctl-version manpage that documents the nvchecker configuration and rules. Component: pkgctl version Singled-off-by: Levente Polyak --- contrib/completion/zsh/_devtools.in | 6 +++--- doc/man/pkgctl-version-check.1.asciidoc | 29 +++++++++++++++++------------ doc/man/pkgctl-version-upgrade.1.asciidoc | 24 +++++++++++++++++++----- doc/man/pkgctl-version.1.asciidoc | 29 +++++++++++++++++++++++++---- doc/man/pkgctl.1.asciidoc | 2 +- src/lib/version.sh | 6 +++--- src/lib/version/check.sh | 12 +++++++----- src/lib/version/upgrade.sh | 12 ++++++++---- src/pkgctl.in | 2 +- 9 files changed, 84 insertions(+), 38 deletions(-) (limited to 'src/lib') diff --git a/contrib/completion/zsh/_devtools.in b/contrib/completion/zsh/_devtools.in index b427d20..34f90c6 100644 --- a/contrib/completion/zsh/_devtools.in +++ b/contrib/completion/zsh/_devtools.in @@ -277,7 +277,7 @@ _pkgctl_cmds=( "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]" - "version[Package version related commands]" + "version[Check and manage package versions against upstream]" ) _pkgctl_args=( @@ -287,8 +287,8 @@ _pkgctl_args=( _pkgctl_version_cmds=( "pkgctl version command" - "check[Check if there is an new upstream version available]" - "upgrade[Upgrade the PKGBUILD according to the latest available upstream version]" + "check[Compares local package versions against upstream versions]" + "upgrade[Adjust the PKGBUILD to match the latest upstream version]" ) _pkgctl_version_check_args=( diff --git a/doc/man/pkgctl-version-check.1.asciidoc b/doc/man/pkgctl-version-check.1.asciidoc index fa5401f..2543bcb 100644 --- a/doc/man/pkgctl-version-check.1.asciidoc +++ b/doc/man/pkgctl-version-check.1.asciidoc @@ -3,7 +3,7 @@ pkgctl-version-check(1) Name ---- -pkgctl-version-check - Check if there is an new upstream version available +pkgctl-version-check - Compares local package versions against upstream Synopsis -------- @@ -12,20 +12,24 @@ pkgctl version check [OPTIONS] [PKGBASE...] Description ----------- -Uses nvchecker, a .nvchecker.toml file and the version specified in the current -PKGBUILDs pkgver to check if there is a newer package version available to -which this package could possibly be upgraded. +Compares the versions of packages in the local packaging repository against +their latest upstream versions. -The current working directory is used if no PKGBASE is specified. +Upon execution, it generates a grouped list that provides detailed insights +into each package's status. For each package, it displays the current local +version alongside the latest version available upstream. + +Outputs a summary of up-to-date packages, out-of-date packages, and any check +failures. + +This simplifies the maintenance of PKGBUILD files, reducing the manual effort +required to track version changes from upstream sources. Configuration ------------- -To provide GitHub or GitLab tokens to nvchecker, a `keyfile.toml` will be -supplied from `$XDG_CONFIG_HOME`/nvchecker. - -See the section on configuration files in linkman:nvchecker[1] for possible options -which can be utilized in .nvchecker.toml. +Uses linkman:nvchecker[1] and a `.nvchecker.toml` file located alongside the +PKGBUILD. Refer to the configuration section in linkman:pkgctl-version[1]. Options ------- @@ -36,8 +40,8 @@ Options *-h, --help*:: Show a help text -Errors ------- +Exit Codes +---------- On exit, return one of the following codes: @@ -56,6 +60,7 @@ On exit, return one of the following codes: See Also -------- +linkman:pkgctl-version[1] linkman:nvchecker[1] include::include/footer.asciidoc[] diff --git a/doc/man/pkgctl-version-upgrade.1.asciidoc b/doc/man/pkgctl-version-upgrade.1.asciidoc index 7f9cd96..68e6369 100644 --- a/doc/man/pkgctl-version-upgrade.1.asciidoc +++ b/doc/man/pkgctl-version-upgrade.1.asciidoc @@ -3,7 +3,7 @@ pkgctl-version-upgrade(1) Name ---- -pkgctl-version-upgrade - Upgrade the PKGBUILD according to the latest available upstream version +pkgctl-version-upgrade - Adjust the PKGBUILD to match the latest upstream version Synopsis -------- @@ -12,12 +12,25 @@ pkgctl version upgrade [OPTIONS] [PKGBASE...] Description ----------- -Upgrade the PKGBUILD according to the latest available upstream version. +Streamlines the process of keeping PKGBUILD files up-to-date with the latest +upstream versions. -Uses nvchecker, a .nvchecker.toml file and the current PKGBUILD pkgver to check -if there is a newer package version available. +Upon execution, it automatically adjusts the PKGBUILD file, ensuring that the +pkgver field is set to match the latest version available from the upstream +source. In addition to updating the pkgver, this command also resets the pkgrel +to 1. -The current working directory is used if no PKGBASE is specified. +Outputs a summary of upgraded packages, up-to-date packages, and any check +failures. + +This simplifies the maintenance of PKGBUILD files, reducing the manual effort +required to track and implement version changes from upstream sources. + +Configuration +------------- + +Uses linkman:nvchecker[1] and a `.nvchecker.toml` file located alongside the +PKGBUILD. Refer to the configuration section in linkman:pkgctl-version[1]. Options ------- @@ -31,6 +44,7 @@ Options See Also -------- +linkman:pkgctl-version[1] linkman:nvchecker[1] include::include/footer.asciidoc[] diff --git a/doc/man/pkgctl-version.1.asciidoc b/doc/man/pkgctl-version.1.asciidoc index e71becd..fa83314 100644 --- a/doc/man/pkgctl-version.1.asciidoc +++ b/doc/man/pkgctl-version.1.asciidoc @@ -3,7 +3,7 @@ pkgctl-version(1) Name ---- -pkgctl-version - Package version related commands. +pkgctl-version - Check and manage package versions against upstream Synopsis @@ -13,7 +13,28 @@ pkgctl version [OPTIONS] [SUBCOMMAND] Description ----------- -Package version related commands such as checking if a package is out of date. +Commands related to package versions, including checks for outdated packages. + +Uses linkman:nvchecker[1] and a `.nvchecker.toml` file located alongside the +PKGBUILD. + +Configuration +------------- + +The `.nvchecker.toml` file must contain a section that matches the +package's pkgbase. The pkgbase section within the `.nvchecker.toml` file +specifies the source and method for checking the latest version of the +corresponding package. + +For detailed information on the various configuration options available for the +`.nvchecker.toml` file, refer to the configuration files section in +linkman:nvchecker[1]. This documentation provides insights into the possible +options that can be utilized to customize the version checking process. + +To supply GitHub or GitLab tokens to nvchecker, a `keyfile.toml` should be +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. Options ------- @@ -25,10 +46,10 @@ Subcommands ----------- pkgctl version check:: - Check if there is an new upstream version available + Compares local package versions against upstream pkgctl version upgrade:: - Upgrade the PKGBUILD according to the latest available upstream version + Adjust the PKGBUILD to match the latest upstream version See Also -------- diff --git a/doc/man/pkgctl.1.asciidoc b/doc/man/pkgctl.1.asciidoc index 929ae9a..d9a1d8c 100644 --- a/doc/man/pkgctl.1.asciidoc +++ b/doc/man/pkgctl.1.asciidoc @@ -51,7 +51,7 @@ pkgctl search:: Search for an expression across the GitLab packaging group pkgctl version:: - Package version related commands + Check and manage package versions against upstream See Also -------- diff --git a/src/lib/version.sh b/src/lib/version.sh index 4340fca..ac810ae 100644 --- a/src/lib/version.sh +++ b/src/lib/version.sh @@ -15,11 +15,11 @@ pkgctl_version_usage() { cat <<- _EOF_ Usage: ${COMMAND} [COMMAND] [OPTIONS] - Package version related commands. + Check and manage package versions against upstream. COMMANDS - check Check if there is a newer version availble - upgrade Upgrade the PKGBUILD according to the latest available upstream version + check Compares local package versions against upstream + upgrade Adjust the PKGBUILD to match the latest upstream version OPTIONS -h, --help Show this help text diff --git a/src/lib/version/check.sh b/src/lib/version/check.sh index cc8827d..006fd80 100644 --- a/src/lib/version/check.sh +++ b/src/lib/version/check.sh @@ -28,13 +28,15 @@ pkgctl_version_check_usage() { cat <<- _EOF_ Usage: ${COMMAND} [OPTIONS] [PKGBASE]... - Uses nvchecker, a .nvchecker.toml file and the current PKGBUILD - pkgver to check if there is a newer package version available. + Compares the versions of packages in the local packaging repository against + their latest upstream versions. - The current working directory is used if no PKGBASE is specified. + Upon execution, it generates a grouped list that provides detailed insights + into each package's status. For each package, it displays the current local + version alongside the latest version available upstream. - To provide GitHub or GitLab tokens to nvchecker, a keyfile.toml - will be supplied from \${XDG_CONFIG_HOME}/nvchecker. + Outputs a summary of up-to-date packages, out-of-date packages, and any + check failures. OPTIONS -v, --verbose Display results including up-to-date versions diff --git a/src/lib/version/upgrade.sh b/src/lib/version/upgrade.sh index 70513ce..87744b0 100644 --- a/src/lib/version/upgrade.sh +++ b/src/lib/version/upgrade.sh @@ -24,12 +24,16 @@ pkgctl_version_upgrade_usage() { cat <<- _EOF_ Usage: ${COMMAND} [OPTIONS] [PKGBASE]... - Upgrade the PKGBUILD according to the latest available upstream version + Streamlines the process of keeping PKGBUILD files up-to-date with the latest + upstream versions. - Uses nvchecker, a .nvchecker.toml file and the current PKGBUILD - pkgver to check if there is a newer package version available. + Upon execution, it automatically adjusts the PKGBUILD file, ensuring that the + pkgver field is set to match the latest version available from the upstream + source. In addition to updating the pkgver, this command also resets the pkgrel + to 1. - The current working directory is used if no PKGBASE is specified. + Outputs a summary of upgraded packages, up-to-date packages, and any check + failures. OPTIONS -v, --verbose Display results including up-to-date versions diff --git a/src/pkgctl.in b/src/pkgctl.in index 9deb4b2..50c14b5 100644 --- a/src/pkgctl.in +++ b/src/pkgctl.in @@ -27,7 +27,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 - version Package version related commands + version Check and manage package versions against upstream OPTIONS -h, --help Show this help text -- cgit v1.2.3-70-g09d2 From 800cf9b56b64f9954852f55fea408786cd5aaaa0 Mon Sep 17 00:00:00 2001 From: Jelle van der Waa Date: Sun, 4 Feb 2024 11:27:02 +0100 Subject: fix(version): fix typo never should be newer Component: pkgctl version check Component: pkgctl version update --- src/lib/version/check.sh | 2 +- src/lib/version/upgrade.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'src/lib') diff --git a/src/lib/version/check.sh b/src/lib/version/check.sh index 006fd80..4731545 100644 --- a/src/lib/version/check.sh +++ b/src/lib/version/check.sh @@ -149,7 +149,7 @@ pkgctl_version_check() { result="${BOLD}${pkgbase}${ALL_OFF}: current version ${PURPLE}${pkgver}${ALL_OFF} is latest" up_to_date+=("${result}") elif (( result < 0 )); then - result="${BOLD}${pkgbase}${ALL_OFF}: current version ${PURPLE}${pkgver}${ALL_OFF} is never than ${DARK_GREEN}${upstream_version}${ALL_OFF}" + result="${BOLD}${pkgbase}${ALL_OFF}: current version ${PURPLE}${pkgver}${ALL_OFF} is newer than ${DARK_GREEN}${upstream_version}${ALL_OFF}" up_to_date+=("${result}") elif (( result > 0 )); then result="${BOLD}${pkgbase}${ALL_OFF}: upgrade from version ${PURPLE}${pkgver}${ALL_OFF} to ${DARK_GREEN}${upstream_version}${ALL_OFF}" diff --git a/src/lib/version/upgrade.sh b/src/lib/version/upgrade.sh index 87744b0..e217532 100644 --- a/src/lib/version/upgrade.sh +++ b/src/lib/version/upgrade.sh @@ -140,7 +140,7 @@ pkgctl_version_upgrade() { result="${BOLD}${pkgbase}${ALL_OFF}: current version ${PURPLE}${pkgver}${ALL_OFF} is latest" up_to_date+=("${result}") elif (( result < 0 )); then - result="${BOLD}${pkgbase}${ALL_OFF}: current version ${PURPLE}${pkgver}${ALL_OFF} is never than ${DARK_GREEN}${upstream_version}${ALL_OFF}" + result="${BOLD}${pkgbase}${ALL_OFF}: current version ${PURPLE}${pkgver}${ALL_OFF} is newer than ${DARK_GREEN}${upstream_version}${ALL_OFF}" up_to_date+=("${result}") elif (( result > 0 )); then result="${BOLD}${pkgbase}${ALL_OFF}: upgraded from version ${PURPLE}${pkgver}${ALL_OFF} to ${DARK_GREEN}${upstream_version}${ALL_OFF}" -- cgit v1.2.3-70-g09d2 From a7a2f25fb092f30bb8c31ed45a60ffcf44b34932 Mon Sep 17 00:00:00 2001 From: Carl Smedstad Date: Mon, 5 Feb 2024 11:43:33 +0100 Subject: fix(version): Handle pkgbase with '.' correctly MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For pkgbases with '.' in the name, the TOML-section must be wrapped in double quotes in order for it not to be parsed as a supersection and a subsection. This case was not properly handled by checks for if the TOML-file contains a pkgbase section, and for if the TOML-file contains superfluous sections. Address this by handling optional double quotes in the greps related to said checks. This was discovered in the AUR package ruby-cool.io and the issue can be reproduced with the following minimal PKGBUILD and .nvchecker.toml file: $ cat PKGBUILD pkgname=ruby-cool.io pkgver=1.8.0 $ cat .nvchecker.toml ["ruby-cool.io"] source = "gems" gems = "cool.io" Before the fix: $ pkgctl version check Failure x ruby-cool.io: missing pkgbase section in .nvchecker.toml: ruby-cool.io After the fix: $ pkgctl version check GEN lib/version/check.sh Out-of-date ✓ ruby-cool.io: current version 1.8.0 is latest Component: pkgctl version check --- src/lib/version/check.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/lib') diff --git a/src/lib/version/check.sh b/src/lib/version/check.sh index 4731545..6aa465c 100644 --- a/src/lib/version/check.sh +++ b/src/lib/version/check.sh @@ -260,13 +260,13 @@ nvchecker_check_config() { done # check if the config contains a pkgbase section - if [[ -n ${pkgbase} ]] && ! grep --max-count=1 --quiet "^\\[${pkgbase}\\]" < "${config}"; then + if [[ -n ${pkgbase} ]] && ! grep --max-count=1 --extended-regexp --quiet "^\\[\"?${pkgbase}\"?\\]" < "${config}"; then printf "missing pkgbase section in %s: %s" "${config}" "${pkgbase}" return 1 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 "none pkgbase section not supported in %s: %s" "${config}" "${property}" return 1 fi -- cgit v1.2.3-70-g09d2 From eabb1a9313a83baa5789992004dba3eb28efd070 Mon Sep 17 00:00:00 2001 From: Carl Smedstad Date: Mon, 5 Feb 2024 11:44:51 +0100 Subject: fix(doc): Correct typo in version check error message Change 'none pkgbase' to 'non-pkgbase' as the sentence refers sections that are not the pkgbase section, rather than an empty pkgbase section or something of that sort that could be misconstrued by using the word 'none'. Component: pkgctl version check --- src/lib/version/check.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/lib') diff --git a/src/lib/version/check.sh b/src/lib/version/check.sh index 6aa465c..35d07e2 100644 --- a/src/lib/version/check.sh +++ b/src/lib/version/check.sh @@ -267,7 +267,7 @@ nvchecker_check_config() { # check if the config contains any section other than pkgbase if [[ -n ${pkgbase} ]] && property=$(grep --max-count=1 --perl-regexp "^\\[(?!\"?${pkgbase}\"?\\]).+\\]" < "${config}"); then - printf "none pkgbase section not supported in %s: %s" "${config}" "${property}" + printf "non-pkgbase section not supported in %s: %s" "${config}" "${property}" return 1 fi } -- cgit v1.2.3-70-g09d2 From 67fdb58758db553d2c081cf16fbfb54e8d4e932d Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Thu, 18 Jan 2024 19:44:11 +0100 Subject: feat(search): add status spinner to long running GitLab calls This helps people to be slightly more patient as the progress status update includes the current percentage. Component: pkgctl search Signed-off-by: Levente Polyak --- src/lib/api/gitlab.sh | 22 +++++++++++++++++----- src/lib/search.sh | 24 +++++++++++++++++++----- 2 files changed, 36 insertions(+), 10 deletions(-) (limited to 'src/lib') diff --git a/src/lib/api/gitlab.sh b/src/lib/api/gitlab.sh index e4b8a9d..115e58c 100644 --- a/src/lib/api/gitlab.sh +++ b/src/lib/api/gitlab.sh @@ -97,9 +97,10 @@ gitlab_api_call() { gitlab_api_call_paged() { local outfile=$1 - local request=$2 - local endpoint=$3 - local data=${4:-} + local status_file=$2 + local request=$3 + local endpoint=$4 + local data=${5:-} local result header # empty token @@ -110,9 +111,18 @@ gitlab_api_call_paged() { [[ -z ${WORKDIR:-} ]] && setup_workdir api_workdir=$(mktemp --tmpdir="${WORKDIR}" --directory pkgctl-gitlab-api.XXXXXXXXXX) + tmp_file=$(mktemp --tmpdir="${api_workdir}" spinner.tmp.XXXXXXXXXX) + + local next_page=1 + local total_pages=1 - next_page=1 while [[ -n "${next_page}" ]]; do + percentage=$(( 100 * next_page / total_pages )) + printf "📡 Querying GitLab: %s/%s [%s] %%spinner%%" \ + "${BOLD}${next_page}" "${total_pages}" "${percentage}%${ALL_OFF}" \ + > "${tmp_file}" + mv "${tmp_file}" "${status_file}" + result="${api_workdir}/result.${next_page}" header="${api_workdir}/header" if ! curl --request "${request}" \ @@ -133,6 +143,7 @@ gitlab_api_call_paged() { fi next_page=$(grep "x-next-page" "${header}" | tr -d '\r' | awk '{ print $2 }') + total_pages=$(grep "x-total-pages" "${header}" | tr -d '\r' | awk '{ print $2 }') done jq --slurp add "${api_workdir}"/result.* > "${outfile}" @@ -277,12 +288,13 @@ gitlab_api_create_project() { # https://docs.gitlab.com/ee/api/search.html#scope-blobs gitlab_api_search() { local search=$1 + local status_file=$2 local outfile [[ -z ${WORKDIR:-} ]] && setup_workdir outfile=$(mktemp --tmpdir="${WORKDIR}" pkgctl-gitlab-api.XXXXXXXXXX) - if ! gitlab_api_call_paged "${outfile}" GET "/groups/archlinux%2fpackaging%2fpackages/search?scope=blobs" "search=${search}"; then + if ! gitlab_api_call_paged "${outfile}" "${status_file}" GET "/groups/archlinux%2fpackaging%2fpackages/search?scope=blobs" "search=${search}"; then return 1 fi diff --git a/src/lib/search.sh b/src/lib/search.sh index e737dfa..d3bad68 100644 --- a/src/lib/search.sh +++ b/src/lib/search.sh @@ -14,6 +14,8 @@ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/cache.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/api/gitlab.sh # shellcheck source=src/lib/valid-search.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-search.sh +# shellcheck source=src/lib/util/term.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/term.sh source /usr/share/makepkg/util/util.sh source /usr/share/makepkg/util/message.sh @@ -167,9 +169,12 @@ pkgctl_search() { fi # call the gitlab search API - stat_busy "Querying gitlab search api" - output=$(gitlab_api_search "${search}") - stat_done + status_dir=$(mktemp --tmpdir="${WORKDIR}" --directory pkgctl-gitlab-api.XXXXXXXXXX) + printf "📡 Querying GitLab search API..." > "${status_dir}/status" + term_spinner_start "${status_dir}" + output=$(gitlab_api_search "${search}" "${status_dir}/status") + term_spinner_stop "${status_dir}" + msg_success "Querying GitLab search API" # collect project ids whose name needs to be looked up project_name_cache_file=$(get_cache_file gitlab/project_id_to_name) @@ -179,7 +184,9 @@ pkgctl_search() { grep --invert-match --file <(awk '{ print $1 }' < "${project_name_cache_file}" )) # look up project names - stat_busy "Querying project names" + tmp_file=$(mktemp --tmpdir="${WORKDIR}" pkgctl-gitlab-api-spinner.tmp.XXXXXXXXXX) + printf "📡 Querying GitLab project names..." > "${status_dir}/status" + term_spinner_start "${status_dir}" local entries="${#project_ids[@]}" local until=0 while (( until < entries )); do @@ -190,6 +197,12 @@ pkgctl_search() { fi length=$(( until - from )) + percentage=$(( 100 * until / entries )) + printf "📡 Querying GitLab project names: %s/%s [%s] %%spinner%%" \ + "${BOLD}${until}" "${entries}" "${percentage}%${ALL_OFF}" \ + > "${tmp_file}" + mv "${tmp_file}" "${status_dir}/status" + project_slice=("${project_ids[@]:${from}:${length}}") printf -v projects '"gid://gitlab/Project/%s",' "${project_slice[@]}" query='{ @@ -214,7 +227,8 @@ pkgctl_search() { '.[] | "\(.id | rindex("/") as $lastSlash | .[$lastSlash+1:]) \(.name)"' \ <<< "${mapping_output}") done - stat_done + term_spinner_stop "${status_dir}" + msg_success "Querying GitLab project names" # read project_id to name mapping from cache declare -A project_name_lookup=() -- cgit v1.2.3-70-g09d2 From 5042dcaeb4916e199b30ecf21048a4234da43499 Mon Sep 17 00:00:00 2001 From: Christian Heusel Date: Thu, 15 Jun 2023 16:30:41 +0200 Subject: feat(build): allow to test-install the built packages This change introduces the new --install-to-host flag to pkgctl build, which can be used with one of the modes 'all' or 'auto'. Depending on the mode either all or just already installed packages are installed to the host system. BREAKING CHANGE: the --install flag is renamed to --install-to-chroot to avoid confusion with the newly introduced flag. Component: pkgctl build Signed-off-by: Christian Heusel Signed-off-by: Levente Polyak --- contrib/completion/bash/devtools.in | 11 +++++++ contrib/completion/zsh/_devtools.in | 5 ++- doc/man/pkgctl-build.1.asciidoc | 14 +++++++-- src/lib/build/build.sh | 61 ++++++++++++++++++++++++++++++++++--- src/lib/valid-build-install.sh | 11 +++++++ 5 files changed, 93 insertions(+), 9 deletions(-) create mode 100644 src/lib/valid-build-install.sh (limited to 'src/lib') diff --git a/contrib/completion/bash/devtools.in b/contrib/completion/bash/devtools.in index f8b1c9f..11fa234 100644 --- a/contrib/completion/bash/devtools.in +++ b/contrib/completion/bash/devtools.in @@ -3,6 +3,8 @@ # SPDX-License-Identifier: GPL-3.0-or-later _DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@} +# shellcheck source=src/lib/valid-build-install.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-build-install.sh # shellcheck source=src/lib/valid-tags.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-tags.sh # shellcheck source=src/lib/valid-repos.sh @@ -179,6 +181,8 @@ _pkgctl_build_args=( -c --clean -w --worker --inspect + -I --install-to-chroot + -i --install-to-host --pkgver --pkgrel @@ -199,9 +203,16 @@ _pkgctl_build_args_w_opts() { _pkgctl_build_args__worker_opts; } _pkgctl_build_args__inspect_opts() { _devtools_completions_inspect; } _pkgctl_build_args__pkgver_opts() { :; } _pkgctl_build_args__pkgrel_opts() { :; } +_pkgctl_build_args__install_to_host_opts() { _pkgctl_build_completions_install_mode; } +_pkgctl_build_args_i_opts() { _pkgctl_build_args__install_to_host_opts; } +_pkgctl_build_args__install_to_chroot_opts() { _makechrootpkg_args_I_opts; } +_pkgctl_build_args_I_opts() { _pkgctl_build_args__install_to_chroot_opts; } _pkgctl_build_args__message_opts() { :; } _pkgctl_build_args_m_opts() { _pkgctl_build_args__message_opts; } _pkgctl_build_opts() { _filedir -d; } +_pkgctl_build_completions_install_mode() { + mapfile -t COMPREPLY < <(compgen -W "${DEVTOOLS_VALID_BUILD_INSTALL[*]}" -- "$cur") +} _pkgctl_db_cmds=( diff --git a/contrib/completion/zsh/_devtools.in b/contrib/completion/zsh/_devtools.in index 34f90c6..24e57bf 100644 --- a/contrib/completion/zsh/_devtools.in +++ b/contrib/completion/zsh/_devtools.in @@ -3,6 +3,8 @@ # SPDX-License-Identifier: GPL-3.0-or-later _DEVTOOLS_LIBRARY_DIR=${_DEVTOOLS_LIBRARY_DIR:-@pkgdatadir@} +# shellcheck source=src/lib/valid-build-install.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-build-install.sh # shellcheck source=src/lib/valid-tags.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-tags.sh # shellcheck source=src/lib/valid-repos.sh @@ -45,8 +47,9 @@ _pkgctl_build_args=( '(-t --testing)'{-t,--testing}'[Build against the testing counterpart of the auto-detected repo]' '(-o --offload)'{-o,--offload}'[Build on a remote server and transfer artifacts afterwards]' '(-c --clean)'{-c,--clean}'[Recreate the chroot before building]' - '(-I --install)'{-I,--install}'[Install a package into the working copy of the chroot]:target:_files -g "*.pkg.tar.*(.)"' "--inspect[Spawn an interactive shell to inspect the chroot (never, always, failure)]:inspect:($DEVTOOLS_VALID_INSPECT_MODES[*])" + '(-I --install-to-chroot)'{-I,--install-to-chroot}'[Install a package to the working copy of the chroot]:target:_files -g "*.pkg.tar.*(.)"' + '(-i --install-to-host)'{-i,--install-to-host}"[Install the built packages to the host system]:mode:($DEVTOOLS_VALID_BUILD_INSTALL[*])" '(-w --worker)'{-w,--worker}'[Name of the worker slot, useful for concurrent builds (disables auto-detection)]:slot:' '--nocheck[Do not run the check() function in the PKGBUILD]' '--pkgver=[Set pkgver, reset pkgrel and update checksums]:pkgver:' diff --git a/doc/man/pkgctl-build.1.asciidoc b/doc/man/pkgctl-build.1.asciidoc index 12deaaa..e7ec714 100644 --- a/doc/man/pkgctl-build.1.asciidoc +++ b/doc/man/pkgctl-build.1.asciidoc @@ -35,9 +35,6 @@ Build Options *-c, --clean*:: Recreate the chroot before building -*-I, --install* 'FILE':: - Install a package into the working copy of the chroot - *--inspect* 'WHEN':: Spawn an interactive shell to inspect the chroot after building. Useful to ease the debugging of a package build. + Possible values for 'WHEN' are `'never'`, `'always'` or `'failure'` @@ -51,6 +48,17 @@ Build Options *--nocheck*:: Do not run the check() function in the PKGBUILD +Install Options +--------------- + +*-I, --install-to-chroot* 'FILE':: + Install a package to the working copy of the chroot + +*-i, --install-to-host* 'MODE':: + Install the built packages to the host system. Useful when one wants to verify that the package works as intended. + * When 'MODE' is 'all', this installs all built packages + * When 'MODE' is 'auto', this installs all built packages which are currently installed + PKGBUILD Options ---------------- diff --git a/src/lib/build/build.sh b/src/lib/build/build.sh index 712be22..64a6ce3 100644 --- a/src/lib/build/build.sh +++ b/src/lib/build/build.sh @@ -20,6 +20,8 @@ source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/srcinfo.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/pacman.sh # shellcheck source=src/lib/util/pkgbuild.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/pkgbuild.sh +# shellcheck source=src/lib/valid-build-install.sh +source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-build-install.sh # shellcheck source=src/lib/valid-repos.sh source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh # shellcheck source=src/lib/valid-tags.sh @@ -52,11 +54,14 @@ pkgctl_build_usage() { -t, --testing Build against the testing counterpart of the auto-detected repo -o, --offload Build on a remote server and transfer artifacts afterwards -c, --clean Recreate the chroot before building - -I, --install FILE Install a package into the working copy of the chroot --inspect WHEN Spawn an interactive shell to inspect the chroot (never, always, failure) -w, --worker SLOT Name of the worker slot, useful for concurrent builds (disables automatic names) --nocheck Do not run the check() function in the PKGBUILD + INSTALL OPTIONS + -I, --install-to-chroot FILE Install a package to the working copy of the chroot + -i, --install-to-host MODE Install the built package to the host system, possible modes are 'all' and 'auto' + PKGBUILD OPTIONS --pkgver=PKGVER Set pkgver, reset pkgrel and update checksums --pkgrel=PKGREL Set pkgrel to a given value @@ -119,6 +124,7 @@ pkgctl_build() { local TESTING=0 local RELEASE=0 local DB_UPDATE=0 + local INSTALL_TO_HOST=none local REPO= local PKGVER= @@ -131,12 +137,13 @@ pkgctl_build() { local MAKECHROOT_OPTIONS=() local RELEASE_OPTIONS=() local MAKEPKG_OPTIONS=() + local INSTALL_HOST_PACKAGES=() local WORKER= local WORKER_SLOT= # variables - local _arch path pkgbase pkgrepo source pkgbuild_checksum + local _arch path pkgbase pkgrepo source pkgbuild_checksum current_checksum while (( $# )); do case $1 in @@ -209,14 +216,22 @@ pkgctl_build() { BUILD_OPTIONS+=("-c") shift ;; - -I|--install) + -I|--install-to-chroot) (( $# <= 1 )) && die "missing argument for %s" "$1" if (( OFFLOAD )); then MAKECHROOT_OPTIONS+=("-I" "$2") else MAKECHROOT_OPTIONS+=("-I" "$(realpath "$2")") fi - warning 'installing packages into the chroot may break reproducible builds, use with caution!' + warning 'installing packages to the chroot may break reproducible builds, use with caution!' + shift 2 + ;; + -i|--install-to-host) + (( $# <= 1 )) && die "missing argument for %s" "$1" + if ! in_array "$2" "${DEVTOOLS_VALID_BUILD_INSTALL[@]}"; then + die 'invalid install mode: %s' "${2}" + fi + INSTALL_TO_HOST=$2 shift 2 ;; --nocheck) @@ -410,7 +425,9 @@ pkgctl_build() { fi # re-source the PKGBUILD if it changed - if [[ ${pkgbuild_checksum} != "$(b2sum PKGBUILD | awk '{print $1}')" ]]; then + current_checksum="$(b2sum PKGBUILD | awk '{print $1}')" + if [[ ${pkgbuild_checksum} != "${current_checksum}" ]]; then + pkgbuild_checksum=${current_checksum} # shellcheck source=contrib/makepkg/PKGBUILD.proto . ./PKGBUILD fi @@ -432,10 +449,38 @@ pkgctl_build() { fi done + # re-source the PKGBUILD if it changed + current_checksum="$(b2sum PKGBUILD | awk '{print $1}')" + if [[ ${pkgbuild_checksum} != "${current_checksum}" ]]; then + pkgbuild_checksum=${current_checksum} + # shellcheck source=contrib/makepkg/PKGBUILD.proto + . ./PKGBUILD + fi + # auto generate .SRCINFO # shellcheck disable=SC2119 write_srcinfo_file + # test-install (some of) the produced packages + if [[ ${INSTALL_TO_HOST} == auto ]] || [[ ${INSTALL_TO_HOST} == all ]]; then + # shellcheck disable=2119 + load_makepkg_config + + # this is inspired by print_all_package_names from libmakepkg + local version pkg_architecture pkg pkgfile + version=$(get_full_version) + + for pkg in "${pkgname[@]}"; do + pkg_architecture=$(get_pkg_arch "$pkg") + pkgfile=$(realpath "$(printf "%s/%s-%s-%s%s\n" "${PKGDEST:-.}" "$pkg" "$version" "$pkg_architecture" "$PKGEXT")") + + # check if we install all packages or if the (split-)package is already installed + if [[ ${INSTALL_TO_HOST} == all ]] || ( [[ ${INSTALL_TO_HOST} == auto ]] && pacman -Qq -- "$pkg" &>/dev/null ); then + INSTALL_HOST_PACKAGES+=("$pkgfile") + fi + done + fi + # release the build if (( RELEASE )); then pkgctl_release --repo "${pkgrepo}" "${RELEASE_OPTIONS[@]}" @@ -446,6 +491,12 @@ pkgctl_build() { popd >/dev/null done + # install all collected packages to the host system + if (( ${#INSTALL_HOST_PACKAGES[@]} )); then + msg "Installing built packages to the host system" + sudo pacman -U -- "${INSTALL_HOST_PACKAGES[@]}" + fi + # update the binary package repo db as last action if (( RELEASE )) && (( DB_UPDATE )); then # shellcheck disable=2119 diff --git a/src/lib/valid-build-install.sh b/src/lib/valid-build-install.sh new file mode 100644 index 0000000..9e98be2 --- /dev/null +++ b/src/lib/valid-build-install.sh @@ -0,0 +1,11 @@ +#!/hint/bash +# +# SPDX-License-Identifier: GPL-3.0-or-later +: + +# shellcheck disable=2034 +DEVTOOLS_VALID_BUILD_INSTALL=( + none + auto + all +) -- cgit v1.2.3-70-g09d2 From 3ecba314fc3a7508d80c5450aaae4b5fc507d62b Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Tue, 6 Feb 2024 21:59:11 +0100 Subject: feat(build): consolidate repo flags in build and release subcommand Previously the behavior was inconsistent and not fully fulfilling its purpose of only using --repo once when initially pushing a new and unknown package to the official repositories. Consolidate the behavior by only allowing to use --repo during the initial packaging and disallow any subsequent usage. The expected user experience is to subsequently use --testing or --staging to influence the auto-detection of the build target. This avoids any kind of human error which leads to releasing core packages to extra-testing by accident. Furthermore, allow the build subcommand to automatically fallback to extra as the default stable repository target which greatly improves the usability for AUR or local override builds. Fixes #193 Fixes #191 Component: pkgctl build Component: pkgctl release Signed-off-by: Levente Polyak --- contrib/completion/zsh/_devtools.in | 2 +- doc/man/pkgctl-build.1.asciidoc | 5 ++++- doc/man/pkgctl-release.1.asciidoc | 4 +++- src/lib/build/build.sh | 35 +++++++++++++++++++++-------------- src/lib/release.sh | 29 ++++++++++++++++++----------- src/lib/util/pacman.sh | 7 ++++++- 6 files changed, 53 insertions(+), 29 deletions(-) (limited to 'src/lib') diff --git a/contrib/completion/zsh/_devtools.in b/contrib/completion/zsh/_devtools.in index 24e57bf..3aa0f96 100644 --- a/contrib/completion/zsh/_devtools.in +++ b/contrib/completion/zsh/_devtools.in @@ -91,7 +91,7 @@ _pkgctl_db_update_args=( _pkgctl_release_args=( '(-m --message=)'{-m,--message=}"[Use the given as the commit message]:message:" - '(-r --repo=)'{-r,--repo=}"[Specify a target repository (disables auto-detection)]:repo:($DEVTOOLS_VALID_REPOS[*])" + '(-r --repo=)'{-r,--repo=}"[Specify a target repository for new packages]:repo:($DEVTOOLS_VALID_REPOS[*])" '(-s --staging)'{-s,--staging}'[Release to the staging counterpart of the auto-detected repo]' '(-t --testing)'{-t,--testing}'[Release to the testing counterpart of the auto-detected repo]' '(-u --db-update)'{-u,--db-update}'[Automatically update the pacman database after uploading]' diff --git a/doc/man/pkgctl-build.1.asciidoc b/doc/man/pkgctl-build.1.asciidoc index e7ec714..f7abdeb 100644 --- a/doc/man/pkgctl-build.1.asciidoc +++ b/doc/man/pkgctl-build.1.asciidoc @@ -21,7 +21,10 @@ Build Options Specify architectures to build for (disables auto-detection) *--repo* 'REPO':: - Specify a target repository (disables auto-detection) + Specify target repository for new packages not in any official repo. + Fallback to `'extra'` when building packages that are not present in any + official repository yet. Using this option is disallowed if the package is + already released, as it would circumvent the auto-detection safeguard. *-s, --staging*:: Build against the staging counterpart of the auto-detected repo diff --git a/doc/man/pkgctl-release.1.asciidoc b/doc/man/pkgctl-release.1.asciidoc index c991db4..01a0c9e 100644 --- a/doc/man/pkgctl-release.1.asciidoc +++ b/doc/man/pkgctl-release.1.asciidoc @@ -27,7 +27,9 @@ Options Use the given as the commit message *-r, --repo* 'REPO':: - Specify a target repository (disables auto-detection) + Specify target repository for new packages not in any official repo. + Using this option is disallowed if the package is already released, as it + would circumvent the auto-detection safeguard. *-s, --staging*:: Build against the staging counterpart of the auto-detected repo diff --git a/src/lib/build/build.sh b/src/lib/build/build.sh index 64a6ce3..8e9a3bb 100644 --- a/src/lib/build/build.sh +++ b/src/lib/build/build.sh @@ -49,7 +49,7 @@ pkgctl_build_usage() { BUILD OPTIONS --arch ARCH Specify architectures to build for (disables auto-detection) - --repo REPO Specify a target repository (disables auto-detection) + --repo REPO Specify target repository for new packages not in any official repo -s, --staging Build against the staging counterpart of the auto-detected repo -t, --testing Build against the testing counterpart of the auto-detected repo -o, --offload Build on a remote server and transfer artifacts afterwards @@ -89,8 +89,7 @@ pkgctl_build_check_option_group_repo() { local repo=$2 local testing=$3 local staging=$4 - if ( (( testing )) && (( staging )) ) || - ( [[ $repo =~ ^.*-(staging|testing)$ ]] && ( (( testing )) || (( staging )) )); then + if [[ -n "${repo}" ]] || (( testing )) || (( staging )); then die "The argument '%s' cannot be used with one or more of the other specified arguments" "${option}" exit 1 fi @@ -153,8 +152,8 @@ pkgctl_build() { ;; --repo) (( $# <= 1 )) && die "missing argument for %s" "$1" - REPO="${2}" pkgctl_build_check_option_group_repo '--repo' "${REPO}" "${TESTING}" "${STAGING}" + REPO="${2}" shift 2 ;; --arch) @@ -203,13 +202,13 @@ pkgctl_build() { shift ;; -s|--staging) - STAGING=1 pkgctl_build_check_option_group_repo '--staging' "${REPO}" "${TESTING}" "${STAGING}" + STAGING=1 shift ;; -t|--testing) - TESTING=1 pkgctl_build_check_option_group_repo '--testing' "${REPO}" "${TESTING}" "${STAGING}" + TESTING=1 shift ;; -c|--clean) @@ -331,14 +330,22 @@ pkgctl_build() { pkgbuild_checksum=$(b2sum PKGBUILD | awk '{print $1}') msg "Building ${pkgbase}" - # auto-detection of build target - if [[ -z ${pkgrepo} ]]; then - if ! pkgrepo=$(get_pacman_repo_from_pkgbuild PKGBUILD); then - die 'failed to get pacman repo' - fi - if [[ -z "${pkgrepo}" ]]; then - die 'unknown repo, specify --repo for packages not currently in any official repo' - fi + # auto-detect target repository + if ! repo=$(get_pacman_repo_from_pkgbuild PKGBUILD); then + die 'Failed to query pacman repo' + fi + + # fail if an existing package specifies --repo + if [[ -n "${repo}" ]] && [[ -n ${pkgrepo} ]]; then + die 'Using --repo for packages that exist in official repositories is disallowed' + fi + + # assign auto-detected target repository + if [[ -n ${repo} ]]; then + pkgrepo=${repo} + # fallback to extra for unreleased packages + elif [[ -z ${pkgrepo} ]]; then + pkgrepo=extra fi # special cases to resolve final build target diff --git a/src/lib/release.sh b/src/lib/release.sh index 028d92e..700b2b0 100644 --- a/src/lib/release.sh +++ b/src/lib/release.sh @@ -35,7 +35,7 @@ pkgctl_release_usage() { OPTIONS -m, --message MSG Use the given as the commit message - -r, --repo REPO Specify a target repository (disables auto-detection) + -r, --repo REPO Specify target repository for new packages not in any official repo -s, --staging Release to the staging counterpart of the auto-detected repo -t, --testing Release to the testing counterpart of the auto-detected repo -u, --db-update Automatically update the pacman database after uploading @@ -43,8 +43,8 @@ pkgctl_release_usage() { EXAMPLES $ ${COMMAND} - $ ${COMMAND} --repo core-testing --message 'libyay 0.42 rebuild' libfoo libbar - $ ${COMMAND} --staging --db-update libfoo + $ ${COMMAND} --staging --message 'libyay 0.42 rebuild' libfoo libbar + $ ${COMMAND} --repo extra --db-update new-package _EOF_ } @@ -134,15 +134,22 @@ pkgctl_release() { pushd "${path}" >/dev/null pkgbase=$(basename "${path}") - if [[ -n ${REPO} ]]; then - repo=${REPO} - else - if ! repo=$(get_pacman_repo_from_pkgbuild PKGBUILD); then - die 'Failed to get pacman repo' - fi - if [[ -z "${repo}" ]]; then - die 'Unknown repo, please specify --repo for new packages' + # auto-detect target repository + if ! repo=$(get_pacman_repo_from_pkgbuild PKGBUILD); then + die 'Failed to query pacman repo' + fi + + # fail if an existing package specifies --repo + if [[ -n "${repo}" ]] && [[ -n ${REPO} ]]; then + die 'Using --repo for packages that exist in official repositories is disallowed' + fi + + # fail if a new package does not specify --repo + if [[ -z "${repo}" ]]; then + if [[ -z ${REPO} ]]; then + die 'Specify --repo for packages that do not yet exist in official repositories' fi + repo=${REPO} fi if (( TESTING )); then diff --git a/src/lib/util/pacman.sh b/src/lib/util/pacman.sh index 82a227b..620e1a8 100644 --- a/src/lib/util/pacman.sh +++ b/src/lib/util/pacman.sh @@ -38,6 +38,11 @@ get_pacman_repo_from_pkgbuild() { return fi + # update the pacman repo cache if it doesn't exist yet + if [[ ! -d "${_DEVTOOLS_PACMAN_CACHE_DIR}" ]]; then + update_pacman_repo_cache + fi + slock 10 "${_DEVTOOLS_PACMAN_CACHE_DIR}.lock" "Locking pacman database cache" # query repo of passed pkgname, specify --nodeps twice to skip all dependency checks mapfile -t repos < <(pacman --config "${_DEVTOOLS_PACMAN_CONF_DIR}/multilib.conf" \ @@ -47,7 +52,7 @@ get_pacman_repo_from_pkgbuild() { --nodeps \ --print \ --print-format '%n %r' \ - "${pkgnames[0]}" | awk '$1=="'"${pkgnames[0]}"'"{print $2}' + "${pkgnames[0]}" 2>/dev/null | awk '$1=="'"${pkgnames[0]}"'"{print $2}' ) lock_close 10 -- cgit v1.2.3-70-g09d2 From fc05ea19d9005cffaa461cf4f86131a001f88ca9 Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Thu, 8 Feb 2024 01:15:48 +0100 Subject: fix(build): allow unstable repositories to override repo target This works around the fact that we are currently not auto detecting unstable repository targets while providing a stability layer option on the subcommand. Soften the --repo option rules by allowing unstable repositories to use that flag for building and releasing against the unstable repositories. This will be replaced in the near future by proper integration of target repository auto-detection that in aware of unstable repositories while providing a unstable stability layer options. Component: pkgctl build Component: pkgctl release Signed-off-by: Levente Polyak --- src/lib/build/build.sh | 7 ++++++- src/lib/release.sh | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) (limited to 'src/lib') diff --git a/src/lib/build/build.sh b/src/lib/build/build.sh index 8e9a3bb..9bd1e5d 100644 --- a/src/lib/build/build.sh +++ b/src/lib/build/build.sh @@ -337,7 +337,12 @@ pkgctl_build() { # fail if an existing package specifies --repo if [[ -n "${repo}" ]] && [[ -n ${pkgrepo} ]]; then - die 'Using --repo for packages that exist in official repositories is disallowed' + # allow unstable to use --repo + if [[ ${pkgrepo} == *unstable ]]; then + repo=${pkgrepo} + else + die 'Using --repo for packages that exist in official repositories is disallowed' + fi fi # assign auto-detected target repository diff --git a/src/lib/release.sh b/src/lib/release.sh index 700b2b0..acb3b54 100644 --- a/src/lib/release.sh +++ b/src/lib/release.sh @@ -141,7 +141,12 @@ pkgctl_release() { # fail if an existing package specifies --repo if [[ -n "${repo}" ]] && [[ -n ${REPO} ]]; then - die 'Using --repo for packages that exist in official repositories is disallowed' + # allow unstable to use --repo + if [[ ${REPO} == *unstable ]]; then + repo=${REPO} + else + die 'Using --repo for packages that exist in official repositories is disallowed' + fi fi # fail if a new package does not specify --repo -- cgit v1.2.3-70-g09d2 From 1cf402eae9d4b98f839ce9d116f807531cda7862 Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Fri, 9 Feb 2024 20:18:30 +0100 Subject: fix(build): forward target repo options to the release subcommand The adequate target repo options are not appropriately forwarded to the release subcommand if the auto-release options is activated. Previously we did not restrict the --repo option, which the build option has used as a shortcut. Since last release, this option is restricted to new packages that are not in any official repository yet. Fix this issue by forwarding the same target repo options that have been used during the build command and not forcefully the --repo options. Fixes #209 Component: pkgctl build Signed-off-by: Levente Polyak --- src/lib/build/build.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src/lib') diff --git a/src/lib/build/build.sh b/src/lib/build/build.sh index 9bd1e5d..171bb9a 100644 --- a/src/lib/build/build.sh +++ b/src/lib/build/build.sh @@ -154,6 +154,7 @@ pkgctl_build() { (( $# <= 1 )) && die "missing argument for %s" "$1" pkgctl_build_check_option_group_repo '--repo' "${REPO}" "${TESTING}" "${STAGING}" REPO="${2}" + RELEASE_OPTIONS+=("--repo" "${REPO}") shift 2 ;; --arch) @@ -204,11 +205,13 @@ pkgctl_build() { -s|--staging) pkgctl_build_check_option_group_repo '--staging' "${REPO}" "${TESTING}" "${STAGING}" STAGING=1 + RELEASE_OPTIONS+=("--staging") shift ;; -t|--testing) pkgctl_build_check_option_group_repo '--testing' "${REPO}" "${TESTING}" "${STAGING}" TESTING=1 + RELEASE_OPTIONS+=("--testing") shift ;; -c|--clean) @@ -495,7 +498,7 @@ pkgctl_build() { # release the build if (( RELEASE )); then - pkgctl_release --repo "${pkgrepo}" "${RELEASE_OPTIONS[@]}" + pkgctl_release "${RELEASE_OPTIONS[@]}" fi # reset common PKGBUILD variables -- cgit v1.2.3-70-g09d2 From 98bd7e376091ef8a19d848f865521cb13fdfb577 Mon Sep 17 00:00:00 2001 From: Jakub Klinkovský Date: Sun, 11 Feb 2024 13:37:49 +0100 Subject: fix(build): explicitly add --nosign when building a srcpkg We should explicitly instruct makepkg to not sign the source package, even when the BUILDENV array in makepkg.conf contains 'sign'. The devtools workflow is to always sign separately from building, which is different from makepkg and it should not depend on its configuration. Furthermore, this function is currently used only in offload-build to collect sources that are transferred to the server before the build itself. Signing this source package does not provide any benefits. --- src/lib/util/makepkg.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/lib') diff --git a/src/lib/util/makepkg.sh b/src/lib/util/makepkg.sh index adb3af6..22df247 100644 --- a/src/lib/util/makepkg.sh +++ b/src/lib/util/makepkg.sh @@ -28,7 +28,9 @@ makepkg_source_package() { export LIBMAKEPKG_SRCINFO_SH=1 write_srcinfo() { print_srcinfo; } - set +e -- -F --source + # explicitly instruct makepkg to not sign the source package, even when + # the BUILDENV array in makepkg.conf contains 'sign' + set +e -- -F --source --nosign # shellcheck source=/usr/bin/makepkg source "$(command -v makepkg)" ) -- cgit v1.2.3-70-g09d2 From e0a84aefc35a4716fa91c13ec1c3909b50fccd5c Mon Sep 17 00:00:00 2001 From: Christian Heusel Date: Sat, 10 Feb 2024 20:14:16 +0100 Subject: fix(common): check before using tput with a fallback for colors The latest release of devtools has included some pretty printing capabilities and fancy terminal stuff with the spinner and so on. It seems like the existing safeguards to disable this for incapable terminals were not enough though, therefore we saw two types of errors: - offload-build: ``` ==> Building in chroot for [extra] (x86_64)... tput: unknown terminal "unknown" tput: unknown terminal "unknown" tput: unknown terminal "unknown" ``` - repro builders: ``` ==> Successfully switched to version tput: No value for $TERM and no -T specified ERROR: Failed checkout ``` The recently included fail option made this error populate to the command level and therefore increased its impact from a not so nice logging message to a more severe problem which made the command abort. We fix this by checking if tput is supported or else use the raw escape sequences instead of tput commands. Fixes: fedfc80 ("feat(term): add terminal utils to handle a dynamic spinner") Fixes: 66e83c9 ("feat(version): pretty print and group together version check results") Fixes: d0dc0e1 ("feat(search): add optional plain output formatting") Signed-off-by: Christian Heusel --- src/lib/common.sh | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'src/lib') diff --git a/src/lib/common.sh b/src/lib/common.sh index 63f43f1..2d2d16f 100644 --- a/src/lib/common.sh +++ b/src/lib/common.sh @@ -34,9 +34,15 @@ export AUR_URL_SSH=aur@aur.archlinux.org # check if messages are to be printed using color if [[ -t 2 && "$TERM" != dumb ]] || [[ ${DEVTOOLS_COLOR} == always ]]; then colorize - PURPLE="$(tput setaf 5)" - DARK_GREEN="$(tput setaf 2)" - UNDERLINE="$(tput smul)" + if tput setaf 0 &>/dev/null; then + PURPLE="$(tput setaf 5)" + DARK_GREEN="$(tput setaf 2)" + UNDERLINE="$(tput smul)" + else + PURPLE="\e[35m" + DARK_GREEN="\e[32m" + UNDERLINE="\e[4m" + fi else # shellcheck disable=2034 declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW='' PURPLE='' DARK_GREEN='' UNDERLINE='' @@ -108,7 +114,9 @@ cleanup() { if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then rm -rf "$WORKDIR" fi - tput cnorm >&2 + if tput setaf 0 &>/dev/null; then + tput cnorm >&2 + fi exit "${1:-0}" } -- cgit v1.2.3-70-g09d2 From 66a4357f3e001d02bbbb45fb247efaa2f505726d Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Wed, 14 Feb 2024 01:18:40 +0100 Subject: fix(common): ensure TERM is always set with a fallback to dumb This avoids some corner cases that some applications behave ill when TERM is completely unset. Instead, ensure we set TERM to dumb as a fallback, which should serve better than not having any term defined. Signed-off-by: Levente Polyak --- src/lib/common.sh | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/lib') diff --git a/src/lib/common.sh b/src/lib/common.sh index 2d2d16f..ff767c6 100644 --- a/src/lib/common.sh +++ b/src/lib/common.sh @@ -31,6 +31,9 @@ export PACKAGING_REPO_RELEASE_HOST=repos.archlinux.org export PKGBASE_MAINTAINER_URL=https://archlinux.org/packages/pkgbase-maintainer export AUR_URL_SSH=aur@aur.archlinux.org +# ensure TERM is set with a fallback to dumb +export TERM=${TERM:-dumb} + # check if messages are to be printed using color if [[ -t 2 && "$TERM" != dumb ]] || [[ ${DEVTOOLS_COLOR} == always ]]; then colorize -- cgit v1.2.3-70-g09d2 From 354c9dcd123711191f77813acf35343e8a4849eb Mon Sep 17 00:00:00 2001 From: Levente Polyak Date: Thu, 29 Feb 2024 00:47:11 +0100 Subject: fix(drop-from-repo): avoid error when updating remote head We can only update the local ref to the remote head from main to master once we have actually pushed the master branch to the remote. If we do this too early, the call will simply error out. Instead, only update the local head for the configured remote after we have successfully renamed the branch and pushed it to the AUR. Fixes #212 Component: pkgctl aur drop-from-repo Signed-off-by: Levente Polyak --- src/lib/aur/drop-from-repo.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/lib') diff --git a/src/lib/aur/drop-from-repo.sh b/src/lib/aur/drop-from-repo.sh index d70b559..6ebe12a 100644 --- a/src/lib/aur/drop-from-repo.sh +++ b/src/lib/aur/drop-from-repo.sh @@ -120,7 +120,6 @@ pkgctl_aur_drop_from_repo() { if [[ $(git symbolic-ref --quiet --short HEAD) == main ]]; then git branch --move master git config branch.master.merge refs/heads/master - git remote set-head origin master fi # auto generate .SRCINFO if not already present @@ -142,6 +141,9 @@ pkgctl_aur_drop_from_repo() { git push origin master fi + # update the local default branch in case this clone is used in the future + git remote set-head origin master + if (( DISOWN )); then msg "Disowning ${pkgbase} on the AUR" # shellcheck disable=SC2029 -- cgit v1.2.3-70-g09d2