]> pd.if.org Git - zpackage/blob - zpm-note
initial implementation of zpm-bug
[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" 1>&2
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" 1>&2
50                 exit 1
51         fi
52         echo $file
53 }
54
55 case $cmd in
56         category)
57                 notefile=$(findnote $1)
58                 printf "%s\n" $(basename $(dirname $notefile))
59                 ;;
60         list)
61                 case $1 in
62                         -a) find $SPOOL/ack -type f -printf '%P\n' | sort -n
63                                 ;;
64                         *) find $SPOOL/open -type f -printf '%P\n' | sort -n
65                                 ;;
66                 esac
67                 ;;
68         detail)
69                 len=$(find $SPOOL/open -type f -printf "%P\n" | awk ' { if ( length > x ) { x = length } }END{ print x }')
70                 find $SPOOL/open -type f -printf "%P\n" | sort -n | while read note ; do
71                         subject=$(head -1 $SPOOL/open/$note)    
72                         date=$(stat -c '%y' $SPOOL/open/$note | cut -f1 -d' ')
73                         owner=$(stat -c '%U' $SPOOL/open/$note)
74                         printf '%*s %8s %s %s\n' $len $note $owner "$date" "$subject"
75                 done
76                 ;;
77         ack)
78                 file=$(findopen $1)
79                 subfile=$(echo $file | sed -e "s|$SPOOL/open/||")
80                 filedir=$(dirname $subfile)
81                 mkdir -p $SPOOL/ack/$filedir
82                 mv $file $SPOOL/ack/$filedir
83                 ;;
84         new)
85                 # new -- edit a new file for package general (or ZPMNOTEPACKAGE)
86                 # new package -- edit a new note for package
87                 # new package file -- use file for new package note
88                 if [ $# -eq 0 ]; then set ${ZPMNOTEPACKAGE:-general}; fi
89
90                 # edit a new file for the note
91                 if [ $# -eq 1 ]; then
92                         tmp=$(mktemp -p $SPOOL/open)
93                         pkg=$1
94                         [ -f $SPOOL/.template ] && cp $SPOOL/.template $tmp
95                         ${EDITOR:-vi} $tmp
96                         file=$(zpm sequence notes)
97                         mv $tmp $SPOOL/open/$pkg/$file || { rm -f $tmp; exit 1; }
98                         echo "$pkg/$file"
99                         exit 0
100                 fi
101
102                 # take note from file or stdin
103                 pkg=$1 ; shift
104                 mkdir -p $SPOOL/open/$pkg
105                 case $1 in
106                         '-')
107                                 tmp=$(mktemp -p $SPOOL/open)
108                                 cat - > $tmp
109                                 file=$(zpm sequence notes)
110                                 mv $tmp $SPOOL/open/$pkg/$file || { rm -f $tmp ; exit 1; }
111                                 echo $file
112                                 ;;
113                         *)
114                                 tmp=$(mktemp -p $SPOOL/open)
115                                 cp $1 $tmp
116                                 #flock -n -E3 $tmp vim $tmp
117                                 #if [ $? -eq 3 ]; then echo already editing $1; exit 1; fi
118                                 file=$(zpm sequence notes)
119                                 mv $tmp $SPOOL/open/$pkg/$file || { rm -f $tmp; exit 1; }
120                                 echo $file
121                                 ;;
122                 esac
123                 ;;
124         edit)
125                 file=$(findnote $1)
126                 flock -n -E3 $file vim $file
127                 if [ $? -eq 3 ]; then echo already editing $1; exit 1; fi
128                 ;;
129         resolve)
130                 file=$(findnote $1)
131                 echo $file
132                 ;;
133         remove)
134                 file=$(findnote $1)
135                 rm $file
136                 ;;
137         show)
138                 file=$(findnote $1)
139                 ${PAGER:-less} $file
140                 ;;
141         *)
142                 echo '$0: unknown command ' $cmd 1>&2
143                 exit 1
144 esac