diff options
Diffstat (limited to 'Functions/Calendar/calendar_sort')
-rw-r--r-- | Functions/Calendar/calendar_sort | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/Functions/Calendar/calendar_sort b/Functions/Calendar/calendar_sort new file mode 100644 index 000000000..7d346efc1 --- /dev/null +++ b/Functions/Calendar/calendar_sort @@ -0,0 +1,67 @@ +emulate -L zsh +setopt extendedglob + +autoload -U 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 block for "always" to handle lockfile +{ + calendar_lockfiles $calendar || return 1 + + 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 +} |