From bb167b2275b498dc59e22b063c02f86689ffc34b Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Thu, 27 Sep 2012 00:56:41 -0400 Subject: [PATCH] Feature - New 'modified' attribute, which contains the most recent modification date, if a modification has occurred. --- ChangeLog | 2 ++ NEWS | 6 +++-- doc/man/task.1.in | 9 +++++-- src/TDB2.cpp | 3 +++ src/Task.cpp | 8 ++++++ src/Task.h | 1 + src/columns/CMakeLists.txt | 1 + src/columns/ColModified.cpp | 51 +++++++++++++++++++++++++++++++++++++ src/columns/ColModified.h | 44 ++++++++++++++++++++++++++++++++ src/columns/Column.cpp | 3 +++ src/commands/CmdInfo.cpp | 13 ++++++++++ src/en-US.h | 2 ++ 12 files changed, 139 insertions(+), 4 deletions(-) create mode 100644 src/columns/ColModified.cpp create mode 100644 src/columns/ColModified.h diff --git a/ChangeLog b/ChangeLog index 6a0099656..5e1fef9a5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16,6 +16,8 @@ Features + The 'diagnostics' command now reports libuuid details. + New characters for parsing and formating dates ('n', 's' and 'v'). + Virtual tags. + + New 'modified' attribute, which contains the most recent modification date, + if a modification has occurred. Bugs + Fixed bug #1031, which kept expanding aliases after the '--' operator (thanks diff --git a/NEWS b/NEWS index 5cb1084ab..4b6ce1c4e 100644 --- a/NEWS +++ b/NEWS @@ -3,8 +3,10 @@ New Features in taskwarrior 2.2.0 - Bash autocompletion now works with aliases. - Virtual tags provide a tag query interface to more complex states. - - Deprectated 'fg' and 'bg' attributes removed. Any residual use of those - will appear as orphaned UDAs. + - Deprecated 'fg' and 'bg' attributes removed. Any residual use of those will + appear as orphaned UDAs. + - Tasks now have a 'modified' attribute, which indicates the last time, if at + all, that they were modified. New commands in taskwarrior 2.2.0 diff --git a/doc/man/task.1.in b/doc/man/task.1.in index 5b4cb383d..70b2a58fb 100644 --- a/doc/man/task.1.in +++ b/doc/man/task.1.in @@ -121,7 +121,11 @@ Shows all tasks matching the filter, including parents of recurring tasks. .TP .B task blocked -Shows all tasks matching the filter, that have dependencies on other tasks. +Shows all tasks matching the filter, that are currently blocked by other tasks. + +.TP +.B task blocking +Shows all tasks matching the filter, that block other tasks. .TP .B task burndown.daily @@ -281,7 +285,8 @@ Shows all recurring tasks matching the filter. .TP .B task unblocked -Shows all tasks that do not have dependencies, matching the filter. +Shows all tasks that are not currently blocked by other tasks, matching the +filter. .TP .B task waiting diff --git a/src/TDB2.cpp b/src/TDB2.cpp index 2ae5a883a..d5b1c28c6 100644 --- a/src/TDB2.cpp +++ b/src/TDB2.cpp @@ -577,6 +577,9 @@ void TDB2::modify (Task& task) // Ensure the task is consistent, and provide defaults if necessary. task.validate (false); + // All modified tasks are timestamped. + task.setModified (); + // Find task, overwrite it. Task original; get (task.get ("uuid"), original); diff --git a/src/Task.cpp b/src/Task.cpp index 0cb4755f5..7d20b330d 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -218,6 +218,14 @@ void Task::setStart () recalc_urgency = true; } +//////////////////////////////////////////////////////////////////////////////// +void Task::setModified () +{ + char now[16]; + sprintf (now, "%u", (unsigned int) time (NULL)); + set ("modified", now); +} + //////////////////////////////////////////////////////////////////////////////// bool Task::has (const std::string& name) const { diff --git a/src/Task.h b/src/Task.h index 49200c87b..6ea83a54e 100644 --- a/src/Task.h +++ b/src/Task.h @@ -69,6 +69,7 @@ public: void setEntry (); void setEnd (); void setStart (); + void setModified (); bool has (const std::string&) const; std::vector all (); diff --git a/src/columns/CMakeLists.txt b/src/columns/CMakeLists.txt index 4ef0a7145..652bf151a 100644 --- a/src/columns/CMakeLists.txt +++ b/src/columns/CMakeLists.txt @@ -15,6 +15,7 @@ set (columns_SRCS Column.cpp Column.h ColID.cpp ColID.h ColIMask.cpp ColIMask.h ColMask.cpp ColMask.h + ColModified.cpp ColModified.h ColParent.cpp ColParent.h ColPriority.cpp ColPriority.h ColProject.cpp ColProject.h diff --git a/src/columns/ColModified.cpp b/src/columns/ColModified.cpp new file mode 100644 index 000000000..a7d17074a --- /dev/null +++ b/src/columns/ColModified.cpp @@ -0,0 +1,51 @@ +//////////////////////////////////////////////////////////////////////////////// +// 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 +// +//////////////////////////////////////////////////////////////////////////////// + +#define L10N // Localization complete. + +#include +#include + +//////////////////////////////////////////////////////////////////////////////// +ColumnModified::ColumnModified () +{ + _name = "modified"; + _label = STRING_COLUMN_LABEL_MOD; +} + +//////////////////////////////////////////////////////////////////////////////// +ColumnModified::~ColumnModified () +{ +} + +//////////////////////////////////////////////////////////////////////////////// +bool ColumnModified::validate (std::string& value) +{ + return ColumnDate::validate (value); +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/columns/ColModified.h b/src/columns/ColModified.h new file mode 100644 index 000000000..81559a520 --- /dev/null +++ b/src/columns/ColModified.h @@ -0,0 +1,44 @@ +//////////////////////////////////////////////////////////////////////////////// +// 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 +// +//////////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_COLMODIFIED +#define INCLUDED_COLMODIFIED +#define L10N // Localization complete. + +#include + +class ColumnModified : public ColumnDate +{ +public: + ColumnModified (); + ~ColumnModified (); + + bool validate (std::string&); +}; + +#endif +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/columns/Column.cpp b/src/columns/Column.cpp index f96e731d2..8f2c7d46b 100644 --- a/src/columns/Column.cpp +++ b/src/columns/Column.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -87,6 +88,7 @@ Column* Column::factory (const std::string& name, const std::string& report) else if (column_name == "id") c = new ColumnID (); else if (column_name == "imask") c = new ColumnIMask (); else if (column_name == "mask") c = new ColumnMask (); + else if (column_name == "modified") c = new ColumnModified (); else if (column_name == "parent") c = new ColumnParent (); else if (column_name == "priority") c = new ColumnPriority (); else if (column_name == "project") c = new ColumnProject (); @@ -129,6 +131,7 @@ void Column::factory (std::map & all) c = new ColumnID (); all[c->_name] = c; c = new ColumnIMask (); all[c->_name] = c; c = new ColumnMask (); all[c->_name] = c; + c = new ColumnModified (); all[c->_name] = c; c = new ColumnParent (); all[c->_name] = c; c = new ColumnPriority (); all[c->_name] = c; c = new ColumnProject (); all[c->_name] = c; diff --git a/src/commands/CmdInfo.cpp b/src/commands/CmdInfo.cpp index fb7790ed0..aefe1eb12 100644 --- a/src/commands/CmdInfo.cpp +++ b/src/commands/CmdInfo.cpp @@ -305,6 +305,19 @@ int CmdInfo::execute (std::string& output) view.set (row, 0, STRING_COLUMN_LABEL_URGENCY); view.set (row, 1, trimLeft (format (task->urgency (), 4, 4))); + // modified + if (task->has ("modified")) + { + row = view.addRow (); + view.set (row, 0, STRING_CMD_INFO_MODIFIED); + + Date mod (task->get_date ("modified")); + + std::string age = Duration (now - mod).format (); + view.set (row, 1, Date (task->get_date ("modified")).toString (dateformat) + + " (" + age + ")"); + } + // Show any UDAs std::vector all = task->all (); std::vector ::iterator att; diff --git a/src/en-US.h b/src/en-US.h index 0e852177a..8e6c98cde 100644 --- a/src/en-US.h +++ b/src/en-US.h @@ -141,6 +141,7 @@ #define STRING_COLUMN_LABEL_ENTERED "Entered" #define STRING_COLUMN_LABEL_COUNT "Count" #define STRING_COLUMN_LABEL_COMPLETE "Completed" +#define STRING_COLUMN_LABEL_MOD "Modified" #define STRING_COLUMN_LABEL_ADDED "Added" #define STRING_COLUMN_LABEL_AGE "Age" #define STRING_COLUMN_LABEL_ID "ID" @@ -236,6 +237,7 @@ #define STRING_CMD_INFO_UNTIL "Until" #define STRING_CMD_INFO_MODIFICATION "Modification" #define STRING_CMD_INFO_TOTAL_ACTIVE "Total active time" +#define STRING_CMD_INFO_MODIFIED "Last modified" #define STRING_CMD_UNDO_USAGE "Reverts the most recent change to a task" #define STRING_CMD_UNDO_MODS "The undo command does not allow further task modification." #define STRING_CMD_STATS_USAGE "Shows task database statistics"