# ============= Deinstallation of a package for an origin =============
deinstall_exec ()
{
- local origin origin_regexp currentpkg backup_pkgdir backup_pkg
+ 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`
+ currentpkg=`pkg_info_qO "$origin" 2> /dev/null | tr '\n' ' '`
[ -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"
backup_pkgdir=${PKGREPOSITORY}
fi
[ -d "$backup_pkgdir" ] || mkdir -p "$backup_pkgdir"
- backup_pkg=`pkgsys_create_backup_pkg "$currentpkg" "$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."
fi
fi
message_echo "-- (Deleting package for $origin as $currentpkg)"
- if ! pkg_delete_f "$currentpkg"
- then
- message_echo "*** Continuating forcibly by hoping success..."
- message_echo
- temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
- return
- fi
+ echo "$REINSTALL_CURRENTPKG" | tr ' ' '\n' | grep -v '^$' | while read pkg
+ do
+ if ! pkg_delete_f "$currentpkg"
+ then
+ message_echo "*** Continuating forcibly by hoping success..."
+ fi
+ done
temp_set_msg_current_stage "${_MSG_CURRENT_STAGE_general}"
message_echo
}
# ============= Back-up of the currently installed package =============
reinstall_pkg_backup ()
{
- local backup_pkg
+ local backup_pkg pkg
reinstall_chk_stage_complete PKG_BACKUP && return
- if [ -n "$REINSTALL_CURRENTPKG" ]
+ pkg=`echo "$REINSTALL_CURRENTPKG" | tr ' ' '\n' | grep -v '^$' | tail -n 1`
+ if [ -n "$pkg" ]
then
message_echo "-- (Creating temporary backup package for $REINSTALL_ORIGPKGTAG)"
- backup_pkg=`pkgsys_create_backup_pkg "$REINSTALL_CURRENTPKG" "${DBDIR}/backup_packages"` || \
+ if backup_pkg=`pkgsys_create_backup_pkg "$pkg" "${DBDIR}/backup_packages"`
+ then
+ echo "$pkg" > $REINSTALL_DBNODE_DIR/backedup_version
+ echo "$backup_pkg" > $REINSTALL_DBNODE_DIR/backedup_pkgfile
+ else
message_echo "WARNING: Failed to create the backup package, but ignored by hoping success." >&2
- cd "${PORTSDIR}/$REINSTALL_ORIGIN"
- echo "$REINSTALL_CURRENTPKG" > $REINSTALL_DBNODE_DIR/backedup_version
- echo "$backup_pkg" > $REINSTALL_DBNODE_DIR/backedup_pkgfile
+ break
+ fi
fi
reinstall_register_stage_complete PKG_BACKUP
}
{
[ -n "$REINSTALL_CURRENTPKG" ] || return 0
reinstall_chk_stage_complete DEINSTALL && return
- pkg_delete_f "$REINSTALL_CURRENTPKG" || \
- {
- message_echo "WARNING: Failed to deinstall $REINSTALL_CURRENTPKG by $PKGSYS_CMD_PKG_DELETE." >&2
- }
+ echo "$REINSTALL_CURRENTPKG" | tr ' ' '\n' | grep -v '^$' | while read pkg
+ do
+ pkg_delete_f "$pkg" || \
+ {
+ message_echo "WARNING: Failed to deinstall $pkg by $PKGSYS_CMD_PKG_DELETE." >&2
+ }
+ done
message_echo "-- (Trying to deinstall by ports to make sure. This usually ends up with warnings.)"
reinstall_make deinstall || \
{
( set -e
REINSTALL_ORIGIN=$1
REINSTALL_DBNODE_DIR=${DBDIR}/requires/$REINSTALL_ORIGIN
- REINSTALL_CURRENTPKG=`database_build_update_pkgname "$REINSTALL_ORIGIN"`
+ REINSTALL_CURRENTPKG=`database_build_update_pkgname "$REINSTALL_ORIGIN" | tr '\n' ' '`
REINSTALL_IS_CURRENTPKG_LATEST=no
database_build_is_currentpkg_latest "$REINSTALL_ORIGIN" && REINSTALL_IS_CURRENTPKG_LATEST=yes
database_build_update_pkgtag "$REINSTALL_ORIGIN"
return
fi
reinstall_skip_if_in_a_list 'Skipped because being a leaf port' leaf_ports_to_delete && return
- if [ -e "${DBDIR}/target_all" ]
- then
- if [ $REINSTALL_IS_CURRENTPKG_LATEST = yes ]
- then
- reinstall_restore_if_temporarily_deinstalled
- reinstall_skip 'Skipped because being already latest' "$REINSTALL_ORIGIN"
- return
- fi
- elif [ ! -e "$REINSTALL_DBNODE_DIR/conf_updated" ]
+ if expr "$REINSTALL_CURRENTPKG" : '.* .*' > /dev/null
then
- if [ -e "$nodedir/installed_by_pkg" ] && database_query_is_default_conf "$REINSTALL_ORIGIN" quiet
- then
- reinstall_restore_if_temporarily_deinstalled
- reinstall_skip 'Skipped because already upgraded with a prebuilt package'
- return
- fi
- reinstall_skip_if_in_a_list 'Skipped because the reinstallation has been already completed' \
- "success.${REINSTALL_DBSUFFIX}.list" restore && return
- if [ $opt_skip_unchanged = yes ]
+ message_echo "WARNING: Multiple packages are registered for this port. Reinstallation is needed to fix it." >&2
+ else
+ if [ -e "${DBDIR}/target_all" ]
then
- if [ ! -e "$REINSTALL_DBNODE_DIR/necessary_upgrade.${REINSTALL_DBSUFFIX}" ]
+ if [ $REINSTALL_IS_CURRENTPKG_LATEST = yes ]
then
reinstall_restore_if_temporarily_deinstalled
- if [ -e "$REINSTALL_DBNODE_DIR/installed_version" ]
- then
- reinstall_skip 'Skipped because being already latest as well as the all requirements'
- else
- reinstall_skip 'Skipped because being an only-build-time dependency of already latest packages'
- fi
+ reinstall_skip 'Skipped because being already latest' "$REINSTALL_ORIGIN"
return
fi
- fi
- if [ \( $opt_skip_unchanged = no -a -e "$REINSTALL_DBNODE_DIR/succeeded_once" \) \
- -o \( $opt_skip_unchanged = yes -a $REINSTALL_IS_CURRENTPKG_LATEST = yes \) ]
+ elif [ ! -e "$REINSTALL_DBNODE_DIR/conf_updated" ]
then
- if [ ! -e "$REINSTALL_DBNODE_DIR/need_reinstall_due_to_upgraded_requirements.${REINSTALL_DBSUFFIX}" ]
+ if [ -e "$nodedir/installed_by_pkg" ] && database_query_is_default_conf "$REINSTALL_ORIGIN" quiet
+ then
+ reinstall_restore_if_temporarily_deinstalled
+ reinstall_skip 'Skipped because already upgraded with a prebuilt package'
+ return
+ fi
+ reinstall_skip_if_in_a_list 'Skipped because the reinstallation has been already completed' \
+ "success.${REINSTALL_DBSUFFIX}.list" restore && return
+ if [ $opt_skip_unchanged = yes ]
then
- if ! database_query_is_necessary_upgrade "$REINSTALL_ORIGIN"
+ if [ ! -e "$REINSTALL_DBNODE_DIR/necessary_upgrade.${REINSTALL_DBSUFFIX}" ]
then
reinstall_restore_if_temporarily_deinstalled
- fileedit_add_a_line_if_new "$REINSTALL_ORIGIN" \
- "${DBDIR}/todo_after_requirements_succeed.${REINSTALL_DBSUFFIX}.list"
- reinstall_skip 'Skipped because being already latest or failed as well as the all requirements'
+ if [ -e "$REINSTALL_DBNODE_DIR/installed_version" ]
+ then
+ reinstall_skip 'Skipped because being already latest as well as the all requirements'
+ else
+ reinstall_skip 'Skipped because being an only-build-time dependency of already latest packages'
+ fi
return
fi
fi
+ if [ \( $opt_skip_unchanged = no -a -e "$REINSTALL_DBNODE_DIR/succeeded_once" \) \
+ -o \( $opt_skip_unchanged = yes -a $REINSTALL_IS_CURRENTPKG_LATEST = yes \) ]
+ then
+ if [ ! -e "$REINSTALL_DBNODE_DIR/need_reinstall_due_to_upgraded_requirements.${REINSTALL_DBSUFFIX}" ]
+ then
+ if ! database_query_is_necessary_upgrade "$REINSTALL_ORIGIN"
+ then
+ reinstall_restore_if_temporarily_deinstalled
+ fileedit_add_a_line_if_new "$REINSTALL_ORIGIN" \
+ "${DBDIR}/todo_after_requirements_succeed.${REINSTALL_DBSUFFIX}.list"
+ reinstall_skip 'Skipped because being already latest or failed as well as the all requirements'
+ return
+ fi
+ fi
+ fi
fi
+ reinstall_skip_if_in_a_list 'Marked to be manually-done' manually_done.list restore && return
fi
reinstall_skip_if_in_a_list 'Skipped because being a hold package' conf/HOLD:PORTS.parsed restore && return
- reinstall_skip_if_in_a_list 'Marked to be manually-done' manually_done.list restore && return
if database_query_is_a_port_suppressed "$REINSTALL_ORIGIN"
then
reinstall_restore_if_temporarily_deinstalled