about summary refs log tree commit diff
path: root/Functions/Calendar/calendar_sort
diff options
context:
space:
mode:
Diffstat (limited to 'Functions/Calendar/calendar_sort')
-rw-r--r--Functions/Calendar/calendar_sort67
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
+}