- Localized Task.cpp
This commit is contained in:
Paul Beckingham 2011-07-01 21:50:23 -04:00
parent a9a4c1c692
commit 7d5f4fdfc7
2 changed files with 53 additions and 41 deletions

View file

@ -25,7 +25,8 @@
// //
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
#include <iostream> // TODO Remove #define L10N // Localization complete.
#include <sstream> #include <sstream>
#include <algorithm> #include <algorithm>
#include <Context.h> #include <Context.h>
@ -184,8 +185,7 @@ void Task::legacyParse (const std::string& line)
{ {
// File format version 1, from 2006.11.27 - 2007.12.31 // File format version 1, from 2006.11.27 - 2007.12.31
case 1: case 1:
throw std::string ("Taskwarrior no longer supports file format 1, originally used " throw std::string (STRING_TASK_NO_FF1);
"between 27 November 2006 and 31 December 2007."); // TODO i18n
break; break;
// File format version 2, from 2008.1.1 - 2009.3.23 // File format version 2, from 2008.1.1 - 2009.3.23
@ -233,13 +233,13 @@ void Task::legacyParse (const std::string& line)
set ("description", line.substr (closeAttrBracket + 2)); // No i18n set ("description", line.substr (closeAttrBracket + 2)); // No i18n
} }
else else
throw std::string ("Missing attribute brackets"); // TODO i18n throw std::string (STRING_TASK_PARSE_ATT_BRACK);
} }
else else
throw std::string ("Missing tag brackets"); // TODO i18n throw std::string (STRING_TASK_PARSE_TAG_BRACK);
} }
else else
throw std::string ("Line too short"); // TODO i18n throw std::string (STRING_TASK_PARSE_TOO_SHORT);
removeAnnotations (); removeAnnotations ();
} }
@ -334,21 +334,21 @@ void Task::legacyParse (const std::string& line)
set ("description", line.substr (closeAnnoBracket + 2)); // No i18n set ("description", line.substr (closeAnnoBracket + 2)); // No i18n
} }
else else
throw std::string ("Missing annotation brackets."); // TODO i18n throw std::string (STRING_TASK_PARSE_ANNO_BRACK);
} }
else else
throw std::string ("Missing attribute brackets."); // TODO i18n throw std::string (STRING_TASK_PARSE_ATT_BRACK);
} }
else else
throw std::string ("Missing tag brackets."); // TODO i18n throw std::string (STRING_TASK_PARSE_TAG_BRACK);
} }
else else
throw std::string ("Line too short."); // TODO i18n throw std::string (STRING_TASK_PARSE_TOO_SHORT);
} }
break; break;
default: default:
throw std::string ("Unrecognized taskwarrior file format."); // TODO i18n throw std::string (STRING_TASK_PARSE_UNREC_FF);
break; break;
} }
} }
@ -605,16 +605,12 @@ void Task::removeAnnotations ()
void Task::addDependency (int id) void Task::addDependency (int id)
{ {
if (id == this->id) if (id == this->id)
throw std::string ("A task cannot be dependent on itself."); throw std::string (STRING_TASK_DEPEND_ITSELF);
// Check for extant dependency. // Check for extant dependency.
std::string uuid = context.tdb.uuid (id); std::string uuid = context.tdb.uuid (id);
if (uuid == "") if (uuid == "")
{ throw format (STRING_TASK_DEPEND_MISSING, id);
std::stringstream s;
s << "Could not create a dependency on task " << id << " - not found.";
throw s.str ();
}
// Store the dependency. // Store the dependency.
std::string depends = get ("depends"); std::string depends = get ("depends");
@ -623,18 +619,14 @@ void Task::addDependency (int id)
if (depends.find (uuid) == std::string::npos) if (depends.find (uuid) == std::string::npos)
set ("depends", depends + "," + uuid); set ("depends", depends + "," + uuid);
else else
{ throw std::string (STRING_TASK_DEPEND_DUP, this->id, id);
std::stringstream out;
out << "Task " << this->id << " already depends on task " << id << ".";
throw out.str ();
}
} }
else else
set ("depends", uuid); set ("depends", uuid);
// Prevent circular dependencies. // Prevent circular dependencies.
if (dependencyIsCircular (*this)) if (dependencyIsCircular (*this))
throw std::string ("Circular dependency detected and disallowed."); throw std::string (STRING_TASK_DEPEND_CIRCULAR);
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -661,11 +653,7 @@ void Task::removeDependency (int id)
if (uuid != "") if (uuid != "")
removeDependency (uuid); removeDependency (uuid);
else else
{ throw std::string (STRING_TASK_DEPEND_NO_UUID);
std::stringstream s;
s << "Could not find a UUID for id " << id << ".";
throw s.str ();
}
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@ -882,16 +870,16 @@ void Task::validate () const
{ {
// Every task needs an ID, entry and description attribute. // Every task needs an ID, entry and description attribute.
if (!has ("uuid")) if (!has ("uuid"))
throw std::string ("A task must have a UUID."); throw std::string (STRING_TASK_VALID_UUID);
if (!has ("entry")) if (!has ("entry"))
throw std::string ("A task must have an entry timestamp."); throw std::string (STRING_TASK_VALID_ENTRY);
if (!has ("description")) if (!has ("description"))
throw std::string ("A task must have a description."); throw std::string (STRING_TASK_VALID_DESC);
if (get ("description") == "") // No i18n if (get ("description") == "")
throw std::string ("Cannot add a task that is blank, or contains <CR> or <LF> characters."); throw std::string (STRING_TASK_VALID_BLANK);
if (has ("due")) if (has ("due"))
{ {
@ -902,7 +890,7 @@ void Task::validate () const
{ {
Date wait (::atoi (get ("wait").c_str ())); Date wait (::atoi (get ("wait").c_str ()));
if (wait > due) if (wait > due)
throw std::string ("A 'wait' date must be before a 'due' date."); throw std::string (STRING_TASK_VALID_WAIT);
} }
Date entry (::atoi (get ("entry").c_str ())); Date entry (::atoi (get ("entry").c_str ()));
@ -911,36 +899,36 @@ void Task::validate () const
{ {
Date start (::atoi (get ("start").c_str ())); Date start (::atoi (get ("start").c_str ()));
if (entry > start) if (entry > start)
throw std::string ("A 'start' date must be after an 'entry' date."); throw std::string (STRING_TASK_VALID_START);
} }
if (has ("end")) if (has ("end"))
{ {
Date end (::atoi (get ("end").c_str ())); Date end (::atoi (get ("end").c_str ()));
if (entry > end) if (entry > end)
throw std::string ("An 'end' date must be after an 'entry' date."); throw std::string (STRING_TASK_VALID_END);
} }
} }
else else
{ {
if (has ("recur")) if (has ("recur"))
throw std::string ("You cannot specify a recurring task without a due date."); throw std::string (STRING_TASK_VALID_REC_DUE);
} }
if (has ("until") && !has ("recur")) if (has ("until") && !has ("recur"))
throw std::string ("You cannot specify an until date for a non-recurring task."); throw std::string (STRING_TASK_VALID_UNTIL);
// Recur durations must be valid. // Recur durations must be valid.
if (has ("recur")) if (has ("recur"))
{ {
Duration d; Duration d;
if (! d.valid (get ("recur"))) if (! d.valid (get ("recur")))
throw std::string ("A recurrence value must be valid."); throw std::string (STRING_TASK_VALID_RECUR);
} }
if (has ("wait") && if (has ("wait") &&
getStatus () == Task::recurring) getStatus () == Task::recurring)
throw std::string ("You cannot create a task that is both waiting and recurring."); throw std::string (STRING_TASK_VALID_WAIT_RECUR);
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////

View file

@ -342,6 +342,31 @@
#define STRING_CMD_SHOW_CONF_VAR "Config Variable" #define STRING_CMD_SHOW_CONF_VAR "Config Variable"
#define STRING_CMD_SHOW_CONF_VALUE "Value" #define STRING_CMD_SHOW_CONF_VALUE "Value"
// Task
#define STRING_TASK_NO_FF1 "Taskwarrior no longer supports file format 1, originally used between 27 November 2006 and 31 December 2007."
#define STRING_TASK_PARSE_ANNO_BRACK "Missing annotation brackets."
#define STRING_TASK_PARSE_ATT_BRACK "Missing attribute brackets."
#define STRING_TASK_PARSE_TAG_BRACK "Missing tag brackets."
#define STRING_TASK_PARSE_TOO_SHORT "Line too short."
#define STRING_TASK_PARSE_UNREC_FF "Unrecognized taskwarrior file format."
#define STRING_TASK_DEPEND_ITSELF "A task cannot be dependent on itself."
#define STRING_TASK_DEPEND_MISSING "Could not create a dependency on task {1} - not found."
#define STRING_TASK_DEPEND_DUP "Task {1} already depends on task {2}."
#define STRING_TASK_DEPEND_CIRCULAR "Circular dependency detected and disallowed."
#define STRING_TASK_DEPEND_NO_UUID "Could not find a UUID for id {1}."
#define STRING_TASK_VALID_UUID "A task must have a UUID."
#define STRING_TASK_VALID_ENTRY "A task must have an entry timestamp."
#define STRING_TASK_VALID_DESC "A task must have a description."
#define STRING_TASK_VALID_BLANK "Cannot add a task that is blank."
#define STRING_TASK_VALID_WAIT "A 'wait' date must be before a 'due' date."
#define STRING_TASK_VALID_START "A 'start' date must be after an 'entry' date."
#define STRING_TASK_VALID_END "An 'end' date must be after an 'entry' date."
#define STRING_TASK_VALID_REC_DUE "You cannot specify a recurring task without a due date."
#define STRING_TASK_VALID_UNTIL "You cannot specify an until date for a non-recurring task."
#define STRING_TASK_VALID_RECUR "A recurrence value must be valid."
#define STRING_TASK_VALID_WAIT_RECUR "You cannot create a task that is both waiting and recurring."
// Taskmod // Taskmod
#define STRING_TASKMOD_BAD_INIT "Taskmod::getUuid(): Task object not initialized." #define STRING_TASKMOD_BAD_INIT "Taskmod::getUuid(): Task object not initialized."
#define STRING_TASKMOD_TIME "time " #define STRING_TASKMOD_TIME "time "
@ -363,7 +388,6 @@
#define STRING_TRANSPORT_SSH_URI "When using the 'ssh' protocol, the uri must contain a hostname." #define STRING_TRANSPORT_SSH_URI "When using the 'ssh' protocol, the uri must contain a hostname."
#define STRING_TRANSPORT_SSH_NORUN "Could not run ssh. Is it installed, and available in $PATH?" #define STRING_TRANSPORT_SSH_NORUN "Could not run ssh. Is it installed, and available in $PATH?"
// Uri // Uri
#define STRING_URI_QUOTES "Could not parse uri '{1}', wrong usage of single quotes." #define STRING_URI_QUOTES "Could not parse uri '{1}', wrong usage of single quotes."
#define STRING_URI_BAD_FORMAT "The uri '{1}' is not in the expected format." #define STRING_URI_BAD_FORMAT "The uri '{1}' is not in the expected format."