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 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-54-g00ecf