2 # ==============================================================================
3 # portsreinstall library script
4 # - Deinstallation processes -
5 # Copyright (C) 2013-2014 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 ]
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 tmp_forbidden currentpkg backup_pkg pkg
164 tmp_forbidden=${TMPDIR}/deinstall_restore:forbidden
165 pkg_info_eO "$origin" && return
166 backup_pkg=`pkgsys_get_backup_pkg "$origin"` || return 0
167 currentpkg=`pkgsys_pkgarc_to_pkgname "$backup_pkg"`
168 message_stage_title "$PROGRAM_STEP_COUNTER $origin ($currentpkg)"
169 message_target_relations "$origin"
170 temp_set_msg_current_stage "a ${_MSG_CURRENT_STAGE_general} process for $origin ($currentpkg) $PROGRAM_STEP_COUNTER"
171 database_query_get_target_attributes currentorigin "$origin"
172 if [ -z "${currentorigin_is_relevant}" ]
174 message_echo "-- (Skipping an irrelevant package for obsolete port $origin as $currentpkg)"
176 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
179 if database_query_is_a_port_suppressed "$origin"
181 message_echo "-- (Skipped because being suppressed)"
183 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
186 pkg=`pkgsys_pkgarc_to_pkgname "$backup_pkg"`
187 if reinstall_chk_forbidden_conflicts "$pkg"
189 message_echo "-- (Skipped because conflicting with installed packages)"
192 if [ $opt_dry_run = yes ]
196 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
198 elif ! pkg_add_fF "$backup_pkg"
200 message_echo "*** Going on to the next process anyway..."
202 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
206 # ============= Deinstallation of a package for an origin =============
209 local origin origin_regexp currentpkg backup_pkgdir backup_pkg pkg
211 origin_regexp=`str_escape_regexp "$origin"`
212 grep -v -E "^${origin_regexp}[[:space:]]" "${DBDIR}/deleted_conflicts" > ${DBDIR}/deleted_conflicts.tmp || :
213 mv "${DBDIR}/deleted_conflicts.tmp" "${DBDIR}/deleted_conflicts"
214 currentpkg=`pkg_info_qO "$origin" 2> /dev/null | tr '\n' ' ' | sed 's/ *$//'`
215 [ -n "$currentpkg" ] || return 0
216 temp_set_msg_current_stage "a ${_MSG_CURRENT_STAGE_general} process for $origin ($currentpkg) $PROGRAM_STEP_COUNTER"
217 database_query_get_target_attributes currentorigin "$origin"
218 if [ -z "${currentorigin_is_relevant}" ]
220 message_echo "-- (Skipping an irrelevant package for obsolete port $origin as $currentpkg)"
222 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
225 if database_query_is_a_port_suppressed "$origin"
227 message_echo "-- (Skipped because being suppressed)"
229 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
232 message_stage_title "$PROGRAM_STEP_COUNTER $origin ($currentpkg)"
233 message_target_relations "$origin"
234 if [ $opt_dry_run = yes ]
238 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
241 message_echo "-- (Creating backup package for $origin as $currentpkg)"
242 if ! pkgsys_get_backup_pkg "$origin" > /dev/null
244 if [ -d "${DBDIR}/requires/$origin" ]
246 backup_pkgdir=${DBDIR}/backup_packages
248 backup_pkgdir=${PKGREPOSITORY}
250 [ -d "$backup_pkgdir" ] || mkdir -p "$backup_pkgdir"
251 pkg=`echo "$currentpkg" | tr ' ' '\n' | grep -v '^$' | tail -n 1`
252 backup_pkg=`pkgsys_create_backup_pkg "$pkg" "$backup_pkgdir"` || :
253 if [ -n "$backup_pkg" ]
255 message_echo "INFO: The backup is saved at $backup_pkg."
258 message_echo "*** Continuating forcibly by keeping the installed package"
260 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
264 message_echo "-- (Deleting package for $origin as $currentpkg)"
265 echo "$currentpkg" | tr ' ' '\n' | grep -v '^$' | while read pkg
267 if ! pkg_delete_f "$currentpkg"
269 message_echo "*** Continuating forcibly by hoping success..."
272 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"