Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 12 Nov 2013 20:03:22 +0000 (UTC)
From:      Antoine Brodin <antoine@FreeBSD.org>
To:        ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org
Subject:   svn commit: r333612 - in head/sysutils/etcupdate: . src
Message-ID:  <201311122003.rACK3M1S086784@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: antoine
Date: Tue Nov 12 20:03:21 2013
New Revision: 333612
URL: http://svnweb.freebsd.org/changeset/ports/333612

Log:
  - Update to 1.0
  - Add LICENSE
  - Stage support
  
  Submitted by:	jhb (maintainer)

Modified:
  head/sysutils/etcupdate/Makefile
  head/sysutils/etcupdate/src/etcupdate.8
  head/sysutils/etcupdate/src/etcupdate.sh

Modified: head/sysutils/etcupdate/Makefile
==============================================================================
--- head/sysutils/etcupdate/Makefile	Tue Nov 12 19:53:01 2013	(r333611)
+++ head/sysutils/etcupdate/Makefile	Tue Nov 12 20:03:21 2013	(r333612)
@@ -2,7 +2,7 @@
 # $FreeBSD$
 
 PORTNAME=	etcupdate
-PORTVERSION=	0.4
+PORTVERSION=	1.0
 CATEGORIES=	sysutils
 MASTER_SITES=	# none
 DISTFILES=	# none
@@ -10,17 +10,17 @@ DISTFILES=	# none
 MAINTAINER=	jhb@FreeBSD.org
 COMMENT=	Manage updates to /etc automatically
 
+LICENSE=	BSD
+
 NO_BUILD=	yes
 NO_WRKSUBDIR=	yes
 
 SRC=		${.CURDIR}/src
 
-MAN8=		${PORTNAME}.8
-PLIST_FILES=	sbin/etcupdate
+PLIST_FILES=	sbin/etcupdate man/man8/etcupdate.8.gz
 
-NO_STAGE=	yes
 do-install:
-	${INSTALL_SCRIPT} ${SRC}/${PORTNAME}.sh ${PREFIX}/sbin/${PORTNAME}
-	${INSTALL_MAN} ${SRC}/${PORTNAME}.8 ${PREFIX}/man/man8
+	${INSTALL_SCRIPT} ${SRC}/${PORTNAME}.sh ${STAGEDIR}${PREFIX}/sbin/${PORTNAME}
+	${INSTALL_MAN} ${SRC}/${PORTNAME}.8 ${STAGEDIR}${PREFIX}/man/man8
 
 .include <bsd.port.mk>

Modified: head/sysutils/etcupdate/src/etcupdate.8
==============================================================================
--- head/sysutils/etcupdate/src/etcupdate.8	Tue Nov 12 19:53:01 2013	(r333611)
+++ head/sysutils/etcupdate/src/etcupdate.8	Tue Nov 12 20:03:21 2013	(r333612)
@@ -25,7 +25,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd March 16, 2012
+.Dd November 12, 2013
 .Dt ETCUPDATE 8
 .Os
 .Sh NAME
@@ -33,7 +33,7 @@
 .Nd "manage updates to system files not updated by installworld"
 .Sh SYNOPSIS
 .Nm
-.Op Fl nBF
+.Op Fl npBF
 .Op Fl d Ar workdir
 .Op Fl r | Fl s Ar source | Fl t Ar tarball
 .Op Fl A Ar patterns
@@ -64,6 +64,7 @@
 .Op Fl M Ar options
 .Nm
 .Cm resolve
+.Op Fl p
 .Op Fl d Ar workdir
 .Op Fl D Ar destdir
 .Op Fl L Ar logfile
@@ -112,7 +113,6 @@ The
 utility will not perform a new merge until all conflicts from an earlier
 merge are resolved.
 .Sh MODES
-.Pp
 The
 .Nm
 utility supports several modes of operation.
@@ -150,7 +150,7 @@ tree.
 An older
 .Dq previous
 tree is removed if it exists.
-By default the new 
+By default the new
 .Dq current
 tree is built from a source tree.
 However,
@@ -343,25 +343,7 @@ then nothing will be output.
 .Sh OPTIONS
 The following options are available.
 Note that most options do not apply to all modes.
-.Bl -tag -width ".Fl d Ar workdir"
-.It Fl B
-Do not build generated files in a private object tree.
-Instead,
-reuse the generated files from a previously built object tree that matches
-the source tree.
-This can be useful to avoid gratuitous conflicts in sendmail configuration
-files when bootstrapping.
-It can also be useful for building a tarball that matches a specific
-world build.
-.It Fl d Ar workdir
-Specify an alternate directory to use as the work directory.
-The work directory is used to store the
-.Dq current
-and
-.Dq previous
-trees as well as unresolved conflicts.
-The default work directory is
-.Pa <destdir>/var/db/etcupdate .
+.Bl -tag -width ".Fl A Ar patterns"
 .It Fl A Ar patterns
 Always install the new version of any files that match any of the patterns
 listed in
@@ -377,9 +359,20 @@ Note that ignored files specified via th
 variable or the
 .Fl I
 option will not be installed.
+.It Fl B
+Do not build generated files in a private object tree.
+Instead,
+reuse the generated files from a previously built object tree that matches
+the source tree.
+This can be useful to avoid gratuitous conflicts in
+.Xr sendmail 8
+configuration
+files when bootstrapping.
+It can also be useful for building a tarball that matches a specific
+world build.
 .It Fl D Ar destdir
 Specify an alternate destination directory as the target of a merge.
-This is analagous to the
+This is analogous to the
 .Dv DESTDIR
 variable used with
 .Sq make installworld .
@@ -387,6 +380,15 @@ The default destination directory is an 
 merges updating
 .Pa /etc
 on the local machine.
+.It Fl d Ar workdir
+Specify an alternate directory to use as the work directory.
+The work directory is used to store the
+.Dq current
+and
+.Dq previous
+trees as well as unresolved conflicts.
+The default work directory is
+.Pa <destdir>/var/db/etcupdate .
 .It Fl F
 Ignore changes in the FreeBSD ID string when comparing files in the
 destination directory to files in either of the
@@ -480,6 +482,33 @@ option is not specified,
 then a temporary
 .Dq current
 tree will be extracted to perform the comparison.
+.It Fl p
+Enable
+.Dq pre-world
+mode.
+Only merge changes to files that are necessary to successfully run
+.Sq make installworld
+or
+.Sq make installkernel .
+When this flag is enabled,
+the existing
+.Dq current
+and
+.Dq previous
+trees are left alone.
+Instead,
+a temporary tree is populated with the necessary files.
+This temporary tree is compared against the
+.Dq current
+tree.
+This allows a normal update to be run after
+.Sq make installworld
+has completed.
+Any conflicts generated during a
+.Dq pre-world
+update should be resolved by a
+.Dq pre-world
+.Cm resolve .
 .It Fl r
 Do not update the
 .Dq current
@@ -739,12 +768,16 @@ but it has been removed in the destinati
 .El
 .Sh SEE ALSO
 .Xr cap_mkdb 1 ,
-.Xr diff 1 , 
+.Xr diff 1 ,
 .Xr make 1 ,
 .Xr newaliases 1 ,
 .Xr sh 1 ,
 .Xr pwd_mkdb 8
-.\".Sh HISTORY
+.Sh HISTORY
+The
+.Nm
+utility first appeared in
+.Fx 10.0 .
 .Sh AUTHORS
 The
 .Nm

Modified: head/sysutils/etcupdate/src/etcupdate.sh
==============================================================================
--- head/sysutils/etcupdate/src/etcupdate.sh	Tue Nov 12 19:53:01 2013	(r333611)
+++ head/sysutils/etcupdate/src/etcupdate.sh	Tue Nov 12 20:03:21 2013	(r333612)
@@ -61,14 +61,15 @@
 usage()
 {
 	cat <<EOF
-usage: etcupdate [-nBF] [-d workdir] [-r | -s source | -t tarball] [-A patterns]
-                 [-D destdir] [-I patterns] [-L logfile] [-M options]
+usage: etcupdate [-npBF] [-d workdir] [-r | -s source | -t tarball]
+                 [-A patterns] [-D destdir] [-I patterns] [-L logfile]
+                 [-M options]
        etcupdate build [-B] [-d workdir] [-s source] [-L logfile] [-M options]
                  <tarball>
        etcupdate diff [-d workdir] [-D destdir] [-I patterns] [-L logfile]
        etcupdate extract [-B] [-d workdir] [-s source | -t tarball] [-L logfile]
                  [-M options]
-       etcupdate resolve [-d workdir] [-D destdir] [-L logfile]
+       etcupdate resolve [-p] [-d workdir] [-D destdir] [-L logfile]
        etcupdate status [-d workdir] [-D destdir]
 EOF
 	exit 1
@@ -181,22 +182,31 @@ always_install()
 # $1 - directory to store new tree in
 build_tree()
 {
-	local make
+	local destdir dir file make
 
 	make="make $MAKE_OPTIONS"
 
 	log "Building tree at $1 with $make"
 	mkdir -p $1/usr/obj >&3 2>&1
-	(cd $SRCDIR; $make DESTDIR=$1 distrib-dirs) >&3 2>&1 || return 1
+	destdir=`realpath $1`
 
-	if ! [ -n "$nobuild" ]; then
-		(cd $SRCDIR; \
-	    MAKEOBJDIRPREFIX=$1/usr/obj $make _obj SUBDIR_OVERRIDE=etc &&
-	    MAKEOBJDIRPREFIX=$1/usr/obj $make everything SUBDIR_OVERRIDE=etc &&
-	    MAKEOBJDIRPREFIX=$1/usr/obj $make DESTDIR=$1 distribution) \
+	if [ -n "$preworld" ]; then
+		# Build a limited tree that only contains files that are
+		# crucial to installworld.
+		for file in $PREWORLD_FILES; do
+			dir=`dirname /$file`
+			mkdir -p $1/$dir >&3 2>&1 || return 1
+			cp -p $SRCDIR/$file $1/$file || return 1
+		done
+	elif ! [ -n "$nobuild" ]; then
+		(cd $SRCDIR; $make DESTDIR=$destdir distrib-dirs &&
+    MAKEOBJDIRPREFIX=$destdir/usr/obj $make _obj SUBDIR_OVERRIDE=etc &&
+    MAKEOBJDIRPREFIX=$destdir/usr/obj $make everything SUBDIR_OVERRIDE=etc &&
+    MAKEOBJDIRPREFIX=$destdir/usr/obj $make DESTDIR=$destdir distribution) \
 		    >&3 2>&1 || return 1
 	else
-		(cd $SRCDIR; $make DESTDIR=$1 distribution) >&3 2>&1 || return 1
+		(cd $SRCDIR; $make DESTDIR=$destdir distrib-dirs &&
+		    $make DESTDIR=$destdir distribution) >&3 2>&1 || return 1
 	fi
 	chflags -R noschg $1 >&3 2>&1 || return 1
 	rm -rf $1/usr/obj >&3 2>&1 || return 1
@@ -218,9 +228,15 @@ build_tree()
 # source tree.
 extract_tree()
 {
+	local files
+
 	# If we have a tarball, extract that into the new directory.
 	if [ -n "$tarball" ]; then
-		if ! (mkdir -p $NEWTREE && tar xf $tarball -C $NEWTREE) \
+		files=
+		if [ -n "$preworld" ]; then
+			files="$PREWORLD_FILES"
+		fi
+		if ! (mkdir -p $NEWTREE && tar xf $tarball -C $NEWTREE $files) \
 		    >&3 2>&1; then
 			echo "Failed to extract new tree."
 			remove_tree $NEWTREE
@@ -1298,6 +1314,11 @@ resolve_cmd()
 		return
 	fi
 
+	if ! [ -d $NEWTREE ]; then
+		echo "The current tree is not present to resolve conflicts."
+		exit 1
+	fi
+
 	conflicts=`(cd $CONFLICTS; find . ! -type d) | sed -e 's/^\.//'`
 	for file in $conflicts; do
 		resolve_conflict $file
@@ -1343,7 +1364,7 @@ update_cmd()
 		usage
 	fi
 
-	log "update command: rerun=$rerun tarball=$tarball"
+	log "update command: rerun=$rerun tarball=$tarball preworld=$preworld"
 
 	if [ `id -u` -ne 0 ]; then
 		echo "Must be root to update a tree."
@@ -1376,9 +1397,22 @@ update_cmd()
 				echo "Unable to create temporary directory."
 				exit 1
 			fi
-			OLDTREE=$NEWTREE
+
+			# A pre-world dryrun has already set OLDTREE to
+			# point to the current stock tree.
+			if [ -z "$preworld" ]; then
+				OLDTREE=$NEWTREE
+			fi
 			NEWTREE=$dir
 
+		# For a pre-world update, blow away any pre-existing
+		# NEWTREE.
+		elif [ -n "$preworld" ]; then
+			if ! remove_tree $NEWTREE; then
+				echo "Unable to remove pre-world tree."
+				exit 1
+			fi
+
 		# Rotate the existing stock tree to the old tree.
 		elif [ -d $NEWTREE ]; then
 			# First, delete the previous old tree if it exists.
@@ -1421,6 +1455,12 @@ EOF
 	# Initialize conflicts and warnings handling.
 	rm -f $WARNINGS
 	mkdir -p $CONFLICTS
+
+	# Ignore removed files for the pre-world case.  A pre-world
+	# update uses a stripped-down tree.
+	if [ -n "$preworld" ]; then
+		> $WORKDIR/removed.files
+	fi
 	
 	# The order for the following sections is important.  In the
 	# odd case that a directory is converted into a file, the
@@ -1535,7 +1575,8 @@ always=
 dryrun=
 ignore=
 nobuild=
-while getopts "d:nrs:t:A:BD:FI:L:M:" option; do
+preworld=
+while getopts "d:nprs:t:A:BD:FI:L:M:" option; do
 	case "$option" in
 		d)
 			WORKDIR=$OPTARG
@@ -1543,6 +1584,9 @@ while getopts "d:nrs:t:A:BD:FI:L:M:" opt
 		n)
 			dryrun=YES
 			;;
+		p)
+			preworld=YES
+			;;
 		r)
 			rerun=YES
 			;;
@@ -1633,6 +1677,9 @@ WARNINGS=$WORKDIR/warnings
 # Use $EDITOR for resolving conflicts.  If it is not set, default to vi.
 EDITOR=${EDITOR:-/usr/bin/vi}
 
+# Files that need to be updated before installworld.
+PREWORLD_FILES="etc/master.passwd etc/group"
+
 # Handle command-specific argument processing such as complaining
 # about unsupported options.  Since the configuration file is always
 # included, do not complain about extra command line arguments that
@@ -1644,19 +1691,39 @@ case $command in
 			echo
 			usage
 		fi
+		if [ -n "$rerun" -a -n "$preworld" ]; then
+			echo "Only one of -p or -r can be specified."
+			echo
+			usage
+		fi
+		;;
+	build|diff|status)
+		if [ -n "$dryrun" -o -n "$rerun" -o -n "$tarball" -o
+		     -n "$preworld" ]; then
+			usage
+		fi
 		;;
-	build|diff|resolve|status)
+	resolve)
 		if [ -n "$dryrun" -o -n "$rerun" -o -n "$tarball" ]; then
 			usage
 		fi
 		;;
 	extract)
-		if [ -n "$dryrun" -o -n "$rerun" ]; then
+		if [ -n "$dryrun" -o -n "$rerun" -o -n "$preworld" ]; then
 			usage
 		fi
 		;;
 esac
 
+# Pre-world mode uses a different set of trees.  It leaves the current
+# tree as-is so it is still present for a full etcupdate run after the
+# world install is complete.  Instead, it installs a few critical files
+# into a separate tree.
+if [ -n "$preworld" ]; then
+	OLDTREE=$NEWTREE
+	NEWTREE=$WORKDIR/preworld
+fi
+
 # Open the log file.  Don't truncate it if doing a minor operation so
 # that a minor operation doesn't lose log info from a major operation.
 if ! mkdir -p $WORKDIR 2>/dev/null; then



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201311122003.rACK3M1S086784>