OSDN Git Service

Version 3.2.0+toward_3.2.1_20150120205620
[portsreinstall/current.git] / lib / libdeinstall.sh
1 #!/bin/sh -e
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 # ==============================================================================
8
9 # ============= Dialog for selection of removing new leaf ports =============
10 deinstall_select_leaf_ports_to_delete_dialog ()
11 {
12         local src dst_selected dst_unselected grepptn itemlist title desc
13         src=$1
14         dst_selected=$2
15         dst_unselected=$3
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.'
20         while read origin
21         do
22                 pkgtag=`cat "${DBDIR}/requires/$origin/pkgtag"`
23                 val=on
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 || :
30 }
31
32 # ============= Automatic selection of removing ports =============
33 deinstall_select_auto ()
34 {
35         local src dst_add dst_rem tmp_srcprev tmp_srcnew diff_removed diff_removed_ptn diff_added
36         src=$1
37         dst_add=$2
38         dst_rem=$3
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"
56 }
57
58 # ============= Selection of removing new leaf ports =============
59 deinstall_select_leaf_ports_to_delete ()
60 {
61         local mode src dst_selected dst_unselected tmp_srcprev
62         mode=$1
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 ]
68         then
69                 if [ -e "${DBDIR}/inspected_ports_only_partially" ]
70                 then
71                         return 3
72                 elif [ `cat "$src" 2> /dev/null | wc -l` -eq 0 ]
73                 then
74                         cp /dev/null "$dst_selected"
75                         cp /dev/null "$dst_unselected"
76                         return 2
77                 fi
78                 deinstall_select_leaf_ports_to_delete_dialog "$src" "$dst_selected" "$dst_unselected"
79         elif [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
80         then
81                 case $opt_dialog_auto in
82                 no)
83                         touch "$dst_selected" "$dst_unselected" "$src"
84                         if [ `cat "$src" 2> /dev/null | wc -l` -gt 0 ]
85                         then
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"
89                         else
90                                 cp /dev/null "$dst_selected"
91                                 cp /dev/null "$dst_unselected"
92                         fi
93                         ;;
94                 all)
95                         deinstall_select_auto "$src" "$dst_selected" "$dst_unselected"
96                         ;;
97                 none)
98                         deinstall_select_auto "$src" "$dst_unselected" "$dst_selected"
99                         ;;
100                 esac
101         fi
102 }
103
104 # ============= Dialog for selection of removing obsolete ports =============
105 deinstall_select_obsolete_ports_to_delete_dialog ()
106 {
107         local src dst_selected dst_unselected grepptn itemlist title desc
108         src=$1
109         dst_selected=$2
110         dst_unselected=$3
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.'
115         while read origin
116         do
117                 pkgtag=`cat "${DBDIR}/initial/$origin/installed_version"`
118                 val=on
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 || :
125 }
126
127 # ============= Selection of removing obsolete ports =============
128 deinstall_select_obsolete_ports_to_delete ()
129 {
130         local mode src dst_selected dst_unselected tmp_srcprev
131         mode=$1
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 ]
137         then
138                 if [ `cat "$src" 2> /dev/null | wc -l` -eq 0 ]
139                 then
140                         cp /dev/null "$dst_selected"
141                         cp /dev/null "$dst_unselected"
142                         return 2
143                 fi
144                 deinstall_select_obsolete_ports_to_delete_dialog "$src" "$dst_selected" "$dst_unselected"
145         else
146                 case $opt_dialog_auto in
147                 no)
148                         touch "$dst_selected" "$dst_unselected" "$src"
149                         if [ `cat "$src" 2> /dev/null | wc -l` -gt 0 ]
150                         then
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"
154                         else
155                                 cp /dev/null "$dst_selected"
156                                 cp /dev/null "$dst_unselected"
157                         fi
158                         ;;
159                 all)
160                         deinstall_select_auto "$src" "$dst_selected" "$dst_unselected"
161                         ;;
162                 none)
163                         deinstall_select_auto "$src" "$dst_unselected" "$dst_selected"
164                         ;;
165                 esac
166         fi
167 }
168
169 # ============= Restoration of a package for an origin =============
170 deinstall_restore ()
171 {
172         local origin tmp_forbidden currentpkg backup_pkg pkg
173         origin=$1
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}" ]
183         then
184                 message_echo "-- (Skipping an irrelevant package for obsolete port $origin as $currentpkg)"
185                 message_echo
186                 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
187                 return
188         fi
189         if database_query_is_a_port_suppressed "$origin"
190         then
191                 message_echo "-- (Skipped because being suppressed)"
192                 message_echo
193                 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
194                 return
195         fi
196         pkg=`pkgsys_pkgarc_to_pkgname "$backup_pkg"`
197         if reinstall_chk_forbidden_conflicts "$pkg"
198         then
199                 message_echo "-- (Skipped because conflicting with installed packages)"
200                 return
201         fi
202         if [ $opt_dry_run = yes ]
203         then
204                 message_dry_run
205                 message_echo
206                 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
207                 return
208         elif ! pkg_add_fF "$backup_pkg"
209         then
210                 message_echo "*** Going on to the next process anyway..."
211         fi
212         temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
213         message_echo
214 }
215
216 # ============= Deinstallation of a package for an origin =============
217 deinstall_exec ()
218 {
219         local origin origin_regexp currentpkg backup_pkgdir backup_pkg pkg
220         origin=$1
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}" ]
229         then
230                 message_echo "-- (Skipping an irrelevant package for obsolete port $origin as $currentpkg)"
231                 message_echo
232                 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
233                 return
234         fi
235         if database_query_is_a_port_suppressed "$origin"
236         then
237                 message_echo "-- (Skipped because being suppressed)"
238                 message_echo
239                 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
240                 return
241         fi
242         message_stage_title "$PROGRAM_STEP_COUNTER $origin ($currentpkg)"
243         message_target_relations "$origin"
244         if [ $opt_dry_run = yes ]
245         then
246                 message_dry_run
247                 message_echo
248                 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
249                 return
250         fi
251         message_echo "-- (Creating backup package for $origin as $currentpkg)"
252         if ! pkgsys_get_backup_pkg "$origin" > /dev/null
253         then
254                 if [ -d "${DBDIR}/requires/$origin" ]
255                 then
256                         backup_pkgdir=${DBDIR}/backup_packages
257                 else
258                         backup_pkgdir=${PKGREPOSITORY}
259                 fi
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" ]
264                 then
265                         message_echo "INFO: The backup is saved at $backup_pkg."
266                         message_echo
267                 else
268                         message_echo "*** Continuating forcibly by keeping the installed package"
269                         message_echo
270                         temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
271                         return
272                 fi
273         fi
274         message_echo "-- (Deleting package for $origin as $currentpkg)"
275         echo "$currentpkg" | tr ' ' '\n' | grep -v '^$' | while read pkg
276         do
277                 if ! pkg_delete_f "$currentpkg"
278                 then
279                         message_echo "*** Continuating forcibly by hoping success..."
280                 fi
281         done
282         temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
283         message_echo
284 }