2 # ==============================================================================
3 # portsreinstall library script
4 # - Deinstallation processes -
5 # Copyright (C) 2013 Mamoru Sakaue, MwGhennndo, All Rights Reserved.
6 # This software is distributed under the 2-Clause BSD License.
7 # ==============================================================================
9 # ============= Dialog for selection of removing new leaf ports =============
10 deinstall_select_leaf_ports_to_delete_dialog ()
12 local src dst_selected dst_unselected grepptn itemlist title desc
16 grepptn=${TMPDIR}/deinstall_select_leaf_ports_to_delete_dialog::grep
17 itemlist=${TMPDIR}/deinstall_select_leaf_ports_to_delete_dialog::itemlist
18 title='New leaf ports and their exclusive requirements to be deleted'
19 desc='Unchecked ones are preserved with their requirements.\nCancellation means to preserve all.'
22 pkgtag=`cat "${DBDIR}/requires/$origin/pkgtag"`
24 grep -q '^'`str_escape_regexp "$origin"`'$' "$dst_unselected" 2> /dev/null && val=off
25 printf '%s\t"(%s)"\t%s\n' "$origin" "$pkgtag" "$val"
26 done < $src > $itemlist
27 misc_dialog_checklist "$title" "$desc" "$dst_selected" "$itemlist"
28 str_escape_regexp_filter < $dst_selected | sed 's/^/^/;s/$/$/' > $grepptn
29 grep -E -v -f "$grepptn" "$src" > $dst_unselected || :
32 # ============= Automatic selection of removing ports =============
33 deinstall_select_auto ()
35 local src dst_add dst_rem tmp_srcprev tmp_srcnew diff_removed diff_removed_ptn diff_added
39 tmp_srcprev=${TMPDIR}/deinstall_select_auto:src.prev
40 tmp_srcnew=${TMPDIR}/deinstall_select_auto:src.new
41 diff_removed=${TMPDIR}/deinstall_select_auto:diff_removed
42 diff_removed_ptn=${TMPDIR}/deinstall_select_auto:diff_removed_ptn
43 diff_available_ptn=${TMPDIR}/deinstall_select_auto:diff_available_ptn
44 diff_added=${TMPDIR}/deinstall_select_auto:diff_added
45 cat "$dst_add" "$dst_rem" 2> /dev/null | sort -u > $tmp_srcprev
46 cat "$src" 2> /dev/null | sort -u > $tmp_srcnew
47 fileedit_manipulate_old_new_lines "$tmp_srcprev" "$tmp_srcnew" "$diff_removed" "$diff_added" || return 0
48 str_escape_regexp_filter < $diff_removed | sed 's/^/^/;s/$/$/' > $diff_removed_ptn
49 str_escape_regexp_filter < $src | sed 's/^/^/;s/$/$/' > $diff_available_ptn
50 grep -v -E -f "$diff_removed_ptn" "$dst_rem" | \
51 grep -E -f "$diff_available_ptn" > $dst_rem.tmp 2> /dev/null || :
52 mv "$dst_rem.tmp" "$dst_rem"
53 cat "$dst_add" "$diff_added" 2> /dev/null | sort -u | \
54 grep -E -f "$diff_available_ptn" > $dst_add.tmp
55 mv "$dst_add.tmp" "$dst_add"
58 # ============= Selection of removing new leaf ports =============
59 deinstall_select_leaf_ports_to_delete ()
61 local mode src dst_selected dst_unselected tmp_srcprev
63 src=${DBDIR}/leaf_ports
64 dst_selected=${DBDIR}/leaf_ports_to_delete.selected
65 dst_unselected=${DBDIR}/leaf_ports_to_delete.unselected
66 tmp_srcprev=${TMPDIR}/deinstall_select_leaf_ports_to_delete:src.prev
67 if [ "x$mode" = xforce ]
69 if [ -e "${DBDIR}/inspected_ports_only_partially" ]
72 elif [ `cat "$src" 2> /dev/null | wc -l` -eq 0 ]
76 deinstall_select_leaf_ports_to_delete_dialog "$src" "$dst_selected" "$dst_unselected"
77 elif [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
79 case $opt_dialog_auto in
81 touch "$dst_selected" "$dst_unselected" "$src"
82 if [ `cat "$src" 2> /dev/null | wc -l` -gt 0 ]
84 cat "$dst_selected" "$dst_unselected" 2> /dev/null | sort -u > $tmp_srcprev
85 diff "$tmp_srcprev" "$src" > /dev/null 2>&1 || \
86 deinstall_select_leaf_ports_to_delete_dialog "$src" "$dst_selected" "$dst_unselected"
90 deinstall_select_auto "$src" "$dst_selected" "$dst_unselected"
93 deinstall_select_auto "$src" "$dst_unselected" "$dst_selected"
99 # ============= Dialog for selection of removing obsolete ports =============
100 deinstall_select_obsolete_ports_to_delete_dialog ()
102 local src dst_selected dst_unselected grepptn itemlist title desc
106 grepptn=${TMPDIR}/deinstall_select_obsolete_ports_to_delete_dialog::grep
107 itemlist=${TMPDIR}/deinstall_select_obsolete_ports_to_delete_dialog::itemlist
108 title='Obsolete packages to be deleted'
109 desc='Unchecked ones are preserved.\nCancellation means to preserve all.'
112 pkgtag=`cat "${DBDIR}/initial/$origin/installed_version"`
114 grep -q '^'`str_escape_regexp "$origin"`'$' "$dst_unselected" 2> /dev/null && val=off
115 printf '%s\t"(%s)"\t%s\n' "$origin" "$pkgtag" "$val"
116 done < $src > $itemlist
117 misc_dialog_checklist "$title" "$desc" "$dst_selected" "$itemlist"
118 str_escape_regexp_filter < $dst_selected | sed 's/^/^/;s/$/$/' > $grepptn
119 grep -E -v -f "$grepptn" "$src" > $dst_unselected || :
122 # ============= Selection of removing obsolete ports =============
123 deinstall_select_obsolete_ports_to_delete ()
125 local mode src dst_selected dst_unselected tmp_srcprev
127 src=${DBDIR}/obsolete_ports.can_be_deleted
128 dst_selected=${DBDIR}/obsolete_ports_to_delete.selected
129 dst_unselected=${DBDIR}/obsolete_ports_to_delete.unselected
130 tmp_srcprev=${TMPDIR}/deinstall_select_obsolete_ports_to_delete:src.prev
131 if [ "x$mode" = xforce ]
133 if [ `cat "$src" 2> /dev/null | wc -l` -eq 0 ]
137 deinstall_select_obsolete_ports_to_delete_dialog "$src" "$dst_selected" "$dst_unselected"
139 case $opt_dialog_auto in
141 touch "$dst_selected" "$dst_unselected" "$src"
142 if [ `cat "$src" 2> /dev/null | wc -l` -gt 0 ]
144 cat "$dst_selected" "$dst_unselected" 2> /dev/null | sort -u > $tmp_srcprev
145 diff "$tmp_srcprev" "$src" > /dev/null 2>&1 || \
146 deinstall_select_obsolete_ports_to_delete_dialog "$src" "$dst_selected" "$dst_unselected"
150 deinstall_select_auto "$src" "$dst_selected" "$dst_unselected"
153 deinstall_select_auto "$src" "$dst_unselected" "$dst_selected"
159 # ============= Restoration of a package for an origin =============
162 local origin currentpkg backup_pkg
164 pkg_info_eO "$origin" && return
165 backup_pkg=`pkgsys_get_backup_pkg "$origin"` || return 0
166 currentpkg=`pkgsys_pkgarc_to_pkgname "$backup_pkg"`
167 temp_set_msg_current_stage "a ${_MSG_CURRENT_STAGE_general} process for $origin ($currentpkg) $PROGRAM_STEP_COUNTER"
168 database_query_get_target_attributes currentorigin "$origin"
169 if [ -z "${currentorigin_is_relevant}" ]
171 message_echo "-- (Skipping an irrelevant package for obsolete port $origin as $currentpkg)"
173 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
176 if database_query_is_a_port_suppressed "$origin"
178 message_echo "-- (Skipped because being suppressed)"
180 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
183 message_stage_title "$PROGRAM_STEP_COUNTER $origin ($currentpkg)"
184 message_target_relations "$origin"
185 if [ $opt_dry_run = yes ]
189 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
191 elif ! pkg_add_fF "$backup_pkg"
193 message_echo "*** Going on to the next process anyway..."
195 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
199 # ============= Deinstallation of a package for an origin =============
202 local origin origin_regexp currentpkg backup_pkgdir backup_pkg
204 origin_regexp=`str_escape_regexp "$origin"`
205 grep -v -E "^${origin_regexp}[[:space:]]" "${DBDIR}/deleted_conflicts" > ${DBDIR}/deleted_conflicts.tmp || :
206 mv "${DBDIR}/deleted_conflicts.tmp" "${DBDIR}/deleted_conflicts"
207 currentpkg=`pkg_info_qO "$origin" 2> /dev/null`
208 [ -n "$currentpkg" ] || return 0
209 temp_set_msg_current_stage "a ${_MSG_CURRENT_STAGE_general} process for $origin ($currentpkg) $PROGRAM_STEP_COUNTER"
210 database_query_get_target_attributes currentorigin "$origin"
211 if [ -z "${currentorigin_is_relevant}" ]
213 message_echo "-- (Skipping an irrelevant package for obsolete port $origin as $currentpkg)"
215 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
218 if database_query_is_a_port_suppressed "$origin"
220 message_echo "-- (Skipped because being suppressed)"
222 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
225 message_stage_title "$PROGRAM_STEP_COUNTER $origin ($currentpkg)"
226 message_target_relations "$origin"
227 if [ $opt_dry_run = yes ]
231 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
234 message_echo "-- (Creating backup package for $origin as $currentpkg)"
235 if ! pkgsys_get_backup_pkg "$origin" > /dev/null
237 if [ -d "${DBDIR}/requires/$origin" ]
239 backup_pkgdir=${DBDIR}/backup_packages
241 backup_pkgdir=${PKGREPOSITORY}
243 [ -d "$backup_pkgdir" ] || mkdir -p "$backup_pkgdir"
244 backup_pkg=`pkgsys_create_backup_pkg "$currentpkg" "$backup_pkgdir"` || :
245 if [ -n "$backup_pkg" ]
247 message_echo "INFO: The backup is saved at $backup_pkg."
250 message_echo "*** Continuating forcibly by keeping the installed package"
252 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
256 message_echo "-- (Deleting package for $origin as $currentpkg)"
257 if ! pkg_delete_f "$currentpkg"
259 message_echo "*** Continuating forcibly by hoping success..."
261 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
264 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"