From owner-svn-ports-head@FreeBSD.ORG Wed Jun 25 19:04:32 2014 Return-Path: Delivered-To: svn-ports-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 3DB3AE14; Wed, 25 Jun 2014 19:04:32 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 2A80F2A08; Wed, 25 Jun 2014 19:04:32 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.8/8.14.8) with ESMTP id s5PJ4WbQ082402; Wed, 25 Jun 2014 19:04:32 GMT (envelope-from mandree@svn.freebsd.org) Received: (from mandree@localhost) by svn.freebsd.org (8.14.8/8.14.8/Submit) id s5PJ4WmC082401; Wed, 25 Jun 2014 19:04:32 GMT (envelope-from mandree@svn.freebsd.org) Message-Id: <201406251904.s5PJ4WmC082401@svn.freebsd.org> From: Matthias Andree Date: Wed, 25 Jun 2014 19:04:32 +0000 (UTC) To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r359280 - head/Tools/scripts X-SVN-Group: ports-head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-ports-head@freebsd.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: SVN commit messages for the ports tree for head List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 25 Jun 2014 19:04:32 -0000 Author: mandree Date: Wed Jun 25 19:04:31 2014 New Revision: 359280 URL: http://svnweb.freebsd.org/changeset/ports/359280 QAT: https://qat.redports.org/buildarchive/r359280/ Log: ports/Tools/scripts/mfh revision: - use proper quoting - use fewer svn invocations - optionally drop to a shell before committing, to manually fix up a botched merge. - svnserver can be overridden in the environment. - Finally, we use sh's trap builtin to make sure we always clean up. PR: 186256 Approved by: portmgr (bapt@) Modified: head/Tools/scripts/mfh Modified: head/Tools/scripts/mfh ============================================================================== --- head/Tools/scripts/mfh Wed Jun 25 18:57:28 2014 (r359279) +++ head/Tools/scripts/mfh Wed Jun 25 19:04:31 2014 (r359280) @@ -27,15 +27,19 @@ # # MAINTAINER= portmgr@FreeBSD.org -set -e +set -eu + +LF=$(printf '\nX') +LF=${LF%X} +IFS="${LF}" err() { - echo $@ >&2 + echo "$@" >&2 exit 1 } clean() { - rm -rf ${dir} + rm -rf "${dir}" exit 1 } @@ -44,56 +48,63 @@ ask() { answer=x while [ "${answer}" != "y" -a "${answer}" != "n" ] ; do - read -p "${question} [yn] " answer + read -p "${question} [y/n] " answer done [ "${answer}" = "y" ] && return 0 return 1 } -[ $# -ne 2 ] && err "Takes 2 arguments: " +[ $# -ne 2 ] && err "$(basename $0) requires 2 arguments: " branch=$1 rev=${2##r} # remove a leading "r" case ${rev} in ''|*[!0-9]*) err "revision should be a number" ;; esac -svnserver="svn.FreeBSD.org" +: ${svnserver:="svn.FreeBSD.org"} if [ -n "$(type svn 2>/dev/null)" ]; then svn=svn elif [ -n "$(type svnlite 2>/dev/null)" ]; then svn=svnlite else - err "svn(1) and svnlite(1) not found. please install devel/subversion" + err "Neither svn(1) nor svnlite(1) found. Please install devel/subversion." fi - -dir=$(mktemp -d /tmp/merge.XXX) -cd ${dir} -${svn} co --depth=empty svn+ssh://${svnserver}/ports/branches/${branch} +trap "rc=\$? ; rm -rf \"\${dir}\" ; exit \$rc" EXIT +dir=$(mktemp -d /tmp/merge.XXXXXX) +cd "${dir}" +"${svn}" co --depth=empty svn+ssh://${svnserver}/ports/branches/"${branch}" filelist="" # svn:// is faster than svn+ssh://. Use it wherever it's possible. -for f in $(${svn} diff --summarize -c ${rev} svn://${svnserver}/ports/head); do +for f in $("${svn}" diff --summarize -c ${rev} svn://${svnserver}/ports/head); do case ${f} in */*) ;; *)continue;; esac f=${f#*/ports/head/} f=${f%/*} - filelist="${filelist}\n${f}" + filelist="${filelist}${LF}${f}" done -filelist=$(echo -e ${filelist} | sort -u) +filelist=$(printf '%s\n' "${filelist}" | sort -u) echo "MFH: r${rev}" > commit.txt -${svn} log -r${rev} svn://${svnserver}/ports/head | sed '1,2d;$d;/^MFH:/d' >> commit.txt -for f in ${filelist}; do - ${svn} up --parents ${branch}/${f} -done -${svn} up --quiet ${branch} -${svn} merge -c r${rev} ^/head/ ${branch} -${svn} up --quiet ${branch} -${svn} diff ${branch} -ask "Do you want to commit?" || clean +"${svn}" log -r${rev} svn://${svnserver}/ports/head | sed '1,2d;$d;/^MFH:/d' >> commit.txt +"${svn}" up --parents $(printf '%s\n' $filelist \ + | sed "s}^}${branch}/}") +"${svn}" up --quiet "${branch}" +"${svn}" merge -c r${rev} ^/head/ "${branch}" +"${svn}" up --quiet "${branch}" +"${svn}" status "${branch}" +"${svn}" diff "${branch}" +ask "Do you want to commit? (no = start a shell)" || ( + echo "Dropping you to a shell so you can investigate. Exit the shell to resume this script." + cd "${branch}" + pwd + su -m $(id -un) || : + ask "Do you want to commit now? (no = clean up and abort)" || clean +) ${EDITOR:-vi} commit.txt -${svn} ci -F commit.txt ${branch} -rm -rf ${dir} +"${svn}" ci -F commit.txt "${branch}" +rm -rf "${dir}" +trap - 0