#!/usr/bin/env perl # The above is a portable way to invoke Perl, according to the GNU Autotools # book. It is useful since we don't know where perl is installed. # # evolution-move-tasks: a Perl script to move tasks from the Calendar folder # to the new Tasks folder. # use diagnostics; # You may have to change this if your Evolution files are somewhere else. $EVOLUTION_DIR = "$ENV{'HOME'}/evolution"; $CALENDAR_DIR = "$EVOLUTION_DIR/local/Calendar"; $TASKS_DIR = "$EVOLUTION_DIR/local/Tasks"; # Create the Tasks folder if needed. &EnsureTasksFolderExists ($TASKS_DIR); # Get any tasks from the calendar .ics file. $tasks = &LoadTasks ("$CALENDAR_DIR/calendar.ics"); # Get any tasks already in the tasks .ics file. $tasks .= &LoadTasks ("$TASKS_DIR/tasks.ics"); # Create a new Tasks .ics file containing all the tasks. &OutputTasks ("$TASKS_DIR/tasks.new", $tasks); # Move the existing tasks file to a backup. if (-e "$TASKS_DIR/tasks.ics") { rename "$TASKS_DIR/tasks.ics", "$TASKS_DIR/tasks.bak" || die "Can't rename $TASKS_DIR/tasks.ics to $TASKS_DIR/tasks.bak"; } # Move the new file into position. rename "$TASKS_DIR/tasks.new", "$TASKS_DIR/tasks.ics" || die "Can't rename $TASKS_DIR/tasks.new to $TASKS_DIR/tasks.ics"; # Move the new Calendar file (without the Tasks) into position. rename "$CALENDAR_DIR/calendar.ics.new", "$CALENDAR_DIR/calendar.ics" || die "Can't rename $TASKS_DIR/tasks.new to $TASKS_DIR/tasks.ics"; 0; # If the evolution/local/Tasks folder does not exist, this creates it and # creates the metadata XML file. sub EnsureTasksFolderExists { my ($tasks_dir) = @_; return if (-e $tasks_dir); print "Creating Tasks folder in: $tasks_dir\n"; mkdir ($tasks_dir, 0777) || die "Can't create Tasks folder directory: $tasks_dir"; $metadata = "$tasks_dir/folder-metadata.xml"; open (METADATA, ">$metadata") || die "Can't create metadata file: $metadata"; print METADATA < tasks Tasks EOF close (METADATA); } sub LoadTasks { my ($icalendar_file) = @_; return "" if (! -e $icalendar_file); open (ICSFILE, $icalendar_file) || die "Can't open iCalendar file: $icalendar_file"; open (NEWICSFILE, ">$icalendar_file.new") || die "Can't open iCalendar file: $icalendar_file.new"; $tasks = ""; $in_task = 0; while () { if ($in_task) { $tasks .= $_; if (m/^END:VTODO/) { $in_task = 0; } } else { if (m/^BEGIN:VTODO/) { print "Found task\n"; $tasks .= $_; $in_task = 1; } else { print NEWICSFILE $_; } } } close (NEWICSFILE); close (ICSFILE); return $tasks; } sub OutputTasks { my ($icalendar_file, $tasks) = @_; open (ICSFILE, ">$icalendar_file") || die "Can't create iCalendar file: $icalendar_file"; print ICSFILE <