diff --git a/scripts/CMakeLists.txt b/scripts/CMakeLists.txt index 1079578f8..fd1a4a94c 100644 --- a/scripts/CMakeLists.txt +++ b/scripts/CMakeLists.txt @@ -1,2 +1,3 @@ cmake_minimum_required (VERSION 2.8) -install (DIRECTORY bash fish vim zsh add-ons extensions DESTINATION ${TASK_DOCDIR}/scripts) +install (DIRECTORY bash fish vim zsh add-ons extensions + DESTINATION ${TASK_DOCDIR}/scripts) diff --git a/src/A3.cpp b/src/A3.cpp index 6a2ee5ebe..f64018459 100644 --- a/src/A3.cpp +++ b/src/A3.cpp @@ -27,7 +27,6 @@ #define L10N // Localization complete. -#include #include #include #include @@ -1335,7 +1334,13 @@ bool A3::is_attr (Nibbler& n, Arg& arg) // therefore not stored. std::map::iterator i = context.columns.find (canonical); if (i != context.columns.end ()) - arg._type = Arg::type_id (i->second->type ()); + { + // Special-case: override the type, which is 'string'. + if (canonical == "recur") + arg._type = Arg::type_duration; + else + arg._type = Arg::type_id (i->second->type ()); + } else arg._type = Arg::type_pseudo; @@ -2072,7 +2077,7 @@ bool A3::which_operator ( } //////////////////////////////////////////////////////////////////////////////// -void A3::dump (const std::string& label) +void A3::dump (const std::string& label) const { if (context.config.getBoolean ("debug")) { diff --git a/src/A3.h b/src/A3.h index 59524a92d..10cd1739e 100644 --- a/src/A3.h +++ b/src/A3.h @@ -99,7 +99,7 @@ public: static bool which_operator (const std::string&, char&, int&, char&); - void dump (const std::string&); + void dump (const std::string&) const; private: bool _read_only_command; diff --git a/src/E9.cpp b/src/E9.cpp index 0f774b6b7..2e9b2f512 100644 --- a/src/E9.cpp +++ b/src/E9.cpp @@ -27,7 +27,7 @@ #define L10N // Localization complete. -#include +//#include #include #include #include diff --git a/src/columns/ColRecur.cpp b/src/columns/ColRecur.cpp index e78108f99..1d9a1ac24 100644 --- a/src/columns/ColRecur.cpp +++ b/src/columns/ColRecur.cpp @@ -39,7 +39,11 @@ extern Context context; ColumnRecur::ColumnRecur () { _name = "recur"; + + // This is 'string', and not 'duration' to force the value to be stored as a + // raw duration, so that it can be reevaluated every time. _type = "string"; + _style = "duration"; _label = STRING_COLUMN_LABEL_RECUR; diff --git a/src/commands/Command.cpp b/src/commands/Command.cpp index 61b83b7f2..d89a924f9 100644 --- a/src/commands/Command.cpp +++ b/src/commands/Command.cpp @@ -559,7 +559,8 @@ void Command::modify_task ( } // Durations too. - else if (column->type () == "duration") + else if (name == "recur" || + column->type () == "duration") { // All values must be eval'd first. A3 value_tokens; @@ -737,19 +738,7 @@ bool Command::next_mod_group (const A3& input, Arg& arg, unsigned int& pos) { arg = input[pos++]; - // Date attributes aggregate durations and operators. - if (arg._type == Arg::type_date && - arg._category == Arg::cat_attr) - { - while (pos < input.size () && - (input[pos]._type == Arg::type_duration || - input[pos]._category == Arg::cat_op)) - { - arg._raw += " " + input[pos++]._raw; - } - } - - else if (arg._raw == "depends") + if (arg._raw == "depends") { while (pos < input.size () && (input[pos]._category == Arg::cat_op || diff --git a/src/en-US.h b/src/en-US.h index 172d2e6fd..fbaf4f022 100644 --- a/src/en-US.h +++ b/src/en-US.h @@ -600,7 +600,7 @@ #define STRING_DOM_CANNOT_SET "DOM: Cannot set '{1}'." // Duration -#define STRING_DURATION_UNRECOGNIZED "The date/duration '{1}' was not recognized." +#define STRING_DURATION_UNRECOGNIZED "The duration '{1}' was not recognized as valid, with correct units like '3days'." // E9 #define STRING_E9_UNSUPPORTED "Unsupported operator '{1}'." diff --git a/test/bug.886.t b/test/bug.886.t index 3463ba622..09ea51f32 100755 --- a/test/bug.886.t +++ b/test/bug.886.t @@ -43,7 +43,7 @@ my $output = qx{../src/task rc:bug.rc add one due:sund 2>&1}; like ($output, qr/Created task 1\./, 'sund --> valid date'); $output = qx{../src/task rc:bug.rc add two due:donkey 2>&1 >/dev/null}; -like ($output, qr/was not recognized\./, 'donkey --> invalid date'); +like ($output, qr/was not recognized/, 'donkey --> invalid date'); # Cleanup. unlink qw(pending.data completed.data undo.data backlog.data synch.key bug.rc); diff --git a/test/bug.972.t b/test/bug.972.t new file mode 100755 index 000000000..af759095f --- /dev/null +++ b/test/bug.972.t @@ -0,0 +1,57 @@ +#! /usr/bin/perl +################################################################################ +## taskwarrior - a command line task list manager. +## +## Copyright 2006-2012, Paul Beckingham, Federico Hernandez. +## +## Permission is hereby granted, free of charge, to any person obtaining a copy +## of this software and associated documentation files (the "Software"), to deal +## in the Software without restriction, including without limitation the rights +## to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +## copies of the Software, and to permit persons to whom the Software is +## furnished to do so, subject to the following conditions: +## +## The above copyright notice and this permission notice shall be included +## in all copies or substantial portions of the Software. +## +## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +## OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +## FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +## THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +## LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +## SOFTWARE. +## +## http://www.opensource.org/licenses/mit-license.php +## +################################################################################ + +use strict; +use warnings; +use Test::More tests => 3; + +# Create the rc file. +if (open my $fh, '>', 'bug.rc') +{ + print $fh "data.location=.\n", + "recurrence.limit=1\n"; + close $fh; + ok (-r 'bug.rc', 'Created bug.rc'); +} + +# Bug 972: A recurrence period of "7" is interpreted as "7s", not "7d" as +# intended. +my $output = qx{../src/task rc:bug.rc add foo due:now recur:2 2>&1}; +like ($output, qr/ not recognized as valid, /, 'recur:2 is not valid'); + +# Cleanup. +unlink qw(pending.data completed.data undo.data backlog.data synch.key bug.rc); +ok (! -r 'pending.data' && + ! -r 'completed.data' && + ! -r 'undo.data' && + ! -r 'backlog.data' && + ! -r 'synch.key' && + ! -r 'bug.rc', 'Cleanup'); + +exit 0; + diff --git a/test/color.err.t b/test/color.err.t index 2de132ee3..ae1e51cd2 100755 --- a/test/color.err.t +++ b/test/color.err.t @@ -45,7 +45,7 @@ if (open my $fh, '>', 'color.rc') # Test the errors colors my $output = qx{../src/task rc:color.rc rc.debug:on add due:__ 2>&1 >/dev/null}; -like ($output, qr/^\033\[33mThe\ date\/duration\ '__'\ was\ not\ recognized.\033\[0m$/xms, 'color.error'); +like ($output, qr/^\033\[33mThe\ duration\ '__'\ was\ not\ recognized\ as\ valid,\ with\ correct\ units\ like\ '3days'\.\033\[0m$/xms, 'color.error'); like ($output, qr/^\033\[32mTimer\ Config::load\ \(color.rc\) .* \033\[0m$/xms, 'color.debug'); like ($output, qr/^\033\[34mUsing\ alternate\ .taskrc\ file\ color.rc\033\[0m$/xms, 'color.header'); like ($output, qr/^\033\[31mConfiguration\ override\ rc.debug:on\033\[0m$/xms, 'color.footnote'); diff --git a/test/feature.1013.t b/test/feature.1013.t index 56cef94bc..cb82c631d 100755 --- a/test/feature.1013.t +++ b/test/feature.1013.t @@ -43,9 +43,9 @@ if (open my $fh, '>', 'outerr.rc') # Check that errors are sent to standard error my $stdout = qx{../src/task rc:outerr.rc add due:__ 2> /dev/null}; -unlike ($stdout, qr/^The date\/duration '__' was not recognized.$/ms, 'Errors are not sent to stdout'); +unlike ($stdout, qr/^The duration '__' was not recognized as valid, with correct units like '3days'.$/ms, 'Errors are not sent to stdout'); my $stderr = qx{../src/task rc:outerr.rc add due:__ 2>&1 >/dev/null}; -like ($stderr, qr/^The date\/duration '__' was not recognized.$/ms, 'Errors are sent to stderr'); +like ($stderr, qr/^The duration '__' was not recognized as valid, with correct units like '3days'.$/ms, 'Errors are sent to stderr'); # Check that headers are sent to standard error $stdout = qx{../src/task rc:outerr.rc list 2> /dev/null};