Compare commits

..

3 Commits

Author SHA1 Message Date
Josephine Pfeiffer
1c00adc474 Merge branch 'gl-261-confirm-move' into 'master'
[GL#261] add db move confirmation prompt

Closes #261

See merge request archlinux/devtools!304
2025-08-11 00:12:29 +00:00
Josephine Pfeiffer
f5c8258784 Merge branch 'master' of gitlab.archlinux.org:pfeifferj/devtools into gl-261-confirm-move 2025-03-18 22:26:52 +01:00
Josephine Pfeiffer
c169f5c7ab feat(pgkctl_db): require confirmation for package repository moves
The pkgctl db move command previously executed without confirmation,
which could lead to accidental package moves between repositories.
This change adds a confirmation prompt similar to deletion operations,
while preserving the ability to bypass confirmation with a new --noconfirm flag.

This approach prevents unintended package moves while maintaining efficiency:
- Confirmation prompt provides a safety check before executing moves
- The --noconfirm flag allows for scripting and automation when needed
- Implementation follows consistent patterns used in other pkgctl commands

Package move operations can have significant impact on repository management,
and this small usability improvement helps prevent mistakes that could
affect multiple users or require additional corrective actions.

Fixes #261

Component: pkgctl db move
Signed-off-by: Josephine Pfeiffer <hi@josie.lol>
2025-03-18 22:07:30 +01:00
7 changed files with 49 additions and 71 deletions

View File

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

View File

@@ -8,6 +8,8 @@ DEVTOOLS_INCLUDE_DB_MOVE_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/valid-repos.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh
set -e
@@ -20,6 +22,7 @@ pkgctl_db_move_usage() {
Move packages between binary repositories.
OPTIONS
--noconfirm Bypass any confirmation messages, should only be used with caution
-h, --help Show this help text
EXAMPLES
@@ -29,9 +32,12 @@ _EOF_
}
pkgctl_db_move() {
local SOURCE_REPO=""
local TARGET_REPO=""
local PKGBASES=()
if (( $# < 3 )); then
pkgctl_db_move_usage
exit 1
fi
local CONFIRM=1
# option checking
while (( $# )); do
@@ -40,6 +46,10 @@ pkgctl_db_move() {
pkgctl_db_move_usage
exit 0
;;
--noconfirm)
CONFIRM=0
shift
;;
-*)
die "invalid argument: %s" "$1"
;;
@@ -49,16 +59,35 @@ pkgctl_db_move() {
esac
done
if (( $# < 3 )); then
pkgctl_db_move_usage
exit 1
local source_repo=$1
local target_repo=$2
shift 2
if ! in_array "${source_repo}" "${DEVTOOLS_VALID_REPOS[@]}"; then
die "Invalid source repository: %s" "${source_repo}"
fi
if ! in_array "${target_repo}" "${DEVTOOLS_VALID_REPOS[@]}"; then
die "Invalid target repository: %s" "${target_repo}"
fi
SOURCE_REPO=$1
TARGET_REPO=$2
shift 2
PKGBASES+=("$@")
if (( CONFIRM )); then
local pkglist
pkglist=$(printf '%s\n' "$@" | paste -sd ' ')
read -r -p "Move packages from [${source_repo}] to [${target_repo}]: ${pkglist}? [Y/n] " response
case ${response} in
[Yy][Ee][Ss]|[Yy]|'')
: # continue
;;
*)
exit 0
;;
esac
fi
# shellcheck disable=SC2029
ssh "${PACKAGING_REPO_RELEASE_HOST}" db-move "${SOURCE_REPO}" "${TARGET_REPO}" "${PKGBASES[@]}"
local pkgbase
for pkgbase in "$@"; do
msg "Moving [%s] from [%s] to [%s]" "${pkgbase}" "${source_repo}" "${target_repo}"
# shellcheck disable=SC2046
db-move "${source_repo}" "${target_repo}" $(pacman -Sql "${source_repo}" | grep "^${pkgbase}" || echo "${pkgbase}")
done
}

View File

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

View File

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

View File

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

View File

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

View File

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