summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2018-06-06 16:17:43 +0200
committerErich Eckner <git@eckner.net>2018-06-06 16:17:43 +0200
commit06e26b5b0ca1128730a847a4b06a4489dce10ca6 (patch)
treef4cf96fb93a51356cac657fee17b0b444f7af8dd
parent29383e4b6113f66a67f79901125dc8a2a5cff482 (diff)
downloadbuilder-06e26b5b0ca1128730a847a4b06a4489dce10ca6.tar.xz
bin/delete-packages: -f|--force new
-rwxr-xr-xbin/delete-packages84
1 files changed, 49 insertions, 35 deletions
diff --git a/bin/delete-packages b/bin/delete-packages
index 75fdc8e..a0e6596 100755
--- a/bin/delete-packages
+++ b/bin/delete-packages
@@ -25,6 +25,7 @@ usage() {
>&2 echo ' delete obsolete binary packages.'
>&2 echo ''
>&2 echo 'possible options:'
+ >&2 echo ' -f|--force $id: Only delete the selected packages - but delete in any case.'
>&2 echo ' -h|--help: Show this help and exit.'
>&2 echo ' -n|--no-action: Only print what would be deleted.'
>&2 echo ' -w|--wait: If necessary, wait for lock blocking.'
@@ -32,7 +33,8 @@ usage() {
}
eval set -- "$(
- getopt -o hnw \
+ getopt -o f:hnw \
+ --long force: \
--long help \
--long no-action \
--long wait \
@@ -41,11 +43,16 @@ eval set -- "$(
)"
block_flag='-n'
+force_ids=''
no_action=false
while true
do
case "$1" in
+ -f|--force)
+ shift
+ force_ids="${force_ids} $1"
+ ;;
-h|--help)
usage 0
;;
@@ -107,41 +114,48 @@ export TMPDIR="${tmp_dir}"
{
printf 'CREATE TEMPORARY TABLE `to_deletes` (`id` BIGINT, UNIQUE KEY (`id`));\n'
printf 'INSERT IGNORE INTO `to_deletes`'
- printf ' SELECT DISTINCT `binary_packages`.`id`'
- printf ' FROM `binary_packages`'
- mysql_join_binary_packages_binary_packages_in_repositories
- mysql_join_binary_packages_in_repositories_repositories
- printf ' LEFT' # should not be necessary, but is formally more correct
- mysql_join_binary_packages_install_target_providers
- printf ' WHERE `binary_packages_in_repositories`.`is_to_be_deleted`'
- printf ' AND `repositories`.`is_on_master_mirror`'
- printf ' AND NOT EXISTS ('
- # no packages depending on that one exist
- printf 'SELECT 1 FROM `dependencies`'
- mysql_join_dependencies_dependency_types
- printf ' AND `dependency_types`.`relevant_for_binary_packages`'
- mysql_join_dependencies_binary_packages '' 'd_bp'
- mysql_join_binary_packages_binary_packages_in_repositories 'd_bp' 'd_bpir'
- # deliberately break dependencies of deletion-list packages
- printf ' AND NOT `d_bpir`.`is_to_be_deleted`'
- mysql_join_binary_packages_in_repositories_repositories 'd_bpir' 'd_r'
- mysql_join_repositories_repository_stabilities 'd_r' 'd_rs'
- # this is deliberately less restrict than `d_r`.`is_on_master_mirror`
- printf ' AND `d_rs`.`name` NOT IN ("forbidden","virtual")'
- printf ' WHERE `install_target_providers`.`install_target`=`dependencies`.`depending_on`'
+ if [ -n "${force_ids}" ]; then
+ printf ' VALUES '
+ # shellcheck disable=SC2086
+ printf '(%s),' ${force_ids} | \
+ sed 's/,$/;\n/'
+ else
+ printf ' SELECT DISTINCT `binary_packages`.`id`'
+ printf ' FROM `binary_packages`'
+ mysql_join_binary_packages_binary_packages_in_repositories
+ mysql_join_binary_packages_in_repositories_repositories
+ printf ' LEFT' # should not be necessary, but is formally more correct
+ mysql_join_binary_packages_install_target_providers
+ printf ' WHERE `binary_packages_in_repositories`.`is_to_be_deleted`'
+ printf ' AND `repositories`.`is_on_master_mirror`'
printf ' AND NOT EXISTS ('
- printf 'SELECT 1 FROM `binary_packages` AS `s_bp`'
- mysql_join_binary_packages_binary_packages_in_repositories 's_bp' 's_bpir'
- printf ' AND NOT `s_bpir`.`is_to_be_deleted`'
- mysql_join_binary_packages_install_target_providers 's_bp' 's_itp'
- mysql_join_binary_packages_in_repositories_repositories 's_bpir' 's_r'
- printf ' AND `s_r`.`is_on_master_mirror`'
- printf ' JOIN `repository_stability_relations`'
- printf ' ON `repository_stability_relations`.`more_stable`=`s_r`.`stability`'
- printf ' WHERE `s_itp`.`install_target`=`install_target_providers`.`install_target`'
- printf ' AND `repository_stability_relations`.`less_stable`=`d_r`.`stability`'
- printf ')'
- printf ');\n'
+ # no packages depending on that one exist
+ printf 'SELECT 1 FROM `dependencies`'
+ mysql_join_dependencies_dependency_types
+ printf ' AND `dependency_types`.`relevant_for_binary_packages`'
+ mysql_join_dependencies_binary_packages '' 'd_bp'
+ mysql_join_binary_packages_binary_packages_in_repositories 'd_bp' 'd_bpir'
+ # deliberately break dependencies of deletion-list packages
+ printf ' AND NOT `d_bpir`.`is_to_be_deleted`'
+ mysql_join_binary_packages_in_repositories_repositories 'd_bpir' 'd_r'
+ mysql_join_repositories_repository_stabilities 'd_r' 'd_rs'
+ # this is deliberately less restrict than `d_r`.`is_on_master_mirror`
+ printf ' AND `d_rs`.`name` NOT IN ("forbidden","virtual")'
+ printf ' WHERE `install_target_providers`.`install_target`=`dependencies`.`depending_on`'
+ printf ' AND NOT EXISTS ('
+ printf 'SELECT 1 FROM `binary_packages` AS `s_bp`'
+ mysql_join_binary_packages_binary_packages_in_repositories 's_bp' 's_bpir'
+ printf ' AND NOT `s_bpir`.`is_to_be_deleted`'
+ mysql_join_binary_packages_install_target_providers 's_bp' 's_itp'
+ mysql_join_binary_packages_in_repositories_repositories 's_bpir' 's_r'
+ printf ' AND `s_r`.`is_on_master_mirror`'
+ printf ' JOIN `repository_stability_relations`'
+ printf ' ON `repository_stability_relations`.`more_stable`=`s_r`.`stability`'
+ printf ' WHERE `s_itp`.`install_target`=`install_target_providers`.`install_target`'
+ printf ' AND `repository_stability_relations`.`less_stable`=`d_r`.`stability`'
+ printf ')'
+ printf ');\n'
+ fi
printf 'SELECT DISTINCT "repo",`repositories`.`name`'
printf ' FROM `to_deletes`'