2 # ==============================================================================
3 # portsreinstall library script
4 # - Deinstallation processes -
5 # Copyright (C) 2013-2015 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" 2> /dev/null | \
51 grep -E -f "$diff_available_ptn" > $dst_rem.tmp || :
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 ]
74 cp /dev/null "$dst_selected"
75 cp /dev/null "$dst_unselected"
78 deinstall_select_leaf_ports_to_delete_dialog "$src" "$dst_selected" "$dst_unselected"
79 elif [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
81 case $opt_dialog_auto in
83 touch "$dst_selected" "$dst_unselected" "$src"
84 if [ `cat "$src" 2> /dev/null | wc -l` -gt 0 ]
86 cat "$dst_selected" "$dst_unselected" 2> /dev/null | sort -u > $tmp_srcprev
87 diff "$tmp_srcprev" "$src" > /dev/null 2>&1 || \
88 deinstall_select_leaf_ports_to_delete_dialog "$src" "$dst_selected" "$dst_unselected"
90 cp /dev/null "$dst_selected"
91 cp /dev/null "$dst_unselected"
95 deinstall_select_auto "$src" "$dst_selected" "$dst_unselected"
98 deinstall_select_auto "$src" "$dst_unselected" "$dst_selected"
104 # ============= Dialog for selection of removing obsolete ports =============
105 deinstall_select_obsolete_ports_to_delete_dialog ()
107 local src dst_selected dst_unselected grepptn itemlist title desc
111 grepptn=${TMPDIR}/deinstall_select_obsolete_ports_to_delete_dialog::grep
112 itemlist=${TMPDIR}/deinstall_select_obsolete_ports_to_delete_dialog::itemlist
113 title='Obsolete packages to be deleted'
114 desc='Unchecked ones are preserved.\nCancellation means to preserve all.'
117 pkgtag=`cat "${DBDIR}/initial/$origin/installed_version"`
119 grep -q '^'`str_escape_regexp "$origin"`'$' "$dst_unselected" 2> /dev/null && val=off
120 printf '%s\t"(%s)"\t%s\n' "$origin" "$pkgtag" "$val"
121 done < $src > $itemlist
122 misc_dialog_checklist "$title" "$desc" "$dst_selected" "$itemlist"
123 str_escape_regexp_filter < $dst_selected | sed 's/^/^/;s/$/$/' > $grepptn
124 grep -E -v -f "$grepptn" "$src" > $dst_unselected || :
127 # ============= Selection of removing obsolete ports =============
128 deinstall_select_obsolete_ports_to_delete ()
130 local mode src dst_selected dst_unselected tmp_srcprev
132 src=${DBDIR}/obsolete_ports.can_be_deleted
133 dst_selected=${DBDIR}/obsolete_ports_to_delete.selected
134 dst_unselected=${DBDIR}/obsolete_ports_to_delete.unselected
135 tmp_srcprev=${TMPDIR}/deinstall_select_obsolete_ports_to_delete:src.prev
136 if [ "x$mode" = xforce ]
138 if [ `cat "$src" 2> /dev/null | wc -l` -eq 0 ]
140 cp /dev/null "$dst_selected"
141 cp /dev/null "$dst_unselected"
144 deinstall_select_obsolete_ports_to_delete_dialog "$src" "$dst_selected" "$dst_unselected"
146 case $opt_dialog_auto in
148 touch "$dst_selected" "$dst_unselected" "$src"
149 if [ `cat "$src" 2> /dev/null | wc -l` -gt 0 ]
151 cat "$dst_selected" "$dst_unselected" 2> /dev/null | sort -u > $tmp_srcprev
152 diff "$tmp_srcprev" "$src" > /dev/null 2>&1 || \
153 deinstall_select_obsolete_ports_to_delete_dialog "$src" "$dst_selected" "$dst_unselected"
155 cp /dev/null "$dst_selected"
156 cp /dev/null "$dst_unselected"
160 deinstall_select_auto "$src" "$dst_selected" "$dst_unselected"
163 deinstall_select_auto "$src" "$dst_unselected" "$dst_selected"
169 # ============= Restoration of a package for an origin =============
172 local origin tmp_forbidden currentpkg backup_pkg pkg
174 tmp_forbidden=${TMPDIR}/deinstall_restore:forbidden
175 pkg_info_eO "$origin" && return
176 backup_pkg=`pkgsys_get_backup_pkg "$origin"` || return 0
177 currentpkg=`pkgsys_pkgarc_to_pkgname "$backup_pkg"`
178 message_stage_title "$PROGRAM_STEP_COUNTER $origin ($currentpkg)"
179 message_target_relations "$origin"
180 temp_set_msg_current_stage "a ${_MSG_CURRENT_STAGE_general} process for $origin ($currentpkg) $PROGRAM_STEP_COUNTER"
181 database_query_get_target_attributes currentorigin "$origin"
182 if [ -z "${currentorigin_is_relevant}" ]
184 message_echo "-- (Skipping an irrelevant package for obsolete port $origin as $currentpkg)"
186 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
189 if database_query_is_a_port_suppressed "$origin"
191 message_echo "-- (Skipped because being suppressed)"
193 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
196 pkg=`pkgsys_pkgarc_to_pkgname "$backup_pkg"`
197 if reinstall_chk_forbidden_conflicts "$pkg"
199 message_echo "-- (Skipped because conflicting with installed packages)"
202 if [ $opt_dry_run = yes ]
206 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
208 elif ! pkg_add_fF "$backup_pkg"
210 message_echo "*** Going on to the next process anyway..."
212 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
216 # ============= Deinstallation of a package for an origin =============
219 local origin origin_regexp currentpkg backup_pkgdir backup_pkg pkg
221 origin_regexp=`str_escape_regexp "$origin"`
222 grep -v -E "^${origin_regexp}[[:space:]]" "${DBDIR}/deleted_conflicts" > ${DBDIR}/deleted_conflicts.tmp || :
223 mv "${DBDIR}/deleted_conflicts.tmp" "${DBDIR}/deleted_conflicts"
224 currentpkg=`pkg_info_qO "$origin" 2> /dev/null | tr '\n' ' ' | sed 's/ *$//'`
225 [ -n "$currentpkg" ] || return 0
226 temp_set_msg_current_stage "a ${_MSG_CURRENT_STAGE_general} process for $origin ($currentpkg) $PROGRAM_STEP_COUNTER"
227 database_query_get_target_attributes currentorigin "$origin"
228 if [ -z "${currentorigin_is_relevant}" ]
230 message_echo "-- (Skipping an irrelevant package for obsolete port $origin as $currentpkg)"
232 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
235 if database_query_is_a_port_suppressed "$origin"
237 message_echo "-- (Skipped because being suppressed)"
239 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
242 message_stage_title "$PROGRAM_STEP_COUNTER $origin ($currentpkg)"
243 message_target_relations "$origin"
244 if [ $opt_dry_run = yes ]
248 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
251 message_echo "-- (Creating backup package for $origin as $currentpkg)"
252 if ! pkgsys_get_backup_pkg "$origin" > /dev/null
254 if [ -d "${DBDIR}/requires/$origin" ]
256 backup_pkgdir=${DBDIR}/backup_packages
258 backup_pkgdir=${PKGREPOSITORY}
260 [ -d "$backup_pkgdir" ] || mkdir -p "$backup_pkgdir"
261 pkg=`echo "$currentpkg" | tr ' ' '\n' | grep -v '^$' | tail -n 1`
262 backup_pkg=`pkgsys_create_backup_pkg "$pkg" "$backup_pkgdir"` || :
263 if [ -n "$backup_pkg" ]
265 message_echo "INFO: The backup is saved at $backup_pkg."
268 message_echo "*** Continuating forcibly by keeping the installed package"
270 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
274 message_echo "-- (Deleting package for $origin as $currentpkg)"
275 echo "$currentpkg" | tr ' ' '\n' | grep -v '^$' | while read pkg
277 if ! pkg_delete_f "$currentpkg"
279 message_echo "*** Continuating forcibly by hoping success..."
282 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"