emulate -L zsh
setopt extendedglob
autoload -Uz calendar_{read,scandate,lockfiles}
local calendar line REPLY new lockfile
local -a calendar_entries
local -a times lines_sorted lines_unsorted lines_failed lockfiles
integer i
# Read the calendar file from the calendar-file style
zstyle -s ':datetime:calendar:' calendar-file calendar || calendar=~/calendar
# start of subshell for OS file locking
(
# start of block for following always to clear up lockfiles.
# Not needed but harmless if OS file locking is used.
{
if zmodload -F zsh/system b:zsystem && zsystem supports flock &&
zsystem flock $calendar; then
# locked OK
:
else
calendar_lockfiles $calendar || exit 1
fi
new=$calendar.new.$$
calendar_read $calendar
if [[ ${#calendar_entries} -eq 0 || \
( ${#calendar_entries} -eq 1 && -z $calendar_entries[1] ) ]]; then
return 0
fi
for line in $calendar_entries; do
if calendar_scandate -a $line; then
lines_unsorted+=("${(l.16..0.)REPLY}:$line")
else
lines_failed+=($line)
fi
done
if (( ${#lines_unsorted} )); then
lines_sorted=(${${(o)lines_unsorted}##[0-9]##:})
fi
{
for line in "${lines_failed[@]}"; do
print "$line # BAD DATE"
done
(( ${#lines_sorted} )) && print -l "${lines_sorted[@]}"
} > $new
if [[ ! -s $new ]]; then
print "Writing to $new failed."
return 1
elif (( ${#lines_failed} )); then
print "Warning: lines with date that couldn't be parsed.
Output (with unparseable dates marked) left in $new"
return 1
fi
if ! mv $calendar $calendar.old; then
print "Couldn't back-up $calendar to $calendar.old.
New calendar left in $new"
return 1
fi
if ! mv $new $calendar; then
print "Failed to rename $new to $calendar.
Old calendar left in $calendar.old"
return 1
fi
print "Old calendar left in $calendar.old"
} always {
(( ${#lockfiles} )) && rm -rf $lockfiles
}
)
Copyright 2K16 - 2K18 Indonesian Hacker Rulez