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:
Paul Beckingham 2010-01-23 13:12:49 -05:00
parent 03f7e0686f
commit b02374c3f5
3 changed files with 42 additions and 34 deletions

View file

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

View file

@ -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;
}
////////////////////////////////////////////////////////////////////////////////

View file

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