diff --git a/AUTHORS b/AUTHORS index 2d385ac5c..aa6914eb5 100644 --- a/AUTHORS +++ b/AUTHORS @@ -182,3 +182,4 @@ suggestions: Friedrich Heusler Ben Armstrong XTaran + John West diff --git a/ChangeLog b/ChangeLog index c581984d1..42af439c8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -68,6 +68,8 @@ Bugs + #1263 The 'waiting' report properly lists only pending tasks with a wait date (thanks to Fidel Mato). + #1270 The 'undo' command is now properly removing backlog entries. + + #1273 Query with negative relative date differs greatly from absolute date + in past (thanks to John West). + #1279 Assorted corrections to the task-ref.pdf document (thanks to Benjamin Weber). + #1286 Cannot use "sow", "som", etc in "entry.after", "end.after" filters diff --git a/src/Duration.cpp b/src/Duration.cpp index 57246dd98..2919e861d 100644 --- a/src/Duration.cpp +++ b/src/Duration.cpp @@ -368,6 +368,8 @@ bool Duration::valid (const std::string& input) Nibbler n (lower_input); n.getNumber (value); + // Negative values are valid, but do not need to complicate the validation + // check. if (value < 0.0) value = -value; diff --git a/src/E9.cpp b/src/E9.cpp index 7464ebd4c..5cc4bcd88 100644 --- a/src/E9.cpp +++ b/src/E9.cpp @@ -185,7 +185,10 @@ void E9::eval (const Task& task, std::vector & value_stack) { Duration dur (operand._raw); Date now; - now += (int)(time_t) dur; + if (dur.negative ()) + now -= (int)(time_t) dur; + else + now += (int)(time_t) dur; operand._value = now.toEpochString (); } else diff --git a/src/commands/Command.cpp b/src/commands/Command.cpp index a713691b8..6bd27c00f 100644 --- a/src/commands/Command.cpp +++ b/src/commands/Command.cpp @@ -463,7 +463,7 @@ void Command::modify_task ( std::string& description) { // Utilize Task::modify - task.modify(arguments, description); + task.modify (arguments, description); } //////////////////////////////////////////////////////////////////////////////// diff --git a/test/duration.t.cpp b/test/duration.t.cpp index 374c8563e..7c9097b43 100644 --- a/test/duration.t.cpp +++ b/test/duration.t.cpp @@ -51,7 +51,7 @@ int convertDuration (const std::string& input) int main (int argc, char** argv) { - UnitTest t (644); + UnitTest t (646); // Ensure environment has no influence. unsetenv ("TASKDATA"); @@ -728,6 +728,11 @@ int main (int argc, char** argv) t.is (convertDuration ("10d"), 10, "valid duration 10d"); t.is (convertDuration ("-"), 0, "valid duration -"); + + d = Duration ("-4d"); + t.is ((time_t)d, 4*86400, "-4d == 4*86400"); + t.ok (d.negative (), "-4d == negative"); + try { Duration left, right;