Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
path: root/src/lib/db/remove.sh
blob: cddcc1d36367877601834754e41e604500fcbd92 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#!/hint/bash
#
# SPDX-License-Identifier: GPL-3.0-or-later

[[ -z ${DEVTOOLS_INCLUDE_DB_REMOVE_SH:-} ]] || return 0
DEVTOOLS_INCLUDE_DB_REMOVE_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/pacman.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/pacman.sh
# shellcheck source=src/lib/util/term.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/util/term.sh
# shellcheck source=src/lib/valid-repos.sh
source "${_DEVTOOLS_LIBRARY_DIR}"/lib/valid-repos.sh

set -e


pkgctl_db_remove_usage() {
	local -r COMMAND=${_DEVTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}}
	cat <<- _EOF_
		Usage: ${COMMAND} [OPTIONS] [REPO] [PKGBASE]...

		Remove packages from pacman repositories. By default passing a pkgbase removes
		all split packages, debug packages as well as entries from the state repo for
		all existing architectures.

		Beware when using the --partial option, as it may most likely lead to
		undesired effects by leaving debug packages behind as well as dangling entries
		in the state repository.

		OPTIONS
		    -a, --arch    Remove only one specific architecture (disables auto-detection)
		    --partial     Remove only partial pkgnames from a split package. This leaves
		                  debug packages behind and pkgbase entries in the state repo.
		    --noconfirm   Bypass any confirmation messages, should only be used with caution
		    -h, --help    Show this help text

		EXAMPLES
		    $ ${COMMAND} core-testing libfoo libbar
		    $ ${COMMAND} --arch x86_64 core libyay
_EOF_
}

pkgctl_db_remove() {
	local REPO=""
	local PKGBASES=()
	local pkgnames=()
	local partial=0
	local confirm=1
	local dbscripts_options=()
	local lookup_repo=multilib
	local pkgname

	# option checking
	while (( $# )); do
		case $1 in
			-h|--help)
				pkgctl_db_remove_usage
				exit 0
				;;
			--partial)
				partial=1
				dbscripts_options+=(--partial)
				shift
				;;
			-a|--arch)
				(( $# <= 1 )) && die "missing argument for %s" "$1"
				dbscripts_options+=(--arch "$2")
				shift 2
				;;
			--noconfirm)
				confirm=0
				shift
				;;
			-*)
				die "invalid argument: %s" "$1"
				;;
			*)
				break
				;;
		esac
	done

	if (( $# < 2 )); then
		pkgctl_db_remove_usage
		exit 1
	fi

	REPO=$1
	shift
	PKGBASES+=("$@")
	pkgnames=("${PKGBASES[@]}")

	# check if the target repo is valid
	if ! in_array "${REPO}" "${DEVTOOLS_VALID_REPOS[@]}"; then
		die "Invalid repository target: %s" "${REPO}"
	fi

	# update pacman cache to query all pkgnames
	if (( ! partial )); then
		case ${REPO} in
			*-unstable)
				update_pacman_repo_cache unstable
				;;
			*-staging)
				update_pacman_repo_cache multilib-staging
				;;
			*-testing)
				update_pacman_repo_cache multilib-testing
				;;
			*)
				update_pacman_repo_cache multilib
				;;
		esac

		# fetch the pkgnames of all pkgbase as present in the repo
		mapfile -t pkgnames < <(get_pkgnames_from_repo_pkgbase "${REPO}" "${PKGBASES[@]}")
		echo

		if (( ! ${#pkgnames[@]} )); then
			error "Packages not found in %s" "${REPO}"
			exit 1
		fi
	fi

	# print list of packages
	printf "%sRemoving packages from %s:%s\n" "${RED}" "${REPO}" "${ALL_OFF}"
	for pkgname in "${pkgnames[@]}"; do
		printf "• %s\n" "${pkgname}"
	done

	# print explenation about partial removal
	if (( partial )); then
		echo
		msg_warn "${YELLOW}Removing only partial pkgnames from a split package.${ALL_OFF}"
		msg_warn "${YELLOW}This leaves debug packages and pkgbase entries in the state repo!${ALL_OFF}"
	fi

	# ask for confirmation
	if (( confirm )); then
		echo
		if ! prompt "${GREEN}${BOLD}?${ALL_OFF} Are you sure this is correct?"; then
			exit 1
		fi
	fi

	echo
	# shellcheck disable=SC2029
	ssh "${PACKAGING_REPO_RELEASE_HOST}" db-remove "${dbscripts_options[@]}" "${REPO}" "${PKGBASES[@]}"
}