OSDN Git Service

Version 3.0.0+toward_3.0.1_20130605073650
[portsreinstall/current.git] / lib / libdeinstall.sh
1 #!/bin/sh -e
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 # ==============================================================================
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" | \
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"
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                         return 2
75                 fi
76                 deinstall_select_leaf_ports_to_delete_dialog "$src" "$dst_selected" "$dst_unselected"
77         elif [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
78         then
79                 case $opt_dialog_auto in
80                 no)
81                         touch "$dst_selected" "$dst_unselected" "$src"
82                         if [ `cat "$src" 2> /dev/null | wc -l` -gt 0 ]
83                         then
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"
87                         fi
88                         ;;
89                 all)
90                         deinstall_select_auto "$src" "$dst_selected" "$dst_unselected"
91                         ;;
92                 none)
93                         deinstall_select_auto "$src" "$dst_unselected" "$dst_selected"
94                         ;;
95                 esac
96         fi
97 }
98
99 # ============= Dialog for selection of removing obsolete ports =============
100 deinstall_select_obsolete_ports_to_delete_dialog ()
101 {
102         local src dst_selected dst_unselected grepptn itemlist title desc
103         src=$1
104         dst_selected=$2
105         dst_unselected=$3
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.'
110         while read origin
111         do
112                 pkgtag=`cat "${DBDIR}/initial/$origin/installed_version"`
113                 val=on
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 || :
120 }
121
122 # ============= Selection of removing obsolete ports =============
123 deinstall_select_obsolete_ports_to_delete ()
124 {
125         local mode src dst_selected dst_unselected tmp_srcprev
126         mode=$1
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 ]
132         then
133                 if [ `cat "$src" 2> /dev/null | wc -l` -eq 0 ]
134                 then
135                         return 2
136                 fi
137                 deinstall_select_obsolete_ports_to_delete_dialog "$src" "$dst_selected" "$dst_unselected"
138         else
139                 case $opt_dialog_auto in
140                 no)
141                         touch "$dst_selected" "$dst_unselected" "$src"
142                         if [ `cat "$src" 2> /dev/null | wc -l` -gt 0 ]
143                         then
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"
147                         fi
148                         ;;
149                 all)
150                         deinstall_select_auto "$src" "$dst_selected" "$dst_unselected"
151                         ;;
152                 none)
153                         deinstall_select_auto "$src" "$dst_unselected" "$dst_selected"
154                         ;;
155                 esac
156         fi
157 }
158
159 # ============= Restoration of a package for an origin =============
160 deinstall_restore ()
161 {
162         local origin currentpkg backup_pkg
163         origin=$1
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}" ]
170         then
171                 message_echo "-- (Skipping an irrelevant package for obsolete port $origin as $currentpkg)"
172                 message_echo
173                 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
174                 return
175         fi
176         if database_query_is_a_port_suppressed "$origin"
177         then
178                 message_echo "-- (Skipped because being suppressed)"
179                 message_echo
180                 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
181                 return
182         fi
183         message_stage_title "$PROGRAM_STEP_COUNTER $origin ($currentpkg)"
184         message_target_relations "$origin"
185         if [ $opt_dry_run = yes ]
186         then
187                 message_dry_run
188                 message_echo
189                 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
190                 return
191         elif ! pkg_add_fF "$backup_pkg"
192         then
193                 message_echo "*** Going on to the next process anyway..."
194         fi
195         temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
196         message_echo
197 }
198
199 # ============= Deinstallation of a package for an origin =============
200 deinstall_exec ()
201 {
202         local origin origin_regexp currentpkg backup_pkgdir backup_pkg
203         origin=$1
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}" ]
212         then
213                 message_echo "-- (Skipping an irrelevant package for obsolete port $origin as $currentpkg)"
214                 message_echo
215                 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
216                 return
217         fi
218         if database_query_is_a_port_suppressed "$origin"
219         then
220                 message_echo "-- (Skipped because being suppressed)"
221                 message_echo
222                 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
223                 return
224         fi
225         message_stage_title "$PROGRAM_STEP_COUNTER $origin ($currentpkg)"
226         message_target_relations "$origin"
227         if [ $opt_dry_run = yes ]
228         then
229                 message_dry_run
230                 message_echo
231                 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
232                 return
233         fi
234         message_echo "-- (Creating backup package for $origin as $currentpkg)"
235         if ! pkgsys_get_backup_pkg "$origin" > /dev/null
236         then
237                 if [ -d "${DBDIR}/requires/$origin" ]
238                 then
239                         backup_pkgdir=${DBDIR}/backup_packages
240                 else
241                         backup_pkgdir=${PKGREPOSITORY}
242                 fi
243                 [ -d "$backup_pkgdir" ] || mkdir -p "$backup_pkgdir"
244                 backup_pkg=`pkgsys_create_backup_pkg "$currentpkg" "$backup_pkgdir"` || :
245                 if [ -n "$backup_pkg" ]
246                 then
247                         message_echo "INFO: The backup is saved at $backup_pkg."
248                         message_echo
249                 else
250                         message_echo "*** Continuating forcibly by keeping the installed package"
251                         message_echo
252                         temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
253                         return
254                 fi
255         fi
256         message_echo "-- (Deleting package for $origin as $currentpkg)"
257         if ! pkg_delete_f "$currentpkg"
258         then
259                 message_echo "*** Continuating forcibly by hoping success..."
260                 message_echo
261                 temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
262                 return
263         fi
264         temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
265         message_echo
266 }