#!/bin/sh #\ exec ical -f $0 -nodisplay ${1+"$@"} ############################################################################ # Copyright (c) 1994 by Sanjay Ghemawat ############################################################################ # # Move old calendar entries into another calendar. This can be used # for archiving old entries without having them take space in your # day-to-day calendar. # # Example: # # The folllowing command will move expired entries from the user's # calendar into the file "calendar-archive". # # icalexpire calendar-archive # # Usage: # icalexpire [-calendar ] [] # # All items in the calendar that have no occurrence after # (-) are moved to the calendar stored in the # file named by . # # The default value for is 31. The default value # for is the user's normal calendar. Threfore, if you just # specify an archival calendar, then all items that do not occur # in the past month and do not occur in the future will be moved to # the archival calendar. # Tcl code starts here. # Parse arguments proc usage {} { puts stderr {Usage: icalexpire [-calendar ] []} exit 1 } set days 31 switch [llength $argv] { 1 {set output [lindex $argv 0]} 2 {set output [lindex $argv 0];set days [lindex $argv 1]} default {usage} } if ![regexp {[0-9]+} $days] {usage} if {$days < 1} {usage} # Generate terse description of item proc item2short_string {i} { global month_name weekday_name set type [$i type] if {$type == ""} { set d [$i first] set str [format {%-3s %-3s %2d, %4d}\ [string range $weekday_name([date weekday $d]) 0 2]\ [string range $month_name([date month $d]) 0 2]\ [date monthday $d]\ [date year $d]\ ] } else { set str $type } set txt [$i text] regsub -all \n $txt " " txt set txt [string range $txt 0 50] return [format "%-16s %s" $str $txt] } # Move expired items from the main calendar in "in" to "out". proc move_items {in out days} { if [$in readonly] {error "$in: permission denied"} if [$out readonly] {error "$output: permission denied"} set threshold [expr [date today] - $days] # Copy expired items into output cal incalendar [$in main] item { if ![catch {$item next $threshold}] continue # No occurrence after $threshold puts stdout "Expire: [item2short_string $item]" $out add [$item clone] $in remove $item } # Now save the destination first to avoid losing data $out save $in save } calendar cal $ical(calendar) calendar out $output if [catch {move_items cal out $days} msg] { puts stderr "Error: $msg" exit 1 } exit 0