mergemaster improvement (auto-update for not modified files)

Denis Peplin den at FreeBSD.org
Tue May 3 02:27:47 PDT 2005


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).
-------------- next part --------------
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:anoncvs at anoncvs.jp.FreeBSD.org:/home/ncvs
+	:pserver:anoncvs at anoncvs.fr.FreeBSD.org:/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] "


More information about the freebsd-hackers mailing list