From b4c4e59c24e81b795268b91458676b085093abb6 Mon Sep 17 00:00:00 2001 From: Mamoru Sakaue / MwGhennndo Date: Sat, 22 Dec 2012 22:43:09 +0900 Subject: [PATCH] [IMPROVED] Changes are made so as to avoid retrying for dependents of failed ports when no problem has resolved. modified: portsreinstall modified: portsreinstall.8 modified: portsreinstall.8~ modified: portsreinstall~ --- portsreinstall | 68 +++++++++++++++++++++++++++++++++++++++++++------------ portsreinstall.8 | 3 +++ portsreinstall.8~ | 2 +- portsreinstall~ | 68 +++++++++++++++++++++++++++++++++++++++++++------------ 4 files changed, 112 insertions(+), 29 deletions(-) diff --git a/portsreinstall b/portsreinstall index a701012..f8f4a52 100755 --- a/portsreinstall +++ b/portsreinstall @@ -10,7 +10,7 @@ # ================================================ APPNAME=`basename "$0"` -MYVERSION=2.2.0 +MYVERSION=2.2.0+toward_2.2.1_20121222223545 PREFIX=${PREFIX:-/usr/local} CONFFILE=${PREFIX}/etc/${APPNAME}.conf @@ -643,7 +643,7 @@ add_a_line_if_new () item=$1 dstpath=$2 pattern=`str_escape_regexp "$item"` - grep -m 1 -E "^$pattern$" "$dstpath" 2> /dev/null > /dev/null || echo "$item" >> $dstpath + grep -m 1 -E "^$pattern$" "$dstpath" > /dev/null 2>&1 || echo "$item" >> $dstpath } record_success () @@ -652,6 +652,8 @@ record_success () origin=$1 str_escape_regexp_filter < ${DBDIR}/failed.list | sed "s|^|^|; s|$|$|" > ${TMPDIR}/record_success.grep_failed.list.tmp rm_a_line "$origin" "${DBDIR}/todo_after_requirements_succeed.list" + dbdir_esc=`echo "${DBDIR}/requires/" | sed 's/|/\\|/'` + sed "s|^|$dbdir_esc|;s|$|/failed_requirements|" "${DBDIR}/requires/$origin/dependents" | rm_a_line_from_files "$origin" if [ `grep -m 1 -E -f "${TMPDIR}/record_success.grep_failed.list.tmp" "${DBDIR}/requires/$origin/requires" | wc -l` -eq 0 ] then add_a_line_if_new "$origin" "${DBDIR}/success.list" @@ -668,13 +670,15 @@ record_success () record_failure () { - local origin clean + local origin clean portsdir_esc origin=$1 clean=$2 add_a_line_if_new "$origin" "${DBDIR}/failed.list" rm_a_line "$origin" "${DBDIR}/success.list" rm_a_line "$origin" "${DBDIR}/success_but_dependencies_failed.list" rm_a_line "$origin" "${DBDIR}/todo_after_requirements_succeed.list" + dbdir_esc=`echo "${DBDIR}/requires/" | sed 's/|/\\|/'` + sed "s|^|$dbdir_esc|;s|$|/failed_requirements|" "${DBDIR}/requires/$origin/dependents" | add_a_line_to_files_if_new "$origin" rm -f "${DBDIR}/requires/$origin/succeeded_once" if [ -z "$clean" -o "@$clean" = @clean ] then @@ -685,6 +689,16 @@ record_failure () echo } +rm_a_line_from_files () +{ + local item + item=$1 + while read filepath + do + rm_a_line "$item" "$filepath" + done +} + add_a_line_to_files_if_new () { local item @@ -742,11 +756,8 @@ register_globs () if [ "@$mode" = @remove ] then rm_a_line "$origin" "$listpath" - elif grep -m 1 -E "^`str_escape_regexp $origin`$" "$listpath" > /dev/null 2> /dev/null - then - : else - echo $origin >> "$listpath" + add_a_line_if_new "$origin" "$listpath" fi done } @@ -976,7 +987,7 @@ inspect_dependencies () fi fi echo $pkgtag > $target_dir/pkgtag - env ${MAKE_ENVS} make all-depends-list ${MAKE_ARGS} | sed "s|^${PORTSDIR}/||" > "$target_dir/requires" || : + env ${MAKE_ENVS} make all-depends-list ${MAKE_ARGS} | sed -E "s/^`str_escape_regexp "${PORTSDIR}"`\///" > $target_dir/requires || : grep -E -f "${DBDIR}/REPLACE.grep_from_pattern.conflist" "$target_dir/requires" | grep -v -E "^`str_escape_regexp $origin`$" > ${TMPDIR}/replaced_target.tmp || : mv "$target_dir/requires" "$target_dir/requires.orig" sed -E -f "${DBDIR}/REPLACE.replace_pattern.conflist" "$target_dir/requires.orig" | grep -v '^$' > $target_dir/requires || : @@ -1279,6 +1290,7 @@ ok) warn_update_ports opr=$1 shift + cp "${DBDIR}/manually_done.list" "${TMPDIR}/manually_done.list.old" case $opr in add) register_globs '' "$*" "${DBDIR}/manually_done.list" @@ -1289,6 +1301,19 @@ ok) echo "`linear_list \"$*\"` is/are deregistered from the list of manually resolved ports" ;; esac + if diff "${TMPDIR}/manually_done.list.old" "${DBDIR}/manually_done.list" > ${TMPDIR}/manually_done.list.diff + then + : + else + grep '^<' "${TMPDIR}/manually_done.list.diff" 2> /dev/null | sed 's/^< //' | while read origin + do + record_failure "$origin" + done + grep '^>' "${TMPDIR}/manually_done.list.diff" 2> /dev/null | sed 's/^> //' | while read origin + do + record_success "$origin" + done + fi echo "Now the following ports have been manually resolved:" [ ! -r "${DBDIR}/manually_done.list" ] || cat "${DBDIR}/manually_done.list" exit @@ -2387,11 +2412,26 @@ then then if [ ! -e "${DBDIR}/requires/$origin/need_reinstall_due_to_updated_requirements" ] then - echo "========== $counter (Skipping a port, $position_msg, because itself and the all of its requirements are already latest or failed in update at `timestamp`) ==========" - echo - add_a_line_if_new "$origin" "${DBDIR}/todo_after_requirements_succeed.list" - rm_a_line "$origin" "${DBDIR}/reinst_todo.list" - continue + sort -u "${DBDIR}/requires/$origin/failed_requirements" > ${TMPDIR}/failed_requirements.new + sort -u "${DBDIR}/requires/$origin/failed_requirements.previous" > ${TMPDIR}/failed_requirements.old + if [ ! -e "${DBDIR}/requires/$origin/failed_requirements" ] || \ + diff "${TMPDIR}/failed_requirements.old" "${TMPDIR}/failed_requirements.new" \ + > ${TMPDIR}/failed_requirements.diff + then + need_update=no + elif grep -m 1 '^<' "${TMPDIR}/failed_requirements.diff" > /dev/null + need_update=yes + else + need_update=no + fi + if [ $need_update = no ] + then + echo "========== $counter (Skipping a port, $position_msg, because itself and the all of its requirements are already latest or failed in update at `timestamp`) ==========" + echo + add_a_line_if_new "$origin" "${DBDIR}/todo_after_requirements_succeed.list" + rm_a_line "$origin" "${DBDIR}/reinst_todo.list" + continue + fi fi fi chk_if_target currentorigin "$origin" @@ -2433,7 +2473,6 @@ then echo "========== $counter (Marking a manually-done port $position_msg as success at `timestamp`) ==========" cat ${TMPDIR}/msg_if_target echo - record_success $origin rm_a_line "$origin" "${DBDIR}/reinst_todo.list" continue fi @@ -2723,6 +2762,7 @@ then fi rm -f "${DBDIR}/requires/$origin/need_reinstall_due_to_updated_requirements" record_success $origin + [ -e "${DBDIR}/requires/$origin/failed_requirements" ] && cp "${DBDIR}/requires/$origin/failed_requirements" "${DBDIR}/requires/$origin/failed_requirements.previous" rm_a_line "$origin" "${DBDIR}/reinst_todo.list" rm -f "${DBDIR}/backup_failure/$currentpkg.tbz" rm "${DBDIR}/requires/$origin/status/in_install" diff --git a/portsreinstall.8 b/portsreinstall.8 index 6190ef6..1962760 100644 --- a/portsreinstall.8 +++ b/portsreinstall.8 @@ -287,6 +287,9 @@ Configuration file of portupgrade(1). .SH HISTORY \fBportsreinstall\fR has been developed as below. .TP +2.2.1 (22 December 2012) +[IMPROVED] Changes are made so as to avoid retrying for dependents of failed ports when no problem has resolved. +.TP 2.2.0 (17 December 2012) [NEW] Command of \fBshow todo_next\fR is added. diff --git a/portsreinstall.8~ b/portsreinstall.8~ index e1125f3..6190ef6 100644 --- a/portsreinstall.8~ +++ b/portsreinstall.8~ @@ -287,7 +287,7 @@ Configuration file of portupgrade(1). .SH HISTORY \fBportsreinstall\fR has been developed as below. .TP -2.2.0 (16 December 2012) +2.2.0 (17 December 2012) [NEW] Command of \fBshow todo_next\fR is added. [CHANGED] Changes are made so as to skip wasteful reinstallation where the target port is already reinstalled once (with \fB\-q\fR option, when its version is up-to-date) and no change has been made for either of its requirements afterwards. diff --git a/portsreinstall~ b/portsreinstall~ index 8ffd353..1dcba45 100755 --- a/portsreinstall~ +++ b/portsreinstall~ @@ -10,7 +10,7 @@ # ================================================ APPNAME=`basename "$0"` -MYVERSION=2.1.0+toward_2.2.0_20121217035556 +MYVERSION=2.2.0 PREFIX=${PREFIX:-/usr/local} CONFFILE=${PREFIX}/etc/${APPNAME}.conf @@ -643,7 +643,7 @@ add_a_line_if_new () item=$1 dstpath=$2 pattern=`str_escape_regexp "$item"` - grep -m 1 -E "^$pattern$" "$dstpath" 2> /dev/null > /dev/null || echo "$item" >> $dstpath + grep -m 1 -E "^$pattern$" "$dstpath" > /dev/null 2>&1 || echo "$item" >> $dstpath } record_success () @@ -652,6 +652,8 @@ record_success () origin=$1 str_escape_regexp_filter < ${DBDIR}/failed.list | sed "s|^|^|; s|$|$|" > ${TMPDIR}/record_success.grep_failed.list.tmp rm_a_line "$origin" "${DBDIR}/todo_after_requirements_succeed.list" + dbdir_esc=`echo "${DBDIR}/requires/" | sed 's/|/\\|/'` + sed "s|^|$dbdir_esc|;s|$|/failed_requirements|" "${DBDIR}/requires/$origin/dependents" | rm_a_line_from_files "$origin" if [ `grep -m 1 -E -f "${TMPDIR}/record_success.grep_failed.list.tmp" "${DBDIR}/requires/$origin/requires" | wc -l` -eq 0 ] then add_a_line_if_new "$origin" "${DBDIR}/success.list" @@ -668,13 +670,15 @@ record_success () record_failure () { - local origin clean + local origin clean portsdir_esc origin=$1 clean=$2 add_a_line_if_new "$origin" "${DBDIR}/failed.list" rm_a_line "$origin" "${DBDIR}/success.list" rm_a_line "$origin" "${DBDIR}/success_but_dependencies_failed.list" rm_a_line "$origin" "${DBDIR}/todo_after_requirements_succeed.list" + dbdir_esc=`echo "${DBDIR}/requires/" | sed 's/|/\\|/'` + sed "s|^|$dbdir_esc|;s|$|/failed_requirements|" "${DBDIR}/requires/$origin/dependents" | add_a_line_to_files_if_new "$origin" rm -f "${DBDIR}/requires/$origin/succeeded_once" if [ -z "$clean" -o "@$clean" = @clean ] then @@ -685,6 +689,16 @@ record_failure () echo } +rm_a_line_from_files () +{ + local item + item=$1 + while read filepath + do + rm_a_line "$item" "$filepath" + done +} + add_a_line_to_files_if_new () { local item @@ -742,11 +756,8 @@ register_globs () if [ "@$mode" = @remove ] then rm_a_line "$origin" "$listpath" - elif grep -m 1 -E "^`str_escape_regexp $origin`$" "$listpath" > /dev/null 2> /dev/null - then - : else - echo $origin >> "$listpath" + add_a_line_if_new "$origin" "$listpath" fi done } @@ -976,7 +987,7 @@ inspect_dependencies () fi fi echo $pkgtag > $target_dir/pkgtag - env ${MAKE_ENVS} make all-depends-list ${MAKE_ARGS} | sed "s|^${PORTSDIR}/||" > "$target_dir/requires" || : + env ${MAKE_ENVS} make all-depends-list ${MAKE_ARGS} | sed -E "s/^`str_escape_regexp "${PORTSDIR}"`\///" > $target_dir/requires || : grep -E -f "${DBDIR}/REPLACE.grep_from_pattern.conflist" "$target_dir/requires" | grep -v -E "^`str_escape_regexp $origin`$" > ${TMPDIR}/replaced_target.tmp || : mv "$target_dir/requires" "$target_dir/requires.orig" sed -E -f "${DBDIR}/REPLACE.replace_pattern.conflist" "$target_dir/requires.orig" | grep -v '^$' > $target_dir/requires || : @@ -1279,6 +1290,7 @@ ok) warn_update_ports opr=$1 shift + cp "${DBDIR}/manually_done.list" "${TMPDIR}/manually_done.list.old" case $opr in add) register_globs '' "$*" "${DBDIR}/manually_done.list" @@ -1289,6 +1301,19 @@ ok) echo "`linear_list \"$*\"` is/are deregistered from the list of manually resolved ports" ;; esac + if diff "${TMPDIR}/manually_done.list.old" "${DBDIR}/manually_done.list" > ${TMPDIR}/manually_done.list.diff + then + : + else + grep '^<' "${TMPDIR}/manually_done.list.diff" 2> /dev/null | sed 's/^< //' | while read origin + do + record_failure "$origin" + done + grep '^>' "${TMPDIR}/manually_done.list.diff" 2> /dev/null | sed 's/^> //' | while read origin + do + record_success "$origin" + done + fi echo "Now the following ports have been manually resolved:" [ ! -r "${DBDIR}/manually_done.list" ] || cat "${DBDIR}/manually_done.list" exit @@ -2387,11 +2412,26 @@ then then if [ ! -e "${DBDIR}/requires/$origin/need_reinstall_due_to_updated_requirements" ] then - echo "========== $counter (Skipping a port, $position_msg, because itself and the all of its requirements are already latest or failed in update at `timestamp`) ==========" - echo - add_a_line_if_new "$origin" "${DBDIR}/todo_after_requirements_succeed.list" - rm_a_line "$origin" "${DBDIR}/reinst_todo.list" - continue + sort -u "${DBDIR}/requires/$origin/failed_requirements" > ${TMPDIR}/failed_requirements.new + sort -u "${DBDIR}/requires/$origin/failed_requirements.previous" > ${TMPDIR}/failed_requirements.old + if [ ! -e "${DBDIR}/requires/$origin/failed_requirements" ] || \ + diff "${TMPDIR}/failed_requirements.old" "${TMPDIR}/failed_requirements.new" \ + > ${TMPDIR}/failed_requirements.diff + then + need_update=no + elif grep -m 1 '^<' "${TMPDIR}/failed_requirements.diff" > /dev/null + need_update=yes + else + need_update=no + fi + if [ $need_update = no ] + then + echo "========== $counter (Skipping a port, $position_msg, because itself and the all of its requirements are already latest or failed in update at `timestamp`) ==========" + echo + add_a_line_if_new "$origin" "${DBDIR}/todo_after_requirements_succeed.list" + rm_a_line "$origin" "${DBDIR}/reinst_todo.list" + continue + fi fi fi chk_if_target currentorigin "$origin" @@ -2433,7 +2473,6 @@ then echo "========== $counter (Marking a manually-done port $position_msg as success at `timestamp`) ==========" cat ${TMPDIR}/msg_if_target echo - record_success $origin rm_a_line "$origin" "${DBDIR}/reinst_todo.list" continue fi @@ -2723,6 +2762,7 @@ then fi rm -f "${DBDIR}/requires/$origin/need_reinstall_due_to_updated_requirements" record_success $origin + [ -e "${DBDIR}/requires/$origin/failed_requirements" ] && cp "${DBDIR}/requires/$origin/failed_requirements" "${DBDIR}/requires/$origin/failed_requirements.previous" rm_a_line "$origin" "${DBDIR}/reinst_todo.list" rm -f "${DBDIR}/backup_failure/$currentpkg.tbz" rm "${DBDIR}/requires/$origin/status/in_install" -- 2.11.0