#!/bin/rc rfork e fn xchmod { chmod $* >[2]/dev/null } flagfmt='i' args='name email file... [< description]' if(! ifs=() eval `{aux/getflags $*} || ~ $#* 0 1 2){ aux/usage exit usage } if(! echo $1 | grep -s '^[a-z_0-9.\-]+$'){ echo 'bad name: [a-z0-9._\-]+ only' >[1=2] exit usage } if(! echo $2 | grep -s '^(-|[A-Za-z0-9.\-+]+@[A-Za-z0-9.\-+]+)$'){ echo 'bad email: [a-z0-9.-+] only; use ''-'' to not leave an email address.' >[1=2] exit usage } if(! test -d /n/sources/patch){ rfork n 9fs sources } patch=$1 email=$2 shift shift d=/n/sources/patch/$patch if(! mkdir $d){ echo mkdir $d failed >[1=2] exit mkdir } if(! ~ $email -){ echo $email >$d/email } xchmod o-w $d >$d/readme >$d/files >$d/notes for(i in $*){ i=`{cleanname -d `{pwd} $i} if(! test -f $i){ echo error: cannot find $i >[1=2] rm -rf $d exit oops } short=`{basename $i} uniq=$short n=0 while(test -f $d/$uniq){ uniq=$short.$n n=`{echo 1+$n | hoc} } if(test -f /n/sources/plan9/$i){ cp /n/sources/plan9/$i $d/$uniq.orig if(~ $flagi 1) idiff $d/$uniq.orig $i > $d/$uniq if not cp $i $d/$uniq if(~ $status ''){ echo $i $uniq >>$d/files if(cmp -s /n/sources/plan9/$i $i) echo warning: new file $i does not differ from sources >[1=2] } if not echo warning: skipping file $i >[1=2] } if not{ echo warning: new file $i not on sources >[1=2] cp $i $d/$uniq echo $i $uniq >>$d/files } } @{builtin cd $d && xchmod ug+rw * && xchmod a+r *} if(~ `{cat /proc/$pid/fd | awk 'NR==2{print $NF}'} */dev/cons && test -w /dev/consctl){ >/dev/consctl { echo holdon cat >$d/readme } } if not cat >$d/readme if(! test -s $d/readme){ echo 'no description given; aborting' >[1=2] rm -rf $d exit oops } echo $d