Hello!

The mergemaster with this is test patch (attached)
can auto-update files that was not modified.

It do this by compairing each file with it's CVS
copy. If file was not modified, it can be rewritten.

This dramatically redices amount of files that require
admin's attention.

There is one major problem here:
This can be done in single-user mode only if your
have local CVS repository, because if local CVS is
not exist, anoncvs is used.

Possible solutions:
1. Pre-checkout files in pre-buildworld mode.
2. Setup CVSup collection for subset of required files
(is it possible?), and then keep this small collection
up-to-date locally.
3. Store checksum for every config file installed,
then compare with this checksum on updating.

BTW, tracking checksums can be very useful for
base system too, because checksums can help to do
clean updates (with removal of old files that was not
overwritten).
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      3 May 2005 09:21:38 -0000
@@ -224,6 +224,15 @@
 #
 TEMPROOT='/var/tmp/temproot'
 
+TEMPCVS=`mktemp -q -d -t $(basename $0)`
+CVS_SKIP=''
+
+# Only one variable for the list of sites. Should be improved.
+CVS_LOGGED_IN=0
+
+CVSLIST=":pserver:[EMAIL PROTECTED]:/home/ncvs
+       :pserver:[EMAIL PROTECTED]:/home/ncvs"
+
 # Read /etc/mergemaster.rc first so the one in $HOME can override
 #
 if [ -r /etc/mergemaster.rc ]; then
@@ -871,7 +880,7 @@
     # 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
 
     case "${CVSID2}" in
@@ -879,6 +888,60 @@
       echo " *** Temp ${COMPFILE} and installed have the same CVS Id, deleting"
       rm "${COMPFILE}"
       ;;
+    *)
+      # Checking file for changes against CVS
+      if [ ! -z "${CVSID1}" -a -z "${CVS_SKIP}" ]
+      then
+       CVSFILE=`echo ${CVSID1} | awk '{print $3}' | sed 's/,v$//'`
+       CVSVERSION=`echo ${CVSID1} | awk '{print $4}'`
+       
+       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
+
+           echo "1 $CVS_SKIP 1"
+
+           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 +989,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] "
_______________________________________________
freebsd-hackers@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to