From b0b8bfe1d2870825e0f52ed2746034ffc6e64862 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Wed, 4 Jul 2012 16:44:16 -0400 Subject: [PATCH] Bug #1023 - Fixed bug #1023, which applied default.project and default.priority during modification (thanks to Christoph Lange). - Added unit tests. - Added Christoph to the AUTHORS file. --- AUTHORS | 1 + ChangeLog | 2 ++ src/TDB2.cpp | 2 +- src/Task.cpp | 8 +++--- src/Task.h | 2 +- test/bug.1023.t | 71 +++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 80 insertions(+), 6 deletions(-) create mode 100755 test/bug.1023.t diff --git a/AUTHORS b/AUTHORS index 72134939a..c01b5ad6e 100644 --- a/AUTHORS +++ b/AUTHORS @@ -144,4 +144,5 @@ suggestions: Bruno Bigras Hyde Stevenson Martin U + Christoph Lange diff --git a/ChangeLog b/ChangeLog index da626a0d4..6dc47712f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -92,6 +92,8 @@ Bugs that lack description or entry date (thanks to Nicholas Rabenau). + Fixed bug #1017, which exported invalid JSON when there were no tasks (thanks to Nicholas Rabenau). + + Fixed bug #1023, which applied default.project and default.priority during + modification (thanks to Christoph Lange). ------ old releases ------------------------------ diff --git a/src/TDB2.cpp b/src/TDB2.cpp index 3fd34e1e9..240ab088a 100644 --- a/src/TDB2.cpp +++ b/src/TDB2.cpp @@ -477,7 +477,7 @@ void TDB2::add (Task& task) void TDB2::modify (Task& task) { // Ensure the task is consistent, and provide defaults if necessary. - task.validate (); + task.validate (false); // Find task, overwrite it. Task original; diff --git a/src/Task.cpp b/src/Task.cpp index 952758f1d..70266c5fd 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -1066,7 +1066,7 @@ void Task::substitute ( // 2) To provide suitable warnings about odd states // 3) To generate errors when the inconsistencies are not fixable // -void Task::validate () +void Task::validate (bool applyDefault /* = true */) { Task::status status = getStatus (); @@ -1105,7 +1105,7 @@ void Task::validate () setEnd (); // Override with default.project, if not specified. - if (! has ("project")) + if (applyDefault && ! has ("project")) { std::string defaultProject = context.config.get ("default.project"); if (defaultProject != "" && @@ -1114,7 +1114,7 @@ void Task::validate () } // Override with default.priority, if not specified. - if (get ("priority") == "") + if (applyDefault && get ("priority") == "") { std::string defaultPriority = context.config.get ("default.priority"); if (defaultPriority != "" && @@ -1123,7 +1123,7 @@ void Task::validate () } // Override with default.due, if not specified. - if (get ("due") == "") + if (applyDefault && get ("due") == "") { std::string defaultDue = context.config.get ("default.due"); if (defaultDue != "" && diff --git a/src/Task.h b/src/Task.h index edd59d86f..7f84d5537 100644 --- a/src/Task.h +++ b/src/Task.h @@ -102,7 +102,7 @@ public: void substitute (const std::string&, const std::string&, bool); - void validate (); + void validate (bool applyDefault = true); float urgency_c () const; float urgency (); diff --git a/test/bug.1023.t b/test/bug.1023.t new file mode 100755 index 000000000..ec17d1b33 --- /dev/null +++ b/test/bug.1023.t @@ -0,0 +1,71 @@ +#! /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 => 7; + +# Create the rc file. +if (open my $fh, '>', 'bug.rc') +{ + print $fh "data.location=.\n", + "default.project=home\n"; + close $fh; + ok (-r 'bug.rc', 'Created bug.rc'); +} + +# Bug 1023: rc.default.project gets applied during modify, and should not. +qx{../src/task rc:bug.rc add foo project:garden 2>&1}; +qx{../src/task rc:bug.rc add bar 2>&1}; +qx{../src/task rc:bug.rc add baz rc.default.project= 2>&1}; + +my $output = qx{../src/task rc:bug.rc 1 info 2>&1}; +like ($output, qr/Project\s*garden/, "default project not applied when otherwise specified."); + +$output = qx{../src/task rc:bug.rc 2 info 2>&1}; +like ($output, qr/Project\s*home/, "default project applied when blank."); + +$output = qx{../src/task rc:bug.rc 3 modify +tag 2>&1}; +unlike ($output, qr/Project\s*home/, "default project not applied on modification."); + +qx{../src/task rc:bug.rc 1 modify project: 2>&1}; +$output = qx{../src/task rc:bug.rc 1 info 2>&1}; +unlike ($output, qr/Project\s*garden/, "default project not re-applied on attribute removal."); +unlike ($output, qr/Project\s*home/, "default project not re-applied on attribute removal."); + +# 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; +