Index: head/Tools/scripts/rmport =================================================================== --- head/Tools/scripts/rmport (revision 159776) +++ head/Tools/scripts/rmport (revision 159777) @@ -1,315 +1,327 @@ #!/bin/sh -e # # rmport - remove port(s) from the FreeBSD Ports Collection. # # Copyright 2006 Vasil Dimov # 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 AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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. # # Authors: # Originally written by Vasil Dimov # Others: # # $FreeBSD$ # # MAINTAINER= vd@FreeBSD.org # PORTSDIR=${PORTSDIR:-/usr/ports} INDEX=${PORTSDIR}/`make -C ${PORTSDIR} -V INDEXFILE` TODAY=`date -u -v+0d +%Y-%m-%d` SED="sed -i .orig -E" # use ~/.ssh/config to set up the desired username if different than $LOGNAME PCVS=${PCVS:-cvs -d pcvs.freebsd.org:/home/pcvs} log() { echo "==> $*" >&2 } +pkgname() +{ + make -C ${PORTSDIR}/${1} -V PKGNAME +} + find_expired() { EXPVAR=EXPIRATION_DATE find ${PORTSDIR} -mindepth 3 -maxdepth 3 -name "Makefile*" \ |xargs grep -H ${EXPVAR} \ |sed -E "s|${PORTSDIR}/?([^/]+/[^/]+)/Makefile:${EXPVAR}=[[:space:]]*([0-9-]{10})$|\2 \1|g" \ |perl -ne "if ((substr(\$_, 0, 10) cmp '${TODAY}') <= 0) { print(\$_); }" } # create temporary checkout directory mkcodir() { log "creating temporary directory" d=`mktemp -d -t rmport` log "created ${d}" echo "${d}" } # checkout common files from the repository co_common() { log "getting CVSROOT/modules, ports/MOVED and ports/LEGAL from repository" ${PCVS} co CVSROOT/modules ports/MOVED ports/LEGAL } # check if some ports depend on the given port -# XXX INDEX file may be outdated and not contain recently added dependencies -# it is very unlikely for someone to make a port to depend on a port that -# has EXPIRATION_DATE set +# XXX Very Little Chance (tm) for breaking INDEX exists: +# /usr/ports/INDEX may be outdated and not contain recently added dependencies +# Anyway, it is very unlikely for someone to make a port to depend on a port +# that has EXPIRATION_DATE set, or /usr/ports/INDEX is really outdated - from +# before EXPIRATION_DATE being set check_dep() { - cat=${1} - port=${2} - pkgname=${3} - persist=${4} + catport=${1} + persist=${2} + alltorm=${3} + pkgname=`pkgname ${catport}` + rmpkgs="" + rmcatports="" + for torm in ${alltorm} ; do + rmpkgs="${rmpkgs:+${rmpkgs}|}`pkgname ${torm}`" + rmcatports="${rmcatports:+${rmcatports}|}${PORTSDIR}/${torm}/" + done + while : ; do - log "${cat}/${port}: checking dependencies" + log "${catport}: checking dependencies" err=0 - deps=`grep -E "^.+${pkgname}" ${INDEX} || :` + deps=`grep -E "${pkgname}" ${INDEX} |grep -vE "^(${rmpkgs})" || :` if [ -n "${deps}" ] ; then - log "${cat}/${port}: some port(s) depend on ${pkgname}:" - printf "%s\n" "${deps}" + log "${catport}: some port(s) depend on ${pkgname}:" + printf "%s\n" "${deps}" >&2 err=1 fi # check if some port mentions the port to be deleted - r="`find ${PORTSDIR} -mindepth 3 -maxdepth 3 -not -path "*/${cat}/${port}/*" -name "Makefile*" |xargs grep -Hw ${cat}/${port} || :`" + r="`find ${PORTSDIR} -mindepth 3 -maxdepth 3 -name "Makefile*" \ + |xargs grep -Hw ${catport} \ + |grep -vE "^(${rmcatports})" || :`" if [ -n "${r}" ] ; then - log "${cat}/${port}: some ports mention ${cat}/${port} in their Makefiles" + log "${catport}: some ports mention ${catport} in their Makefiles:" printf "%s\n" "${r}" >&2 err=1 fi if [ ${err} -eq 0 ] ; then break fi if [ ${persist} -eq 0 ] ; then break fi read -p 'deal with the above issues and hit when ready' answer done } # checkout port's specific files from the repository co_port() { cat=${1} port=${2} log "${cat}/${port}: getting ${cat}/Makefile and port's files from repository" ${PCVS} co ports/${cat}/Makefile ports/${cat}/${port} } # check if anything about the port is mentioned in ports/LEGAL check_LEGAL() { - cat=${1} - port=${2} - pkgname=${3} + catport=${1} + pkgname=${2} - for checkstr in ${pkgname} ${cat}/${port} ; do - msg="${cat}/${port}: checking if ${checkstr} is in ports/LEGAL" + for checkstr in ${pkgname} ${catport} ; do + msg="${catport}: checking if ${checkstr} is in ports/LEGAL" log "${msg}" while grep -i ${checkstr} ports/LEGAL ; do read -p "${checkstr} is in ports/LEGAL, remove it and hit when ready" answer log "${msg}" done done } # remove port's entry from CVSROOT/modules edit_modules() { cat=${1} port=${2} log "${cat}/${port}: removing from CVSROOT/modules" ${SED} -e "/^(ports_)?(..-)?${port}[[:space:]]+ports\/${cat}\/${port}\$/d" \ CVSROOT/modules } # add port's entry to ports/MOVED edit_MOVED() { - cat=${1} - port=${2} + catport=${1} - DEPRECATED="`make -C ${PORTSDIR}/${cat}/${port} -V DEPRECATED`" + DEPRECATED="`make -C ${PORTSDIR}/${catport} -V DEPRECATED`" DEPRECATED=${DEPRECATED:+: ${DEPRECATED}} REASON="Has expired${DEPRECATED}" - log "${cat}/${port}: adding entry to ports/MOVED" + log "${catport}: adding entry to ports/MOVED" - echo "${cat}/${port}||${TODAY}|${REASON}" >> ports/MOVED + echo "${catport}||${TODAY}|${REASON}" >> ports/MOVED } # remove port from category/Makefile edit_Makefile() { cat=${1} port=${2} log "${cat}/${port}: removing from ${cat}/Makefile" ${SED} -e "/^[[:space:]]*SUBDIR[[:space:]]*\+=[[:space:]]*${port}([[:space:]]+#.*)?$/d" \ ports/${cat}/Makefile } # remove port's files rm_port() { - cat=${1} - port=${2} + catport=${1} - log "${cat}/${port}: removing port's files" + log "${catport}: removing port's files" - ${PCVS} rm `find ports/${cat}/${port} -type f -not -path "*/CVS/*" -delete -print` + ${PCVS} rm `find ports/${catport} -type f -not -path "*/CVS/*" -delete -print` } # diff diff() { log "creating diff" diffout=${codir}/diff ${PCVS} diff -u CVSROOT/modules ports/MOVED ports/LEGAL \ ports > ${diffout} 2>&1 || : read -p "hit to view cvs diff output" answer # give this to the outside world so it can be removed when we are done echo ${diffout} } # ask for confirmation and commit commit() { read -p "do you want to commit? [yn] " answer if [ "${answer}" = "y" -o "${answer}" = "Y" ] ; then ${PCVS} ci CVSROOT/modules ports/MOVED ports/LEGAL \ ports fi } cleanup() { diffout=${1} codir=${2} log "cleaning up" rm ${diffout} # release cvs directories ${PCVS} rel -d CVSROOT ports cd / rmdir ${codir} } usage() { echo "Usage:" >&2 echo "find expired ports:" >&2 echo "${0} -F" >&2 echo "remove port(s):" >&2 echo "${0} category1/port1 [ category2/port2 ... ]" >&2 echo "just check dependencies:" >&2 echo "${0} -d category/port" >&2 exit 64 } # main if [ ${#} -eq 0 -o "${1}" = "-h" -o "${1}" = "--help" ] ; then usage fi if [ ${1} = "-d" ] ; then if [ ${#} -ne 2 ] ; then usage fi catport=${2} - cat=`dirname ${catport}` - port=`basename ${catport}` - pkgname=`make -C ${PORTSDIR}/${cat}/${port} -V PKGNAME` - check_dep ${cat} ${port} ${pkgname} 0 + check_dep ${catport} 0 ${catport} exit fi if [ ${1} = "-F" ] ; then if [ ${#} -ne 1 ] ; then usage fi find_expired exit fi codir=`mkcodir` cd ${codir} co_common for catport in $* ; do cat=`dirname ${catport}` port=`basename ${catport}` - pkgname=`make -C ${PORTSDIR}/${cat}/${port} -V PKGNAME` + # remove any trailing slashes + catport="${cat}/${port}" + pkgname=`pkgname ${cat}/${port}` - check_dep ${cat} ${port} ${pkgname} 1 + check_dep ${catport} 1 "${*}" co_port ${cat} ${port} - check_LEGAL ${cat} ${port} ${pkgname} + check_LEGAL ${catport} ${pkgname} # everything seems ok, edit the files edit_modules ${cat} ${port} - edit_MOVED ${cat} ${port} + edit_MOVED ${catport} edit_Makefile ${cat} ${port} - rm_port ${cat} ${port} + rm_port ${catport} done diffout=`diff` # EDITOR instead of PAGER because vim has nice syntax highlighting ;-) ${EDITOR} ${diffout} commit cleanup ${diffout} ${codir} # EOF Property changes on: head/Tools/scripts/rmport ___________________________________________________________________ Modified: cvs2svn:cvs-rev ## -1 +1 ## -1.2 \ No newline at end of property +1.3 \ No newline at end of property