#! /bin/sh # Last updated: 20090622 patchfile=$1 if [ -z "$patchfile" -o ! -f $patchfile ]; then echo "usage: ${0##*/} " exit 1 fi login=$USER checkoutfile=${patchfile%%.diff}.checkout commitfile=${patchfile%%.diff}.commit echo_co() { echo $* >> $checkoutfile; } echo_ci() { echo $* >> $commitfile; } echo "#! /bin/sh" > $checkoutfile echo "#! /bin/sh" > $commitfile chmod 755 $checkoutfile chmod 755 $commitfile # Get the list of all changes files. minus=`grep -- "^--- " $patchfile | sed '/\/dev\/null/d;s|^--- ||;s|[ab]/||;s| .*||'` plus=`grep -- "^+++ " $patchfile | sed '/\/dev\/null/d;s|^+++ ||;s|[ab]/||;s| .*||'` checkout=`echo $minus $plus | tr ' ' '\n' | sed -E 's|/[^/]+$||;s|^(ports/)?|ports/|' | sort -u` if [ -n "$checkout" ]; then echo_co echo_co "# Checkout a few directories." for i in $checkout; do echo_co "cvs -d $login@pcvs.FreeBSD.org:/home/pcvs checkout -l $i" done fi # Find deleted files. deleted=`grep -B 1 -- "^+++ /dev/null" $patchfile | grep -- "^--- " | sed 's|[ab]/||;s|^--- ||;s| .*||'` if [ -n "$deleted" ]; then echo_ci echo_ci "# Removed files." echo_ci "cvs -d $login@pcvs.FreeBSD.org:/home/pcvs rm $deleted" | tr '\n' ' ' echo_ci fi # Find new files. added=`grep -A 1 -- "^--- /dev/null" $patchfile | grep -- "^+++ " | sed 's|[ab]/||;s|^+++ ||;s| .*||'` newdirs=`echo $added | tr ' ' '\n' | sed -E 's|/[^/]+$||' | sort -u` if [ -n "$newdirs" ]; then echo_ci "# Possible new directories." for i in $newdirs; do echo_ci "cvs -d $login@pcvs.FreeBSD.org:/home/pcvs add $i" done echo_ci fi if [ -n "$added" ]; then echo_ci "# New files." echo_ci "cvs -d $login@pcvs.FreeBSD.org:/home/pcvs add $added" | tr '\n' ' ' echo_ci fi if [ -n "$plus" -o -n "$minus" ]; then echo_ci "# Let's go!" echo_ci "cvs -d $login@pcvs.FreeBSD.org:/home/pcvs ci $plus $minus" | tr '\n' ' ' fi echo "I've generated two shell scripts for you. Typical use case is:" echo "" echo " $ ./$checkoutfile" echo " $ cd ports && patch -s -E -p0 < ../$patchfile" echo " $ ../$commitfile" echo ""