Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
tree: fbc51c9ea7
Fetching contributors…

Cannot retrieve contributors at this time

file 77 lines (66 sloc) 1.93 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
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
}
)
Something went wrong with that request. Please try again.