mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-01-01 05:16:05 +01:00
77 lines
1.9 KiB
Text
77 lines
1.9 KiB
Text
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
|
|
}
|
|
)
|