- New 'modified' attribute, which contains the most recent modification date,
  if a modification has occurred.
This commit is contained in:
Paul Beckingham 2012-09-27 00:56:41 -04:00
parent 8d8bd653fa
commit bb167b2275
12 changed files with 139 additions and 4 deletions

View file

@ -16,6 +16,8 @@ Features
+ The 'diagnostics' command now reports libuuid details. + The 'diagnostics' command now reports libuuid details.
+ New characters for parsing and formating dates ('n', 's' and 'v'). + New characters for parsing and formating dates ('n', 's' and 'v').
+ Virtual tags. + Virtual tags.
+ New 'modified' attribute, which contains the most recent modification date,
if a modification has occurred.
Bugs Bugs
+ Fixed bug #1031, which kept expanding aliases after the '--' operator (thanks + Fixed bug #1031, which kept expanding aliases after the '--' operator (thanks

6
NEWS
View file

@ -3,8 +3,10 @@ New Features in taskwarrior 2.2.0
- Bash autocompletion now works with aliases. - Bash autocompletion now works with aliases.
- Virtual tags provide a tag query interface to more complex states. - Virtual tags provide a tag query interface to more complex states.
- Deprectated 'fg' and 'bg' attributes removed. Any residual use of those - Deprecated 'fg' and 'bg' attributes removed. Any residual use of those will
will appear as orphaned UDAs. 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 New commands in taskwarrior 2.2.0

View file

@ -121,7 +121,11 @@ Shows all tasks matching the filter, including parents of recurring tasks.
.TP .TP
.B task <filter> blocked .B task <filter> 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 <filter> blocking
Shows all tasks matching the filter, that block other tasks.
.TP .TP
.B task <filter> burndown.daily .B task <filter> burndown.daily
@ -281,7 +285,8 @@ Shows all recurring tasks matching the filter.
.TP .TP
.B task <filter> unblocked .B task <filter> 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 .TP
.B task <filter> waiting .B task <filter> waiting

View file

@ -577,6 +577,9 @@ void TDB2::modify (Task& task)
// Ensure the task is consistent, and provide defaults if necessary. // Ensure the task is consistent, and provide defaults if necessary.
task.validate (false); task.validate (false);
// All modified tasks are timestamped.
task.setModified ();
// Find task, overwrite it. // Find task, overwrite it.
Task original; Task original;
get (task.get ("uuid"), original); get (task.get ("uuid"), original);

View file

@ -218,6 +218,14 @@ void Task::setStart ()
recalc_urgency = true; 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 bool Task::has (const std::string& name) const
{ {

View file

@ -69,6 +69,7 @@ public:
void setEntry (); void setEntry ();
void setEnd (); void setEnd ();
void setStart (); void setStart ();
void setModified ();
bool has (const std::string&) const; bool has (const std::string&) const;
std::vector <std::string> all (); std::vector <std::string> all ();

View file

@ -15,6 +15,7 @@ set (columns_SRCS Column.cpp Column.h
ColID.cpp ColID.h ColID.cpp ColID.h
ColIMask.cpp ColIMask.h ColIMask.cpp ColIMask.h
ColMask.cpp ColMask.h ColMask.cpp ColMask.h
ColModified.cpp ColModified.h
ColParent.cpp ColParent.h ColParent.cpp ColParent.h
ColPriority.cpp ColPriority.h ColPriority.cpp ColPriority.h
ColProject.cpp ColProject.h ColProject.cpp ColProject.h

View file

@ -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 <ColModified.h>
#include <i18n.h>
////////////////////////////////////////////////////////////////////////////////
ColumnModified::ColumnModified ()
{
_name = "modified";
_label = STRING_COLUMN_LABEL_MOD;
}
////////////////////////////////////////////////////////////////////////////////
ColumnModified::~ColumnModified ()
{
}
////////////////////////////////////////////////////////////////////////////////
bool ColumnModified::validate (std::string& value)
{
return ColumnDate::validate (value);
}
////////////////////////////////////////////////////////////////////////////////

44
src/columns/ColModified.h Normal file
View file

@ -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 <ColDate.h>
class ColumnModified : public ColumnDate
{
public:
ColumnModified ();
~ColumnModified ();
bool validate (std::string&);
};
#endif
////////////////////////////////////////////////////////////////////////////////

View file

@ -37,6 +37,7 @@
#include <ColID.h> #include <ColID.h>
#include <ColIMask.h> #include <ColIMask.h>
#include <ColMask.h> #include <ColMask.h>
#include <ColModified.h>
#include <ColParent.h> #include <ColParent.h>
#include <ColPriority.h> #include <ColPriority.h>
#include <ColProject.h> #include <ColProject.h>
@ -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 == "id") c = new ColumnID ();
else if (column_name == "imask") c = new ColumnIMask (); else if (column_name == "imask") c = new ColumnIMask ();
else if (column_name == "mask") c = new ColumnMask (); 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 == "parent") c = new ColumnParent ();
else if (column_name == "priority") c = new ColumnPriority (); else if (column_name == "priority") c = new ColumnPriority ();
else if (column_name == "project") c = new ColumnProject (); else if (column_name == "project") c = new ColumnProject ();
@ -129,6 +131,7 @@ void Column::factory (std::map <std::string, Column*>& all)
c = new ColumnID (); all[c->_name] = c; c = new ColumnID (); all[c->_name] = c;
c = new ColumnIMask (); all[c->_name] = c; c = new ColumnIMask (); all[c->_name] = c;
c = new ColumnMask (); 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 ColumnParent (); all[c->_name] = c;
c = new ColumnPriority (); all[c->_name] = c; c = new ColumnPriority (); all[c->_name] = c;
c = new ColumnProject (); all[c->_name] = c; c = new ColumnProject (); all[c->_name] = c;

View file

@ -305,6 +305,19 @@ int CmdInfo::execute (std::string& output)
view.set (row, 0, STRING_COLUMN_LABEL_URGENCY); view.set (row, 0, STRING_COLUMN_LABEL_URGENCY);
view.set (row, 1, trimLeft (format (task->urgency (), 4, 4))); 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 // Show any UDAs
std::vector <std::string> all = task->all (); std::vector <std::string> all = task->all ();
std::vector <std::string>::iterator att; std::vector <std::string>::iterator att;

View file

@ -141,6 +141,7 @@
#define STRING_COLUMN_LABEL_ENTERED "Entered" #define STRING_COLUMN_LABEL_ENTERED "Entered"
#define STRING_COLUMN_LABEL_COUNT "Count" #define STRING_COLUMN_LABEL_COUNT "Count"
#define STRING_COLUMN_LABEL_COMPLETE "Completed" #define STRING_COLUMN_LABEL_COMPLETE "Completed"
#define STRING_COLUMN_LABEL_MOD "Modified"
#define STRING_COLUMN_LABEL_ADDED "Added" #define STRING_COLUMN_LABEL_ADDED "Added"
#define STRING_COLUMN_LABEL_AGE "Age" #define STRING_COLUMN_LABEL_AGE "Age"
#define STRING_COLUMN_LABEL_ID "ID" #define STRING_COLUMN_LABEL_ID "ID"
@ -236,6 +237,7 @@
#define STRING_CMD_INFO_UNTIL "Until" #define STRING_CMD_INFO_UNTIL "Until"
#define STRING_CMD_INFO_MODIFICATION "Modification" #define STRING_CMD_INFO_MODIFICATION "Modification"
#define STRING_CMD_INFO_TOTAL_ACTIVE "Total active time" #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_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_UNDO_MODS "The undo command does not allow further task modification."
#define STRING_CMD_STATS_USAGE "Shows task database statistics" #define STRING_CMD_STATS_USAGE "Shows task database statistics"