OSDN Git Service

[NEW] Commands of show inst_built_default and show inst_built_custom are added.
[portsreinstall/current.git] / lib / libdeinstall.sh
index ff52d01..92ea92f 100644 (file)
@@ -2,56 +2,50 @@
 # ==============================================================================
 # portsreinstall library script
 # - Deinstallation processes -
-# Copyright (C) 2013 Mamoru Sakaue, MwGhennndo, All Rights Reserved.
+# Copyright (C) 2013-2018 Mamoru Sakaue, MwGhennndo, All Rights Reserved.
 # This software is distributed under the 2-Clause BSD License.
 # ==============================================================================
 
 # ============= Dialog for selection of removing new leaf ports =============
 deinstall_select_leaf_ports_to_delete_dialog ()
 {
-       local src dst_selected dst_unselected grepptn itemlist title desc
+       local src dst_selected dst_unselected itemlist title desc
        src=$1
        dst_selected=$2
        dst_unselected=$3
-       grepptn=${TMPDIR}/deinstall_select_leaf_ports_to_delete_dialog::grep
        itemlist=${TMPDIR}/deinstall_select_leaf_ports_to_delete_dialog::itemlist
        title='New leaf ports and their exclusive requirements to be deleted'
        desc='Unchecked ones are preserved with their requirements.\nCancellation means to preserve all.'
        while read origin
        do
-               pkgtag=`cat "${DBDIR}/requires/$origin/pkgtag"`
+               pkgtag=`cat "${DBDIR}/moved_from/$origin/pkgtag" 2> /dev/null` || :
                val=on
-               grep -q '^'`str_escape_regexp "$origin"`'$' "$dst_unselected" 2> /dev/null && val=off
+               grep -Fxq "$origin" "$dst_unselected" 2> /dev/null && val=off
                printf '%s\t"(%s)"\t%s\n' "$origin" "$pkgtag" "$val"
        done < $src > $itemlist
        misc_dialog_checklist "$title" "$desc" "$dst_selected" "$itemlist"
-       str_escape_regexp_filter < $dst_selected | sed 's/^/^/;s/$/$/' > $grepptn
-       grep -E -v -f "$grepptn" "$src" > $dst_unselected || :
+       grep -Fx -v -f "$dst_selected" "$src" > $dst_unselected || :
 }
 
 # ============= Automatic selection of removing ports =============
 deinstall_select_auto ()
 {
-       local src dst_add dst_rem tmp_srcprev tmp_srcnew diff_removed diff_removed_ptn diff_added
+       local src dst_add dst_rem tmp_srcprev tmp_srcnew diff_removed diff_added
        src=$1
        dst_add=$2
        dst_rem=$3
        tmp_srcprev=${TMPDIR}/deinstall_select_auto:src.prev
        tmp_srcnew=${TMPDIR}/deinstall_select_auto:src.new
        diff_removed=${TMPDIR}/deinstall_select_auto:diff_removed
-       diff_removed_ptn=${TMPDIR}/deinstall_select_auto:diff_removed_ptn
-       diff_available_ptn=${TMPDIR}/deinstall_select_auto:diff_available_ptn
        diff_added=${TMPDIR}/deinstall_select_auto:diff_added
        cat "$dst_add" "$dst_rem" 2> /dev/null | sort -u > $tmp_srcprev
        cat "$src" 2> /dev/null | sort -u > $tmp_srcnew
        fileedit_manipulate_old_new_lines "$tmp_srcprev" "$tmp_srcnew" "$diff_removed" "$diff_added" || return 0
-       str_escape_regexp_filter < $diff_removed | sed 's/^/^/;s/$/$/' > $diff_removed_ptn
-       str_escape_regexp_filter < $src | sed 's/^/^/;s/$/$/' > $diff_available_ptn
-       grep -v -E -f "$diff_removed_ptn" "$dst_rem" 2> /dev/null | \
-               grep -E -f "$diff_available_ptn" > $dst_rem.tmp || :
+       grep -v -Fx -f "$diff_removed" "$dst_rem" 2> /dev/null | \
+               grep -Fx -f "$src" > $dst_rem.tmp || :
        mv "$dst_rem.tmp" "$dst_rem"
        cat "$dst_add" "$diff_added" 2> /dev/null | sort -u | \
-               grep -E -f "$diff_available_ptn" > $dst_add.tmp
+               grep -Fx -f "$src" > $dst_add.tmp || :
        mv "$dst_add.tmp" "$dst_add"
 }
 
@@ -71,25 +65,30 @@ deinstall_select_leaf_ports_to_delete ()
                        return 3
                elif [ `cat "$src" 2> /dev/null | wc -l` -eq 0 ]
                then
+                       cp /dev/null "$dst_selected"
+                       cp /dev/null "$dst_unselected"
                        return 2
                fi
                deinstall_select_leaf_ports_to_delete_dialog "$src" "$dst_selected" "$dst_unselected"
        elif [ ! -e "${DBDIR}/inspected_ports_only_partially" ]
        then
                case $opt_dialog_auto in
-               no)
+               no )
                        touch "$dst_selected" "$dst_unselected" "$src"
                        if [ `cat "$src" 2> /dev/null | wc -l` -gt 0 ]
                        then
                                cat "$dst_selected" "$dst_unselected" 2> /dev/null | sort -u > $tmp_srcprev
-                               diff "$tmp_srcprev" "$src" > /dev/null 2>&1 || \
+                               diff -q "$tmp_srcprev" "$src" > /dev/null 2>&1 || \
                                        deinstall_select_leaf_ports_to_delete_dialog "$src" "$dst_selected" "$dst_unselected"
+                       else
+                               cp /dev/null "$dst_selected"
+                               cp /dev/null "$dst_unselected"
                        fi
                        ;;
-               all)
+               all )
                        deinstall_select_auto "$src" "$dst_selected" "$dst_unselected"
                        ;;
-               none)
+               none )
                        deinstall_select_auto "$src" "$dst_unselected" "$dst_selected"
                        ;;
                esac
@@ -99,11 +98,10 @@ deinstall_select_leaf_ports_to_delete ()
 # ============= Dialog for selection of removing obsolete ports =============
 deinstall_select_obsolete_ports_to_delete_dialog ()
 {
-       local src dst_selected dst_unselected grepptn itemlist title desc
+       local src dst_selected dst_unselected itemlist title desc
        src=$1
        dst_selected=$2
        dst_unselected=$3
-       grepptn=${TMPDIR}/deinstall_select_obsolete_ports_to_delete_dialog::grep
        itemlist=${TMPDIR}/deinstall_select_obsolete_ports_to_delete_dialog::itemlist
        title='Obsolete packages to be deleted'
        desc='Unchecked ones are preserved.\nCancellation means to preserve all.'
@@ -111,12 +109,11 @@ deinstall_select_obsolete_ports_to_delete_dialog ()
        do
                pkgtag=`cat "${DBDIR}/initial/$origin/installed_version"`
                val=on
-               grep -q '^'`str_escape_regexp "$origin"`'$' "$dst_unselected" 2> /dev/null && val=off
+               grep -Fxq "$origin" "$dst_unselected" 2> /dev/null && val=off
                printf '%s\t"(%s)"\t%s\n' "$origin" "$pkgtag" "$val"
        done < $src > $itemlist
        misc_dialog_checklist "$title" "$desc" "$dst_selected" "$itemlist"
-       str_escape_regexp_filter < $dst_selected | sed 's/^/^/;s/$/$/' > $grepptn
-       grep -E -v -f "$grepptn" "$src" > $dst_unselected || :
+       grep -Fx -v -f "$dst_selected" "$src" > $dst_unselected || :
 }
 
 # ============= Selection of removing obsolete ports =============
@@ -132,37 +129,42 @@ deinstall_select_obsolete_ports_to_delete ()
        then
                if [ `cat "$src" 2> /dev/null | wc -l` -eq 0 ]
                then
+                       cp /dev/null "$dst_selected"
+                       cp /dev/null "$dst_unselected"
                        return 2
                fi
                deinstall_select_obsolete_ports_to_delete_dialog "$src" "$dst_selected" "$dst_unselected"
        else
                case $opt_dialog_auto in
-               no)
+               no )
                        touch "$dst_selected" "$dst_unselected" "$src"
                        if [ `cat "$src" 2> /dev/null | wc -l` -gt 0 ]
                        then
                                cat "$dst_selected" "$dst_unselected" 2> /dev/null | sort -u > $tmp_srcprev
-                               diff "$tmp_srcprev" "$src" > /dev/null 2>&1 || \
+                               diff -q "$tmp_srcprev" "$src" > /dev/null 2>&1 || \
                                        deinstall_select_obsolete_ports_to_delete_dialog "$src" "$dst_selected" "$dst_unselected"
+                       else
+                               cp /dev/null "$dst_selected"
+                               cp /dev/null "$dst_unselected"
                        fi
                        ;;
-               all)
+               all )
                        deinstall_select_auto "$src" "$dst_selected" "$dst_unselected"
                        ;;
-               none)
+               none )
                        deinstall_select_auto "$src" "$dst_unselected" "$dst_selected"
                        ;;
                esac
        fi
 }
 
-# ============= Restoration of a package for an origin =============
+# ============= Restoration of a package for a flavored origin =============
 deinstall_restore ()
 {
        local origin tmp_forbidden currentpkg backup_pkg pkg
        origin=$1
        tmp_forbidden=${TMPDIR}/deinstall_restore:forbidden
-       pkg_info_eO "$origin" && return
+       pkgsys_exists_from_orig "$origin" && return
        backup_pkg=`pkgsys_get_backup_pkg "$origin"` || return 0
        currentpkg=`pkgsys_pkgarc_to_pkgname "$backup_pkg"`
        message_stage_title "$PROGRAM_STEP_COUNTER $origin ($currentpkg)"
@@ -203,72 +205,70 @@ deinstall_restore ()
        message_echo
 }
 
-# ============= Deinstallation of a package for an origin =============
+# ============= Deinstallation of a package for a flavored origin =============
 deinstall_exec ()
 {
-       local origin origin_regexp currentpkg backup_pkgdir backup_pkg pkg
-       origin=$1
-       origin_regexp=`str_escape_regexp "$origin"`
-       grep -v -E "^${origin_regexp}[[:space:]]" "${DBDIR}/deleted_conflicts" > ${DBDIR}/deleted_conflicts.tmp || :
-       mv "${DBDIR}/deleted_conflicts.tmp" "${DBDIR}/deleted_conflicts"
-       currentpkg=`pkg_info_qO "$origin" 2> /dev/null | tr '\n' ' ' | sed 's/ *$//'`
-       [ -n "$currentpkg" ] || return 0
-       temp_set_msg_current_stage "a ${_MSG_CURRENT_STAGE_general} process for $origin ($currentpkg) $PROGRAM_STEP_COUNTER"
-       database_query_get_target_attributes currentorigin "$origin"
-       if [ -z "${currentorigin_is_relevant}" ]
-       then
-               message_echo "-- (Skipping an irrelevant package for obsolete port $origin as $currentpkg)"
-               message_echo
-               temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
-               return
-       fi
-       if database_query_is_a_port_suppressed "$origin"
-       then
-               message_echo "-- (Skipped because being suppressed)"
-               message_echo
-               temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
-               return
-       fi
-       message_stage_title "$PROGRAM_STEP_COUNTER $origin ($currentpkg)"
-       message_target_relations "$origin"
-       if [ $opt_dry_run = yes ]
-       then
-               message_dry_run
-               message_echo
-               temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
-               return
-       fi
-       message_echo "-- (Creating backup package for $origin as $currentpkg)"
-       if ! pkgsys_get_backup_pkg "$origin" > /dev/null
-       then
-               if [ -d "${DBDIR}/requires/$origin" ]
+       local origin_master origin origin_regexp currentpkg backup_pkgdir backup_pkg pkg
+       origin_master=$1
+       currentpkg=`pkgsys_get_installed_pkg_from_origin "$origin_master" | tr '\n' ' ' | sed 's/ *$//'`
+       [ -n "$currentpkg" ] || currentpkg='deinstalled'
+       message_stage_title "$PROGRAM_STEP_COUNTER $origin_master ($currentpkg)"
+       message_target_relations "$origin_master"
+       for origin in `{ echo "$origin_master"; database_query_initial_orgins "$origin_master"; } | sort -u`
+       do
+               origin_regexp=`str_escape_regexp "$origin"`
+               grep -v -E "^${origin_regexp}[[:space:]]" "${DBDIR}/deleted_conflicts" > ${DBDIR}/deleted_conflicts.tmp 2> /dev/null || :
+               mv "${DBDIR}/deleted_conflicts.tmp" "${DBDIR}/deleted_conflicts"
+               currentpkg=`pkgsys_get_installed_pkg_from_origin "$origin" | tr '\n' ' ' | sed 's/ *$//'`
+               [ -n "$currentpkg" ] || continue
+               temp_set_msg_current_stage "a ${_MSG_CURRENT_STAGE_general} process for $origin ($currentpkg) $PROGRAM_STEP_COUNTER"
+               database_query_get_target_attributes currentorigin "$origin"
+               if [ -z "${currentorigin_is_relevant}" ]
                then
-                       backup_pkgdir=${DBDIR}/backup_packages
-               else
-                       backup_pkgdir=${PKGREPOSITORY}
+                       message_echo "-- (Skipping an non-target package for obsolete port $origin as $currentpkg)"
+                       continue
                fi
-               [ -d "$backup_pkgdir" ] || mkdir -p "$backup_pkgdir"
-               pkg=`echo "$currentpkg" | tr ' ' '\n' | grep -v '^$' | tail -n 1`
-               backup_pkg=`pkgsys_create_backup_pkg "$pkg" "$backup_pkgdir"` || :
-               if [ -n "$backup_pkg" ]
+               if database_query_is_a_port_suppressed "$origin"
                then
-                       message_echo "INFO: The backup is saved at $backup_pkg."
-                       message_echo
-               else
-                       message_echo "*** Continuating forcibly by keeping the installed package"
-                       message_echo
-                       temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
-                       return
+                       message_echo "-- (Skipped for $origin as $currentpkg because being suppressed)"
+                       continue
                fi
-       fi
-       message_echo "-- (Deleting package for $origin as $currentpkg)"
-       echo "$currentpkg" | tr ' ' '\n' | grep -v '^$' | while read pkg
-       do
-               if ! pkg_delete_f "$currentpkg"
+               if [ $opt_dry_run = yes ]
                then
-                       message_echo "*** Continuating forcibly by hoping success..."
+                       message_echo "-- (Create backup package for $origin as $currentpkg)"
+                       continue
                fi
+               message_echo "-- (Creating backup package for $origin as $currentpkg)"
+               if ! pkgsys_get_backup_pkg "$origin" > /dev/null
+               then
+                       if [ -d "${DBDIR}/requires/$origin" ]
+                       then
+                               backup_pkgdir=${DBDIR}/backup_packages
+                       else
+                               backup_pkgdir=${PKGREPOSITORY}
+                       fi
+                       mkdir -p "$backup_pkgdir"
+                       pkg=`echo "$currentpkg" | tr ' ' '\n' | grep -v '^$' | tail -n 1`
+                       backup_pkg=`pkgsys_create_backup_pkg "$pkg" "$backup_pkgdir"` || :
+                       if [ -n "$backup_pkg" ]
+                       then
+                               message_echo "INFO: The backup is saved at $backup_pkg."
+                               message_echo
+                       else
+                               message_echo "*** Continuating forcibly by keeping the installed package"
+                               continue
+                       fi
+               fi
+               message_echo "-- (Deleting package for $origin as $currentpkg)"
+               echo "$currentpkg" | tr ' ' '\n' | grep -v '^$' | while read pkg
+               do
+                       if ! pkg_delete_f "$currentpkg"
+                       then
+                               message_echo "*** Continuating forcibly by hoping success..."
+                       fi
+               done
        done
+       [ $opt_dry_run = yes ] && message_dry_run
        temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
        message_echo
 }