On phlogosphere.org, the [ph|g]logs are marked with a timestamp, coming from the modification date of the user's gopher directory. glog.sh is now honouring this. Here's the updated version: #!/bin/sh # gopherlog - GPL - (C)2005 Yargo C Bonetti cvsid="\$Id: glog.sh,v 1.12 2009/12/18 13:01:45 yargo Exp $" progname=`basename $0` # default dir for storing messages rootdir=${GLOG_ROOT:-$HOME/gopher/glog} # place to touch for timestamp updating touchspot=${GLOG_TOUCH:-$HOME/gopher/} # default prefix for messages prefix=${GLOG_PREFIX:-g} # automatic entry id autoid=$prefix`date -u +%y%j%H%M` # reporting file for last message lastmsg=$rootdir/actmsg.txt # map file map='gophermap' # separation for map headers and glog entries; will be used as pattern separator=" -----" # information attached to new file newinfo="::: reply via mailto:$USER+glog@jerq.org?Subject=$autoid" # default message suffix suffix='.txt' # error display routine err () { echo $progname error: "$*" >&2 ; } # exit routine in case of signal abort () { echo "aborted - if interactive, hit CTRL-D" >&2 cat >>$HOME/dead.$progname cleanexit 9 } trap abort HUP INT QUIT ABRT PIPE TERM # help display usage () { cat <&2 ; } gopher log script 2005 YCB - $cvsid usage: $progname [-a|b|h] [-p prefix] [-q suffix] [-r root] [-s subject] [id] will add a message entered via stdin to a directory, named with a time-stamp and add a link in $map after its header and before old links (header ends at line containing '$separator') -a only allow appending to existing file (id is required in this case) -b ignore inline commands in stdin -h this help -p,-q message prefix (default: $prefix) and suffix (default: $suffix) -r root directory (default: $rootdir) a copy of the last message is put into $lastmsg -s subject - if missing, first line of stdin will be used id if present, entry will be added to message id inline edit commands, must be given at beginning of line: .e edit message entered so far with \$EDITOR (currently $EDITOR) .h short command help .p print message entered so far .q abort message .s enter new subject . end message EOH echo "($progname - for help, use option -h)" >&2 while test "$1" != "" ; do case $1 in -a) append=1 ; echo appending only >&2 ;; -b) ign=1 ; echo ignoring inline commands >&2 ;; -h|--help) usage ; exit 3 ;; -p) shift ; prefix="$1" ; echo prefix: $prefix >&2 ;; -q) shift ; suffix="$1" ; echo suffix: $suffix >&2 ;; -r) shift ; rootdir="$1" ; echo root directory: $rootdir >&2 ;; -s) shift ; subject="$1" ; echo "subject: $subject" >&2 ;; -*) err "ignoring unknown option $1" ;; *) id="${1%.*}" ;; # remove suffix if present esac shift done test -d $rootdir || { err "nonexistent root directory $rootdir" usage exit 7 } # lock-&buffer-file tmpfile=$rootdir/$progname-lock if test -f $tmpfile ; then err "$tmpfile exists, waiting for disappearing..." sleep 5 if test -f $tmpfile ; then err "$tmpfile exists, other instance may be running" exit 8 fi fi # exit routine for cleanup cleanexit () { rm -f $tmpfile ; exit $1 ; } id=${id:-$autoid} echo id: $id >&2 #generate file name and check lfile=$rootdir/${id}$suffix if test ! -f $lfile ; then if test "$append" = "1" ; then err $lfile nonexistent but append-only cleanexit 6 fi else # if file exists already, do not append information newinfo='' fi : >$tmpfile # clear tmpfile # add subject as first line, if defined if test "$subject" != "" ; then echo "$subject" >$tmpfile ; fi if test "$ign" = "1" ; then # simply take contents of tmpfile and stdin into message file cat >>$tmpfile # fold lines to width of 77 characters max (not necessary in lastmsg) fold -s -w 77 $tmpfile >>$lfile # and store in lastmsg together with id echo "#$id" >$lastmsg cat $tmpfile >>$lastmsg else # process one line at a time after printing of header cat $tmpfile while read mline ; do case $mline in .e) test -x $EDITOR && $EDITOR $tmpfile ;; .p) echo "subject: $subject" ; cat $tmpfile ;; .q) err aborted ; cleanexit 1 ;; .s) echo "enter new subject" ; echo " currently: $subject" read newsubject ; subject=${newsubject:-$subject} ;; .) break ;; .*) echo "commands: .e edit .p print .q abort .s subject . end" ;; *) echo "$mline" >>$tmpfile ;; esac done # ignore messages shorter than 7 words or 1 line (noise) wc $tmpfile | { read tl tw rem ; test $tw -gt 6 -a $tl -gt 1 ; } || { err "message too short" ; cleanexit 2 ; } # append message to logfile and store in lastmsg cat $tmpfile >>$lfile echo "#$id" >$lastmsg cat $tmpfile >>$lastmsg fi echo >>$lfile echo ':::' `date -u` >>$lfile echo "$newinfo" >>$lfile echo "$separator" >>$lfile echo >>$lfile # update timestamp touch $touchspot # update map file if it is writable and if current id not yet linked map=$rootdir/$map if ! grep "${id}$suffix" $map >/dev/null 2>&1 && test -f $map -a -w $map ; then # set subject, just first line if not yet defined subject=${subject:-`head -n 1 $tmpfile`} # create gophermap entry mapentry="0$subject [$id] ./${id}$suffix" # if separator present in map file if grep "$separator" $map 2>&1 >/dev/null then # get map headers sed -e "/$separator/,\$d" $map >$tmpfile echo "$separator" >>$tmpfile echo "$mapentry" >>$tmpfile # get rest of map sed -e "1,/$separator/d" $map >>$tmpfile else # just prepend to map file echo "$mapentry" >$tmpfile cat $map >>$tmpfile fi # write new map cat $tmpfile >$map fi # make sure everybody can read it # map file, if present, should already have correct permissions! chmod a+r $lfile $lastmsg cleanexit 0 ::: Fri Dec 18 13:07:39 UTC 2009 ::: reply via mailto:yargo+glog@jerq.org?Subject=g093521303 -----