- 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.
+ 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

6
NEWS
View file

@ -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

View file

@ -121,7 +121,11 @@ Shows all tasks matching the filter, including parents of recurring tasks.
.TP
.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
.B task <filter> burndown.daily
@ -281,7 +285,8 @@ Shows all recurring tasks matching the filter.
.TP
.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
.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.
task.validate (false);
// All modified tasks are timestamped.
task.setModified ();
// Find task, overwrite it.
Task original;
get (task.get ("uuid"), original);

View file

@ -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
{

View file

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

View file

@ -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

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 <ColIMask.h>
#include <ColMask.h>
#include <ColModified.h>
#include <ColParent.h>
#include <ColPriority.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 == "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 <std::string, Column*>& 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;

View file

@ -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 <std::string> all = task->all ();
std::vector <std::string>::iterator att;

View file

@ -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"