Index: mergemaster.sh =================================================================== RCS file: /home/ncvs/src/usr.sbin/mergemaster/mergemaster.sh,v retrieving revision 1.51 diff -u -r1.51 mergemaster.sh --- mergemaster.sh 7 Mar 2004 10:10:19 -0000 1.51 +++ mergemaster.sh 10 May 2005 06:00:43 -0000 @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/sh -x # mergemaster @@ -224,6 +224,17 @@ # TEMPROOT='/var/tmp/temproot' +TEMPCVS=`mktemp -q -d -t $(basename $0)` +CVS_SKIP='y' + +# Only one variable for the list of sites. Should be improved. +CVS_LOGGED_IN=0 + +CVSLIST=":pserver:anoncvs@anoncvs.jp.FreeBSD.org:/home/ncvs + :pserver:anoncvs@anoncvs.fr.FreeBSD.org:/home/ncvs" + +CHECKSUM_DIR=/var/db/sys/etc + # Read /etc/mergemaster.rc first so the one in $HOME can override # if [ -r /etc/mergemaster.rc ]; then @@ -871,14 +882,105 @@ # If the files have the same $Id, delete the one in temproot so the # user will have less to wade through if files are left to merge by hand. # - CVSID1=`grep "[$]${CVS_ID_TAG}:" ${DESTDIR}${COMPFILE#.} 2>/dev/null` + CVSID1=`grep "[$]${CVS_ID_TAG}:" ${DESTDIR}${COMPFILE#.} 2>/dev/null` || CVSID1='' CVSID2=`grep "[$]${CVS_ID_TAG}:" ${COMPFILE} 2>/dev/null` || CVSID2=none + CVSFILE=`echo ${CVSID1} | awk '{print $3}' | sed 's/,v$//'` + ETCFILE=`echo ${CVSFILE} | sed 's/src\/etc\///'` + CVSVERSION=`echo ${CVSID1} | awk '{print $4}'` + + # check for stored checksum and add if not stored + CVSVERSION_ORIG=`echo ${CVSID2} | awk '{print $4}'` + MD5_STORED_ORIG=`cat ${CHECKSUM_DIR}/*.list 2>/dev/null | \ + grep -m 1 "^${ETCFILE} ${CVSVERSION_ORIG} " | \ + awk '{print $3}'` + + test -d ${CHECKSUM_DIR} || mkdir -p ${CHECKSUM_DIR} + + case "${MD5_STORED_ORIG}" in + "") + MD5_ORIG=`/sbin/md5 ${COMPFILE} | awk '{print $4}'` + echo "${ETCFILE} ${CVSVERSION_ORIG} ${MD5_ORIG}" >> ${CHECKSUM_DIR}/sums-etc-local.list + ;; + *) + ;; + esac + case "${CVSID2}" in "${CVSID1}") echo " *** Temp ${COMPFILE} and installed have the same CVS Id, deleting" rm "${COMPFILE}" ;; + *) + # Checking for changes against checksum collection + if [ ! -z "${CVSID1}" -a -d ${CHECKSUM_DIR} ] + then + echo " *** Checking ${COMPFILE#.} against stored checksum" + MD5_STORED=`cat ${CHECKSUM_DIR}/*.list | \ + grep -m 1 "^${ETCFILE} ${CVSVERSION} " | \ + awk '{print $3}'` || MD5_STORED=none + MD5_INSTALLED=`/sbin/md5 ${DESTDIR}${COMPFILE#.} | awk '{print $4}'` + if [ x${MD5_INSTALLED} = x${MD5_STORED} ] + then + if mm_install "${COMPFILE}"; then + echo " *** ${COMPFILE} installed successfully" + else + echo " *** Problem installing ${COMPFILE}, it will remain to merge by hand" + fi + CVS_SKIP=y + else + echo " *** Checksums mismatch" + fi + fi + + # Checking file for changes against CVS + if [ ! -z "${CVSID1}" -a -z "${CVS_SKIP}" ] + then + echo " *** Checking ${COMPFILE#.} against CVS" + (cd ${TEMPCVS} && cvs -Rq co -r ${CVSVERSION} ${CVSFILE} > /dev/null 2>&1) || \ + for CVSROOT in ${CVSLIST} + do + if [ ${CVS_LOGGED_IN} -eq 0 ]; then + echo " *** Enter 'anoncvs' password below" + cvs -Rqd ${CVSROOT} login && CVS_LOGGED_IN=1 + fi + (cd ${TEMPCVS} && cvs -Rqd ${CVSROOT} co -r ${CVSVERSION} ${CVSFILE} > /dev/null 2>&1 && continue) + done + case "${AUTO_RUN}" in + '') + if [ $? -ne 0 ]; then + echo "${COMPFILE} can't be checked against CVS" + echo -n "Do you wish skip CVS checking for remaining files? y or n [y] " + read CVS_SKIP + + case $CVS_SKIP in + [Nn]) + CVS_SKIP='' + ;; + *) + CVS_SKIP='y' + echo " *** Skip CVS checking for remaining files" + ;; + esac + fi + ;; + *) + echo " *** Skip CVS checking for remaining files" + ;; + esac + + + if diff -q ${DIFF_OPTIONS} "${DESTDIR}${COMPFILE#.}" "${TEMPCVS}/${CVSFILE}" > \ + /dev/null 2>&1; then + if mm_install "${COMPFILE}"; then + echo " *** ${COMPFILE} installed successfully" + else + echo " *** Problem installing ${COMPFILE}, it will remain to merge by hand" + fi + fi + rm -f ${TEMPCVS}/${CVSFILE} + fi + ;; esac ;; esac @@ -926,6 +1028,9 @@ echo '' fi +# How safe it is? +rm -rf ${TEMPCVS} + case "${AUTO_RUN}" in '') echo -n "Do you wish to delete what is left of ${TEMPROOT}? [no] "