]> pd.if.org Git - zpackage/blob - zpm-note
added zpm-note new editing
[zpackage] / zpm-note
1 #!/bin/sh
2
3 # Admin notes:
4
5 # Each note is just a file.  Stored under /var/spool/admin/notes/[open|ack]/<package>/<note>
6
7 # note: list notes
8 # note ack <note> - moves note to "acknowledged" spool
9 # note list [package] show notes for a given package, or all notes
10 # note delete <note> - delete a note from the system
11 # note edit <package> [file] - edit or create a note
12
13 # TODO
14 # discard unchanged new note file
15 # quiet options to suppress new note name echo
16 # semi-quiet to just output the number
17 # renumber? to renumber all notes/reset sequence
18 # lock the temp files
19 # clean up unlocked temp files
20
21 SPOOL=/var/lib/admin/notes
22 OPEN=$SPOOL/open
23
24 set -e
25
26 umask 007
27
28 #cd $SPOOL || { echo "can't chdir to $SPOOL" ; exit 1; }
29
30 [ -z "$1" ] && set list
31
32 quiet=
33
34 cmd=$1
35 shift
36
37 findnote() {
38         file=$(find $SPOOL -type f -name "$1")
39         if [ -z "$file" ] ; then
40                 [ -z "$quiet" ] || printf "no such note $1\n"
41                 exit 1
42         fi
43         echo $file
44 }
45
46 findopen() {
47         file=$(find $SPOOL/open -type f -name "$1")
48         if [ -z "$file" ] ; then
49                 [ -z "$quiet" ] || printf "no such open note $1\n"
50                 exit 1
51         fi
52         echo $file
53 }
54
55 case $cmd in
56         list)
57                 case $1 in
58                         -a) find $SPOOL/ack -type f -printf '%P\n' | sort -n
59                                 ;;
60                         *) find $SPOOL/open -type f -printf '%P\n' | sort -n
61                                 ;;
62                 esac
63                 ;;
64         detail)
65                 len=$(find $SPOOL/open -type f -printf "%P\n" | awk ' { if ( length > x ) { x = length } }END{ print x }')
66                 find $SPOOL/open -type f -printf "%P\n" | sort -n | while read note ; do
67                         subject=$(head -1 $SPOOL/open/$note)    
68                         date=$(stat -c '%y' $SPOOL/open/$note | cut -f1 -d' ')
69                         owner=$(stat -c '%U' $SPOOL/open/$note)
70                         printf '%*s %8s %s %s\n' $len $note $owner "$date" "$subject"
71                 done
72                 ;;
73         ack)
74                 file=$(findopen $1)
75                 subfile=$(echo $file | sed -e "s|$SPOOL/open/||")
76                 filedir=$(dirname $subfile)
77                 mkdir -p $SPOOL/ack/$filedir
78                 mv $file $SPOOL/ack/$filedir
79                 ;;
80         new)
81                 # new -- edit a new file for package general (or ZPMNOTEPACKAGE)
82                 # new package -- edit a new note for package
83                 # new package file -- use file for new package note
84                 if [ $# -eq 0 ]; then set ${ZPMNOTEPACKAGE:-general}; fi
85
86                 # edit a new file for the note
87                 if [ $# -eq 1 ]; then
88                         tmp=$(mktemp -p $SPOOL/open)
89                         pkg=$1
90                         [ -f $SPOOL/.template ] && cp $SPOOL/.template $tmp
91                         ${EDITOR:-vi} $tmp
92                         file=$(zpm sequence notes)
93                         mv $tmp $SPOOL/open/$pkg/$file || { rm -f $tmp; exit 1; }
94                         echo "$pkg/$file"
95                         exit 0
96                 fi
97
98                 # take note from file or stdin
99                 pkg=$1 ; shift
100                 mkdir -p $SPOOL/open/$pkg
101                 case $1 in
102                         '-')
103                                 tmp=$(mktemp -p $SPOOL/open)
104                                 cat - > $tmp
105                                 file=$(zpm sequence notes)
106                                 mv $tmp $SPOOL/open/$pkg/$file || { rm -f $tmp ; exit 1; }
107                                 echo $file
108                                 ;;
109                         *)
110                                 tmp=$(mktemp -p $SPOOL/open)
111                                 cp $1 $tmp
112                                 #flock -n -E3 $tmp vim $tmp
113                                 #if [ $? -eq 3 ]; then echo already editing $1; exit 1; fi
114                                 file=$(zpm sequence notes)
115                                 mv $tmp $SPOOL/open/$pkg/$file || { rm -f $tmp; exit 1; }
116                                 echo $file
117                                 ;;
118                 esac
119                 ;;
120         edit)
121                 file=$(findnote $1)
122                 flock -n -E3 $file vim $file
123                 if [ $? -eq 3 ]; then echo already editing $1; exit 1; fi
124                 ;;
125         resolve)
126                 file=$(findnote $1)
127                 echo $file
128                 ;;
129         remove)
130                 file=$(findnote $1)
131                 rm $file
132                 ;;
133         show)
134                 file=$(findnote $1)
135                 ${PAGER:-less} $file
136                 ;;
137         *)
138                 echo '$0: unknown command ' $cmd 1>&2
139                 exit 1
140 esac