diff options
author | dougb <dougb@FreeBSD.org> | 2009-05-16 22:22:31 +0000 |
---|---|---|
committer | dougb <dougb@FreeBSD.org> | 2009-05-16 22:22:31 +0000 |
commit | 7135ece058c80766190374796cb7da40f26ce700 (patch) | |
tree | 728664948500a761bca49e1ca2520f4714f25915 /usr.sbin | |
parent | 15eeed7d62b94d461b2afcaf468ab6697264db18 (diff) | |
download | FreeBSD-src-7135ece058c80766190374796cb7da40f26ce700.zip FreeBSD-src-7135ece058c80766190374796cb7da40f26ce700.tar.gz |
Enhance the safety of the -U option:
1. In several places make sure that the mtree database is not empty using
the -s argument to test instead of -f. (I thought I'd already changed this,
but obviously not.)
2. When deriving the list of changed files use a colon-delimited list.
3. If the list of changed files is empty, unset the variable, and test
for a non-empty CHANGED in diff_loop() before entering that routine.
Enhance the speed of the -U option by using an internal case statement
instead of echoing the variable to an external grep for every file.
Fix indentation on one line.
Diffstat (limited to 'usr.sbin')
-rwxr-xr-x | usr.sbin/mergemaster/mergemaster.sh | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/usr.sbin/mergemaster/mergemaster.sh b/usr.sbin/mergemaster/mergemaster.sh index 9b8c656..f8b92c0 100755 --- a/usr.sbin/mergemaster/mergemaster.sh +++ b/usr.sbin/mergemaster/mergemaster.sh @@ -115,8 +115,10 @@ diff_loop () { while [ "${HANDLE_COMPFILE}" = "v" -o "${HANDLE_COMPFILE}" = "V" -o \ "${HANDLE_COMPFILE}" = "NOT V" ]; do if [ -f "${DESTDIR}${COMPFILE#.}" -a -f "${COMPFILE}" ]; then - if [ -n "${AUTO_UPGRADE}" ]; then - if echo "${CHANGED}" | grep -qsv ${DESTDIR}${COMPFILE#.}; then + if [ -n "${AUTO_UPGRADE}" -a -n "${CHANGED}" ]; then + case "${CHANGED}" in + *:${DESTDIR}${COMPFILE#.}:*) ;; # File has been modified + *) echo '' echo " *** ${COMPFILE} has not been user modified." echo '' @@ -128,10 +130,11 @@ diff_loop () { AUTO_UPGRADED_FILES="${AUTO_UPGRADED_FILES} ${DESTDIR}${COMPFILE#.} " else - echo " *** Problem upgrading ${COMPFILE}, it will remain to merge by hand" + echo " *** Problem upgrading ${COMPFILE}, it will remain to merge by hand" fi return - fi + ;; + esac fi if [ "${HANDLE_COMPFILE}" = "v" -o "${HANDLE_COMPFILE}" = "V" ]; then echo '' @@ -348,7 +351,7 @@ fi case "${AUTO_UPGRADE}" in '') ;; # If the option is not set no need to run the test or warn the user *) - if [ ! -f "${DESTDIR}${MTREEFILE}" ]; then + if [ ! -s "${DESTDIR}${MTREEFILE}" ]; then echo '' echo "*** Unable to find mtree database. Skipping auto-upgrade." echo '' @@ -459,14 +462,15 @@ MM_MAKE="make ${ARCHSTRING} -m ${SOURCEDIR}/share/mk" # Check DESTDIR against the mergemaster mtree database to see what # files the user changed from the reference files. # -CHANGED= -if [ -n "${AUTO_UPGRADE}" -a -f "${DESTDIR}${MTREEFILE}" ]; then +if [ -n "${AUTO_UPGRADE}" -a -s "${DESTDIR}${MTREEFILE}" ]; then + CHANGED=: for file in `mtree -eqL -f ${DESTDIR}${MTREEFILE} -p ${DESTDIR}/ \ 2>/dev/null | awk '($2 == "changed") {print $1}'`; do if [ -f "${DESTDIR}/$file" ]; then - CHANGED="${CHANGED} ${DESTDIR}/$file" + CHANGED="${CHANGED}${DESTDIR}/${file}:" fi done + [ "$CHANGED" = ':' ] && unset CHANGED fi # Check the width of the user's terminal @@ -1055,7 +1059,7 @@ done # This is for the for way up there at the beginning of the comparison echo '' echo "*** Comparison complete" -if [ -f "${MTREENEW}" ]; then +if [ -s "${MTREENEW}" ]; then echo "*** Saving mtree database for future upgrades" test -e "${DESTDIR}${MTREEFILE}" && unlink ${DESTDIR}${MTREEFILE} mv ${MTREENEW} ${DESTDIR}${MTREEFILE} |