mirror of
https://github.com/GothenburgBitFactory/taskwarrior.git
synced 2025-07-31 17:03:30 +02:00
Enhancement - Hooks
- Implemented pre-completed, post-completed events. - Added debug info for event triggers. - Removed support for pre-file-unlock, post-file-unlock, as they are called from TDB::~TDB in Context::~Context, which is after Hooks::~Hooks, which means segfault.
This commit is contained in:
parent
03f7e0686f
commit
b02374c3f5
3 changed files with 42 additions and 34 deletions
|
@ -150,6 +150,8 @@ bool Hooks::trigger (const std::string& event)
|
|||
std::string type;
|
||||
if (eventType (event, type))
|
||||
{
|
||||
context.debug (std::string ("Event ") + event + " triggered");
|
||||
|
||||
// Figure out where to get the calling-context info from.
|
||||
if (type == "program") rc = api.callProgramHook (it->file, it->function);
|
||||
else if (type == "list") rc = api.callListHook (it->file, it->function/*, tasks*/);
|
||||
|
@ -182,7 +184,6 @@ bool Hooks::eventType (const std::string& event, std::string& type)
|
|||
event == "pre-gc" || event == "post-gc" ||
|
||||
event == "pre-undo" || event == "post-undo" ||
|
||||
event == "pre-file-lock" || event == "post-file-lock" ||
|
||||
event == "pre-file-unlock" || event == "post-file-unlock" ||
|
||||
event == "pre-add-command" || event == "post-add-command")
|
||||
{
|
||||
type = "program";
|
||||
|
@ -193,8 +194,9 @@ bool Hooks::eventType (const std::string& event, std::string& type)
|
|||
type = "list";
|
||||
return true;
|
||||
}
|
||||
else if (event == "pre-tag" || event == "post-tag" ||
|
||||
event == "pre-detag" || event == "post-detag")
|
||||
else if (event == "pre-tag" || event == "post-tag" ||
|
||||
event == "pre-detag" || event == "post-detag" ||
|
||||
event == "pre-completed" || event == "post-completed")
|
||||
{
|
||||
type = "task";
|
||||
return true;
|
||||
|
|
36
src/TDB.cpp
36
src/TDB.cpp
|
@ -144,30 +144,26 @@ void TDB::lock (bool lockFile /* = true */)
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
void TDB::unlock ()
|
||||
{
|
||||
if (mAllOpenAndLocked && context.hooks.trigger ("pre-file-unlock"))
|
||||
mPending.clear ();
|
||||
mNew.clear ();
|
||||
mModified.clear ();
|
||||
|
||||
foreach (location, mLocations)
|
||||
{
|
||||
mPending.clear ();
|
||||
mNew.clear ();
|
||||
mModified.clear ();
|
||||
fflush (location->pending);
|
||||
fclose (location->pending);
|
||||
location->pending = NULL;
|
||||
|
||||
foreach (location, mLocations)
|
||||
{
|
||||
fflush (location->pending);
|
||||
fclose (location->pending);
|
||||
location->pending = NULL;
|
||||
fflush (location->completed);
|
||||
fclose (location->completed);
|
||||
location->completed = NULL;
|
||||
|
||||
fflush (location->completed);
|
||||
fclose (location->completed);
|
||||
location->completed = NULL;
|
||||
|
||||
fflush (location->undo);
|
||||
fclose (location->undo);
|
||||
location->completed = NULL;
|
||||
}
|
||||
|
||||
mAllOpenAndLocked = false;
|
||||
context.hooks.trigger ("post-file-unlock");
|
||||
fflush (location->undo);
|
||||
fclose (location->undo);
|
||||
location->completed = NULL;
|
||||
}
|
||||
|
||||
mAllOpenAndLocked = false;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
|
@ -994,20 +994,28 @@ int handleDone (std::string &outs)
|
|||
|
||||
if (taskDiff (before, *task))
|
||||
{
|
||||
if (permission.confirmed (before, taskDifferences (before, *task) + "Proceed with change?"))
|
||||
context.hooks.setTaskId (task->id);
|
||||
if (context.hooks.trigger ("pre-completed"))
|
||||
{
|
||||
context.tdb.update (*task);
|
||||
if (permission.confirmed (before, taskDifferences (before, *task) + "Proceed with change?"))
|
||||
{
|
||||
context.tdb.update (*task);
|
||||
|
||||
if (context.config.getBoolean ("echo.command"))
|
||||
out << "Completed "
|
||||
<< task->id
|
||||
<< " '"
|
||||
<< task->get ("description")
|
||||
<< "'"
|
||||
<< std::endl;
|
||||
if (context.config.getBoolean ("echo.command"))
|
||||
out << "Completed "
|
||||
<< task->id
|
||||
<< " '"
|
||||
<< task->get ("description")
|
||||
<< "'"
|
||||
<< std::endl;
|
||||
|
||||
++count;
|
||||
++count;
|
||||
}
|
||||
|
||||
context.hooks.trigger ("post-completed");
|
||||
}
|
||||
else
|
||||
continue;
|
||||
}
|
||||
|
||||
updateRecurrenceMask (all, *task);
|
||||
|
@ -1024,7 +1032,9 @@ int handleDone (std::string &outs)
|
|||
rc = 1;
|
||||
}
|
||||
|
||||
context.tdb.commit ();
|
||||
if (count)
|
||||
context.tdb.commit ();
|
||||
|
||||
context.tdb.unlock ();
|
||||
|
||||
if (context.config.getBoolean ("echo.command"))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue