mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-10-22 16:20:23 +02:00
69 lines
1.7 KiB
Bash
69 lines
1.7 KiB
Bash
#!/bin/env zsh
|
|
|
|
# All arguments are joined with spaces and inserted into the calendar
|
|
# file at the appropriate point.
|
|
#
|
|
# While the function compares the date of the new entry with dates in the
|
|
# existing calendar file, it does not do any sorting; it inserts the new
|
|
# entry before the first existing entry with a later date and time.
|
|
|
|
emulate -L zsh
|
|
setopt extendedglob
|
|
|
|
local calendar newfile REPLY lastline
|
|
local -a calendar_entries lockfiles
|
|
integer newdate done rstat
|
|
|
|
autoload -U calendar_{read,lockfiles,scandate}
|
|
|
|
# Read the calendar file from the calendar-file style
|
|
zstyle -s ':datetime:calendar_add:' calendar-file calendar ||
|
|
calendar=~/calendar
|
|
newfile=$calendar.new.$HOST.$$
|
|
|
|
if ! calendar_scandate -a "$*"; then
|
|
print "$0: failed to parse date/time" >&2
|
|
return 1
|
|
fi
|
|
(( newdate = $REPLY ))
|
|
|
|
# $calendar doesn't necessarily exist yet.
|
|
|
|
# start of block for following always to clear up lockfiles.
|
|
{
|
|
calendar_lockfiles $calendar || return 1
|
|
|
|
if [[ -f $calendar ]]; then
|
|
calendar_read $calendar
|
|
|
|
{
|
|
for line in $calendar_entries; do
|
|
if (( ! done )) && calendar_scandate -a $line && (( REPLY > newdate )); then
|
|
print -r -- "$*"
|
|
(( done = 1 ))
|
|
elif [[ $REPLY -eq $newdate && $line = "$*" ]]; then
|
|
(( done = 1 ))
|
|
fi
|
|
print -r -- $line
|
|
done
|
|
(( done )) || print -r -- "$*"
|
|
} >$newfile
|
|
if ! mv $calendar $calendar.old; then
|
|
print "Couldn't back up $calendar to $calendar.old.
|
|
New calendar left in $newfile." >&2
|
|
(( rstat = 1 ))
|
|
fi
|
|
else
|
|
print -r -- $line >$newfile
|
|
fi
|
|
|
|
if (( !rstat )) && ! mv $newfile $calendar; then
|
|
print "Failed to rename $newfile to $calendar.
|
|
Old calendar left in $calendar.old." >&2
|
|
(( rstat = 1 ))
|
|
fi
|
|
} always {
|
|
(( ${#lockfiles} )) && rm -f $lockfiles
|
|
}
|
|
|
|
return $rstat
|