Status: ok

diff ./p~current~ ./p

 ----------- Diffstat output ------------
 ./p |   66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 62 insertions(+), 4 deletions(-)

diff ./p~current~ ./p
--- ./p~current~	2004-02-03 13:18:55.000000000 +1100
+++ ./p	2004-02-03 13:19:20.000000000 +1100
@@ -146,7 +146,7 @@ all_files()
 
 diff_one()
 {
-	if cmp -s "$1~current~" "$1"
+	if cmp -s "$1~current~" "$1" || [ ! -f "$1" -a ! -f "$1~current~" ]
 	then :
 	else
 		echo
@@ -168,10 +168,12 @@ diff_one_orig()
 
 commit_one()
 {
-	rm -f "$1~current~"
+    rm -f "$1~current~"
+    if [  -f "$1" ] ; then
 	mv "$1" "$1~current~"
 	cp -p "$1~current~" $1
 	chmod u+w $1
+    fi
 }
 
 discard_one()
@@ -623,6 +625,33 @@ case $cmd in
 	while [ -s "$pfile" ]  &&
 	     p apply last && p commit ; do : ; done
 	;;
+  decommit )
+	make_diff
+	get_meta
+	if [ -s .patches/patch ]
+	then
+	    echo >&2 Patch $name already open - please commit ; exit 1;
+	fi
+	if [ $# -eq 0 ]
+	then
+	    echo "Applied patches are:"
+	    ls .patches/applied
+	    exit 0
+	fi
+	if [ $# -ne 1 ]
+	then echo >&2 "Usage: p decommit patchname"; exit 1
+	fi
+	case $1 in
+	    last ) pfile=`ls -d .patches/applied/[0-9]* | tail -1` ; echo last is "$pfile";;
+	    */* ) pfile=$1 ;;
+	    * ) pfile=`echo .patches/applied/*$1*`
+	esac
+	if [ ! -f "$pfile" ]
+	then echo >&2 "Cannot find unique patch '$1' - found: $pfile"; exit 1
+	fi
+	while [ -s "$pfile" ]  &&
+	     p open last && p discard ; do : ; done
+	;;
   snapshot )
 	all_files snap_one
 	;;
@@ -653,6 +682,12 @@ case $cmd in
         cd .patches/SOURCE && bk pull
 	;;
   update )
+	make_diff
+	get_meta
+	if [ -s .patches/patch ]
+	then 
+		echo >&2 Patch $name already open - please commit; exit 1;
+	fi
         p openall && p clean &&
 	  (cd .patches/SOURCE ; bk export -tpatch -rLATEST, ) > .patches/imported-patch &&
 	  patch --dry-run -f -p1 < .patches/imported-patch &&
@@ -678,9 +713,32 @@ case $cmd in
 	    echo "Your address and other headers must be in .patches/owner"
 	    exit 1;
 	fi
+	messid="<`date +'%Y%m%d%H%M%S'`.$$.patches@`uname -n`>"
 	cnt=$(ls .patches/applied/???${1}* | wc -l)
 	cnt=$(echo $cnt)  # discard spaces
 	this=1
+	{
+	    cat .patches/owner
+	    echo "To: `cat .patches/maintainer`"
+	    if [ -s .patches/cc ] ; then
+		while read word prefix addr
+		  do if [ " $word" = " $1" ] ; then
+			echo "Cc: $addr" 
+			sprefix="$prefix - "
+		    fi
+		  done < .patches/cc
+	    fi
+	    if [ $cnt = 1 ]
+		  then
+		  echo "Subject: [PATCH] $sprefix Intro"
+		  else
+		  echo "Subject: [PATCH] ${sprefix}0 of $cnt - Introduction"
+	    fi
+	    echo "Message-ID: $messid"
+	    echo
+	    echo PUT COMMENTS HERE
+	} > .patches/mail/000Intro
+
 	for patch in .patches/applied/???${1}*
 	do
 	  {
@@ -702,9 +760,9 @@ case $cmd in
 		  else
 		  echo "Subject: [PATCH] $sprefix$this of $cnt - $head"
 	      fi
+	      echo "References: $messid"
 	      echo
-	      echo '### Comments for ChangeSet'
-	      sed -e '1,/^[^S]/d' $patch
+	      sed -e '1,3d' $patch
 	  } > .patches/mail/${patch#.patches/applied/}
 	  this=$(expr $this + 1)
 	done