Date: Sun, 18 Mar 2001 21:26:43 +0100 (CET) From: Martin Blapp <mb@imp.ch> To: dougb@freebsd.org Cc: current@freebsd.org Subject: MD5 mergemaster Message-ID: <Pine.BSF.4.21.0103182104360.7913-200000@levais.imp.ch>
index | next in thread | raw e-mail
[-- Attachment #1 --]
Hi Doug and all others.
here is a first version of the MD5 mergemaster. It works like this:
No checksum in existing /etc file
---------------------------------
- If a installed version of a /etc file is the same as the temproot
version, we add a md5 checksum to the cvs-header of the file and
install it again.
- If it differs from from the temproot version, we show as usual
the merge/install page, and when we do the install, we add the
md5 checksum.
Checksum already in /etc file:
------------------------------
- If the checksum of the /etc file is the as the fresh file, we do
nothing and skip.
- If the checksum of header of the /etc file is the same as the generated
from /etc, we let it install the new version, if there is any, else we
skip.
- If these checks are unsucessfull, we just hand it to the diff routine
and let diplay the changes you made in the /etc files.
I think there may be some things to change, but it works for me at the
moment. Fixes are welcome. Maybe it's also a good thing to add a flag
for these checks, so you can turn off and on the new behaviour.
Martin
Martin Blapp, mb@imp.ch
------------------------------------------------
Improware AG, UNIX solution and service provider
Zurlindenstrasse 29, 4133 Pratteln, Switzerland
Phone: +41 79 370 26 05, Fax: +41 61 826 93 01
------------------------------------------------
[-- Attachment #2 --]
--- /usr/sbin/mergemaster Fri Mar 16 08:01:20 2001
+++ mergemaster Sun Mar 18 20:25:11 2001
@@ -8,7 +8,7 @@
# Copyright 1998-2001 Douglas Barton
# DougB@FreeBSD.org
-# $FreeBSD: src/usr.sbin/mergemaster/mergemaster.sh,v 1.17 2001/03/05 10:13:21 dougb Exp $
+# $FreeBSD: src/usr.sbin/mergemaster/mergemaster.sh,v 1.6.2.6 2001/03/05 20:33:28 dougb Exp $
PATH=/bin:/usr/bin:/usr/sbin
@@ -112,7 +112,9 @@
echo ''
echo " *** Displaying differences between ${COMPFILE} and installed version:"
echo ''
- diff "${DIFF_FLAG}" "${DESTDIR}${COMPFILE#.}" "${COMPFILE}"
+ /usr/bin/sed -E -e 's%MD5=*.{32} %%' < "${DESTDIR}${COMPFILE#.}" > "${COMPFILE}.orig"
+ diff "${DIFF_FLAG}" "${COMPFILE}.orig" ${COMPFILE}
+ rm "${COMPFILE}.orig"
) | ${PAGER}
echo ''
fi
@@ -490,11 +492,6 @@
;;
esac
- # Avoid trying to update MAKEDEV if /dev is on a devfs
- if /sbin/sysctl vfs.devfs.generation > /dev/null 2>&1 ; then
- rm ${TEMPROOT}/dev/MAKEDEV ${TEMPROOT}/dev/MAKEDEV.local
- fi
-
;; # End of the "RERUN" test
esac
@@ -643,7 +640,12 @@
case "${DONT_INSTALL}" in
'')
+ /bin/cp ${1} ${1}.orig
+ GENMD5=`/usr/bin/grep -v "[$]${CVS_ID_TAG}:" "${1}" | /sbin/md5`
+ SEDSTRING="'s%Exp \\\$\$%Exp MD5=${GENMD5} \\\$%'"
+ eval "/usr/bin/sed -E -e ${SEDSTRING} < \"${1}.orig\" > \"${1}\""
install -m "${FILE_MODE}" "${1}" "${DESTDIR}${INSTALL_DIR}"
+ rm ${1}.orig
;;
*)
unset DONT_INSTALL
@@ -676,6 +678,69 @@
#
for COMPFILE in `find . -type f -size +0`; do
+ # get the MD5 checksum of the CVS header of ${DESTDIR}${COMPFILE#.}
+ MD5ID_OLD=`/usr/bin/grep "[$]${CVS_ID_TAG}:" ${DESTDIR}${COMPFILE#.} 2>&1 | /usr/bin/sed -E -e 's%^.*MD5=(.{32}).*$%\1%' 2>&1`
+
+ # Generate the MD5 checksum of the installed file
+ GENMD5_OLD=`/usr/bin/grep -v "[$]${CVS_ID_TAG}:" ${DESTDIR}${COMPFILE#.} | /sbin/md5`
+
+ # Generate the MD5 checksum of ${COMPFILE}
+ GENMD5_NEW=`/usr/bin/grep -v "[$]${CVS_ID_TAG}:" ${COMPFILE} | /sbin/md5`
+
+ # Get the CVS_ID lines without MD5 checksum
+ CVSID_OLD=`/usr/bin/grep "[$]${CVS_ID_TAG}:" ${DESTDIR}${COMPFILE#.} | /usr/bin/sed -E -e 's%MD5=.{32}%%' 2>/dev/null`
+ CVSID_NEW=`/usr/bin/grep "[$]${CVS_ID_TAG}:" ${COMPFILE} 2>/dev/null | /usr/bin/sed -E -e 's%MD5=.{32}%%' 2>/dev/null`
+
+ #
+ # Check if no MD5 checksum exits in the installed version.
+ #
+ case "${MD5ID_OLD}" in
+ "${CVSID_NEW}")
+ #
+ # No MD5 checksum available, if the files are exactly the
+ # same we can add a MD5 checksum to the cvs header.
+ #
+ case "${GENMD5_OLD}" in
+ "${GENMD5_NEW}")
+ #
+ # New File is the same as the installed version
+ # so we can savly install the new version with
+ # generated md5 checksum.
+ #
+ mm_install "${COMPFILE}"
+ continue
+ ;;
+ esac
+ ;;
+ *)
+ #
+ # MD5 checksum available
+ #
+ case "${MD5ID_OLD}" in
+ "${GENMD5_NEW}")
+ #
+ # New and old file are exactly the same, MD5 checksum
+ # is available, so skip the file.
+ #
+ continue
+ ;;
+ *)
+ case "${GENMD5_OLD}" in
+ "${MD5ID_OLD}")
+ #
+ # New and old file are different and the installed
+ # version has not been changed in any way, so we
+ # can install a new version without problems.
+ #
+ mm_install "${COMPFILE}"
+ continue
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ esac
+
# First, check to see if the file exists in DESTDIR. If not, the
# diff_loop function knows how to handle it.
#
@@ -691,11 +756,9 @@
# 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`
- CVSID2=`grep "[$]${CVS_ID_TAG}:" ${COMPFILE} 2>/dev/null`
- case "${CVSID2}" in
- "${CVSID1}")
+ case "${CVSID_OLD}" in
+ "${CVSID_NEW}")
echo " *** Temp ${COMPFILE} and installed have the same CVS Id, deleting"
rm "${COMPFILE}"
;;
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.21.0103182104360.7913-200000>
