diff options
Diffstat (limited to 'tools/evolution-move-tasks')
-rwxr-xr-x | tools/evolution-move-tasks | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/tools/evolution-move-tasks b/tools/evolution-move-tasks new file mode 100755 index 0000000000..05c27cbce2 --- /dev/null +++ b/tools/evolution-move-tasks @@ -0,0 +1,135 @@ +#!/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 <<EOF; +<?xml version="1.0"?> +<efolder> + <type>tasks</type> + <description>Tasks</description> +</efolder> +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 (<ICSFILE>) { + 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 <<EOF; +BEGIN:VCALENDAR +CALSCALE + :GREGORIAN +PRODID + :-//Helix Code//NONSGML Evolution Calendar//EN +VERSION + :2.0 +$tasks +END:VCALENDAR +EOF + + close (ICSFILE); +} + + |