mirror of
				git://git.code.sf.net/p/zsh/code
				synced 2025-10-31 06:00:54 +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
 | |
| }
 | |
| )
 |