Date: Sun, 17 May 2015 23:48:01 +0000 (UTC) From: John Marino <marino@FreeBSD.org> To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r386647 - in head/ports-mgmt: . genpatch genpatch/files Message-ID: <201505172348.t4HNm1oP090179@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: marino Date: Sun May 17 23:48:01 2015 New Revision: 386647 URL: https://svnweb.freebsd.org/changeset/ports/386647 Log: Add new port ports-mgmt/genpatch (toolset used in dports for 18 months) ===== This is a set of three simple tools written in sh(1) for generating single patches for use in Ports. This set is ideal for creating a new patch when it is inconvenient or undesirable to use the "make makepatch" utility. The first tool is "dupe" which is a quick copy utility. The second tool is "genpatch" which creates patches in the standards diff format and using the standard file name conventions. The last tool is "portfix" which runs "dupe", an editor of choice, and "genpatch" serially as a macro as a convenient and quick way to create port patches. Please see the dupe, genpatch, and portfix man pages for details. Added: head/ports-mgmt/genpatch/ head/ports-mgmt/genpatch/Makefile (contents, props changed) head/ports-mgmt/genpatch/files/ head/ports-mgmt/genpatch/files/dupe (contents, props changed) head/ports-mgmt/genpatch/files/dupe.1 (contents, props changed) head/ports-mgmt/genpatch/files/genpatch.1 (contents, props changed) head/ports-mgmt/genpatch/files/genpatch.in (contents, props changed) head/ports-mgmt/genpatch/files/portfix.1 (contents, props changed) head/ports-mgmt/genpatch/files/portfix.in (contents, props changed) head/ports-mgmt/genpatch/pkg-descr (contents, props changed) Modified: head/ports-mgmt/Makefile Modified: head/ports-mgmt/Makefile ============================================================================== --- head/ports-mgmt/Makefile Sun May 17 22:44:09 2015 (r386646) +++ head/ports-mgmt/Makefile Sun May 17 23:48:01 2015 (r386647) @@ -10,6 +10,7 @@ SUBDIR += distilator SUBDIR += fastest_sites SUBDIR += fbsdmon + SUBDIR += genpatch SUBDIR += genplist SUBDIR += gnome-packagekit SUBDIR += hs-porte Added: head/ports-mgmt/genpatch/Makefile ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/ports-mgmt/genpatch/Makefile Sun May 17 23:48:01 2015 (r386647) @@ -0,0 +1,46 @@ +# Created by: John Marino <marino@FreeBSD.org> +# $FreeBSD$ + +PORTNAME= genpatch +PORTVERSION= 1.40 +CATEGORIES= ports-mgmt +MASTER_SITES= # none +DISTFILES= # none + +MAINTAINER= marino@FreeBSD.org +COMMENT= Single patch generator tool compatible with makepatch format + +LICENSE= BSD2CLAUSE + +NO_BUILD= yes +SUB_FILES= genpatch portfix +SUB_LIST= WORKPATH=${PORTWORK} +PLIST_FILES= bin/dupe \ + bin/genpatch \ + bin/portfix \ + man/man1/dupe.1.gz \ + man/man1/genpatch.1.gz \ + man/man1/portfix.1.gz + +.if defined(PACKAGE_BUILDING) # use known default values, poudriere overrides +. if defined(.MAKE.BUILT.BY) # DragonFly! +PORTWORK= /usr/obj/dports +. else +PORTWORK= /usr/ports +. endif +.else +. if defined(WRKDIRPREFIX) && !empty(WRKDIRPREFIX) +PORTWORK= ${WRKDIRPREFIX} +. else +PORTWORK= ${PORTSDIR} +. endif +.endif + +do-install: + ${INSTALL_SCRIPT} ${FILESDIR}/dupe ${STAGEDIR}${PREFIX}/bin + ${INSTALL_SCRIPT} ${WRKDIR}/genpatch ${STAGEDIR}${PREFIX}/bin + ${INSTALL_SCRIPT} ${WRKDIR}/portfix ${STAGEDIR}${PREFIX}/bin + (cd ${FILESDIR} && ${INSTALL_MAN} dupe.1 genpatch.1 portfix.1 \ + ${STAGEDIR}${MANPREFIX}/man/man1) + +.include <bsd.port.mk> Added: head/ports-mgmt/genpatch/files/dupe ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/ports-mgmt/genpatch/files/dupe Sun May 17 23:48:01 2015 (r386647) @@ -0,0 +1,49 @@ +#!/bin/sh +# +# Usage: dupe origfile +# +# This will make a duplicate of the file indicate by the first argument. +# If <origfile>.orig does not exist, the duplicate will have this name, +# otherwise it will be called <origfile>.intermediate. +# This is a complementary tool of genpatch +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR +# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# + +if [ $# -eq 1 ]; then + old=${1} + if [ ! -f ${old} ]; then + echo "${0}: '${old}' does not exist! aborting..." + exit 1; + fi + if [ -f "${old}.orig" ]; then + new="${old}.intermediate" + else + new="${old}.orig" + fi +else + echo "${0}: need exactly one argument" + echo "${0} <path/to/original/file>" + exit 1; +fi + +cp -p ${old} ${new} Added: head/ports-mgmt/genpatch/files/dupe.1 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/ports-mgmt/genpatch/files/dupe.1 Sun May 17 23:48:01 2015 (r386647) @@ -0,0 +1,30 @@ +.Dd May 17, 2015 +.Dt DUPE 1 +.Os +.Sh NAME +.Nm dupe +.Nd duplicate a file quickly +.Sh SYNOPSIS +.Nm +.Ar original +.Sh DESCRIPTION +This utility is always called by +.Xr portfix 1 , +but sometimes it is useful in its own right. + +.Nm +takes exactly one argument, a path to a file. It will duplicate the +.Op original +file to "<original>.orig" unless there is already an existing file with +this exact name. In that case, the target file name will be "<original>.intermediate" +and any existing file of that name will be unconditionally overwritten. +.Pp +.Sh ERRORS +.Nm +will abort if zero or more than one argument is given, or if +.Op original +is not a path to a valid regular file. +.Pp +.Sh SEE ALSO +.Xr genpatch 1 , +.Xr portfix 1 Added: head/ports-mgmt/genpatch/files/genpatch.1 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/ports-mgmt/genpatch/files/genpatch.1 Sun May 17 23:48:01 2015 (r386647) @@ -0,0 +1,87 @@ +.Dd 17 May, 2015 +.Dt GENPATCH 1 +.Os +.Sh NAME +.Nm genpatch +.Nd generate patch quickly in standard FreeBSD ports format +.Sh SYNOPSIS +.Nm +.Ar newfile +.Nm +.Ar oldfile +.Ar newfile +.Sh DESCRIPTION +This utility is always called by +.Xr portfix 1 , +but quite often it is useful in its own right. + +It creates patches using the standard FreeBSD ports format defined by the "make makepatch" +ports utility, but there are different operational modes. + +If +.Nm +is called when the current working directory is a subdirectory of WRKDIRPREFIX if defined +or PORTSDIR if not, then a patch will be saved in the current directory using the naming +standard used by "make makepatch". Note that the utility assumes that it has been executed +in the WRKSRC directory, the standard location for applying ports patches. + +If +.Nm +is executed outside of WRKDIRPREFIX (or PORTSDIR), then a patch will not be created. The +contents of the patch will be send to stdout, so the user will have to direct it to a +file manually as desired. + +If only one argument is given, +.Nm +will search for a file named "<newfile>.intermediate" and if found, it will generated diff +output between it and +.Op newfile . +If that file doesn't exist, it will search for "<newfile>.orig" and attempt to create diff +output between it and +.Op newfile . +.Pp +.Sh ERRORS +.Nm +will abort if no arguments or more than 2 arguments are given. If only one argument ( +.Op newfile +) is given, then a regular file called "<newfile>.orig" or "<newfile>.intermediate" +must exist otherwise +.Nm +will abort. If two arguments are given, both must be existing regular files. +.Pp +.Sh ENVIRONMENT +.Bl -tag -width "PORTEDITOR" -indent +.It Ev WORKTREE +Overrides hardcoded WRKDIRPREFIX (or PORTSDIR). This is useful for ports outside of the tree +or when +.Nm +was installed via binary packages and WRKDIRPREFIX is defined (or PORTSDIR is non-standard) +.Pp +.Sh NOTES +.Bl -enum -compact +.It +FreeBSD does not set WRKDIRPREFIX by default +.It +The default PORTSDIR for FreeBSD is +.Pa /usr/ports +so on standard FreeBSD systems +.Nm +will generate a patch file in the current directory if executed on any subdirectory of +.Pa /usr/ports . +.It +Dragonfly sets WRKDIRPREFIX to +.Pa /usr/obj/dports +by default, so on standard systems patch +files are generated automatically if +.Nm +is executed from a subdirectory of +.Pa /usr/obj/dports . +.It +The root directory used for this calculation is permanently set when +.Nm +is built, but it can be overridden with the WORKTREE environment variable. +.El +.Pp +.Sh SEE ALSO +.Xr dupe 1 , +.Xr portfix 1 Added: head/ports-mgmt/genpatch/files/genpatch.in ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/ports-mgmt/genpatch/files/genpatch.in Sun May 17 23:48:01 2015 (r386647) @@ -0,0 +1,98 @@ +#!/bin/sh +# +# Usage: genpatch newfile +# genpatch oldfile newfile +# +# Will output a patch ready for dports (unified diff). +# If only newfile is given, oldfile is assumed as newfile.intermediate (1st) +# or newfile.orig (2nd) if such a file exists +# If the realpath doesn't start with /usr/obj/dports, sends output to stdout +# Otherwise, the patch file will be created in the current directory with a +# filename on the file's location relative to worksource. The patch will be +# generated from wrksrc location. + +# +# Copyright (c) 2004-2011 The NetBSD Foundation, Inc. +# Copyright (c) 2011 by Thomas Klausner <wiz@NetBSD.org> +# Copyright (c) 2012 by John Marino <draco@marino.st> +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR +# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +# Ensure we always use the same timezone to avoid spurious metadata diffs +export TZ=UTC + +if [ $# -le 1 ] +then + if [ -f "$1.intermediate" ]; then + old="$1.intermediate" + new="$1" + elif [ -f "$1.orig" ]; then + old="$1.orig" + new="$1" + else + echo $0: need at least one valid argument >&2 + exit 1; + fi +else + if [ $# -eq 2 ] + then + old="$1" + new="$2" + else + echo $0: more than two arguments detected >&2 + exit 1; + fi +fi + +PKGDIFF_FMT="-p --unified=3" + +# Strip out the date on the +++ line to reduce needless +# differences in regenerated patches +SEDPLUS='/^---/s|\.[0-9]* +0000$| UTC| ; /^+++/s|\([[:blank:]][-0-9:.+]*\)*$||' + +if diff -q ${PKGDIFF_FMT} ${old} ${new} > /dev/null +then + exit 0 +fi + +if [ -n "${WORKTREE}" ]; then +objpath=${WORKTREE} +else +objpath=$(realpath %%WORKPATH%%) +fi +cnt1=$(echo ${objpath} | wc -c) +objcount=$(expr $cnt1 - 1) +fullpath=$(dirname `realpath ${old}`) +testpath=$(echo ${fullpath} | cut -c "1-${objcount}") + +if [ "${testpath}" = "${objpath}" ]; then + # Inside standard work area. Assume genpatch executed from wrksrc + # and generate patch with appropriate name + + fname=patch-$(echo ${new} | sed -e 's|_|__|g' -e 's|/|_|g') + diff ${PKGDIFF_FMT} ${old} ${new} | sed -e "${SEDPLUS}" > ${fname} + echo "generated ${fname}" +else + # Not in standard work area, just send patch to stdout + diff ${PKGDIFF_FMT} ${old} ${new} | sed -e "${SEDPLUS}" +fi Added: head/ports-mgmt/genpatch/files/portfix.1 ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/ports-mgmt/genpatch/files/portfix.1 Sun May 17 23:48:01 2015 (r386647) @@ -0,0 +1,72 @@ +.Dd 17 May 2015 +.Dt PORTFIX 1 +.Os +.Sh NAME +.Nm portfix +.Nd macro to execute three programs to create a ports patch +.Sh SYNOPSIS +.Nm +.Ar original +.Sh DESCRIPTION +.Nm +is a wrapper. It consecutively runs: + +.Bl -enum -compact +.It +dupe +.Ar original +.It +<editor> +.Ar original +.It +genpatch +.Ar original +.El + +If PORTEDITOR is defined in the environment then that program will be used to edit +.Op original +file. If PORTEDITOR is not defined but EDITOR is defined, then the EDITOR program +will be invoked. If neither variable is defined in the environment, then +.Xr vi 1 +will be invoked for the edit step. + +.Nm +should be launched when the current working directory is equal to the port's WRKSRC, and +.Op original +should be a relative path to file that needs a patch. Assuming changes are saved after +the editor appears, a patch file will be automatically generated in the proper diff format +with the standard "make makepatch" naming convention. It only needs to be moved to the +port's "files" directory to be used. + +If +.Nm +is launched outside of the port's WRKSRC, then diff output will still be generated, but it +will be sent to stdout rather than to a file. This will also occur when the port is located +outside of the standard tree. +.Pp +.Pp +.Sh ERRORS +The script will abort if the number of arguments does not equal one, or if the one argument +is not an existing regular file. + +If the editor is closed without making changes, no patch will be created. However, the +duplicated file will exist. If the script is run again, it will detect the duplicate and +create a second duplicate with the .intermediate extension. See +.Xr genpatch 1 +for more information. +.Sh ENVIRONMENT +.Bl -tag -width "PORTEDITOR" -indent +.It Ev PORTEDITOR +First priority editor to use for modifying file to be patched +.It Ev EDITOR +Second priority editor to use for modifying file to be patched +.El +.Sh SEE ALSO +.Xr dupe 1 , +.Xr genpatch 1 +.Sh HISTORY +This script was inspired by pkgsrc's pkgdiff suite although it works a bit differently. +It was written by +.An John Marino Aq Mt marino@freebsd.org +and used for a couple of years on DragonFly's DPorts before being formally imported +into FreeBSD Ports Collection. Added: head/ports-mgmt/genpatch/files/portfix.in ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/ports-mgmt/genpatch/files/portfix.in Sun May 17 23:48:01 2015 (r386647) @@ -0,0 +1,39 @@ +#!/bin/sh +# +# usage: portfix origfile +# +# This is a wrapper. It runs consecutively: +# 1. dupe XXX +# 2. <editor> XXX +# 3. genpatch XXX +# +# If PORTEDITOR is defined in the environment, that program will be +# used instead of the EDITOR env. variable. If neither are defined +# it will fall back to vi. + + +if [ $# -eq 1 ]; then + old=${1} + if [ ! -f ${old} ]; then + echo "${0}: '${old}' does not exist! aborting..." + exit 1; + fi +else + echo "${0}: need exactly one argument" + echo "${0} <path/to/original/file>" + exit 1; +fi + +if [ -n "${PORTEDITOR}" ]; then + MYPORTEDITOR=${PORTEDITOR} +elif [ -n "${EDITOR}" ]; then + MYPORTEDITOR=${EDITOR} +else + MYPORTEDITOR=/usr/bin/vi +fi + +%%PREFIX%%/bin/dupe ${old} +${MYPORTEDITOR} ${old} +if [ $? -eq 0 ]; then + %%PREFIX%%/bin/genpatch ${old} +fi Added: head/ports-mgmt/genpatch/pkg-descr ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/ports-mgmt/genpatch/pkg-descr Sun May 17 23:48:01 2015 (r386647) @@ -0,0 +1,11 @@ +This is a set of three simple tools written in sh(1) for generating single +patches for use in Ports. This set is ideal for creating a new patch when +it is inconvenient or undesirable to use the "make makepatch" utility. + +The first tool is "dupe" which is a quick copy utility. The second tool +is "genpatch" which creates patches in the standards diff format and +using the standard file name conventions. The last tool is "portfix" +which runs "dupe", an editor of choice, and "genpatch" serially as a +macro as a convenient and quick way to create port patches. + +Please see the dupe, genpatch, and portfix man pages for details.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201505172348.t4HNm1oP090179>