Enhancement - Hooks

- Implemented a master switch rc.hooks=off that can shut off all
  hooks.  Seems like a good idea.
- Added support for 'hooks' and 'hook.*' as valid configuration
  entries.
This commit is contained in:
Paul Beckingham 2010-01-30 17:43:33 -05:00
parent ea8b4beede
commit d09a079199
3 changed files with 41 additions and 32 deletions

View file

@ -119,6 +119,7 @@ std::string Config::defaults =
"complete.all.projects=no # Include old project names in 'projects' command\n" // TODO
"complete.all.tags=no # Include old tag names in 'tags' command\n" // TODO
"debug=no # Display diagnostics\n"
"hooks=off # Hook system master switch\n"
"fontunderline=yes # Uses underlines rather than -------\n"
"shell.prompt=task> # Prompt used by the shell command\n" // TODO
"\n"

View file

@ -89,46 +89,53 @@ void Hooks::initialize ()
api.initialize ();
#endif
std::vector <std::string> vars;
context.config.all (vars);
std::vector <std::string>::iterator it;
for (it = vars.begin (); it != vars.end (); ++it)
// Allow a master switch to turn the whole thing off.
bool big_red_switch = context.config.getBoolean ("hooks");
if (big_red_switch)
{
std::string type;
std::string name;
std::string value;
std::vector <std::string> vars;
context.config.all (vars);
// "<type>.<name>"
Nibbler n (*it);
if (n.getUntil ('.', type) &&
type == "hook" &&
n.skip ('.') &&
n.getUntilEOS (name))
std::vector <std::string>::iterator it;
for (it = vars.begin (); it != vars.end (); ++it)
{
std::string value = context.config.get (*it);
Nibbler n (value);
std::string type;
std::string name;
std::string value;
// <path>:<function> [, ...]
while (!n.depleted ())
// "<type>.<name>"
Nibbler n (*it);
if (n.getUntil ('.', type) &&
type == "hook" &&
n.skip ('.') &&
n.getUntilEOS (name))
{
std::string file;
std::string function;
if (n.getUntil (':', file) &&
n.skip (':') &&
n.getUntil (',', function))
{
context.debug (std::string ("Event '") + name + "' hooked by " + file + ", function " + function);
Hook h (name, Path::expand (file), function);
all.push_back (h);
std::string value = context.config.get (*it);
Nibbler n (value);
(void) n.skip (',');
// <path>:<function> [, ...]
while (!n.depleted ())
{
std::string file;
std::string function;
if (n.getUntil (':', file) &&
n.skip (':') &&
n.getUntil (',', function))
{
context.debug (std::string ("Event '") + name + "' hooked by " + file + ", function " + function);
Hook h (name, Path::expand (file), function);
all.push_back (h);
(void) n.skip (',');
}
else
throw std::string ("Malformed hook definition '") + *it + "'";
}
else
throw std::string ("Malformed hook definition '") + *it + "'";
}
}
}
else
context.debug ("Hooks::initialize - hook system shut off");
}
////////////////////////////////////////////////////////////////////////////////

View file

@ -671,7 +671,7 @@ int handleConfig (std::string &outs)
"displayweeknumber echo.command fontunderline locking monthsperline nag "
"next project shadow.command shadow.file shadow.notify weekstart editor "
"import.synonym.id import.synonym.uuid complete.all.projects "
"complete.all.tags search.case.sensitive "
"complete.all.tags search.case.sensitive hooks "
#ifdef FEATURE_SHELL
"shell.prompt "
#endif
@ -700,7 +700,8 @@ int handleConfig (std::string &outs)
i->substr (0, 10) != "color.tag." &&
i->substr (0, 8) != "holiday." &&
i->substr (0, 7) != "report." &&
i->substr (0, 6) != "alias.")
i->substr (0, 6) != "alias." &&
i->substr (0, 5) != "hook.")
{
unrecognized.push_back (*i);
}