diff --git a/src/commands/CmdLog.cpp b/src/commands/CmdLog.cpp index 385a4b53..93d9a2fc 100644 --- a/src/commands/CmdLog.cpp +++ b/src/commands/CmdLog.cpp @@ -25,12 +25,14 @@ //////////////////////////////////////////////////////////////////////////////// #include +#include #include //////////////////////////////////////////////////////////////////////////////// -int CmdLog () +int CmdLog (Log& log) { std::cout << "# log\n"; + log.write ("debug", "----8<----"); return 0; } diff --git a/src/commands/commands.h b/src/commands/commands.h index 254a6489..98941129 100644 --- a/src/commands/commands.h +++ b/src/commands/commands.h @@ -28,6 +28,7 @@ #define INCLUDED_COMMANDS #include +#include int CmdClear (); int CmdConfig (); @@ -40,7 +41,7 @@ int CmdExtension (); int CmdGaps (); int CmdHelpUsage (); int CmdHelp (); -int CmdLog (); +int CmdLog (Log&); int CmdImport (); int CmdReport (); int CmdStart (); diff --git a/src/init.cpp b/src/init.cpp index f4e6b289..1539f42e 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -29,6 +29,7 @@ #include #include #include +#include //#include //#include #include @@ -53,7 +54,10 @@ bool lightweightVersionCheck (int argc, const char** argv) } //////////////////////////////////////////////////////////////////////////////// -void initializeData (Configuration& configuration, Database& database) +void initializeData ( + Configuration& configuration, + Database& database, + Log& log) { // The $TIMEWARRIORDB environment variable overrides the default value of // ~/.timewarrior‥ @@ -120,6 +124,9 @@ void initializeData (Configuration& configuration, Database& database) // Initialize the database (no data read), but files are enumerated. database.initialize (data._data); + // TODO Give the log file a temp fake name. To be removed. + log.file (dbLocation._data + "/timewarrior.log"); + std::cout << "# Configuration\n"; for (const auto& name : configuration.all ()) std::cout << "# " << name << "=" << configuration[name] << "\n"; @@ -128,7 +135,10 @@ void initializeData (Configuration& configuration, Database& database) } //////////////////////////////////////////////////////////////////////////////// -void initializeRules (Configuration& configuration, Rules& rules) +void initializeRules ( + Configuration& configuration, + Rules& rules, + Log& log) { // TODO Load rule grammar. /* @@ -148,7 +158,10 @@ void initializeRules (Configuration& configuration, Rules& rules) } //////////////////////////////////////////////////////////////////////////////// -void initializeExtensions (Configuration& configuration, Extensions& extensions) +void initializeExtensions ( + Configuration& configuration, + Extensions& extensions, + Log& log) { Directory extDir (configuration.get ("db")); extDir += "extensions"; @@ -165,7 +178,8 @@ int dispatchCommand ( Configuration& configuration, Database& database, Rules& rules, - Extensions& extensions) + Extensions& extensions, + Log& log) { int status {0}; @@ -193,7 +207,7 @@ int dispatchCommand ( else if (closeEnough (allCommands[6], argv[1], 2)) status = CmdExport (); else if (closeEnough (allCommands[7], argv[1], 2)) status = CmdGaps (); else if (closeEnough (allCommands[8], argv[1], 2)) status = CmdImport (); - else if (closeEnough (allCommands[9], argv[1], 2)) status = CmdLog (); + else if (closeEnough (allCommands[9], argv[1], 2)) status = CmdLog (log); else if (closeEnough (allCommands[10], argv[1], 2)) status = CmdReport (); else if (closeEnough (allCommands[11], argv[1], 2)) status = CmdStart (); else if (closeEnough (allCommands[12], argv[1], 2)) status = CmdStop (); diff --git a/src/timew.cpp b/src/timew.cpp index bd2d548e..300b6d71 100644 --- a/src/timew.cpp +++ b/src/timew.cpp @@ -29,6 +29,7 @@ #include #include #include +#include //#include #include #include @@ -42,6 +43,11 @@ //////////////////////////////////////////////////////////////////////////////// int main (int argc, const char** argv) { + // The log is needed early, in order to capture as much as possible, but will + // only be given a file name once configuration is loaded. The log therefore + // buffers the messages until it has a file name to write to. + Log log; + // Lightweight version checking that doesn't require initialization or I/O. int status = 0; if (lightweightVersionCheck (argc, argv)) @@ -52,7 +58,7 @@ int main (int argc, const char** argv) // Load the configuration, prepare the database, but do not read data. Configuration configuration; Database database; - initializeData (configuration, database); + initializeData (configuration, database, log); // TODO Arrange the following to minimize memory use. // TODO Load CLI grammar. @@ -73,31 +79,36 @@ int main (int argc, const char** argv) // Load the rules. Rules rules; - initializeRules (configuration, rules); + initializeRules (configuration, rules, log); // Load extension script info. Extensions extensions; - initializeExtensions (configuration, extensions); + initializeExtensions (configuration, extensions, log); // Dispatch to commands. - status = dispatchCommand (argc, argv, configuration, database, rules, extensions); + status = dispatchCommand (argc, argv, configuration, database, rules, extensions, log); } catch (const std::string& error) { std::cerr << error << "\n"; + log.write ("error", error); status = -1; } catch (std::bad_alloc& error) { - std::cerr << "Error: Memory allocation failed: " << error.what () << "\n"; + auto message = std::string ("Memory allocation failed: ") + error.what (); + std::cerr << "Error: " << message << "\n"; + log.write ("error", message); status = -3; } catch (...) { - std::cerr << "Error: Unknown problem, please report.\n"; + auto message = "Unknown problem, please report."; + std::cerr << "Error: " << message << "\n"; + log.write ("error", message); status = -2; } diff --git a/src/timew.h b/src/timew.h index 9affda7e..38c441a4 100644 --- a/src/timew.h +++ b/src/timew.h @@ -31,12 +31,13 @@ #include #include #include +#include // init.cpp bool lightweightVersionCheck (int, const char**); -void initializeData (Configuration&, Database&); -void initializeRules (Configuration&, Rules&); -void initializeExtensions (Configuration&, Extensions&); -int dispatchCommand (int, const char**, Configuration&, Database&, Rules&, Extensions&); +void initializeData (Configuration&, Database&, Log&); +void initializeRules (Configuration&, Rules&, Log&); +void initializeExtensions (Configuration&, Extensions&, Log&); +int dispatchCommand (int, const char**, Configuration&, Database&, Rules&, Extensions&, Log&); #endif