- Rewrote updateRecurrenceMask, which was hopelessly muddled after the
TDB -> TDB2 change.
- Modified associated code.
- Improved signal to noise ratio in unit tests.
- When handleRecurrence was cloning the parent task, it failed to set
a new ID, so all the child tasks were given the ID of the parent.
- Cleaned up bug.annual.t.
- Fixed validation bug whereby recurring child tasks inherited the
parent status ("recurring") instead of the expected "pending".
- Modified 'add' command to code duplicated in Task::validate.
- Cleaned up associated bug.period.t unit test.
- Converted the 'cal' command to TDB2.
- Reinstated command line handling for 'cal' command, but realized there
is a conflict with filters. Filtering disabled for 'cal' until a good
solution is found.
- Converted recur.cpp to use TDB2, which eliminates the file locking
problems that occur when both TDB and TDB2 are in use at the same time.
This will cause other issues until all commands are converted to TDB2.
- Added feature #559, which implements a new configuration variable,
rc.exit.on.missing.db, which causes taskwarrior to exit if the
rc.data.location is missing (thanks to Sander Marechal).
- Child tasks now have their own entry date, instead of inheriting it
from the parent. This improves the ability to report new tasks in
the burndown charts, history report.
- Completed support for 'task 1 depends:2,-3' to manipulate the
dependencies.
- Now supports rc.dependency.reminder to indicate when to nag about
dependency chain violations, defaulting to on.
- Now supports rc.dependency.confirm to require confirmation before
fixing dependency chains, defaulting to on.
- New source file dependency.cpp which implements a low-level API for
determining dependency status, and assorted handlers for task state
changes.
- Adds blocking tasks to the 'next' report.
- Added more dependency unit tests, changed the wording in a couple of
them and numbered them for easy reference.
- Cleaned up message that is generated when a recurring task is past
its until: date and all child tasks have been dismissed, as the
parent task is deleted.
- Added unit tests recur.until.t to prove that the above is working.
- Relocated util/formatSeconds and util/formatSecondsCompact into
Duration object.
- Relocated unit tests.
- Upgraded Duration object to use seconds, not days.
- Enhanced Duration so that it can now parse '4 mins' etc.
- Added new recurrence.limit value (default 1) to control the number of
future pending tasks generated from a recurring parent task.
- Added unit tests.
- Updated taskrc man page.
- Implemented replacement Config::get* methods.
- Replaced all calls throughout the code, with the new methods which
have no static values as defaults.
- Fixed bug whereby handleRecurrence was being called after the tasks
were loaded and filtered, and thus handleRecurrence operated on a
filtered set, and failed. The fix is to move the call to before the
TDB::load call, and to add another TDB::loadPending call inside
handleRecurrence. This means TDB::load needs to be reentrant without
re-reading the file, and can therefore be called twice, with the
likelihood of there being a different filter for each call. This in
turn led to the problem whereby handleRecurrence would generate the
synthetic tasks, which then sat uncommitted in TDB::mNew. The fix
for this is that every call to TDB::loadPending gets the contents of
TDB::mNew appended (with correct IDs). This bug is what you might
call a good one.