From owner-svn-ports-all@freebsd.org Thu Jun 4 09:19:51 2020 Return-Path: Delivered-To: svn-ports-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 61DF9331E2B; Thu, 4 Jun 2020 09:19:51 +0000 (UTC) (envelope-from mandree@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 49d0bq20MWz4DsD; Thu, 4 Jun 2020 09:19:51 +0000 (UTC) (envelope-from mandree@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 3FCC71D232; Thu, 4 Jun 2020 09:19:51 +0000 (UTC) (envelope-from mandree@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0549Jpqs043212; Thu, 4 Jun 2020 09:19:51 GMT (envelope-from mandree@FreeBSD.org) Received: (from mandree@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0549JpMU043211; Thu, 4 Jun 2020 09:19:51 GMT (envelope-from mandree@FreeBSD.org) Message-Id: <202006040919.0549JpMU043211@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: mandree set sender to mandree@FreeBSD.org using -f From: Matthias Andree Date: Thu, 4 Jun 2020 09:19:51 +0000 (UTC) To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r537876 - head/Tools/scripts X-SVN-Group: ports-head X-SVN-Commit-Author: mandree X-SVN-Commit-Paths: head/Tools/scripts X-SVN-Commit-Revision: 537876 X-SVN-Commit-Repository: ports MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-ports-all@freebsd.org X-Mailman-Version: 2.1.33 Precedence: list List-Id: SVN commit messages for the ports tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 04 Jun 2020 09:19:51 -0000 Author: mandree Date: Thu Jun 4 09:19:50 2020 New Revision: 537876 URL: https://svnweb.freebsd.org/changeset/ports/537876 Log: Tools/scripts/mfh: check out entire port directory even if touching only files/ - remove unused clean() function, trap does it - fix race around mktemp/setting up rm trap - rename filelist to dirlist so it matches its purpose - move defaults up front to the script - misc. minor edits PR: 246336 Approved by: portmgr (mat@) Differential Revision: https://reviews.freebsd.org/D24789 Modified: head/Tools/scripts/mfh Modified: head/Tools/scripts/mfh ============================================================================== --- head/Tools/scripts/mfh Thu Jun 4 09:04:37 2020 (r537875) +++ head/Tools/scripts/mfh Thu Jun 4 09:19:50 2020 (r537876) @@ -39,16 +39,18 @@ LF=$(printf '\nX') LF=${LF%X} IFS="${LF}" +# defaults from here --------------------------- + +: ${svnserver:="svn+ssh://repo.FreeBSD.org"} +: ${EDITOR:=vi} + +# implementation from here --------------------- + err() { echo "$@" >&2 exit 1 } -clean() { - rm -rf "${dir}" - exit 1 -} - ask() { question=${1} @@ -62,7 +64,7 @@ ask() { return 1 } -: "${svnserver:="svn+ssh://repo.FreeBSD.org"}" +# -- find svn and diff coloring command -- if [ -n "$(command -v svn 2>/dev/null)" ]; then svn=svn @@ -77,6 +79,11 @@ latest_branch=$("${svn}" ls ${svnserver}/ports/branche [ $# -lt 1 ] && err "$(basename "$0") requires at least 1 arguments: [] [...]" branch=$1 +if [ -n "$(command -v ydiff)" ] ; then cdiffcmd=ydiff +elif [ -n "$(command -v colordiff)" ] ; then cdiffcmd=colordiff +else cdiffcmd=cat +fi + # I sure hope by 2030 we'll be doing something else. Yes, famous last words. if expr "${branch}" : '20[12][0-9]Q[1-4]' > /dev/null; then shift @@ -87,6 +94,8 @@ else branch=${latest_branch} fi +## -- parse revisions -- + for rev in "$@" do rev=${rev##r} # remove a leading "r" @@ -95,13 +104,14 @@ do esac done +## -- set up tmpdir and auto-clean -- -trap "rc=\$? ; rm -rf \"\${dir}\" ; exit \$rc" EXIT -dir=$(mktemp -d /tmp/merge.XXXXXX) +dir=$(mktemp -d /tmp/mfh.XXXXXX) +trap "rc=\$? ; echo '+ rm -rf \"${dir}\"' ; rm -rf \"\${dir}\" ; trap - EXIT ; exit \$rc" EXIT INT QUIT TERM cd "${dir}" -"${svn}" co --depth=empty ${svnserver}/ports/branches/"${branch}" -filelist="" +## -- check out, merge, generate commit log -- + printf "MFH:" > commit.txt for rev in "$@" do @@ -109,24 +119,39 @@ do printf " r%s" "${rev}" >> commit.txt done echo >> commit.txt + +# iterate over revisions to assemble dirlist (for checkout) +# and accumulate log messages +dirlist="" for rev in "$@" do rev=${rev##r} for f in $("${svn}" diff --summarize -c "r${rev}" "${svnserver}/ports/head"); do + # ignore top-level filenames without slash case ${f} in */*) ;; - *)continue;; + *) continue ;; esac f=${f#*/ports/head/} - f=${f%/*} - filelist="${filelist}${LF}${f}" + # strip down f to the first two components (CATEGORY/PORTNAME), + # so that if the MFH only addresses files/, we still get the + # full port to review, and, for instance, bump PORTREVISION + # separately if the patch was broken out from a larger lump. + while :; do + case ${f} in + */*/*) f=${f%/*} ;; + *) break ;; + esac + done + dirlist="${dirlist}${f}${LF}" done "${svn}" log "-r${rev##-}" ${svnserver}/ports/head | sed '1,2d;$d;/^MFH:/d' \ | sed '$d' >> commit.txt done -filelist=$(printf '%s\n' "${filelist}" | sort -u) -"${svn}" up --parents $(printf '%s\n' $filelist \ - | sed "s}^}${branch}/}") +dirlist=$(printf '%s' "${dirlist}" | sort -u | sed "s}^}${branch}/}") + +"${svn}" co --quiet --depth=empty ${svnserver}/ports/branches/"${branch}" +"${svn}" up --parents --set-depth=infinity $dirlist "${svn}" up --quiet "${branch}" for rev in "$@" do @@ -134,19 +159,29 @@ do "${svn}" merge -c "r${rev}" ^/head/ "${branch}" done "${svn}" up --quiet "${branch}" -"${svn}" status "${branch}" -"${svn}" diff "${branch}" -echo "All the merge work was done in ${dir}/${branch}" + +## -- present final result to user -- +svnstat=$("${svn}" status "${branch}") +if [ -z "${svnstat}" ] ; then + err "The MFH came up empty - already merged? Wrong revision given?" +fi + +echo +printf '%s\n' "${svnstat}" +"${svn}" diff "${branch}" | $cdiffcmd +printf '\nSee the status/diff above: all the merge work was done on %s.\n' "${dir}/${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 + ask "Do you want to commit now? (no = clean up and abort)" || err "User-requested abort." ) echo >> commit.txt -echo "Approved by: " >> commit.txt -${EDITOR:-vi} commit.txt +echo "Approved by: " >> commit.txt + +## -- edit pre-assembled log message and commit -- +${EDITOR} commit.txt while ! "${svn}" ci -F commit.txt "${branch}"; do if ! ask "Commit failed. Re-edit message and try again?"; then save_log="$(mktemp -t mfh)" @@ -154,7 +189,8 @@ while ! "${svn}" ci -F commit.txt "${branch}"; do echo "Saving commit log to ${save_log}" break fi - ${EDITOR:-vi} commit.txt + ${EDITOR} commit.txt done -rm -rf "${dir}" -trap - 0 + +# the trap will clean up for us +exit 0