xref: /plan9/rc/bin/patch/create (revision d1da931c1953c14f6f98c26297030a0b55cb02f6)
1ff8c3af2SDavid du Colombier#!/bin/rc
2603dff34SDavid du Colombierrfork e
3ff1040beSDavid du Colombier
4ff1040beSDavid du Colombierfn xchmod {
5ff1040beSDavid du Colombier	chmod $* >[2]/dev/null
6ff1040beSDavid du Colombier}
7ff1040beSDavid du Colombier
8ff1040beSDavid du Colombierif(~ $#* 0 1 2){
9ff1040beSDavid du Colombier	echo 'usage: patch/create name email file... [< description]' >[1=2]
10ff8c3af2SDavid du Colombier	exit usage
11ff8c3af2SDavid du Colombier}
12ff8c3af2SDavid du Colombier
13ff8c3af2SDavid du Colombierif(! echo $1 | grep -s '^[a-z_0-9.\-]+$'){
14e059317eSDavid du Colombier	echo 'bad name: [a-z0-9._\-]+ only' >[1=2]
15ff8c3af2SDavid du Colombier	exit usage
16ff8c3af2SDavid du Colombier}
17ff1040beSDavid du Colombierif(! echo $2 | grep -s '^(-|[A-Za-z0-9.\-+]+@[A-Za-z0-9.\-+]+)$'){
18ff1040beSDavid du Colombier	echo 'bad email: [a-z0-9.-+] only; use ''-'' to not leave an email address.' >[1=2]
19ff1040beSDavid du Colombier	exit usage
20ff1040beSDavid du Colombier}
21ff8c3af2SDavid du Colombier
22ff8c3af2SDavid du Colombierif(! test -d /n/sources/patch){
23ff8c3af2SDavid du Colombier	rfork n
24ff8c3af2SDavid du Colombier	9fs sources
25ff8c3af2SDavid du Colombier}
26ff8c3af2SDavid du Colombier
27603dff34SDavid du Colombierpatch=$1
28ff1040beSDavid du Colombieremail=$2
29ff1040beSDavid du Colombiershift
30ff1040beSDavid du Colombiershift
31603dff34SDavid du Colombierd=/n/sources/patch/$patch
32ff8c3af2SDavid du Colombierif(! mkdir $d){
33fcdc259eSDavid du Colombier	echo mkdir $d failed >[1=2]
34ff8c3af2SDavid du Colombier	exit mkdir
35ff8c3af2SDavid du Colombier}
36ff1040beSDavid du Colombierif(! ~ $email -){
37ff1040beSDavid du Colombier	echo $email >$d/email
38ff1040beSDavid du Colombier}
39ff8c3af2SDavid du Colombier
40ff1040beSDavid du Colombierxchmod o-w $d
41ff8c3af2SDavid du Colombier>$d/readme
42ff8c3af2SDavid du Colombier>$d/files
43ff8c3af2SDavid du Colombier>$d/notes
44ff8c3af2SDavid du Colombierfor(i in $*){
45ff8c3af2SDavid du Colombier	i=`{cleanname -d `{pwd} $i}
46ff8c3af2SDavid du Colombier	if(! test -f $i){
47ff8c3af2SDavid du Colombier		echo error: cannot find $i >[1=2]
48ff8c3af2SDavid du Colombier		rm -rf $d
49ff8c3af2SDavid du Colombier		exit oops
50ff8c3af2SDavid du Colombier	}
51ff8c3af2SDavid du Colombier	short=`{basename $i}
52ff8c3af2SDavid du Colombier	uniq=$short
53ff8c3af2SDavid du Colombier	n=0
54ff8c3af2SDavid du Colombier	while(test -f $d/$uniq){
55ff8c3af2SDavid du Colombier		uniq=$short.$n
56ff8c3af2SDavid du Colombier		n=`{echo 1+$n | hoc}
57ff8c3af2SDavid du Colombier	}
58ff8c3af2SDavid du Colombier	cp $i $d/$uniq
59ff8c3af2SDavid du Colombier	if(test -f /n/sources/plan9/$i){
60ff8c3af2SDavid du Colombier		if(cmp -s /n/sources/plan9/$i $i)
61ff8c3af2SDavid du Colombier			echo warning: new file $i does not differ from sources >[1=2]
62ff8c3af2SDavid du Colombier		cp /n/sources/plan9/$i $d/$uniq.orig
63ff8c3af2SDavid du Colombier	}
64ff8c3af2SDavid du Colombier	if not
65ff8c3af2SDavid du Colombier		echo warning: new file $i not on sources >[1=2]
66ff8c3af2SDavid du Colombier	echo $i $uniq >>$d/files
67ff8c3af2SDavid du Colombier}
68*d1da931cSDavid du Colombier@{builtin cd $d && xchmod ug+rw * && xchmod a+r *}
69ff8c3af2SDavid du Colombier
704d44ba9bSDavid du Colombierif(~ `{cat /proc/$pid/fd | awk 'NR==2{print $NF}'} */dev/cons && test -w /dev/consctl){
71ff8c3af2SDavid du Colombier	>/dev/consctl {
72ff8c3af2SDavid du Colombier		echo holdon
73ff8c3af2SDavid du Colombier		cat >$d/readme
74ff8c3af2SDavid du Colombier	}
75ff8c3af2SDavid du Colombier}
76ff8c3af2SDavid du Colombierif not
77ff8c3af2SDavid du Colombier	cat >$d/readme
78ff8c3af2SDavid du Colombier
79ff8c3af2SDavid du Colombierif(! test -s $d/readme){
80ff8c3af2SDavid du Colombier	echo 'no description given; aborting' >[1=2]
81ff8c3af2SDavid du Colombier	rm -rf $d
82ff8c3af2SDavid du Colombier	exit oops
83ff8c3af2SDavid du Colombier}
84ff8c3af2SDavid du Colombier
85ff8c3af2SDavid du Colombierecho $d
86