Portability: Updated to make main re-entrant()

- New INSTALL instructions to emscripten, and AUTHORS for contribution.
This commit is contained in:
Mark Scannell
2018-01-31 19:45:07 -05:00
committed by Paul Beckingham
parent cae3f06b7d
commit 7af6db4c17
112 changed files with 960 additions and 1147 deletions

View File

@@ -141,6 +141,7 @@ The following submitted code, packages or analysis, and deserve special thanks:
Øyvind A. Holm Øyvind A. Holm
Paul J. Fenwick Paul J. Fenwick
Michael Neumann Michael Neumann
Mark Scannell
Thanks to the following, who submitted detailed bug reports and excellent Thanks to the following, who submitted detailed bug reports and excellent
suggestions: suggestions:

View File

@@ -12,6 +12,13 @@ include (CXXSniffer)
set (PROJECT_VERSION "2.6.0") set (PROJECT_VERSION "2.6.0")
OPTION (ENABLE_WASM "Enable 'wasm' support" OFF)
if (ENABLE_WASM)
message ("Enabling WASM support.")
set(CMAKE_EXECUTABLE_SUFFIX ".js")
endif (ENABLE_WASM)
OPTION (ENABLE_SYNC "Enable 'task sync' support" ON) OPTION (ENABLE_SYNC "Enable 'task sync' support" ON)
if (ENABLE_SYNC) if (ENABLE_SYNC)

View File

@@ -158,6 +158,14 @@ OpenBSD
See: https://bug.tasktools.org/browse/TW-1579 See: https://bug.tasktools.org/browse/TW-1579
WASM
Using the Emscripten compiler, you can achieve it like this:
cmake -DCMAKE_CXX_COMPILER=emcc -DENABLE_SYNC=OFF -DCMAKE_BUILD_TYPE=release -DENABLE_WASM=ON \
-DCMAKE_EXE_LINKER_FLAGS="-m32 -s NO_DYNAMIC_EXECUTION=1 -s WASM=1 -s NO_EXIT_RUNTIME=1 -s INVOKE_RUN=0" \
-DCMAKE_CXX_FLAGS_RELEASE="-O2 -m32"
This will produce an optimized WASM with a main() that is callable multiple times.
Troubleshooting Troubleshooting
--------------- ---------------

View File

@@ -35,8 +35,6 @@
#include <shared.h> #include <shared.h>
#include <format.h> #include <format.h>
extern Context context;
// Overridden by rc.abbreviation.minimum. // Overridden by rc.abbreviation.minimum.
int CLI2::minimumMatchLength = 3; int CLI2::minimumMatchLength = 3;
@@ -235,7 +233,7 @@ void CLI2::getOverride (int argc, const char** argv, std::string& home, File& rc
if (last_slash != std::string::npos) if (last_slash != std::string::npos)
home = rc.parent (); home = rc.parent ();
context.header (format ("Using alternate .taskrc file {1}", rc._data)); Context::getContext ().header (format ("Using alternate .taskrc file {1}", rc._data));
// Keep looping, because if there are multiple rc:file arguments, the last // Keep looping, because if there are multiple rc:file arguments, the last
// one should dominate. // one should dominate.
@@ -248,7 +246,7 @@ void CLI2::getOverride (int argc, const char** argv, std::string& home, File& rc
// Static method. // Static method.
void CLI2::getDataLocation (int argc, const char** argv, Path& data) void CLI2::getDataLocation (int argc, const char** argv, Path& data)
{ {
std::string location = context.config.get ("data.location"); std::string location = Context::getContext ().config.get ("data.location");
if (location != "") if (location != "")
data = location; data = location;
@@ -262,7 +260,7 @@ void CLI2::getDataLocation (int argc, const char** argv, Path& data)
raw.substr (0, 16) == "rc.data.location") raw.substr (0, 16) == "rc.data.location")
{ {
data = Directory (raw.substr (17)); data = Directory (raw.substr (17));
context.header (format ("Using alternate data.location {1}", (std::string) data)); Context::getContext ().header (format ("Using alternate data.location {1}", (std::string) data));
// Keep looping, because if there are multiple rc:file arguments, the last // Keep looping, because if there are multiple rc:file arguments, the last
// one should dominate. // one should dominate.
@@ -297,10 +295,10 @@ void CLI2::applyOverrides (int argc, const char** argv)
{ {
std::string name = raw.substr (3, sep - 3); std::string name = raw.substr (3, sep - 3);
std::string value = raw.substr (sep + 1); std::string value = raw.substr (sep + 1);
context.config.set (name, value); Context::getContext ().config.set (name, value);
if (context.verbose("override")) if (Context::getContext ().verbose("override"))
context.footnote (format ("Configuration override rc.{1}:{2}", name, value)); Context::getContext ().footnote (format ("Configuration override rc.{1}:{2}", name, value));
} }
} }
} }
@@ -469,8 +467,8 @@ void CLI2::lexArguments ()
} }
} }
if (context.config.getInteger ("debug.parser") >= 2) if (Context::getContext ().config.getInteger ("debug.parser") >= 2)
context.debug (dump ("CLI2::analyze lexArguments")); Context::getContext ().debug (dump ("CLI2::analyze lexArguments"));
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -500,7 +498,7 @@ void CLI2::demotion ()
else if (a._lextype == Lexer::Type::pair && else if (a._lextype == Lexer::Type::pair &&
canonicalize (canonical, "pseudo", a.attribute ("name"))) canonicalize (canonical, "pseudo", a.attribute ("name")))
{ {
context.config.set (canonical, a.attribute ("value")); Context::getContext ().config.set (canonical, a.attribute ("value"));
changes = true; changes = true;
// Equivalent to erasing 'a'. // Equivalent to erasing 'a'.
@@ -511,16 +509,16 @@ void CLI2::demotion ()
} }
if (changes && if (changes &&
context.config.getInteger ("debug.parser") >= 2) Context::getContext ().config.getInteger ("debug.parser") >= 2)
context.debug (dump ("CLI2::analyze demotion")); Context::getContext ().debug (dump ("CLI2::analyze demotion"));
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Intended to be called after ::add() to perform the final analysis. // Intended to be called after ::add() to perform the final analysis.
void CLI2::analyze () void CLI2::analyze ()
{ {
if (context.config.getInteger ("debug.parser") >= 2) if (Context::getContext ().config.getInteger ("debug.parser") >= 2)
context.debug (dump ("CLI2::analyze")); Context::getContext ().debug (dump ("CLI2::analyze"));
// Process _original_args. // Process _original_args.
_args.clear (); _args.clear ();
@@ -577,10 +575,10 @@ void CLI2::addContextFilter ()
return; return;
// Detect if any context is set, and bail out if not // Detect if any context is set, and bail out if not
std::string contextName = context.config.get ("context"); std::string contextName = Context::getContext ().config.get ("context");
if (contextName == "") if (contextName == "")
{ {
context.debug ("No context."); Context::getContext ().debug ("No context.");
return; return;
} }
@@ -591,23 +589,23 @@ void CLI2::addContextFilter ()
a._lextype == Lexer::Type::number || a._lextype == Lexer::Type::number ||
a._lextype == Lexer::Type::set) a._lextype == Lexer::Type::set)
{ {
context.debug (format ("UUID/ID argument found '{1}', not applying context.", a.attribute ("raw"))); Context::getContext ().debug (format ("UUID/ID argument found '{1}', not applying context.", a.attribute ("raw")));
return; return;
} }
} }
// Apply context // Apply context
context.debug ("Applying context: " + contextName); Context::getContext ().debug ("Applying context: " + contextName);
std::string contextFilter = context.config.get ("context." + contextName); std::string contextFilter = Context::getContext ().config.get ("context." + contextName);
if (contextFilter == "") if (contextFilter == "")
context.debug ("Context '" + contextName + "' not defined."); Context::getContext ().debug ("Context '" + contextName + "' not defined.");
else else
{ {
_context_filter_added = true; _context_filter_added = true;
addFilter (contextFilter); addFilter (contextFilter);
if (context.verbose ("context")) if (Context::getContext ().verbose ("context"))
context.footnote (format ("Context '{1}' set. Use 'task context none' to remove.", contextName)); Context::getContext ().footnote (format ("Context '{1}' set. Use 'task context none' to remove.", contextName));
} }
} }
@@ -633,7 +631,7 @@ void CLI2::prepareFilter ()
desugarFilterPatterns (); desugarFilterPatterns ();
insertJunctions (); // Deliberately after all desugar calls. insertJunctions (); // Deliberately after all desugar calls.
if (context.verbose ("filter")) if (Context::getContext ().verbose ("filter"))
{ {
std::string combined; std::string combined;
for (const auto& a : _args) for (const auto& a : _args)
@@ -648,7 +646,7 @@ void CLI2::prepareFilter ()
} }
if (combined.size ()) if (combined.size ())
context.footnote (std::string ("Filter: ") + combined); Context::getContext ().footnote (std::string ("Filter: ") + combined);
} }
} }
@@ -661,13 +659,13 @@ const std::vector <std::string> CLI2::getWords ()
if (a.hasTag ("MISCELLANEOUS")) if (a.hasTag ("MISCELLANEOUS"))
words.push_back (a.attribute ("raw")); words.push_back (a.attribute ("raw"));
if (context.config.getInteger ("debug.parser") >= 2) if (Context::getContext ().config.getInteger ("debug.parser") >= 2)
{ {
Color colorOrigArgs ("gray10 on gray4"); Color colorOrigArgs ("gray10 on gray4");
std::string message = " "; std::string message = " ";
for (const auto& word : words) for (const auto& word : words)
message += colorOrigArgs.colorize (word) + ' '; message += colorOrigArgs.colorize (word) + ' ';
context.debug ("CLI2::getWords" + message); Context::getContext ().debug ("CLI2::getWords" + message);
} }
return words; return words;
@@ -854,11 +852,11 @@ void CLI2::aliasExpansion ()
while (action && counter++ < safetyValveDefault); while (action && counter++ < safetyValveDefault);
if (counter >= safetyValveDefault) if (counter >= safetyValveDefault)
context.debug (format ("Nested alias limit of {1} reached.", safetyValveDefault)); Context::getContext ().debug (format ("Nested alias limit of {1} reached.", safetyValveDefault));
if (changes && if (changes &&
context.config.getInteger ("debug.parser") >= 2) Context::getContext ().config.getInteger ("debug.parser") >= 2)
context.debug (dump ("CLI2::analyze aliasExpansion")); Context::getContext ().debug (dump ("CLI2::analyze aliasExpansion"));
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -892,8 +890,8 @@ void CLI2::canonicalizeNames ()
} }
if (changes && if (changes &&
context.config.getInteger ("debug.parser") >= 2) Context::getContext ().config.getInteger ("debug.parser") >= 2)
context.debug (dump ("CLI2::analyze canonicalizeNames")); Context::getContext ().debug (dump ("CLI2::analyze canonicalizeNames"));
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -902,7 +900,7 @@ void CLI2::categorizeArgs ()
{ {
// Context is only applied for commands that request it. // Context is only applied for commands that request it.
std::string command = getCommand (); std::string command = getCommand ();
Command* cmd = context.commands[command]; Command* cmd = Context::getContext ().commands[command];
if (cmd && cmd->uses_context ()) if (cmd && cmd->uses_context ())
addContextFilter (); addContextFilter ();
@@ -1013,8 +1011,8 @@ void CLI2::categorizeArgs ()
} }
if (changes && if (changes &&
context.config.getInteger ("debug.parser") >= 2) Context::getContext ().config.getInteger ("debug.parser") >= 2)
context.debug (dump ("CLI2::analyze categorizeArgs")); Context::getContext ().debug (dump ("CLI2::analyze categorizeArgs"));
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -1082,8 +1080,8 @@ void CLI2::parenthesizeOriginalFilter ()
_args = reconstructed; _args = reconstructed;
if (context.config.getInteger ("debug.parser") >= 2) if (Context::getContext ().config.getInteger ("debug.parser") >= 2)
context.debug (dump ("CLI2::analyze parenthesizeOriginalFilter")); Context::getContext ().debug (dump ("CLI2::analyze parenthesizeOriginalFilter"));
} }
} }
@@ -1114,7 +1112,7 @@ bool CLI2::findCommand ()
a.tag ("CMD"); a.tag ("CMD");
// Apply command DNA as tags. // Apply command DNA as tags.
Command* command = context.commands[canonical]; Command* command = Context::getContext ().commands[canonical];
if (command->read_only ()) a.tag ("READONLY"); if (command->read_only ()) a.tag ("READONLY");
if (command->displays_id ()) a.tag ("SHOWSID"); if (command->displays_id ()) a.tag ("SHOWSID");
if (command->needs_gc ()) a.tag ("RUNSGC"); if (command->needs_gc ()) a.tag ("RUNSGC");
@@ -1123,8 +1121,8 @@ bool CLI2::findCommand ()
if (command->accepts_modifications ()) a.tag ("ALLOWSMODIFICATIONS"); if (command->accepts_modifications ()) a.tag ("ALLOWSMODIFICATIONS");
if (command->accepts_miscellaneous ()) a.tag ("ALLOWSMISC"); if (command->accepts_miscellaneous ()) a.tag ("ALLOWSMISC");
if (context.config.getInteger ("debug.parser") >= 2) if (Context::getContext ().config.getInteger ("debug.parser") >= 2)
context.debug (dump ("CLI2::analyze findCommand")); Context::getContext ().debug (dump ("CLI2::analyze findCommand"));
// Stop and indicate command found. // Stop and indicate command found.
return true; return true;
@@ -1185,8 +1183,8 @@ void CLI2::desugarFilterTags ()
{ {
_args = reconstructed; _args = reconstructed;
if (context.config.getInteger ("debug.parser") >= 2) if (Context::getContext ().config.getInteger ("debug.parser") >= 2)
context.debug (dump ("CLI2::prepareFilter desugarFilterTags")); Context::getContext ().debug (dump ("CLI2::prepareFilter desugarFilterTags"));
} }
} }
@@ -1211,8 +1209,8 @@ void CLI2::findStrayModifications ()
} }
if (changes) if (changes)
if (context.config.getInteger ("debug.parser") >= 2) if (Context::getContext ().config.getInteger ("debug.parser") >= 2)
context.debug (dump ("CLI2::prepareFilter findStrayModifications")); Context::getContext ().debug (dump ("CLI2::prepareFilter findStrayModifications"));
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -1249,12 +1247,12 @@ void CLI2::desugarFilterAttributes ()
// ) // )
// Use this sequence in place of a single value. // Use this sequence in place of a single value.
std::vector <A2> values = lexExpression (value); std::vector <A2> values = lexExpression (value);
if (context.config.getInteger ("debug.parser") >= 2) if (Context::getContext ().config.getInteger ("debug.parser") >= 2)
{ {
context.debug ("CLI2::lexExpression " + name + ':' + value); Context::getContext ().debug ("CLI2::lexExpression " + name + ':' + value);
for (auto& v : values) for (auto& v : values)
context.debug (" " + v.dump ()); Context::getContext ().debug (" " + v.dump ());
context.debug (" "); Context::getContext ().debug (" ");
} }
bool found = false; bool found = false;
@@ -1267,7 +1265,7 @@ void CLI2::desugarFilterAttributes ()
// date --> yes // date --> yes
// duration --> yes // duration --> yes
bool evalSupported = true; bool evalSupported = true;
Column* col = context.columns[canonical]; Column* col = Context::getContext ().columns[canonical];
if (col && col->type () == "string") if (col && col->type () == "string")
evalSupported = false; evalSupported = false;
@@ -1413,8 +1411,8 @@ void CLI2::desugarFilterAttributes ()
{ {
_args = reconstructed; _args = reconstructed;
if (context.config.getInteger ("debug.parser") >= 2) if (Context::getContext ().config.getInteger ("debug.parser") >= 2)
context.debug (dump ("CLI2::prepareFilter desugarFilterAttributes")); Context::getContext ().debug (dump ("CLI2::prepareFilter desugarFilterAttributes"));
} }
} }
@@ -1452,8 +1450,8 @@ void CLI2::desugarFilterPatterns ()
{ {
_args = reconstructed; _args = reconstructed;
if (context.config.getInteger ("debug.parser") >= 2) if (Context::getContext ().config.getInteger ("debug.parser") >= 2)
context.debug (dump ("CLI2::prepareFilter desugarFilterPatterns")); Context::getContext ().debug (dump ("CLI2::prepareFilter desugarFilterPatterns"));
} }
} }
@@ -1470,7 +1468,7 @@ void CLI2::findIDs ()
{ {
bool changes = false; bool changes = false;
if (context.config.getBoolean ("sugar")) if (Context::getContext ().config.getBoolean ("sugar"))
{ {
bool previousFilterArgWasAnOperator = false; bool previousFilterArgWasAnOperator = false;
int filterCount = 0; int filterCount = 0;
@@ -1590,8 +1588,8 @@ void CLI2::findIDs ()
} }
if (changes) if (changes)
if (context.config.getInteger ("debug.parser") >= 2) if (Context::getContext ().config.getInteger ("debug.parser") >= 2)
context.debug (dump ("CLI2::prepareFilter findIDs")); Context::getContext ().debug (dump ("CLI2::prepareFilter findIDs"));
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -1599,7 +1597,7 @@ void CLI2::findUUIDs ()
{ {
bool changes = false; bool changes = false;
if (context.config.getBoolean ("sugar")) if (Context::getContext ().config.getBoolean ("sugar"))
{ {
for (const auto& a : _args) for (const auto& a : _args)
{ {
@@ -1651,8 +1649,8 @@ void CLI2::findUUIDs ()
} }
if (changes) if (changes)
if (context.config.getInteger ("debug.parser") >= 2) if (Context::getContext ().config.getInteger ("debug.parser") >= 2)
context.debug (dump ("CLI2::prepareFilter findUUIDs")); Context::getContext ().debug (dump ("CLI2::prepareFilter findUUIDs"));
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -1798,8 +1796,8 @@ void CLI2::insertIDExpr ()
{ {
_args = reconstructed; _args = reconstructed;
if (context.config.getInteger ("debug.parser") >= 2) if (Context::getContext ().config.getInteger ("debug.parser") >= 2)
context.debug (dump ("CLI2::prepareFilter insertIDExpr")); Context::getContext ().debug (dump ("CLI2::prepareFilter insertIDExpr"));
} }
} }
@@ -1835,8 +1833,8 @@ void CLI2::lexFilterArgs ()
{ {
_args = reconstructed; _args = reconstructed;
if (context.config.getInteger ("debug.parser") >= 2) if (Context::getContext ().config.getInteger ("debug.parser") >= 2)
context.debug (dump ("CLI2::prepareFilter lexFilterArgs")); Context::getContext ().debug (dump ("CLI2::prepareFilter lexFilterArgs"));
} }
} }
@@ -1942,8 +1940,8 @@ void CLI2::desugarFilterPlainArgs ()
{ {
_args = reconstructed; _args = reconstructed;
if (context.config.getInteger ("debug.parser") >= 2) if (Context::getContext ().config.getInteger ("debug.parser") >= 2)
context.debug (dump ("CLI2::prepareFilter desugarFilterPlainArgs")); Context::getContext ().debug (dump ("CLI2::prepareFilter desugarFilterPlainArgs"));
} }
} }
@@ -1996,8 +1994,8 @@ void CLI2::insertJunctions ()
{ {
_args = reconstructed; _args = reconstructed;
if (context.config.getInteger ("debug.parser") >= 2) if (Context::getContext ().config.getInteger ("debug.parser") >= 2)
context.debug (dump ("CLI2::prepareFilter insertJunctions")); Context::getContext ().debug (dump ("CLI2::prepareFilter insertJunctions"));
} }
} }
@@ -2037,7 +2035,7 @@ void CLI2::defaultCommand ()
if (! found_sequence) if (! found_sequence)
{ {
// Apply overrides, if any. // Apply overrides, if any.
std::string defaultCommand = context.config.get ("default.command"); std::string defaultCommand = Context::getContext ().config.get ("default.command");
if (defaultCommand != "") if (defaultCommand != "")
{ {
// Modify _args, _original_args to be: // Modify _args, _original_args to be:
@@ -2080,8 +2078,8 @@ void CLI2::defaultCommand ()
} }
if (changes && if (changes &&
context.config.getInteger ("debug.parser") >= 2) Context::getContext ().config.getInteger ("debug.parser") >= 2)
context.debug (dump ("CLI2::analyze defaultCommand")); Context::getContext ().debug (dump ("CLI2::analyze defaultCommand"));
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////

View File

@@ -414,6 +414,20 @@ static const char* modifierNames[] =
#define NUM_MODIFIER_NAMES (sizeof (modifierNames) / sizeof (modifierNames[0])) #define NUM_MODIFIER_NAMES (sizeof (modifierNames) / sizeof (modifierNames[0]))
Context* Context::context;
////////////////////////////////////////////////////////////////////////////////
Context& Context::getContext ()
{
return *Context::context;
}
////////////////////////////////////////////////////////////////////////////////
void Context::setContext (Context* context)
{
Context::context = context;
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
Context::~Context () Context::~Context ()
{ {

View File

@@ -47,6 +47,9 @@ public:
Context (const Context&); Context (const Context&);
Context& operator= (const Context&); Context& operator= (const Context&);
static Context& getContext ();
static void setContext (Context*);
int initialize (int, const char**); // all startup int initialize (int, const char**); // all startup
int run (); int run ();
int dispatch (std::string&); // command handler dispatch int dispatch (std::string&); // command handler dispatch
@@ -76,6 +79,8 @@ private:
void loadAliases (); void loadAliases ();
void propagateDebug (); void propagateDebug ();
static Context* context;
public: public:
CLI2 cli2 {}; CLI2 cli2 {};
std::string home_dir {}; std::string home_dir {};

View File

@@ -38,8 +38,6 @@
#include <format.h> #include <format.h>
#include <util.h> #include <util.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// DOM Supported References: // DOM Supported References:
// //
@@ -75,8 +73,8 @@ bool getDOM (const std::string& name, Variant& value)
! name.compare (0, 3, "rc.", 3)) ! name.compare (0, 3, "rc.", 3))
{ {
auto key = name.substr (3); auto key = name.substr (3);
auto c = context.config.find (key); auto c = Context::getContext ().config.find (key);
if (c != context.config.end ()) if (c != Context::getContext ().config.end ())
{ {
value = Variant (c->second); value = Variant (c->second);
return true; return true;
@@ -92,7 +90,7 @@ bool getDOM (const std::string& name, Variant& value)
if (name == "tw.syncneeded") if (name == "tw.syncneeded")
{ {
value = Variant (0); value = Variant (0);
for (const auto& line : context.tdb2.backlog.get_lines ()) for (const auto& line : Context::getContext ().tdb2.backlog.get_lines ())
{ {
if (line[0] == '{') if (line[0] == '{')
{ {
@@ -105,13 +103,13 @@ bool getDOM (const std::string& name, Variant& value)
} }
else if (name == "tw.program") else if (name == "tw.program")
{ {
value = Variant (context.cli2.getBinary ()); value = Variant (Context::getContext ().cli2.getBinary ());
return true; return true;
} }
else if (name == "tw.args") else if (name == "tw.args")
{ {
std::string commandLine; std::string commandLine;
for (auto& arg : context.cli2._original_args) for (auto& arg : Context::getContext ().cli2._original_args)
{ {
if (commandLine != "") if (commandLine != "")
commandLine += ' '; commandLine += ' ';
@@ -124,16 +122,16 @@ bool getDOM (const std::string& name, Variant& value)
} }
else if (name == "tw.width") else if (name == "tw.width")
{ {
value = Variant (static_cast<int> (context.terminal_width value = Variant (static_cast<int> (Context::getContext ().terminal_width
? context.terminal_width ? Context::getContext ().terminal_width
: context.getWidth ())); : Context::getContext ().getWidth ()));
return true; return true;
} }
else if (name == "tw.height") else if (name == "tw.height")
{ {
value = Variant (static_cast<int> (context.terminal_height value = Variant (static_cast<int> (Context::getContext ().terminal_height
? context.terminal_height ? Context::getContext ().terminal_height
: context.getHeight ())); : Context::getContext ().getHeight ()));
return true; return true;
} }
@@ -152,13 +150,13 @@ bool getDOM (const std::string& name, Variant& value)
{ {
if (name == "context.program") if (name == "context.program")
{ {
value = Variant (context.cli2.getBinary ()); value = Variant (Context::getContext ().cli2.getBinary ());
return true; return true;
} }
else if (name == "context.args") else if (name == "context.args")
{ {
std::string commandLine; std::string commandLine;
for (auto& arg : context.cli2._original_args) for (auto& arg : Context::getContext ().cli2._original_args)
{ {
if (commandLine != "") if (commandLine != "")
commandLine += ' '; commandLine += ' ';
@@ -171,16 +169,16 @@ bool getDOM (const std::string& name, Variant& value)
} }
else if (name == "context.width") else if (name == "context.width")
{ {
value = Variant (static_cast<int> (context.terminal_width value = Variant (static_cast<int> (Context::getContext ().terminal_width
? context.terminal_width ? Context::getContext ().terminal_width
: context.getWidth ())); : Context::getContext ().getWidth ()));
return true; return true;
} }
else if (name == "context.height") else if (name == "context.height")
{ {
value = Variant (static_cast<int> (context.terminal_height value = Variant (static_cast<int> (Context::getContext ().terminal_height
? context.terminal_height ? Context::getContext ().terminal_height
: context.getHeight ())); : Context::getContext ().getHeight ()));
return true; return true;
} }
@@ -273,7 +271,7 @@ bool getDOM (const std::string& name, const Task& task, Variant& value)
token.length () == elements[0].length ()) token.length () == elements[0].length ())
{ {
if (token != ref.get ("uuid")) if (token != ref.get ("uuid"))
context.tdb2.get (token, ref); Context::getContext ().tdb2.get (token, ref);
// Eat elements[0]/UUID. // Eat elements[0]/UUID.
elements.erase (elements.begin ()); elements.erase (elements.begin ());
@@ -283,7 +281,7 @@ bool getDOM (const std::string& name, const Task& task, Variant& value)
{ {
auto id = strtol (token.c_str (), NULL, 10); auto id = strtol (token.c_str (), NULL, 10);
if (id && id != ref.id) if (id && id != ref.id)
context.tdb2.get (id, ref); Context::getContext ().tdb2.get (id, ref);
// Eat elements[0]/ID. // Eat elements[0]/ID.
elements.erase (elements.begin ()); elements.erase (elements.begin ());
@@ -293,7 +291,7 @@ bool getDOM (const std::string& name, const Task& task, Variant& value)
auto size = elements.size (); auto size = elements.size ();
std::string canonical; std::string canonical;
if ((size == 1 || size == 2) && context.cli2.canonicalize (canonical, "attribute", elements[0])) if ((size == 1 || size == 2) && Context::getContext ().cli2.canonicalize (canonical, "attribute", elements[0]))
{ {
// Now that 'ref' is the contextual task, and any ID/UUID is chopped off the // Now that 'ref' is the contextual task, and any ID/UUID is chopped off the
// elements vector, DOM resolution is now simple. // elements vector, DOM resolution is now simple.
@@ -309,7 +307,7 @@ bool getDOM (const std::string& name, const Task& task, Variant& value)
return true; return true;
} }
Column* column = context.columns[canonical]; Column* column = Context::getContext ().columns[canonical];
if (ref.data.size () && size == 1 && column) if (ref.data.size () && size == 1 && column)
{ {

View File

@@ -36,7 +36,6 @@
#define STRING_EVAL_NO_EVAL "The expression could not be evaluated." #define STRING_EVAL_NO_EVAL "The expression could not be evaluated."
extern Context context;
extern Task& contextTask; extern Task& contextTask;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -129,15 +128,15 @@ void Eval::evaluateInfixExpression (const std::string& e, Variant& v) const
// Parse for syntax checking and operator replacement. // Parse for syntax checking and operator replacement.
if (_debug) if (_debug)
context.debug ("FILTER Infix " + dump (tokens)); Context::getContext ().debug ("FILTER Infix " + dump (tokens));
infixParse (tokens); infixParse (tokens);
if (_debug) if (_debug)
context.debug ("FILTER Infix parsed " + dump (tokens)); Context::getContext ().debug ("FILTER Infix parsed " + dump (tokens));
// Convert infix --> postfix. // Convert infix --> postfix.
infixToPostfix (tokens); infixToPostfix (tokens);
if (_debug) if (_debug)
context.debug ("FILTER Postfix " + dump (tokens)); Context::getContext ().debug ("FILTER Postfix " + dump (tokens));
// Call the postfix evaluator. // Call the postfix evaluator.
evaluatePostfixStack (tokens, v); evaluatePostfixStack (tokens, v);
@@ -155,7 +154,7 @@ void Eval::evaluatePostfixExpression (const std::string& e, Variant& v) const
tokens.push_back (std::pair <std::string, Lexer::Type> (token, type)); tokens.push_back (std::pair <std::string, Lexer::Type> (token, type));
if (_debug) if (_debug)
context.debug ("FILTER Postfix " + dump (tokens)); Context::getContext ().debug ("FILTER Postfix " + dump (tokens));
// Call the postfix evaluator. // Call the postfix evaluator.
evaluatePostfixStack (tokens, v); evaluatePostfixStack (tokens, v);
@@ -169,15 +168,15 @@ void Eval::compileExpression (
// Parse for syntax checking and operator replacement. // Parse for syntax checking and operator replacement.
if (_debug) if (_debug)
context.debug ("FILTER Infix " + dump (_compiled)); Context::getContext ().debug ("FILTER Infix " + dump (_compiled));
infixParse (_compiled); infixParse (_compiled);
if (_debug) if (_debug)
context.debug ("FILTER Infix parsed " + dump (_compiled)); Context::getContext ().debug ("FILTER Infix parsed " + dump (_compiled));
// Convert infix --> postfix. // Convert infix --> postfix.
infixToPostfix (_compiled); infixToPostfix (_compiled);
if (_debug) if (_debug)
context.debug ("FILTER Postfix " + dump (_compiled)); Context::getContext ().debug ("FILTER Postfix " + dump (_compiled));
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -240,7 +239,7 @@ void Eval::evaluatePostfixStack (
Variant result = ! right; Variant result = ! right;
values.push_back (result); values.push_back (result);
if (_debug) if (_debug)
context.debug (format ("Eval {1} ↓'{2}' → ↑'{3}'", token.first, (std::string) right, (std::string) result)); Context::getContext ().debug (format ("Eval {1} ↓'{2}' → ↑'{3}'", token.first, (std::string) right, (std::string) result));
} }
else if (token.second == Lexer::Type::op && else if (token.second == Lexer::Type::op &&
token.first == "_neg_") token.first == "_neg_")
@@ -256,14 +255,14 @@ void Eval::evaluatePostfixStack (
values.push_back (result); values.push_back (result);
if (_debug) if (_debug)
context.debug (format ("Eval {1} ↓'{2}' → ↑'{3}'", token.first, (std::string) right, (std::string) result)); Context::getContext ().debug (format ("Eval {1} ↓'{2}' → ↑'{3}'", token.first, (std::string) right, (std::string) result));
} }
else if (token.second == Lexer::Type::op && else if (token.second == Lexer::Type::op &&
token.first == "_pos_") token.first == "_pos_")
{ {
// The _pos_ operator is a NOP. // The _pos_ operator is a NOP.
if (_debug) if (_debug)
context.debug (format ("[{1}] eval op {2} NOP", values.size (), token.first)); Context::getContext ().debug (format ("[{1}] eval op {2} NOP", values.size (), token.first));
} }
// Binary operators. // Binary operators.
@@ -309,7 +308,7 @@ void Eval::evaluatePostfixStack (
values.push_back (result); values.push_back (result);
if (_debug) if (_debug)
context.debug (format ("Eval ↓'{1}' {2} ↓'{3}' → ↑'{4}'", (std::string) left, token.first, (std::string) right, (std::string) result)); Context::getContext ().debug (format ("Eval ↓'{1}' {2} ↓'{3}' → ↑'{4}'", (std::string) left, token.first, (std::string) right, (std::string) result));
} }
// Literals and identifiers. // Literals and identifiers.
@@ -323,13 +322,13 @@ void Eval::evaluatePostfixStack (
{ {
v.cast (Variant::type_integer); v.cast (Variant::type_integer);
if (_debug) if (_debug)
context.debug (format ("Eval literal number ↑'{1}'", (std::string) v)); Context::getContext ().debug (format ("Eval literal number ↑'{1}'", (std::string) v));
} }
else else
{ {
v.cast (Variant::type_real); v.cast (Variant::type_real);
if (_debug) if (_debug)
context.debug (format ("Eval literal decimal ↑'{1}'", (std::string) v)); Context::getContext ().debug (format ("Eval literal decimal ↑'{1}'", (std::string) v));
} }
break; break;
@@ -346,7 +345,7 @@ void Eval::evaluatePostfixStack (
if ((*source) (token.first, v)) if ((*source) (token.first, v))
{ {
if (_debug) if (_debug)
context.debug (format ("Eval identifier source '{1}' → ↑'{2}'", token.first, (std::string) v)); Context::getContext ().debug (format ("Eval identifier source '{1}' → ↑'{2}'", token.first, (std::string) v));
found = true; found = true;
break; break;
} }
@@ -357,7 +356,7 @@ void Eval::evaluatePostfixStack (
{ {
v.cast (Variant::type_string); v.cast (Variant::type_string);
if (_debug) if (_debug)
context.debug (format ("Eval identifier source failed '{1}'", token.first)); Context::getContext ().debug (format ("Eval identifier source failed '{1}'", token.first));
} }
} }
break; break;
@@ -365,20 +364,20 @@ void Eval::evaluatePostfixStack (
case Lexer::Type::date: case Lexer::Type::date:
v.cast (Variant::type_date); v.cast (Variant::type_date);
if (_debug) if (_debug)
context.debug (format ("Eval literal date ↑'{1}'", (std::string) v)); Context::getContext ().debug (format ("Eval literal date ↑'{1}'", (std::string) v));
break; break;
case Lexer::Type::duration: case Lexer::Type::duration:
v.cast (Variant::type_duration); v.cast (Variant::type_duration);
if (_debug) if (_debug)
context.debug (format ("Eval literal duration ↑'{1}'", (std::string) v)); Context::getContext ().debug (format ("Eval literal duration ↑'{1}'", (std::string) v));
break; break;
// Nothing to do. // Nothing to do.
case Lexer::Type::string: case Lexer::Type::string:
default: default:
if (_debug) if (_debug)
context.debug (format ("Eval literal string ↑'{1}'", (std::string) v)); Context::getContext ().debug (format ("Eval literal string ↑'{1}'", (std::string) v));
break; break;
} }

View File

@@ -35,8 +35,6 @@
#include <format.h> #include <format.h>
#include <shared.h> #include <shared.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Const iterator that can be derefenced into a Task by domSource. // Const iterator that can be derefenced into a Task by domSource.
static Task dummy; static Task dummy;
@@ -61,10 +59,10 @@ void Filter::subset (const std::vector <Task>& input, std::vector <Task>& output
Timer timer; Timer timer;
_startCount = (int) input.size (); _startCount = (int) input.size ();
context.cli2.prepareFilter (); Context::getContext ().cli2.prepareFilter ();
std::vector <std::pair <std::string, Lexer::Type>> precompiled; std::vector <std::pair <std::string, Lexer::Type>> precompiled;
for (auto& a : context.cli2._args) for (auto& a : Context::getContext ().cli2._args)
if (a.hasTag ("FILTER")) if (a.hasTag ("FILTER"))
precompiled.push_back (std::pair <std::string, Lexer::Type> (a.getToken (), a._lextype)); precompiled.push_back (std::pair <std::string, Lexer::Type> (a.getToken (), a._lextype));
@@ -75,7 +73,7 @@ void Filter::subset (const std::vector <Task>& input, std::vector <Task>& output
// Debug output from Eval during compilation is useful. During evaluation // Debug output from Eval during compilation is useful. During evaluation
// it is mostly noise. // it is mostly noise.
eval.debug (context.config.getInteger ("debug.parser") >= 3 ? true : false); eval.debug (Context::getContext ().config.getInteger ("debug.parser") >= 3 ? true : false);
eval.compileExpression (precompiled); eval.compileExpression (precompiled);
for (auto& task : input) for (auto& task : input)
@@ -95,8 +93,8 @@ void Filter::subset (const std::vector <Task>& input, std::vector <Task>& output
output = input; output = input;
_endCount = (int) output.size (); _endCount = (int) output.size ();
context.debug (format ("Filtered {1} tasks --> {2} tasks [list subset]", _startCount, _endCount)); Context::getContext ().debug (format ("Filtered {1} tasks --> {2} tasks [list subset]", _startCount, _endCount));
context.time_filter_us += timer.total_us (); Context::getContext ().time_filter_us += timer.total_us ();
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -104,10 +102,10 @@ void Filter::subset (const std::vector <Task>& input, std::vector <Task>& output
void Filter::subset (std::vector <Task>& output) void Filter::subset (std::vector <Task>& output)
{ {
Timer timer; Timer timer;
context.cli2.prepareFilter (); Context::getContext ().cli2.prepareFilter ();
std::vector <std::pair <std::string, Lexer::Type>> precompiled; std::vector <std::pair <std::string, Lexer::Type>> precompiled;
for (auto& a : context.cli2._args) for (auto& a : Context::getContext ().cli2._args)
if (a.hasTag ("FILTER")) if (a.hasTag ("FILTER"))
precompiled.push_back (std::pair <std::string, Lexer::Type> (a.getToken (), a._lextype)); precompiled.push_back (std::pair <std::string, Lexer::Type> (a.getToken (), a._lextype));
@@ -117,8 +115,8 @@ void Filter::subset (std::vector <Task>& output)
if (precompiled.size ()) if (precompiled.size ())
{ {
Timer timer_pending; Timer timer_pending;
auto pending = context.tdb2.pending.get_tasks (); auto pending = Context::getContext ().tdb2.pending.get_tasks ();
context.time_filter_us -= timer_pending.total_us (); Context::getContext ().time_filter_us -= timer_pending.total_us ();
_startCount = (int) pending.size (); _startCount = (int) pending.size ();
Eval eval; Eval eval;
@@ -126,7 +124,7 @@ void Filter::subset (std::vector <Task>& output)
// Debug output from Eval during compilation is useful. During evaluation // Debug output from Eval during compilation is useful. During evaluation
// it is mostly noise. // it is mostly noise.
eval.debug (context.config.getInteger ("debug.parser") >= 3 ? true : false); eval.debug (Context::getContext ().config.getInteger ("debug.parser") >= 3 ? true : false);
eval.compileExpression (precompiled); eval.compileExpression (precompiled);
output.clear (); output.clear ();
@@ -145,8 +143,8 @@ void Filter::subset (std::vector <Task>& output)
if (! shortcut) if (! shortcut)
{ {
Timer timer_completed; Timer timer_completed;
auto completed = context.tdb2.completed.get_tasks (); auto completed = Context::getContext ().tdb2.completed.get_tasks ();
context.time_filter_us -= timer_completed.total_us (); Context::getContext ().time_filter_us -= timer_completed.total_us ();
_startCount += (int) completed.size (); _startCount += (int) completed.size ();
for (auto& task : completed) for (auto& task : completed)
@@ -168,23 +166,23 @@ void Filter::subset (std::vector <Task>& output)
safety (); safety ();
Timer pending_completed; Timer pending_completed;
for (auto& task : context.tdb2.pending.get_tasks ()) for (auto& task : Context::getContext ().tdb2.pending.get_tasks ())
output.push_back (task); output.push_back (task);
for (auto& task : context.tdb2.completed.get_tasks ()) for (auto& task : Context::getContext ().tdb2.completed.get_tasks ())
output.push_back (task); output.push_back (task);
context.time_filter_us -= pending_completed.total_us (); Context::getContext ().time_filter_us -= pending_completed.total_us ();
} }
_endCount = (int) output.size (); _endCount = (int) output.size ();
context.debug (format ("Filtered {1} tasks --> {2} tasks [{3}]", _startCount, _endCount, (shortcut ? "pending only" : "all tasks"))); Context::getContext ().debug (format ("Filtered {1} tasks --> {2} tasks [{3}]", _startCount, _endCount, (shortcut ? "pending only" : "all tasks")));
context.time_filter_us += timer.total_us (); Context::getContext ().time_filter_us += timer.total_us ();
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
bool Filter::hasFilter () const bool Filter::hasFilter () const
{ {
for (const auto& a : context.cli2._args) for (const auto& a : Context::getContext ().cli2._args)
if (a.hasTag ("FILTER")) if (a.hasTag ("FILTER"))
return true; return true;
@@ -198,7 +196,7 @@ bool Filter::hasFilter () const
bool Filter::pendingOnly () const bool Filter::pendingOnly () const
{ {
// When GC is off, there are no shortcuts. // When GC is off, there are no shortcuts.
if (! context.config.getBoolean ("gc")) if (! Context::getContext ().config.getBoolean ("gc"))
return false; return false;
// To skip loading completed.data, there should be: // To skip loading completed.data, there should be:
@@ -211,13 +209,13 @@ bool Filter::pendingOnly () const
int countPending = 0; int countPending = 0;
int countWaiting = 0; int countWaiting = 0;
int countRecurring = 0; int countRecurring = 0;
int countId = (int) context.cli2._id_ranges.size (); int countId = (int) Context::getContext ().cli2._id_ranges.size ();
int countUUID = (int) context.cli2._uuid_list.size (); int countUUID = (int) Context::getContext ().cli2._uuid_list.size ();
int countOr = 0; int countOr = 0;
int countXor = 0; int countXor = 0;
int countNot = 0; int countNot = 0;
for (const auto& a : context.cli2._args) for (const auto& a : Context::getContext ().cli2._args)
{ {
if (a.hasTag ("FILTER")) if (a.hasTag ("FILTER"))
{ {
@@ -263,7 +261,7 @@ void Filter::safety () const
{ {
bool readonly = true; bool readonly = true;
bool filter = false; bool filter = false;
for (const auto& a : context.cli2._args) for (const auto& a : Context::getContext ().cli2._args)
{ {
if (a.hasTag ("CMD") && if (a.hasTag ("CMD") &&
! a.hasTag ("READONLY")) ! a.hasTag ("READONLY"))
@@ -276,11 +274,11 @@ void Filter::safety () const
if (! readonly && if (! readonly &&
! filter) ! filter)
{ {
if (! context.config.getBoolean ("allow.empty.filter")) if (! Context::getContext ().config.getBoolean ("allow.empty.filter"))
throw std::string ("You did not specify a filter, and with the 'allow.empty.filter' value, no action is taken."); throw std::string ("You did not specify a filter, and with the 'allow.empty.filter' value, no action is taken.");
// If user is willing to be asked, this can be avoided. // If user is willing to be asked, this can be avoided.
if (context.config.getBoolean ("confirmation") && if (Context::getContext ().config.getBoolean ("confirmation") &&
confirm ("This command has no filter, and will modify all (including completed and deleted) tasks. Are you sure?")) confirm ("This command has no filter, and will modify all (including completed and deleted) tasks. Are you sure?"))
return; return;

View File

@@ -58,23 +58,21 @@
#define STRING_HOOK_ERROR_SAME2 "Hook Error: JSON must be for the same task: {1} != {2}, in hook script: {3}" #define STRING_HOOK_ERROR_SAME2 "Hook Error: JSON must be for the same task: {1} != {2}, in hook script: {3}"
#define STRING_HOOK_ERROR_NOFEEDBACK "Hook Error: Expected feedback from failing hook script: {1}" #define STRING_HOOK_ERROR_NOFEEDBACK "Hook Error: Expected feedback from failing hook script: {1}"
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
void Hooks::initialize () void Hooks::initialize ()
{ {
_debug = context.config.getInteger ("debug.hooks"); _debug = Context::getContext ().config.getInteger ("debug.hooks");
// Scan <rc.hooks.location> // Scan <rc.hooks.location>
// <rc.data.location>/hooks // <rc.data.location>/hooks
Directory d; Directory d;
if (context.config.has ("hooks.location")) if (Context::getContext ().config.has ("hooks.location"))
{ {
d = Directory (context.config.get ("hooks.location")); d = Directory (Context::getContext ().config.get ("hooks.location"));
} }
else else
{ {
d = Directory (context.config.get ("data.location")); d = Directory (Context::getContext ().config.get ("data.location"));
d += "hooks"; d += "hooks";
} }
@@ -96,17 +94,17 @@ void Hooks::initialize ()
name.substr (0, 9) == "on-modify" || name.substr (0, 9) == "on-modify" ||
name.substr (0, 9) == "on-launch" || name.substr (0, 9) == "on-launch" ||
name.substr (0, 7) == "on-exit") name.substr (0, 7) == "on-exit")
context.debug ("Found hook script " + i); Context::getContext ().debug ("Found hook script " + i);
else else
context.debug ("Found misnamed hook script " + i); Context::getContext ().debug ("Found misnamed hook script " + i);
} }
} }
} }
} }
else if (_debug >= 1) else if (_debug >= 1)
context.debug ("Hook directory not readable: " + d._data); Context::getContext ().debug ("Hook directory not readable: " + d._data);
_enabled = context.config.getBoolean ("hooks"); _enabled = Context::getContext ().config.getBoolean ("hooks");
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -154,20 +152,20 @@ void Hooks::onLaunch () const
if (status == 0) if (status == 0)
{ {
for (auto& message : outputFeedback) for (auto& message : outputFeedback)
context.footnote (message); Context::getContext ().footnote (message);
} }
else else
{ {
assertFeedback (outputFeedback, script); assertFeedback (outputFeedback, script);
for (auto& message : outputFeedback) for (auto& message : outputFeedback)
context.error (message); Context::getContext ().error (message);
throw 0; // This is how hooks silently terminate processing. throw 0; // This is how hooks silently terminate processing.
} }
} }
} }
context.time_hooks_us += timer.total_us (); Context::getContext ().time_hooks_us += timer.total_us ();
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -194,7 +192,7 @@ void Hooks::onExit () const
{ {
// Get the set of changed tasks. // Get the set of changed tasks.
std::vector <Task> tasks; std::vector <Task> tasks;
context.tdb2.get_changes (tasks); Context::getContext ().tdb2.get_changes (tasks);
// Convert to a vector of strings. // Convert to a vector of strings.
std::vector <std::string> input; std::vector <std::string> input;
@@ -216,20 +214,20 @@ void Hooks::onExit () const
if (status == 0) if (status == 0)
{ {
for (auto& message : outputFeedback) for (auto& message : outputFeedback)
context.footnote (message); Context::getContext ().footnote (message);
} }
else else
{ {
assertFeedback (outputFeedback, script); assertFeedback (outputFeedback, script);
for (auto& message : outputFeedback) for (auto& message : outputFeedback)
context.error (message); Context::getContext ().error (message);
throw 0; // This is how hooks silently terminate processing. throw 0; // This is how hooks silently terminate processing.
} }
} }
} }
context.time_hooks_us += timer.total_us (); Context::getContext ().time_hooks_us += timer.total_us ();
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -278,13 +276,13 @@ void Hooks::onAdd (Task& task) const
input[0] = outputJSON[0]; input[0] = outputJSON[0];
for (auto& message : outputFeedback) for (auto& message : outputFeedback)
context.footnote (message); Context::getContext ().footnote (message);
} }
else else
{ {
assertFeedback (outputFeedback, script); assertFeedback (outputFeedback, script);
for (auto& message : outputFeedback) for (auto& message : outputFeedback)
context.error (message); Context::getContext ().error (message);
throw 0; // This is how hooks silently terminate processing. throw 0; // This is how hooks silently terminate processing.
} }
@@ -294,7 +292,7 @@ void Hooks::onAdd (Task& task) const
task = Task (input[0]); task = Task (input[0]);
} }
context.time_hooks_us += timer.total_us (); Context::getContext ().time_hooks_us += timer.total_us ();
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -345,13 +343,13 @@ void Hooks::onModify (const Task& before, Task& after) const
input[1] = outputJSON[0]; input[1] = outputJSON[0];
for (auto& message : outputFeedback) for (auto& message : outputFeedback)
context.footnote (message); Context::getContext ().footnote (message);
} }
else else
{ {
assertFeedback (outputFeedback, script); assertFeedback (outputFeedback, script);
for (auto& message : outputFeedback) for (auto& message : outputFeedback)
context.error (message); Context::getContext ().error (message);
throw 0; // This is how hooks silently terminate processing. throw 0; // This is how hooks silently terminate processing.
} }
@@ -360,7 +358,7 @@ void Hooks::onModify (const Task& before, Task& after) const
after = Task (input[1]); after = Task (input[1]);
} }
context.time_hooks_us += timer.total_us (); Context::getContext ().time_hooks_us += timer.total_us ();
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -420,7 +418,7 @@ void Hooks::assertValidJSON (
i[0] != '{' || i[0] != '{' ||
i[i.length () - 1] != '}') i[i.length () - 1] != '}')
{ {
context.error (format (STRING_HOOK_ERROR_OBJECT, Path (script).name ())); Context::getContext ().error (format (STRING_HOOK_ERROR_OBJECT, Path (script).name ()));
throw 0; throw 0;
} }
@@ -429,19 +427,19 @@ void Hooks::assertValidJSON (
json::value* root = json::parse (i); json::value* root = json::parse (i);
if (root->type () != json::j_object) if (root->type () != json::j_object)
{ {
context.error (format (STRING_HOOK_ERROR_OBJECT, Path (script).name ())); Context::getContext ().error (format (STRING_HOOK_ERROR_OBJECT, Path (script).name ()));
throw 0; throw 0;
} }
if (((json::object*)root)->_data.find ("description") == ((json::object*)root)->_data.end ()) if (((json::object*)root)->_data.find ("description") == ((json::object*)root)->_data.end ())
{ {
context.error (format (STRING_HOOK_ERROR_NODESC, Path (script).name ())); Context::getContext ().error (format (STRING_HOOK_ERROR_NODESC, Path (script).name ()));
throw 0; throw 0;
} }
if (((json::object*)root)->_data.find ("uuid") == ((json::object*)root)->_data.end ()) if (((json::object*)root)->_data.find ("uuid") == ((json::object*)root)->_data.end ())
{ {
context.error (format (STRING_HOOK_ERROR_NOUUID, Path (script).name ())); Context::getContext ().error (format (STRING_HOOK_ERROR_NOUUID, Path (script).name ()));
throw 0; throw 0;
} }
@@ -450,15 +448,15 @@ void Hooks::assertValidJSON (
catch (const std::string& e) catch (const std::string& e)
{ {
context.error (format (STRING_HOOK_ERROR_SYNTAX, i)); Context::getContext ().error (format (STRING_HOOK_ERROR_SYNTAX, i));
if (_debug) if (_debug)
context.error (STRING_HOOK_ERROR_JSON + e); Context::getContext ().error (STRING_HOOK_ERROR_JSON + e);
throw 0; throw 0;
} }
catch (...) catch (...)
{ {
context.error (STRING_HOOK_ERROR_NOPARSE + i); Context::getContext ().error (STRING_HOOK_ERROR_NOPARSE + i);
throw 0; throw 0;
} }
} }
@@ -472,7 +470,7 @@ void Hooks::assertNTasks (
{ {
if (input.size () != n) if (input.size () != n)
{ {
context.error (format (STRING_HOOK_ERROR_BAD_NUM, n, (int) input.size (), Path (script).name ())); Context::getContext ().error (format (STRING_HOOK_ERROR_BAD_NUM, n, (int) input.size (), Path (script).name ()));
throw 0; throw 0;
} }
} }
@@ -494,7 +492,7 @@ void Hooks::assertSameTask (
if (u == root_obj->_data.end () || if (u == root_obj->_data.end () ||
u->second->type () != json::j_string) u->second->type () != json::j_string)
{ {
context.error (format (STRING_HOOK_ERROR_SAME1, uuid, Path (script).name ())); Context::getContext ().error (format (STRING_HOOK_ERROR_SAME1, uuid, Path (script).name ()));
throw 0; throw 0;
} }
@@ -504,7 +502,7 @@ void Hooks::assertSameTask (
std::string json_uuid = json::decode (text); std::string json_uuid = json::decode (text);
if (json_uuid != uuid) if (json_uuid != uuid)
{ {
context.error (format (STRING_HOOK_ERROR_SAME2, uuid, json_uuid, Path (script).name ())); Context::getContext ().error (format (STRING_HOOK_ERROR_SAME2, uuid, json_uuid, Path (script).name ()));
throw 0; throw 0;
} }
@@ -524,7 +522,7 @@ void Hooks::assertFeedback (
if (! foundSomething) if (! foundSomething)
{ {
context.error (format (STRING_HOOK_ERROR_NOFEEDBACK, Path (script).name ())); Context::getContext ().error (format (STRING_HOOK_ERROR_NOFEEDBACK, Path (script).name ()));
throw 0; throw 0;
} }
} }
@@ -542,13 +540,13 @@ std::vector <std::string>& Hooks::buildHookScriptArgs (std::vector <std::string>
args.push_back ("args:" + std::string (v)); args.push_back ("args:" + std::string (v));
// Command to be executed. // Command to be executed.
args.push_back ("command:" + context.cli2.getCommand ()); args.push_back ("command:" + Context::getContext ().cli2.getCommand ());
// rc file used after applying all overrides. // rc file used after applying all overrides.
args.push_back ("rc:" + context.rc_file._data); args.push_back ("rc:" + Context::getContext ().rc_file._data);
// Directory containing *.data files. // Directory containing *.data files.
args.push_back ("data:" + context.data_dir._data); args.push_back ("data:" + Context::getContext ().data_dir._data);
// Taskwarrior version, same as returned by "task --version" // Taskwarrior version, same as returned by "task --version"
args.push_back ("version:" + std::string(VERSION)); args.push_back ("version:" + std::string(VERSION));
@@ -563,13 +561,13 @@ int Hooks::callHookScript (
std::vector <std::string>& output) const std::vector <std::string>& output) const
{ {
if (_debug >= 1) if (_debug >= 1)
context.debug ("Hook: Calling " + script); Context::getContext ().debug ("Hook: Calling " + script);
if (_debug >= 2) if (_debug >= 2)
{ {
context.debug ("Hook: input"); Context::getContext ().debug ("Hook: input");
for (const auto& i : input) for (const auto& i : input)
context.debug (" " + i); Context::getContext ().debug (" " + i);
} }
std::string inputStr; std::string inputStr;
@@ -580,9 +578,9 @@ int Hooks::callHookScript (
buildHookScriptArgs (args); buildHookScriptArgs (args);
if (_debug >= 2) if (_debug >= 2)
{ {
context.debug ("Hooks: args"); Context::getContext ().debug ("Hooks: args");
for (const auto& arg: args) for (const auto& arg: args)
context.debug (" " + arg); Context::getContext ().debug (" " + arg);
} }
// Measure time for each hook if running in debug // Measure time for each hook if running in debug
@@ -592,7 +590,7 @@ int Hooks::callHookScript (
{ {
Timer timer; Timer timer;
status = execute (script, args, inputStr, outputStr); status = execute (script, args, inputStr, outputStr);
context.debugTiming (format ("Hooks::execute ({1})", script), timer); Context::getContext ().debugTiming (format ("Hooks::execute ({1})", script), timer);
} }
else else
status = execute (script, args, inputStr, outputStr); status = execute (script, args, inputStr, outputStr);
@@ -601,13 +599,13 @@ int Hooks::callHookScript (
if (_debug >= 2) if (_debug >= 2)
{ {
context.debug ("Hook: output"); Context::getContext ().debug ("Hook: output");
for (const auto& i : output) for (const auto& i : output)
if (i != "") if (i != "")
context.debug (" " + i); Context::getContext ().debug (" " + i);
context.debug (format ("Hook: Completed with status {1}", status)); Context::getContext ().debug (format ("Hook: Completed with status {1}", status));
context.debug (" "); // Blank line Context::getContext ().debug (" "); // Blank line
} }
return status; return status;

View File

@@ -44,8 +44,6 @@
#define STRING_TDB2_REVERTED "Modified task reverted." #define STRING_TDB2_REVERTED "Modified task reverted."
extern Context context;
bool TDB2::debug_mode = false; bool TDB2::debug_mode = false;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -171,7 +169,7 @@ void TF2::add_task (Task& task)
_added_tasks.push_back (task); // For commit/synch _added_tasks.push_back (task); // For commit/synch
// For faster lookup // For faster lookup
if (context.cli2.getCommand () == "import") if (Context::getContext ().cli2.getCommand () == "import")
_tasks_map.insert (std::pair<std::string, Task> (task.get("uuid"), task)); _tasks_map.insert (std::pair<std::string, Task> (task.get("uuid"), task));
Task::status status = task.getStatus (); Task::status status = task.getStatus ();
@@ -180,7 +178,7 @@ void TF2::add_task (Task& task)
status == Task::recurring || status == Task::recurring ||
status == Task::waiting)) status == Task::waiting))
{ {
task.id = context.tdb2.next_id (); task.id = Context::getContext ().tdb2.next_id ();
} }
_I2U[task.id] = task.get ("uuid"); _I2U[task.id] = task.get ("uuid");
@@ -194,7 +192,7 @@ bool TF2::modify_task (const Task& task)
{ {
std::string uuid = task.get ("uuid"); std::string uuid = task.get ("uuid");
if (context.cli2.getCommand () == "import") if (Context::getContext ().cli2.getCommand () == "import")
{ {
// Update map used for faster lookup // Update map used for faster lookup
auto i = _tasks_map.find (uuid); auto i = _tasks_map.find (uuid);
@@ -270,7 +268,7 @@ void TF2::commit ()
{ {
if (_file.open ()) if (_file.open ())
{ {
if (context.config.getBoolean ("locking")) if (Context::getContext ().config.getBoolean ("locking"))
_file.lock (); _file.lock ();
// Write out all the added tasks. // Write out all the added tasks.
@@ -292,7 +290,7 @@ void TF2::commit ()
{ {
if (_file.open ()) if (_file.open ())
{ {
if (context.config.getBoolean ("locking")) if (Context::getContext ().config.getBoolean ("locking"))
_file.lock (); _file.lock ();
// Truncate the file and rewrite. // Truncate the file and rewrite.
@@ -327,9 +325,9 @@ Task TF2::load_task (const std::string& line)
{ {
Task::status status = task.getStatus (); Task::status status = task.getStatus ();
// Completed / deleted tasks in pending.data get an ID if GC is off. // Completed / deleted tasks in pending.data get an ID if GC is off.
if (! context.run_gc || if (! Context::getContext ().run_gc ||
(status != Task::completed && status != Task::deleted)) (status != Task::completed && status != Task::deleted))
task.id = context.tdb2.next_id (); task.id = Context::getContext ().tdb2.next_id ();
} }
// Maintain mapping for ease of link/dependency resolution. // Maintain mapping for ease of link/dependency resolution.
@@ -355,7 +353,7 @@ void TF2::load_gc (Task& task)
if (status == "pending" || if (status == "pending" ||
status == "recurring") status == "recurring")
{ {
context.tdb2.pending._tasks.push_back (task); Context::getContext ().tdb2.pending._tasks.push_back (task);
} }
else if (status == "waiting") else if (status == "waiting")
{ {
@@ -366,17 +364,17 @@ void TF2::load_gc (Task& task)
task.remove ("wait"); task.remove ("wait");
// Unwaiting pending tasks is the only case not caught by the size() // Unwaiting pending tasks is the only case not caught by the size()
// checks in TDB2::gc(), so we need to signal it here. // checks in TDB2::gc(), so we need to signal it here.
context.tdb2.pending._dirty = true; Context::getContext ().tdb2.pending._dirty = true;
if (context.verbose ("unwait")) if (Context::getContext ().verbose ("unwait"))
context.footnote (format ("Un-waiting task '{1}'", task.get ("description"))); Context::getContext ().footnote (format ("Un-waiting task '{1}'", task.get ("description")));
} }
context.tdb2.pending._tasks.push_back (task); Context::getContext ().tdb2.pending._tasks.push_back (task);
} }
else else
{ {
context.tdb2.completed._tasks.push_back (task); Context::getContext ().tdb2.completed._tasks.push_back (task);
} }
} }
@@ -411,7 +409,7 @@ void TF2::load_tasks (bool from_gc /* = false */)
else else
_tasks.push_back (task); _tasks.push_back (task);
if (context.cli2.getCommand () == "import") // For faster lookup only if (Context::getContext ().cli2.getCommand () == "import") // For faster lookup only
_tasks_map.insert (std::pair<std::string, Task> (task.get("uuid"), task)); _tasks_map.insert (std::pair<std::string, Task> (task.get("uuid"), task));
} }
@@ -427,7 +425,7 @@ void TF2::load_tasks (bool from_gc /* = false */)
throw e + format (" in {1} at line {2}", _file._data, line_number); throw e + format (" in {1} at line {2}", _file._data, line_number);
} }
context.time_load_us += timer.total_us (); Context::getContext ().time_load_us += timer.total_us ();
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -435,7 +433,7 @@ void TF2::load_lines ()
{ {
if (_file.open ()) if (_file.open ())
{ {
if (context.config.getBoolean ("locking")) if (Context::getContext ().config.getBoolean ("locking"))
_file.lock (); _file.lock ();
_file.read (_lines); _file.read (_lines);
@@ -645,7 +643,7 @@ void TDB2::add (Task& task, bool add_to_backlog /* = true */)
// Only locally-added tasks trigger hooks. This means that tasks introduced // Only locally-added tasks trigger hooks. This means that tasks introduced
// via 'sync' do not trigger hooks. // via 'sync' do not trigger hooks.
if (add_to_backlog) if (add_to_backlog)
context.hooks.onAdd (task); Context::getContext ().hooks.onAdd (task);
update (task, add_to_backlog, true); update (task, add_to_backlog, true);
} }
@@ -662,7 +660,7 @@ void TDB2::modify (Task& task, bool add_to_backlog /* = true */)
{ {
Task original; Task original;
get (uuid, original); get (uuid, original);
context.hooks.onModify (original, task); Context::getContext ().hooks.onModify (original, task);
} }
update (task, add_to_backlog); update (task, add_to_backlog);
@@ -764,7 +762,7 @@ void TDB2::commit ()
signal (SIGUSR1, SIG_DFL); signal (SIGUSR1, SIG_DFL);
signal (SIGUSR2, SIG_DFL); signal (SIGUSR2, SIG_DFL);
context.time_commit_us += timer.total_us (); Context::getContext ().time_commit_us += timer.total_us ();
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -803,7 +801,7 @@ void TDB2::revert ()
// Display diff and confirm. // Display diff and confirm.
show_diff (current, prior, when); show_diff (current, prior, when);
if (! context.config.getBoolean ("confirmation") || if (! Context::getContext ().config.getBoolean ("confirmation") ||
confirm ("The undo command is not reversible. Are you sure you want to revert to the previous state?")) confirm ("The undo command is not reversible. Are you sure you want to revert to the previous state?"))
{ {
// There are six kinds of change possible. Determine which one, and act // There are six kinds of change possible. Determine which one, and act
@@ -914,7 +912,7 @@ void TDB2::revert_pending (
{ {
if (task->find (uuid_att) != std::string::npos) if (task->find (uuid_att) != std::string::npos)
{ {
context.debug ("TDB::revert - task found in pending.data"); Context::getContext ().debug ("TDB::revert - task found in pending.data");
// Either revert if there was a prior state, or remove the task. // Either revert if there was a prior state, or remove the task.
if (prior != "") if (prior != "")
@@ -947,7 +945,7 @@ void TDB2::revert_completed (
{ {
if (task->find (uuid_att) != std::string::npos) if (task->find (uuid_att) != std::string::npos)
{ {
context.debug ("TDB::revert_completed - task found in completed.data"); Context::getContext ().debug ("TDB::revert_completed - task found in completed.data");
// Either revert if there was a prior state, or remove the task. // Either revert if there was a prior state, or remove the task.
if (prior != "") if (prior != "")
@@ -960,12 +958,12 @@ void TDB2::revert_completed (
c.erase (task); c.erase (task);
p.push_back (prior); p.push_back (prior);
std::cout << STRING_TDB2_REVERTED << '\n'; std::cout << STRING_TDB2_REVERTED << '\n';
context.debug ("TDB::revert_completed - task belongs in pending.data"); Context::getContext ().debug ("TDB::revert_completed - task belongs in pending.data");
} }
else else
{ {
std::cout << STRING_TDB2_REVERTED << '\n'; std::cout << STRING_TDB2_REVERTED << '\n';
context.debug ("TDB::revert_completed - task belongs in completed.data"); Context::getContext ().debug ("TDB::revert_completed - task belongs in completed.data");
} }
} }
else else
@@ -973,7 +971,7 @@ void TDB2::revert_completed (
c.erase (task); c.erase (task);
std::cout << STRING_TDB2_REVERTED << '\n'; std::cout << STRING_TDB2_REVERTED << '\n';
context.debug ("TDB::revert_completed - task removed"); Context::getContext ().debug ("TDB::revert_completed - task removed");
} }
std::cout << "Undo complete.\n"; std::cout << "Undo complete.\n";
@@ -996,7 +994,7 @@ void TDB2::revert_backlog (
{ {
if (task->find (uuid_att) != std::string::npos) if (task->find (uuid_att) != std::string::npos)
{ {
context.debug ("TDB::revert_backlog - task found in backlog.data"); Context::getContext ().debug ("TDB::revert_backlog - task found in backlog.data");
found = true; found = true;
// If this is a new task (no prior), then just remove it from the backlog. // If this is a new task (no prior), then just remove it from the backlog.
@@ -1031,10 +1029,10 @@ void TDB2::show_diff (
Datetime lastChange (strtol (when.c_str (), NULL, 10)); Datetime lastChange (strtol (when.c_str (), NULL, 10));
// Set the colors. // Set the colors.
Color color_red (context.color () ? context.config.get ("color.undo.before") : ""); Color color_red (Context::getContext ().color () ? Context::getContext ().config.get ("color.undo.before") : "");
Color color_green (context.color () ? context.config.get ("color.undo.after") : ""); Color color_green (Context::getContext ().color () ? Context::getContext ().config.get ("color.undo.after") : "");
if (context.config.get ("undo.style") == "side") if (Context::getContext ().config.get ("undo.style") == "side")
{ {
std::cout << '\n' std::cout << '\n'
<< format ("The last modification was made {1}", lastChange.toString ()) << format ("The last modification was made {1}", lastChange.toString ())
@@ -1043,7 +1041,7 @@ void TDB2::show_diff (
// Attributes are all there is, so figure the different attribute names // Attributes are all there is, so figure the different attribute names
// between before and after. // between before and after.
Table view; Table view;
view.width (context.getWidth ()); view.width (Context::getContext ().getWidth ());
view.intraPadding (2); view.intraPadding (2);
view.add (""); view.add ("");
view.add ("Prior Values"); view.add ("Prior Values");
@@ -1128,7 +1126,7 @@ void TDB2::show_diff (
// - name: // - name:
// + name: new // att added // + name: new // att added
// //
else if (context.config.get ("undo.style") == "diff") else if (Context::getContext ().config.get ("undo.style") == "diff")
{ {
// Create reference tasks. // Create reference tasks.
Task before; Task before;
@@ -1139,7 +1137,7 @@ void TDB2::show_diff (
// Generate table header. // Generate table header.
Table view; Table view;
view.width (context.getWidth ()); view.width (Context::getContext ().getWidth ());
view.intraPadding (2); view.intraPadding (2);
view.add (""); view.add ("");
view.add (""); view.add ("");
@@ -1151,13 +1149,13 @@ void TDB2::show_diff (
row = view.addRow (); row = view.addRow ();
view.set (row, 0, "+++ current state ", color_green); view.set (row, 0, "+++ current state ", color_green);
view.set (row, 1, format ("Change made {1}", view.set (row, 1, format ("Change made {1}",
lastChange.toString (context.config.get ("dateformat"))), lastChange.toString (Context::getContext ().config.get ("dateformat"))),
color_green); color_green);
view.addRow (); view.addRow ();
// Add rows to table showing diffs. // Add rows to table showing diffs.
std::vector <std::string> all = context.getColumns (); std::vector <std::string> all = Context::getContext ().getColumns ();
// Now factor in the annotation attributes. // Now factor in the annotation attributes.
for (auto& it : before.data) for (auto& it : before.data)
@@ -1252,7 +1250,7 @@ void TDB2::gc ()
Timer timer; Timer timer;
// Allowed as an override, but not recommended. // Allowed as an override, but not recommended.
if (context.config.getBoolean ("gc")) if (Context::getContext ().config.getBoolean ("gc"))
{ {
// Load pending, check whether completed changes size // Load pending, check whether completed changes size
auto size_before = completed._tasks.size (); auto size_before = completed._tasks.size ();
@@ -1286,7 +1284,7 @@ void TDB2::gc ()
completed.dependency_scan (); completed.dependency_scan ();
} }
context.time_gc_us += timer.total_us (); Context::getContext ().time_gc_us += timer.total_us ();
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -1463,13 +1461,13 @@ void TDB2::clear ()
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
void TDB2::dump () void TDB2::dump ()
{ {
if (context.config.getBoolean ("debug")) if (Context::getContext ().config.getBoolean ("debug"))
{ {
context.debug (pending.dump ()); Context::getContext ().debug (pending.dump ());
context.debug (completed.dump ()); Context::getContext ().debug (completed.dump ());
context.debug (undo.dump ()); Context::getContext ().debug (undo.dump ());
context.debug (backlog.dump ()); Context::getContext ().debug (backlog.dump ());
context.debug (" "); Context::getContext ().debug (" ");
} }
} }

View File

@@ -60,7 +60,6 @@
#define APPROACHING_INFINITY 1000 // Close enough. This isn't rocket surgery. #define APPROACHING_INFINITY 1000 // Close enough. This isn't rocket surgery.
extern Context context;
extern Task& contextTask; extern Task& contextTask;
static const float epsilon = 0.000001; static const float epsilon = 0.000001;
@@ -336,7 +335,7 @@ Task::dateState Task::getDateState (const std::string& name) const
return dateLaterToday; return dateLaterToday;
} }
int imminentperiod = context.config.getInteger ("due"); int imminentperiod = Context::getContext ().config.getInteger ("due");
if (imminentperiod == 0) if (imminentperiod == 0)
return dateAfterToday; return dateAfterToday;
@@ -519,7 +518,7 @@ bool Task::is_dueyear () const
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
bool Task::is_udaPresent () const bool Task::is_udaPresent () const
{ {
for (auto& col : context.columns) for (auto& col : Context::getContext ().columns)
if (col.second->is_uda () && if (col.second->is_uda () &&
has (col.first)) has (col.first))
return true; return true;
@@ -532,7 +531,7 @@ bool Task::is_orphanPresent () const
{ {
for (auto& att : data) for (auto& att : data)
if (att.first.compare (0, 11, "annotation_", 11) != 0) if (att.first.compare (0, 11, "annotation_", 11) != 0)
if (context.columns.find (att.first) == context.columns.end ()) if (Context::getContext ().columns.find (att.first) == Context::getContext ().columns.end ())
return true; return true;
return false; return false;
@@ -783,7 +782,7 @@ void Task::parseJSON (const json::object* root_obj)
<< "' with value '" << "' with value '"
<< i.second << i.second
<< "' --> preserved\n"; << "' --> preserved\n";
context.debug (message.str ()); Context::getContext ().debug (message.str ());
#endif #endif
auto text = i.second->dump (); auto text = i.second->dump ();
Lexer::dequote (text); Lexer::dequote (text);
@@ -818,7 +817,7 @@ void Task::parseLegacy (const std::string& line)
message << "Invalid fileformat at line '" message << "Invalid fileformat at line '"
<< line << line
<< '\''; << '\'';
context.debug (message.str ()); Context::getContext ().debug (message.str ());
#endif #endif
throw std::string ("Unrecognized Taskwarrior file format or blank line in data."); throw std::string ("Unrecognized Taskwarrior file format or blank line in data.");
break; break;
@@ -962,7 +961,7 @@ std::string Task::composeJSON (bool decorate /*= false*/) const
// and Taskserver 1.2.0 is released, the default for // and Taskserver 1.2.0 is released, the default for
// 'json.depends.array' can revert to 'on'. // 'json.depends.array' can revert to 'on'.
&& context.config.getBoolean ("json.depends.array") && Context::getContext ().config.getBoolean ("json.depends.array")
#endif #endif
) )
{ {
@@ -1124,14 +1123,14 @@ void Task::setAnnotations (const std::map <std::string, std::string>& annotation
void Task::addDependency (int depid) void Task::addDependency (int depid)
{ {
// Check that id is resolvable. // Check that id is resolvable.
std::string uuid = context.tdb2.pending.uuid (depid); std::string uuid = Context::getContext ().tdb2.pending.uuid (depid);
if (uuid == "") if (uuid == "")
throw format ("Could not create a dependency on task {1} - not found.", depid); throw format ("Could not create a dependency on task {1} - not found.", depid);
std::string depends = get ("depends"); std::string depends = get ("depends");
if (depends.find (uuid) != std::string::npos) if (depends.find (uuid) != std::string::npos)
{ {
context.footnote (format ("Task {1} already depends on task {2}.", id, depid)); Context::getContext ().footnote (format ("Task {1} already depends on task {2}.", id, depid));
return; return;
} }
@@ -1155,7 +1154,7 @@ void Task::addDependency (const std::string& uuid)
else else
{ {
#ifdef PRODUCT_TASKWARRIOR #ifdef PRODUCT_TASKWARRIOR
context.footnote (format ("Task {1} already depends on task {2}.", get ("uuid"), uuid)); Context::getContext ().footnote (format ("Task {1} already depends on task {2}.", get ("uuid"), uuid));
#endif #endif
return; return;
} }
@@ -1193,7 +1192,7 @@ void Task::removeDependency (const std::string& uuid)
void Task::removeDependency (int id) void Task::removeDependency (int id)
{ {
std::string depends = get ("depends"); std::string depends = get ("depends");
std::string uuid = context.tdb2.pending.uuid (id); std::string uuid = Context::getContext ().tdb2.pending.uuid (id);
if (uuid != "" && depends.find (uuid) != std::string::npos) if (uuid != "" && depends.find (uuid) != std::string::npos)
removeDependency (uuid); removeDependency (uuid);
else else
@@ -1205,7 +1204,7 @@ std::vector <int> Task::getDependencyIDs () const
{ {
std::vector <int> all; std::vector <int> all;
for (auto& dep : split (get ("depends"), ',')) for (auto& dep : split (get ("depends"), ','))
all.push_back (context.tdb2.pending.id (dep)); all.push_back (Context::getContext ().tdb2.pending.id (dep));
return all; return all;
} }
@@ -1223,7 +1222,7 @@ std::vector <Task> Task::getDependencyTasks () const
for (auto& dep : split (get ("depends"), ',')) for (auto& dep : split (get ("depends"), ','))
{ {
Task task; Task task;
context.tdb2.get (dep, task); Context::getContext ().tdb2.get (dep, task);
all.push_back (task); all.push_back (task);
} }
@@ -1288,7 +1287,7 @@ bool Task::hasTag (const std::string& tag) const
#ifdef PRODUCT_TASKWARRIOR #ifdef PRODUCT_TASKWARRIOR
if (tag == "UDA") return is_udaPresent (); if (tag == "UDA") return is_udaPresent ();
if (tag == "ORPHAN") return is_orphanPresent (); if (tag == "ORPHAN") return is_orphanPresent ();
if (tag == "LATEST") return id == context.tdb2.latest_id (); if (tag == "LATEST") return id == Context::getContext ().tdb2.latest_id ();
#endif #endif
if (tag == "PROJECT") return has ("project"); if (tag == "PROJECT") return has ("project");
if (tag == "PRIORITY") return has ("priority"); if (tag == "PRIORITY") return has ("priority");
@@ -1357,7 +1356,7 @@ std::vector <std::string> Task::getUDAOrphanUUIDs () const
std::vector <std::string> orphans; std::vector <std::string> orphans;
for (auto& it : data) for (auto& it : data)
if (it.first.compare (0, 11, "annotation_", 11) != 0) if (it.first.compare (0, 11, "annotation_", 11) != 0)
if (context.columns.find (it.first) == context.columns.end ()) if (Context::getContext ().columns.find (it.first) == Context::getContext ().columns.end ())
orphans.push_back (it.first); orphans.push_back (it.first);
return orphans; return orphans;
@@ -1574,7 +1573,7 @@ void Task::validate (bool applyDefault /* = true */)
if (Task::defaultProject != "" && if (Task::defaultProject != "" &&
! has ("project")) ! has ("project"))
{ {
if (context.columns["project"]->validate (Task::defaultProject)) if (Context::getContext ().columns["project"]->validate (Task::defaultProject))
set ("project", Task::defaultProject); set ("project", Task::defaultProject);
} }
@@ -1582,7 +1581,7 @@ void Task::validate (bool applyDefault /* = true */)
if (Task::defaultDue != "" && if (Task::defaultDue != "" &&
! has ("due")) ! has ("due"))
{ {
if (context.columns["due"]->validate (Task::defaultDue)) if (Context::getContext ().columns["due"]->validate (Task::defaultDue))
{ {
Duration dur (Task::defaultDue); Duration dur (Task::defaultDue);
if (dur.toTime_t () != 0) if (dur.toTime_t () != 0)
@@ -1596,7 +1595,7 @@ void Task::validate (bool applyDefault /* = true */)
if (Task::defaultScheduled != "" && if (Task::defaultScheduled != "" &&
! has ("scheduled")) ! has ("scheduled"))
{ {
if (context.columns["scheduled"]->validate (Task::defaultScheduled)) if (Context::getContext ().columns["scheduled"]->validate (Task::defaultScheduled))
{ {
Duration dur (Task::defaultScheduled); Duration dur (Task::defaultScheduled);
if (dur.toTime_t () != 0) if (dur.toTime_t () != 0)
@@ -1610,7 +1609,7 @@ void Task::validate (bool applyDefault /* = true */)
// override with uda.(uda).default, if not specified. // override with uda.(uda).default, if not specified.
// Gather a list of all UDAs with a .default value // Gather a list of all UDAs with a .default value
std::vector <std::string> udas; std::vector <std::string> udas;
for (auto& var : context.config) for (auto& var : Context::getContext ().config)
{ {
if (! var.first.compare (0, 4, "uda.", 4) && if (! var.first.compare (0, 4, "uda.", 4) &&
var.first.find (".default") != std::string::npos) var.first.find (".default") != std::string::npos)
@@ -1627,7 +1626,7 @@ void Task::validate (bool applyDefault /* = true */)
// of course only if we don't have one on the command line already // of course only if we don't have one on the command line already
for (auto& uda : udas) for (auto& uda : udas)
{ {
std::string defVal= context.config.get ("uda." + uda + ".default"); std::string defVal= Context::getContext ().config.get ("uda." + uda + ".default");
// If the default is empty, or we already have a value, skip it // If the default is empty, or we already have a value, skip it
if (defVal != "" && get (uda) == "") if (defVal != "" && get (uda) == "")
@@ -1687,7 +1686,7 @@ void Task::validate_before (const std::string& left, const std::string& right)
// if date is zero, then it is being removed (e.g. "due: wait:1day") // if date is zero, then it is being removed (e.g. "due: wait:1day")
if (date_left > date_right && date_right.toEpoch () != 0) if (date_left > date_right && date_right.toEpoch () != 0)
context.footnote (format ("Warning: You have specified that the '{1}' date is after the '{2}' date.", left, right)); Context::getContext ().footnote (format ("Warning: You have specified that the '{1}' date is after the '{2}' date.", left, right));
} }
#endif #endif
} }
@@ -1886,7 +1885,7 @@ float Task::urgency_c () const
} }
} }
if (is_blocking && context.config.getBoolean ("urgency.inherit")) if (is_blocking && Context::getContext ().config.getBoolean ("urgency.inherit"))
{ {
float prev = value; float prev = value;
value = std::max (value, urgency_inherit ()); value = std::max (value, urgency_inherit ());
@@ -2069,7 +2068,7 @@ void Task::modify (modType type, bool text_required /* = false */)
std::string text = ""; std::string text = "";
bool mods = false; bool mods = false;
for (auto& a : context.cli2._args) for (auto& a : Context::getContext ().cli2._args)
{ {
if (a.hasTag ("MODIFICATION")) if (a.hasTag ("MODIFICATION"))
{ {
@@ -2086,22 +2085,22 @@ void Task::modify (modType type, bool text_required /* = false */)
// ::composeF4 will skip if the value is blank, but the presence of // ::composeF4 will skip if the value is blank, but the presence of
// the attribute will prevent ::validate from applying defaults. // the attribute will prevent ::validate from applying defaults.
if ((has (name) && get (name) != "") || if ((has (name) && get (name) != "") ||
(name == "due" && context.config.has ("default.due")) || (name == "due" && Context::getContext ().config.has ("default.due")) ||
(name == "scheduled" && context.config.has ("default.scheduled")) || (name == "scheduled" && Context::getContext ().config.has ("default.scheduled")) ||
(name == "project" && context.config.has ("default.project"))) (name == "project" && Context::getContext ().config.has ("default.project")))
{ {
mods = true; mods = true;
set (name, ""); set (name, "");
} }
context.debug (label + name + " <-- ''"); Context::getContext ().debug (label + name + " <-- ''");
} }
else else
{ {
Lexer::dequote (value); Lexer::dequote (value);
// Get the column info. Some columns are not modifiable. // Get the column info. Some columns are not modifiable.
Column* column = context.columns[name]; Column* column = Context::getContext ().columns[name];
if (! column || if (! column ||
! column->modifiable ()) ! column->modifiable ())
throw format ("The '{1}' attribute does not allow a value of '{2}'.", name, value); throw format ("The '{1}' attribute does not allow a value of '{2}'.", name, value);
@@ -2127,7 +2126,7 @@ void Task::modify (modType type, bool text_required /* = false */)
// Perform description/annotation substitution. // Perform description/annotation substitution.
else if (a._lextype == Lexer::Type::substitution) else if (a._lextype == Lexer::Type::substitution)
{ {
context.debug (label + "substitute " + a.attribute ("raw")); Context::getContext ().debug (label + "substitute " + a.attribute ("raw"));
substitute (a.attribute ("from"), substitute (a.attribute ("from"),
a.attribute ("to"), a.attribute ("to"),
a.attribute ("flags")); a.attribute ("flags"));
@@ -2144,13 +2143,13 @@ void Task::modify (modType type, bool text_required /* = false */)
if (a.attribute ("sign") == "+") if (a.attribute ("sign") == "+")
{ {
context.debug (label + "tags <-- add '" + tag + '\''); Context::getContext ().debug (label + "tags <-- add '" + tag + '\'');
addTag (tag); addTag (tag);
feedback_special_tags (*this, tag); feedback_special_tags (*this, tag);
} }
else else
{ {
context.debug (label + "tags <-- remove '" + tag + '\''); Context::getContext ().debug (label + "tags <-- remove '" + tag + '\'');
removeTag (tag); removeTag (tag);
} }
@@ -2176,22 +2175,22 @@ void Task::modify (modType type, bool text_required /* = false */)
switch (type) switch (type)
{ {
case modReplace: case modReplace:
context.debug (label + "description <-- '" + text + '\''); Context::getContext ().debug (label + "description <-- '" + text + '\'');
set ("description", text); set ("description", text);
break; break;
case modPrepend: case modPrepend:
context.debug (label + "description <-- '" + text + "' + description"); Context::getContext ().debug (label + "description <-- '" + text + "' + description");
set ("description", text + ' ' + get ("description")); set ("description", text + ' ' + get ("description"));
break; break;
case modAppend: case modAppend:
context.debug (label + "description <-- description + '" + text + '\''); Context::getContext ().debug (label + "description <-- description + '" + text + '\'');
set ("description", get ("description") + ' ' + text); set ("description", get ("description") + ' ' + text);
break; break;
case modAnnotate: case modAnnotate:
context.debug (label + "new annotation <-- '" + text + '\''); Context::getContext ().debug (label + "new annotation <-- '" + text + '\'');
addAnnotation (text); addAnnotation (text);
break; break;
} }
@@ -2205,7 +2204,7 @@ void Task::modify (modType type, bool text_required /* = false */)
getStatus () == originalStatus) getStatus () == originalStatus)
{ {
auto uuid = get ("uuid").substr (0, 8); auto uuid = get ("uuid").substr (0, 8);
context.footnote (format ("Note: Modified task {1} is {2}. You may wish to make this task pending with: task {3} modify status:pending", uuid, get ("status"), uuid)); Context::getContext ().footnote (format ("Note: Modified task {1} is {2}. You may wish to make this task pending with: task {3} modify status:pending", uuid, get ("status"), uuid));
} }
} }
#endif #endif

View File

@@ -33,8 +33,6 @@
#include <utf8.h> #include <utf8.h>
#include <main.h> #include <main.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
ViewTask::ViewTask () ViewTask::ViewTask ()
: _width (0) : _width (0)
@@ -112,8 +110,8 @@ std::string ViewTask::render (std::vector <Task>& data, std::vector <int>& seque
{ {
Timer timer; Timer timer;
bool const obfuscate = context.config.getBoolean ("obfuscate"); bool const obfuscate = Context::getContext ().config.getBoolean ("obfuscate");
bool const print_empty_columns = context.config.getBoolean ("print.empty.columns"); bool const print_empty_columns = Context::getContext ().config.getBoolean ("print.empty.columns");
std::vector <Column*> nonempty_columns; std::vector <Column*> nonempty_columns;
std::vector <bool> nonempty_sort; std::vector <bool> nonempty_sort;
@@ -190,11 +188,11 @@ std::string ViewTask::render (std::vector <Task>& data, std::vector <int>& seque
// Calculate final column widths. // Calculate final column widths.
int overage = _width - sum_minimal - all_extra; int overage = _width - sum_minimal - all_extra;
context.debug (format ("ViewTask::render min={1} ideal={2} overage={3} width={4}", Context::getContext ().debug (format ("ViewTask::render min={1} ideal={2} overage={3} width={4}",
sum_minimal + all_extra, sum_minimal + all_extra,
sum_ideal + all_extra, sum_ideal + all_extra,
overage, overage,
_width)); _width));
std::vector <int> widths; std::vector <int> widths;
@@ -207,7 +205,7 @@ std::string ViewTask::render (std::vector <Task>& data, std::vector <int>& seque
// Not enough for minimum. // Not enough for minimum.
else if (overage < 0) else if (overage < 0)
{ {
context.error (format ("The report has a minimum width of {1} and does not fit in the available width of {2}.", sum_minimal + all_extra, _width)); Context::getContext ().error (format ("The report has a minimum width of {1} and does not fit in the available width of {2}.", sum_minimal + all_extra, _width));
widths = minimal; widths = minimal;
} }
@@ -256,10 +254,10 @@ std::string ViewTask::render (std::vector <Task>& data, std::vector <int>& seque
std::string extra = std::string (_extra_padding, ' '); std::string extra = std::string (_extra_padding, ' ');
std::string intra = std::string (_intra_padding, ' '); std::string intra = std::string (_intra_padding, ' ');
std::string extra_odd = context.color () ? _extra_odd.colorize (extra) : extra; std::string extra_odd = Context::getContext ().color () ? _extra_odd.colorize (extra) : extra;
std::string extra_even = context.color () ? _extra_even.colorize (extra) : extra; std::string extra_even = Context::getContext ().color () ? _extra_even.colorize (extra) : extra;
std::string intra_odd = context.color () ? _intra_odd.colorize (intra) : intra; std::string intra_odd = Context::getContext ().color () ? _intra_odd.colorize (intra) : intra;
std::string intra_even = context.color () ? _intra_even.colorize (intra) : intra; std::string intra_even = Context::getContext ().color () ? _intra_even.colorize (intra) : intra;
std::string out; std::string out;
_lines = 0; _lines = 0;
@@ -287,7 +285,7 @@ std::string ViewTask::render (std::vector <Task>& data, std::vector <int>& seque
// Stop if the line limit is exceeded. // Stop if the line limit is exceeded.
if (++_lines >= _truncate_lines && _truncate_lines != 0) if (++_lines >= _truncate_lines && _truncate_lines != 0)
{ {
context.time_render_us += timer.total_us (); Context::getContext ().time_render_us += timer.total_us ();
return out; return out;
} }
} }
@@ -306,7 +304,7 @@ std::string ViewTask::render (std::vector <Task>& data, std::vector <int>& seque
// Alternate rows based on |s % 2| // Alternate rows based on |s % 2|
bool odd = (s % 2) ? true : false; bool odd = (s % 2) ? true : false;
Color row_color; Color row_color;
if (context.color ()) if (Context::getContext ().color ())
{ {
row_color = odd ? _odd : _even; row_color = odd ? _odd : _even;
row_color.blend (rule_color); row_color.blend (rule_color);
@@ -373,7 +371,7 @@ std::string ViewTask::render (std::vector <Task>& data, std::vector <int>& seque
// Stop if the line limit is exceeded. // Stop if the line limit is exceeded.
if (++_lines >= _truncate_lines && _truncate_lines != 0) if (++_lines >= _truncate_lines && _truncate_lines != 0)
{ {
context.time_render_us += timer.total_us (); Context::getContext ().time_render_us += timer.total_us ();
return out; return out;
} }
} }
@@ -383,12 +381,12 @@ std::string ViewTask::render (std::vector <Task>& data, std::vector <int>& seque
// Stop if the row limit is exceeded. // Stop if the row limit is exceeded.
if (++_rows >= _truncate_rows && _truncate_rows != 0) if (++_rows >= _truncate_rows && _truncate_rows != 0)
{ {
context.time_render_us += timer.total_us (); Context::getContext ().time_render_us += timer.total_us ();
return out; return out;
} }
} }
context.time_render_us += timer.total_us (); Context::getContext ().time_render_us += timer.total_us ();
return out; return out;
} }

View File

@@ -37,8 +37,6 @@
#include <shared.h> #include <shared.h>
#include <format.h> #include <format.h>
Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Constants. // Constants.
bool get (const std::string&, Variant&) bool get (const std::string&, Variant&)
@@ -58,6 +56,9 @@ int main (int argc, char** argv)
try try
{ {
Context globalContext;
Context::setContext (&globalContext);
// Same operating parameters as Context::staticInitialization. // Same operating parameters as Context::staticInitialization.
Datetime::standaloneDateEnabled = false; Datetime::standaloneDateEnabled = false;
Datetime::standaloneTimeEnabled = false; Datetime::standaloneTimeEnabled = false;
@@ -118,7 +119,7 @@ int main (int argc, char** argv)
e.evaluatePostfixExpression (expression, result); e.evaluatePostfixExpression (expression, result);
// Show any debug output. // Show any debug output.
for (const auto& i : context.debugMessages) for (const auto& i : Context::getContext ().debugMessages)
std::cout << i << '\n'; std::cout << i << '\n';
// Show the result in string form. // Show the result in string form.

View File

@@ -36,8 +36,6 @@
#define STRING_COLUMN_LABEL_DEP "Depends" #define STRING_COLUMN_LABEL_DEP "Depends"
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
ColumnDepends::ColumnDepends () ColumnDepends::ColumnDepends ()
{ {
@@ -49,7 +47,7 @@ ColumnDepends::ColumnDepends ()
"indicator"}; "indicator"};
_examples = {"1 2 10", _examples = {"1 2 10",
"[3]", "[3]",
context.config.get ("dependency.indicator")}; Context::getContext ().config.get ("dependency.indicator")};
_hyphenate = false; _hyphenate = false;
} }
@@ -61,7 +59,7 @@ void ColumnDepends::setStyle (const std::string& value)
{ {
Column::setStyle (value); Column::setStyle (value);
if (_style == "indicator" && _label == STRING_COLUMN_LABEL_DEP) _label = _label.substr (0, context.config.get ("dependency.indicator").length ()); if (_style == "indicator" && _label == STRING_COLUMN_LABEL_DEP) _label = _label.substr (0, Context::getContext ().config.get ("dependency.indicator").length ());
else if (_style == "count" && _label == STRING_COLUMN_LABEL_DEP) _label = "Dep"; else if (_style == "count" && _label == STRING_COLUMN_LABEL_DEP) _label = "Dep";
} }
@@ -74,7 +72,7 @@ void ColumnDepends::measure (Task& task, unsigned int& minimum, unsigned int& ma
{ {
if (_style == "indicator") if (_style == "indicator")
{ {
minimum = maximum = utf8_width (context.config.get ("dependency.indicator")); minimum = maximum = utf8_width (Context::getContext ().config.get ("dependency.indicator"));
} }
else if (_style == "count") else if (_style == "count")
@@ -117,7 +115,7 @@ void ColumnDepends::render (
{ {
if (_style == "indicator") if (_style == "indicator")
{ {
renderStringRight (lines, width, color, context.config.get ("dependency.indicator")); renderStringRight (lines, width, color, Context::getContext ().config.get ("dependency.indicator"));
} }
else if (_style == "count") else if (_style == "count")

View File

@@ -34,8 +34,6 @@
#include <utf8.h> #include <utf8.h>
#include <util.h> #include <util.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
ColumnDescription::ColumnDescription () ColumnDescription::ColumnDescription ()
{ {
@@ -51,9 +49,9 @@ ColumnDescription::ColumnDescription ()
"count", "count",
"truncated_count"}; "truncated_count"};
_dateformat = context.config.get ("dateformat.annotation"); _dateformat = Context::getContext ().config.get ("dateformat.annotation");
if (_dateformat == "") if (_dateformat == "")
_dateformat = context.config.get ("dateformat"); _dateformat = Context::getContext ().config.get ("dateformat");
std::string t = Datetime ().toString (_dateformat); std::string t = Datetime ().toString (_dateformat);
std::string d = "Move your clothes down on to the lower peg"; std::string d = "Move your clothes down on to the lower peg";
@@ -75,9 +73,9 @@ ColumnDescription::ColumnDescription ()
d + " [4]", d + " [4]",
d.substr (0, 20) + "... [4]"}; d.substr (0, 20) + "... [4]"};
_hyphenate = context.config.getBoolean ("hyphenate"); _hyphenate = Context::getContext ().config.getBoolean ("hyphenate");
_indent = context.config.getInteger ("indent.annotation"); _indent = Context::getContext ().config.getInteger ("indent.annotation");
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////

View File

@@ -36,7 +36,6 @@
#include <utf8.h> #include <utf8.h>
#include <util.h> #include <util.h>
extern Context context;
extern Task& contextTask; extern Task& contextTask;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -49,7 +48,7 @@ ColumnProject::ColumnProject ()
_examples = {"home.garden", _examples = {"home.garden",
"home", "home",
" home.garden"}; " home.garden"};
_hyphenate = context.config.getBoolean ("hyphenate"); _hyphenate = Context::getContext ().config.getBoolean ("hyphenate");
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -127,7 +126,7 @@ void ColumnProject::modify (Task& task, const std::string& value)
Variant v; Variant v;
e.evaluateInfixExpression (value, v); e.evaluateInfixExpression (value, v);
task.set (_name, (std::string) v); task.set (_name, (std::string) v);
context.debug (label + _name + " <-- '" + (std::string) v + "' <-- '" + value + '\''); Context::getContext ().debug (label + _name + " <-- '" + (std::string) v + "' <-- '" + value + '\'');
} }
catch (const std::string& e) catch (const std::string& e)
{ {
@@ -136,7 +135,7 @@ void ColumnProject::modify (Task& task, const std::string& value)
if (e == "The value is not an expression.") if (e == "The value is not an expression.")
{ {
task.set (_name, value); task.set (_name, value);
context.debug (label + _name + " <-- '" + value + '\''); Context::getContext ().debug (label + _name + " <-- '" + value + '\'');
} }
else else
throw; throw;
@@ -145,7 +144,7 @@ void ColumnProject::modify (Task& task, const std::string& value)
else else
{ {
task.set (_name, value); task.set (_name, value);
context.debug (label + _name + " <-- '" + value + '\''); Context::getContext ().debug (label + _name + " <-- '" + value + '\'');
} }
} }

View File

@@ -31,8 +31,6 @@
#include <format.h> #include <format.h>
#include <cctype> #include <cctype>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
ColumnRType::ColumnRType () ColumnRType::ColumnRType ()
{ {
@@ -52,7 +50,7 @@ void ColumnRType::setStyle (const std::string& value)
Column::setStyle (value); Column::setStyle (value);
if (_style == "indicator" && _label == "Recurrence type") if (_style == "indicator" && _label == "Recurrence type")
_label = _label.substr (0, context.config.get ("rtype.indicator").length ()); _label = _label.substr (0, Context::getContext ().config.get ("rtype.indicator").length ());
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////

View File

@@ -36,7 +36,6 @@
#include <format.h> #include <format.h>
#include <utf8.h> #include <utf8.h>
extern Context context;
extern Task& contextTask; extern Task& contextTask;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -47,7 +46,7 @@ ColumnRecur::ColumnRecur ()
_label = "Recur"; _label = "Recur";
_modifiable = true; _modifiable = true;
_styles = {"duration", "indicator"}; _styles = {"duration", "indicator"};
_examples = {"weekly", context.config.get ("recurrence.indicator")}; _examples = {"weekly", Context::getContext ().config.get ("recurrence.indicator")};
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -58,7 +57,7 @@ void ColumnRecur::setStyle (const std::string& value)
Column::setStyle (value); Column::setStyle (value);
if (_style == "indicator" && _label == "Recur") if (_style == "indicator" && _label == "Recur")
_label = _label.substr (0, context.config.get ("recurrence.indicator").length ()); _label = _label.substr (0, Context::getContext ().config.get ("recurrence.indicator").length ());
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -75,7 +74,7 @@ void ColumnRecur::measure (Task& task, unsigned int& minimum, unsigned int& maxi
} }
else if (_style == "indicator") else if (_style == "indicator")
{ {
minimum = maximum = utf8_width (context.config.get ("recurrence.indicator")); minimum = maximum = utf8_width (Context::getContext ().config.get ("recurrence.indicator"));
} }
} }
} }
@@ -94,7 +93,7 @@ void ColumnRecur::render (
renderStringRight (lines, width, color, Duration (task.get (_name)).formatISO ()); renderStringRight (lines, width, color, Duration (task.get (_name)).formatISO ());
else if (_style == "indicator") else if (_style == "indicator")
renderStringRight (lines, width, color, context.config.get ("recurrence.indicator")); renderStringRight (lines, width, color, Context::getContext ().config.get ("recurrence.indicator"));
} }
} }
@@ -122,7 +121,7 @@ void ColumnRecur::modify (Task& task, const std::string& value)
{ {
// Store the raw value, for 'recur'. // Store the raw value, for 'recur'.
std::string label = " MODIFICATION "; std::string label = " MODIFICATION ";
context.debug (label + _name + " <-- '" + value + '\''); Context::getContext ().debug (label + _name + " <-- '" + value + '\'');
task.set (_name, value); task.set (_name, value);
} }
else else

View File

@@ -29,8 +29,6 @@
#include <Context.h> #include <Context.h>
#include <utf8.h> #include <utf8.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
ColumnStart::ColumnStart () ColumnStart::ColumnStart ()
{ {
@@ -38,7 +36,7 @@ ColumnStart::ColumnStart ()
_label = "Started"; _label = "Started";
_styles.push_back ("active"); _styles.push_back ("active");
_examples.push_back (context.config.get ("active.indicator")); _examples.push_back (Context::getContext ().config.get ("active.indicator"));
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -60,7 +58,7 @@ void ColumnStart::measure (Task& task, unsigned int& minimum, unsigned int& maxi
if (task.has (_name)) if (task.has (_name))
{ {
if (_style == "active") if (_style == "active")
minimum = maximum = utf8_width (context.config.get ("active.indicator")); minimum = maximum = utf8_width (Context::getContext ().config.get ("active.indicator"));
else else
ColumnTypeDate::measure (task, minimum, maximum); ColumnTypeDate::measure (task, minimum, maximum);
@@ -80,7 +78,7 @@ void ColumnStart::render (
if (_style == "active") if (_style == "active")
{ {
if (! task.has ("end")) if (! task.has ("end"))
renderStringRight (lines, width, color, context.config.get ("active.indicator")); renderStringRight (lines, width, color, Context::getContext ().config.get ("active.indicator"));
} }
else else
ColumnTypeDate::render (lines, task, width, color); ColumnTypeDate::render (lines, task, width, color);

View File

@@ -36,7 +36,6 @@
#include <utf8.h> #include <utf8.h>
#include <main.h> #include <main.h>
extern Context context;
extern Task& contextTask; extern Task& contextTask;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -47,7 +46,7 @@ ColumnTags::ColumnTags ()
_label = "Tags"; _label = "Tags";
_styles = {"list", "indicator", "count"}; _styles = {"list", "indicator", "count"};
_examples = {"home @chore next", _examples = {"home @chore next",
context.config.get ("tag.indicator"), Context::getContext ().config.get ("tag.indicator"),
"[2]"}; "[2]"};
_hyphenate = false; _hyphenate = false;
} }
@@ -61,7 +60,7 @@ void ColumnTags::setStyle (const std::string& value)
if (_style == "indicator" && if (_style == "indicator" &&
_label == "Tags") _label == "Tags")
_label = _label.substr (0, context.config.get ("tag.indicator").length ()); _label = _label.substr (0, Context::getContext ().config.get ("tag.indicator").length ());
else if (_style == "count" && else if (_style == "count" &&
_label == "Tags") _label == "Tags")
@@ -77,7 +76,7 @@ void ColumnTags::measure (Task& task, unsigned int& minimum, unsigned int& maxim
{ {
if (_style == "indicator") if (_style == "indicator")
{ {
minimum = maximum = utf8_width (context.config.get ("tag.indicator")); minimum = maximum = utf8_width (Context::getContext ().config.get ("tag.indicator"));
} }
else if (_style == "count") else if (_style == "count")
{ {
@@ -139,7 +138,7 @@ void ColumnTags::render (
} }
else if (_style == "indicator") else if (_style == "indicator")
{ {
renderStringRight (lines, width, color, context.config.get ("tag.indicator")); renderStringRight (lines, width, color, Context::getContext ().config.get ("tag.indicator"));
} }
else if (_style == "count") else if (_style == "count")
{ {
@@ -173,12 +172,12 @@ void ColumnTags::modify (Task& task, const std::string& value)
Variant v; Variant v;
e.evaluateInfixExpression (value, v); e.evaluateInfixExpression (value, v);
task.addTag ((std::string) v); task.addTag ((std::string) v);
context.debug (label + "tags <-- '" + (std::string) v + "' <-- '" + tag + '\''); Context::getContext ().debug (label + "tags <-- '" + (std::string) v + "' <-- '" + tag + '\'');
} }
else else
{ {
task.addTag (tag); task.addTag (tag);
context.debug (label + "tags <-- '" + tag + '\''); Context::getContext ().debug (label + "tags <-- '" + tag + '\'');
} }
feedback_special_tags (task, tag); feedback_special_tags (task, tag);

View File

@@ -34,7 +34,6 @@
#include <Filter.h> #include <Filter.h>
#include <format.h> #include <format.h>
extern Context context;
extern Task& contextTask; extern Task& contextTask;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -55,7 +54,7 @@ ColumnTypeDate::ColumnTypeDate ()
Datetime now; Datetime now;
now -= 125; // So that "age" is non-zero. now -= 125; // So that "age" is non-zero.
_examples = {now.toString (context.config.get ("dateformat")), _examples = {now.toString (Context::getContext ().config.get ("dateformat")),
format (now.toJulian (), 13, 12), format (now.toJulian (), 13, 12),
now.toEpochString (), now.toEpochString (),
now.toISO (), now.toISO (),
@@ -81,11 +80,11 @@ void ColumnTypeDate::measure (Task& task, unsigned int& minimum, unsigned int& m
// rc.report.<report>.dateformat // rc.report.<report>.dateformat
// rc.dateformat.report // rc.dateformat.report
// rc.dateformat. // rc.dateformat.
std::string format = context.config.get ("report." + _report + ".dateformat"); std::string format = Context::getContext ().config.get ("report." + _report + ".dateformat");
if (format == "") if (format == "")
format = context.config.get ("dateformat.report"); format = Context::getContext ().config.get ("dateformat.report");
if (format == "") if (format == "")
format = context.config.get ("dateformat"); format = Context::getContext ().config.get ("dateformat");
minimum = maximum = Datetime::length (format); minimum = maximum = Datetime::length (format);
} }
@@ -149,12 +148,12 @@ void ColumnTypeDate::render (
// rc.report.<report>.dateformat // rc.report.<report>.dateformat
// rc.dateformat.report // rc.dateformat.report
// rc.dateformat // rc.dateformat
std::string format = context.config.get ("report." + _report + ".dateformat"); std::string format = Context::getContext ().config.get ("report." + _report + ".dateformat");
if (format == "") if (format == "")
{ {
format = context.config.get ("dateformat.report"); format = Context::getContext ().config.get ("dateformat.report");
if (format == "") if (format == "")
format = context.config.get ("dateformat"); format = Context::getContext ().config.get ("dateformat");
} }
renderStringLeft (lines, width, color, date.toString (format)); renderStringLeft (lines, width, color, date.toString (format));
@@ -227,7 +226,7 @@ void ColumnTypeDate::modify (Task& task, const std::string& value)
std::string label = " MODIFICATION "; std::string label = " MODIFICATION ";
if (evaluatedValue.type () == Variant::type_duration) if (evaluatedValue.type () == Variant::type_duration)
{ {
context.debug (label + _name + " <-- '" + format ("{1}", format (evaluatedValue.get_duration ())) + "' <-- '" + (std::string) evaluatedValue + "' <-- '" + value + '\''); Context::getContext ().debug (label + _name + " <-- '" + format ("{1}", format (evaluatedValue.get_duration ())) + "' <-- '" + (std::string) evaluatedValue + "' <-- '" + value + '\'');
Datetime date_now; Datetime date_now;
Variant now (date_now.toEpoch (), Variant::type_date); Variant now (date_now.toEpoch (), Variant::type_date);
evaluatedValue += now; evaluatedValue += now;
@@ -235,7 +234,7 @@ void ColumnTypeDate::modify (Task& task, const std::string& value)
else else
{ {
evaluatedValue.cast (Variant::type_date); evaluatedValue.cast (Variant::type_date);
context.debug (label + _name + " <-- '" + format ("{1}", evaluatedValue.get_date ()) + "' <-- '" + (std::string) evaluatedValue + "' <-- '" + value + '\''); Context::getContext ().debug (label + _name + " <-- '" + format ("{1}", evaluatedValue.get_date ()) + "' <-- '" + (std::string) evaluatedValue + "' <-- '" + value + '\'');
} }
// If a date doesn't parse (2/29/2014) then it evaluates to zero. // If a date doesn't parse (2/29/2014) then it evaluates to zero.

View File

@@ -32,7 +32,6 @@
#include <Filter.h> #include <Filter.h>
#include <format.h> #include <format.h>
extern Context context;
extern Task& contextTask; extern Task& contextTask;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -71,7 +70,7 @@ void ColumnTypeDuration::modify (Task& task, const std::string& value)
if (evaluatedValue.type () == Variant::type_duration) if (evaluatedValue.type () == Variant::type_duration)
{ {
// Store the raw value, for 'recur'. // Store the raw value, for 'recur'.
context.debug (label + _name + " <-- " + (std::string) evaluatedValue + " <-- '" + value + '\''); Context::getContext ().debug (label + _name + " <-- " + (std::string) evaluatedValue + " <-- '" + value + '\'');
task.set (_name, evaluatedValue); task.set (_name, evaluatedValue);
} }
else else

View File

@@ -32,7 +32,6 @@
#include <Filter.h> #include <Filter.h>
#include <format.h> #include <format.h>
extern Context context;
extern Task& contextTask; extern Task& contextTask;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -66,7 +65,7 @@ void ColumnTypeNumeric::modify (Task& task, const std::string& value)
} }
std::string label = " MODIFICATION "; std::string label = " MODIFICATION ";
context.debug (label + _name + " <-- '" + evaluatedValue.get_string () + "' <-- '" + value + '\''); Context::getContext ().debug (label + _name + " <-- '" + evaluatedValue.get_string () + "' <-- '" + value + '\'');
// If the result is not readily convertible to a numeric value, then this is // If the result is not readily convertible to a numeric value, then this is
// an error. // an error.

View File

@@ -34,7 +34,6 @@
#define STRING_INVALID_MOD "The '{1}' attribute does not allow a value of '{2}'." #define STRING_INVALID_MOD "The '{1}' attribute does not allow a value of '{2}'."
extern Context context;
extern Task& contextTask; extern Task& contextTask;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -71,7 +70,7 @@ void ColumnTypeString::modify (Task& task, const std::string& value)
if (validate (strValue)) if (validate (strValue))
{ {
task.set (_name, strValue); task.set (_name, strValue);
context.debug (label + _name + " <-- '" + strValue + "' <-- '" + value + '\''); Context::getContext ().debug (label + _name + " <-- '" + strValue + "' <-- '" + value + '\'');
} }
else else
throw format (STRING_INVALID_MOD, _name, value); throw format (STRING_INVALID_MOD, _name, value);
@@ -81,7 +80,7 @@ void ColumnTypeString::modify (Task& task, const std::string& value)
if (validate (value)) if (validate (value))
{ {
task.set (_name, value); task.set (_name, value);
context.debug (label + _name + " <-- '" + value + '\''); Context::getContext ().debug (label + _name + " <-- '" + value + '\'');
} }
else else
throw format (STRING_INVALID_MOD, _name, value); throw format (STRING_INVALID_MOD, _name, value);

View File

@@ -34,8 +34,6 @@
#include <utf8.h> #include <utf8.h>
#include <stdlib.h> #include <stdlib.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
ColumnUDAString::ColumnUDAString () ColumnUDAString::ColumnUDAString ()
{ {
@@ -84,7 +82,7 @@ void ColumnUDAString::measure (Task& task, unsigned int& minimum, unsigned int&
} }
else if (_style == "indicator") else if (_style == "indicator")
{ {
auto indicator = context.config.get ("uda." + _name + ".indicator"); auto indicator = Context::getContext ().config.get ("uda." + _name + ".indicator");
if (indicator == "") if (indicator == "")
indicator = "U"; indicator = "U";
@@ -113,7 +111,7 @@ void ColumnUDAString::render (
} }
else if (_style == "indicator") else if (_style == "indicator")
{ {
auto indicator = context.config.get ("uda." + _name + ".indicator"); auto indicator = Context::getContext ().config.get ("uda." + _name + ".indicator");
if (indicator == "") if (indicator == "")
indicator = "U"; indicator = "U";
@@ -165,7 +163,7 @@ void ColumnUDANumeric::measure (Task& task, unsigned int& minimum, unsigned int&
} }
else if (_style == "indicator") else if (_style == "indicator")
{ {
auto indicator = context.config.get ("uda." + _name + ".indicator"); auto indicator = Context::getContext ().config.get ("uda." + _name + ".indicator");
if (indicator == "") if (indicator == "")
indicator = "U"; indicator = "U";
@@ -190,7 +188,7 @@ void ColumnUDANumeric::render (
} }
else if (_style == "indicator") else if (_style == "indicator")
{ {
auto indicator = context.config.get ("uda." + _name + ".indicator"); auto indicator = Context::getContext ().config.get ("uda." + _name + ".indicator");
if (indicator == "") if (indicator == "")
indicator = "U"; indicator = "U";
@@ -244,18 +242,18 @@ void ColumnUDADate::measure (Task& task, unsigned int& minimum, unsigned int& ma
// rc.dateformat.report // rc.dateformat.report
// rc.dateformat // rc.dateformat
Datetime date ((time_t) strtol (value.c_str (), NULL, 10)); Datetime date ((time_t) strtol (value.c_str (), NULL, 10));
auto format = context.config.get ("report." + _report + ".dateformat"); auto format = Context::getContext ().config.get ("report." + _report + ".dateformat");
if (format == "") if (format == "")
format = context.config.get ("dateformat.report"); format = Context::getContext ().config.get ("dateformat.report");
if (format == "") if (format == "")
format = context.config.get ("dateformat"); format = Context::getContext ().config.get ("dateformat");
minimum = maximum = Datetime::length (format); minimum = maximum = Datetime::length (format);
} }
} }
else if (_style == "indicator") else if (_style == "indicator")
{ {
auto indicator = context.config.get ("uda." + _name + ".indicator"); auto indicator = Context::getContext ().config.get ("uda." + _name + ".indicator");
if (indicator == "") if (indicator == "")
indicator = "U"; indicator = "U";
@@ -281,19 +279,19 @@ void ColumnUDADate::render (
// rc.report.<report>.dateformat // rc.report.<report>.dateformat
// rc.dateformat.report // rc.dateformat.report
// rc.dateformat. // rc.dateformat.
auto format = context.config.get ("report." + _report + ".dateformat"); auto format = Context::getContext ().config.get ("report." + _report + ".dateformat");
if (format == "") if (format == "")
{ {
format = context.config.get ("dateformat.report"); format = Context::getContext ().config.get ("dateformat.report");
if (format == "") if (format == "")
format = context.config.get ("dateformat"); format = Context::getContext ().config.get ("dateformat");
} }
renderStringLeft (lines, width, color, Datetime ((time_t) strtol (value.c_str (), NULL, 10)).toString (format)); renderStringLeft (lines, width, color, Datetime ((time_t) strtol (value.c_str (), NULL, 10)).toString (format));
} }
else if (_style == "indicator") else if (_style == "indicator")
{ {
auto indicator = context.config.get ("uda." + _name + ".indicator"); auto indicator = Context::getContext ().config.get ("uda." + _name + ".indicator");
if (indicator == "") if (indicator == "")
indicator = "U"; indicator = "U";
@@ -347,7 +345,7 @@ void ColumnUDADuration::measure (Task& task, unsigned int& minimum, unsigned int
{ {
if (task.has (_name)) if (task.has (_name))
{ {
auto indicator = context.config.get ("uda." + _name + ".indicator"); auto indicator = Context::getContext ().config.get ("uda." + _name + ".indicator");
if (indicator == "") if (indicator == "")
indicator = "U"; indicator = "U";
@@ -375,7 +373,7 @@ void ColumnUDADuration::render (
} }
else if (_style == "indicator") else if (_style == "indicator")
{ {
auto indicator = context.config.get ("uda." + _name + ".indicator"); auto indicator = Context::getContext ().config.get ("uda." + _name + ".indicator");
if (indicator == "") if (indicator == "")
indicator = "U"; indicator = "U";

View File

@@ -56,8 +56,6 @@
#include <shared.h> #include <shared.h>
#include <format.h> #include <format.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Supports the complete column definition: // Supports the complete column definition:
// //
@@ -106,7 +104,7 @@ Column* Column::factory (const std::string& name, const std::string& report)
else if (column_name == "wait") c = new ColumnWait (); else if (column_name == "wait") c = new ColumnWait ();
// UDA. // UDA.
else if (context.config.has ("uda." + column_name + ".type")) else if (Context::getContext ().config.has ("uda." + column_name + ".type"))
c = Column::uda (column_name); c = Column::uda (column_name);
else else
@@ -156,7 +154,7 @@ void Column::uda (std::map <std::string, Column*>& all)
// For each UDA, instantiate and initialize ColumnUDA. // For each UDA, instantiate and initialize ColumnUDA.
std::set <std::string> udas; std::set <std::string> udas;
for (const auto& i : context.config) for (const auto& i : Context::getContext ().config)
{ {
if (i.first.substr (0, 4) == "uda.") if (i.first.substr (0, 4) == "uda.")
{ {
@@ -181,9 +179,9 @@ void Column::uda (std::map <std::string, Column*>& all)
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
Column* Column::uda (const std::string& name) Column* Column::uda (const std::string& name)
{ {
auto type = context.config.get ("uda." + name + ".type"); auto type = Context::getContext ().config.get ("uda." + name + ".type");
auto label = context.config.get ("uda." + name + ".label"); auto label = Context::getContext ().config.get ("uda." + name + ".label");
auto values = context.config.get ("uda." + name + ".values"); auto values = Context::getContext ().config.get ("uda." + name + ".values");
if (type == "string") if (type == "string")
{ {
@@ -251,7 +249,7 @@ void Column::renderHeader (
int width, int width,
Color& color) Color& color)
{ {
if (context.verbose ("label") && if (Context::getContext ().verbose ("label") &&
_label != "") _label != "")
{ {
// Create a basic label. // Create a basic label.
@@ -263,8 +261,8 @@ void Column::renderHeader (
Color c = color; Color c = color;
// Now underline the header, or add a dashed line. // Now underline the header, or add a dashed line.
if (context.color () && if (Context::getContext ().color () &&
context.config.getBoolean ("fontunderline")) Context::getContext ().config.getBoolean ("fontunderline"))
{ {
c.blend (Color (Color::nocolor, Color::nocolor, true, false, false)); c.blend (Color (Color::nocolor, Color::nocolor, true, false, false));
lines.push_back (c.colorize (leftJustify (header, width))); lines.push_back (c.colorize (leftJustify (header, width)));

View File

@@ -30,8 +30,6 @@
#include <format.h> #include <format.h>
#include <main.h> #include <main.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdAdd::CmdAdd () CmdAdd::CmdAdd ()
{ {
@@ -54,7 +52,7 @@ int CmdAdd::execute (std::string& output)
// Apply the command line modifications to the new task. // Apply the command line modifications to the new task.
Task task; Task task;
task.modify (Task::modReplace, true); task.modify (Task::modReplace, true);
context.tdb2.add (task); Context::getContext ().tdb2.add (task);
// Do not display ID 0, users cannot query by that // Do not display ID 0, users cannot query by that
auto status = task.getStatus (); auto status = task.getStatus ();
@@ -64,25 +62,25 @@ int CmdAdd::execute (std::string& output)
// it's enduring and never changes, and it's unlikely the caller // it's enduring and never changes, and it's unlikely the caller
// asked for this if they just wanted a human-friendly number. // asked for this if they just wanted a human-friendly number.
if (context.verbose ("new-uuid") && if (Context::getContext ().verbose ("new-uuid") &&
status != Task::recurring) status != Task::recurring)
output += format ("Created task {1}.\n", task.get ("uuid")); output += format ("Created task {1}.\n", task.get ("uuid"));
else if (context.verbose ("new-uuid") && else if (Context::getContext ().verbose ("new-uuid") &&
status == Task::recurring) status == Task::recurring)
output += format ("Created task {1} (recurrence template).\n", task.get ("uuid")); output += format ("Created task {1} (recurrence template).\n", task.get ("uuid"));
else if (context.verbose ("new-id") && else if (Context::getContext ().verbose ("new-id") &&
(status == Task::pending || (status == Task::pending ||
status == Task::waiting)) status == Task::waiting))
output += format ("Created task {1}.\n", task.id); output += format ("Created task {1}.\n", task.id);
else if (context.verbose ("new-id") && else if (Context::getContext ().verbose ("new-id") &&
status == Task::recurring) status == Task::recurring)
output += format ("Created task {1} (recurrence template).\n", task.id); output += format ("Created task {1} (recurrence template).\n", task.id);
if (context.verbose ("project")) if (Context::getContext ().verbose ("project"))
context.footnote (onProjectChange (task)); Context::getContext ().footnote (onProjectChange (task));
return 0; return 0;
} }

View File

@@ -29,8 +29,6 @@
#include <Context.h> #include <Context.h>
#include <Command.h> #include <Command.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdCompletionAliases::CmdCompletionAliases () CmdCompletionAliases::CmdCompletionAliases ()
{ {
@@ -50,7 +48,7 @@ CmdCompletionAliases::CmdCompletionAliases ()
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int CmdCompletionAliases::execute (std::string& output) int CmdCompletionAliases::execute (std::string& output)
{ {
for (const auto& alias : context.config) for (const auto& alias : Context::getContext ().config)
if (alias.first.substr (0, 6) == "alias.") if (alias.first.substr (0, 6) == "alias.")
output += alias.first.substr (6) + '\n'; output += alias.first.substr (6) + '\n';

View File

@@ -33,8 +33,6 @@
#include <shared.h> #include <shared.h>
#include <format.h> #include <format.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdAnnotate::CmdAnnotate () CmdAnnotate::CmdAnnotate ()
{ {
@@ -63,7 +61,7 @@ int CmdAnnotate::execute (std::string&)
filter.subset (filtered); filter.subset (filtered);
if (filtered.size () == 0) if (filtered.size () == 0)
{ {
context.footnote ("No tasks specified."); Context::getContext ().footnote ("No tasks specified.");
return 1; return 1;
} }
@@ -85,33 +83,33 @@ int CmdAnnotate::execute (std::string&)
if (permission (taskDifferences (before, task) + question, filtered.size ())) if (permission (taskDifferences (before, task) + question, filtered.size ()))
{ {
context.tdb2.modify (task); Context::getContext ().tdb2.modify (task);
++count; ++count;
feedback_affected ("Annotating task {1} '{2}'.", task); feedback_affected ("Annotating task {1} '{2}'.", task);
if (context.verbose ("project")) if (Context::getContext ().verbose ("project"))
projectChanges[task.get ("project")] = onProjectChange (task, false); projectChanges[task.get ("project")] = onProjectChange (task, false);
// Annotate siblings. // Annotate siblings.
if (task.has ("parent")) if (task.has ("parent"))
{ {
if ((context.config.get ("recurrence.confirmation") == "prompt" if ((Context::getContext ().config.get ("recurrence.confirmation") == "prompt"
&& confirm ("This is a recurring task. Do you want to annotate all pending recurrences of this same task?")) || && confirm ("This is a recurring task. Do you want to annotate all pending recurrences of this same task?")) ||
context.config.getBoolean ("recurrence.confirmation")) Context::getContext ().config.getBoolean ("recurrence.confirmation"))
{ {
auto siblings = context.tdb2.siblings (task); auto siblings = Context::getContext ().tdb2.siblings (task);
for (auto& sibling : siblings) for (auto& sibling : siblings)
{ {
sibling.modify (Task::modAnnotate, true); sibling.modify (Task::modAnnotate, true);
context.tdb2.modify (sibling); Context::getContext ().tdb2.modify (sibling);
++count; ++count;
feedback_affected ("Annotating recurring task {1} '{2}'.", sibling); feedback_affected ("Annotating recurring task {1} '{2}'.", sibling);
} }
// Annotate the parent // Annotate the parent
Task parent; Task parent;
context.tdb2.get (task.get ("parent"), parent); Context::getContext ().tdb2.get (task.get ("parent"), parent);
parent.modify (Task::modAnnotate, true); parent.modify (Task::modAnnotate, true);
context.tdb2.modify (parent); Context::getContext ().tdb2.modify (parent);
} }
} }
} }
@@ -127,7 +125,7 @@ int CmdAnnotate::execute (std::string&)
// Now list the project changes. // Now list the project changes.
for (const auto& change : projectChanges) for (const auto& change : projectChanges)
if (change.first != "") if (change.first != "")
context.footnote (change.second); Context::getContext ().footnote (change.second);
feedback_affected (count == 1 ? "Annotated {1} task." : "Annotated {1} tasks.", count); feedback_affected (count == 1 ? "Annotated {1} task." : "Annotated {1} tasks.", count);
return rc; return rc;

View File

@@ -33,8 +33,6 @@
#include <format.h> #include <format.h>
#include <main.h> #include <main.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdAppend::CmdAppend () CmdAppend::CmdAppend ()
{ {
@@ -63,7 +61,7 @@ int CmdAppend::execute (std::string&)
filter.subset (filtered); filter.subset (filtered);
if (filtered.size () == 0) if (filtered.size () == 0)
{ {
context.footnote ("No tasks specified."); Context::getContext ().footnote ("No tasks specified.");
return 1; return 1;
} }
@@ -85,33 +83,33 @@ int CmdAppend::execute (std::string&)
if (permission (taskDifferences (before, task) + question, filtered.size ())) if (permission (taskDifferences (before, task) + question, filtered.size ()))
{ {
context.tdb2.modify (task); Context::getContext ().tdb2.modify (task);
++count; ++count;
feedback_affected ("Appending to task {1} '{2}'.", task); feedback_affected ("Appending to task {1} '{2}'.", task);
if (context.verbose ("project")) if (Context::getContext ().verbose ("project"))
projectChanges[task.get ("project")] = onProjectChange (task, false); projectChanges[task.get ("project")] = onProjectChange (task, false);
// Append to siblings. // Append to siblings.
if (task.has ("parent")) if (task.has ("parent"))
{ {
if ((context.config.get ("recurrence.confirmation") == "prompt" if ((Context::getContext ().config.get ("recurrence.confirmation") == "prompt"
&& confirm ("This is a recurring task. Do you want to append to all pending recurrences of this same task?")) || && confirm ("This is a recurring task. Do you want to append to all pending recurrences of this same task?")) ||
context.config.getBoolean ("recurrence.confirmation")) Context::getContext ().config.getBoolean ("recurrence.confirmation"))
{ {
std::vector <Task> siblings = context.tdb2.siblings (task); std::vector <Task> siblings = Context::getContext ().tdb2.siblings (task);
for (auto& sibling : siblings) for (auto& sibling : siblings)
{ {
sibling.modify (Task::modAppend, true); sibling.modify (Task::modAppend, true);
context.tdb2.modify (sibling); Context::getContext ().tdb2.modify (sibling);
++count; ++count;
feedback_affected ("Appending to recurring task {1} '{2}'.", sibling); feedback_affected ("Appending to recurring task {1} '{2}'.", sibling);
} }
// Append to the parent // Append to the parent
Task parent; Task parent;
context.tdb2.get (task.get ("parent"), parent); Context::getContext ().tdb2.get (task.get ("parent"), parent);
parent.modify (Task::modAppend, true); parent.modify (Task::modAppend, true);
context.tdb2.modify (parent); Context::getContext ().tdb2.modify (parent);
} }
} }
} }
@@ -127,7 +125,7 @@ int CmdAppend::execute (std::string&)
// Now list the project changes. // Now list the project changes.
for (const auto& change : projectChanges) for (const auto& change : projectChanges)
if (change.first != "") if (change.first != "")
context.footnote (change.second); Context::getContext ().footnote (change.second);
feedback_affected (count == 1 ? "Appended {1} task." : "Appended {1} tasks.", count); feedback_affected (count == 1 ? "Appended {1} task." : "Appended {1} tasks.", count);
return rc; return rc;

View File

@@ -31,8 +31,6 @@
#include <Context.h> #include <Context.h>
#include <Command.h> #include <Command.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdZshAttributes::CmdZshAttributes () CmdZshAttributes::CmdZshAttributes ()
{ {
@@ -53,7 +51,7 @@ CmdZshAttributes::CmdZshAttributes ()
int CmdZshAttributes::execute (std::string& output) int CmdZshAttributes::execute (std::string& output)
{ {
// Get a list of all columns, sort them. // Get a list of all columns, sort them.
auto columns = context.getColumns (); auto columns = Context::getContext ().getColumns ();
std::sort (columns.begin (), columns.end ()); std::sort (columns.begin (), columns.end ());
std::stringstream out; std::stringstream out;

View File

@@ -40,8 +40,6 @@
#include <shared.h> #include <shared.h>
#include <format.h> #include <format.h>
extern Context context;
// Helper macro. // Helper macro.
#define LOC(y,x) (((y) * (_width + 1)) + (x)) #define LOC(y,x) (((y) * (_width + 1)) + (x))
@@ -174,8 +172,8 @@ Chart::Chart (char type)
{ {
// How much space is there to render in? This chart will occupy the // How much space is there to render in? This chart will occupy the
// maximum space, and the width drives various other parameters. // maximum space, and the width drives various other parameters.
_width = context.getWidth (); _width = Context::getContext ().getWidth ();
_height = context.getHeight () - 1; // Allow for new line with prompt. _height = Context::getContext ().getHeight () - 1; // Allow for new line with prompt.
_max_value = 0; _max_value = 0;
_max_label = 1; _max_label = 1;
_graph_height = _height - 7; _graph_height = _height - 7;
@@ -193,7 +191,7 @@ Chart::Chart (char type)
_net_fix_rate = 0.0; _net_fix_rate = 0.0;
// Set the title. // Set the title.
std::vector <std::string> words = context.cli2.getWords (); std::vector <std::string> words = Context::getContext ().cli2.getWords ();
auto filter = join (" ", words); auto filter = join (" ", words);
_title = '(' + filter + ')'; _title = '(' + filter + ')';
} }
@@ -396,7 +394,7 @@ std::string Chart::render ()
} }
if (_max_value == 0) if (_max_value == 0)
context.footnote ("No matches."); Context::getContext ().footnote ("No matches.");
// Create a grid, folded into a string. // Create a grid, folded into a string.
_grid = ""; _grid = "";
@@ -520,12 +518,12 @@ std::string Chart::render ()
optimizeGrid (); optimizeGrid ();
if (context.color ()) if (Context::getContext ().color ())
{ {
// Colorize the grid. // Colorize the grid.
Color color_pending (context.config.get ("color.burndown.pending")); Color color_pending (Context::getContext ().config.get ("color.burndown.pending"));
Color color_done (context.config.get ("color.burndown.done")); Color color_done (Context::getContext ().config.get ("color.burndown.done"));
Color color_started (context.config.get ("color.burndown.started")); Color color_started (Context::getContext ().config.get ("color.burndown.started"));
// Replace DD, SS, PP with colored strings. // Replace DD, SS, PP with colored strings.
std::string::size_type i; std::string::size_type i;
@@ -799,7 +797,7 @@ void Chart::calculateRates ()
<< ", with currently " << ", with currently "
<< _current_count << _current_count
<< " pending tasks"; << " pending tasks";
context.debug (peak_message.str ()); Context::getContext ().debug (peak_message.str ());
// If there are no current pending tasks, then it is meaningless to find // If there are no current pending tasks, then it is meaningless to find
// rates or estimated completion date. // rates or estimated completion date.
@@ -824,16 +822,16 @@ void Chart::calculateRates ()
<< " = " << " = "
<< _net_fix_rate << _net_fix_rate
<< " tasks/d"; << " tasks/d";
context.debug (rate_message.str ()); Context::getContext ().debug (rate_message.str ());
Duration delta (static_cast <time_t> (_current_count / fix_rate)); Duration delta (static_cast <time_t> (_current_count / fix_rate));
Datetime end = now + delta.toTime_t (); Datetime end = now + delta.toTime_t ();
// Prefer dateformat.report over dateformat. // Prefer dateformat.report over dateformat.
std::string format = context.config.get ("dateformat.report"); std::string format = Context::getContext ().config.get ("dateformat.report");
if (format == "") if (format == "")
{ {
format = context.config.get ("dateformat"); format = Context::getContext ().config.get ("dateformat");
if (format == "") if (format == "")
format = "Y-M-D"; format = "Y-M-D";
} }
@@ -852,7 +850,7 @@ void Chart::calculateRates ()
<< delta.format () << delta.format ()
<< " --> " << " --> "
<< end.toISO (); << end.toISO ();
context.debug (completion_message.str ()); Context::getContext ().debug (completion_message.str ());
} }
else else
{ {

View File

@@ -29,8 +29,6 @@
#include <Filter.h> #include <Filter.h>
#include <Eval.h> #include <Eval.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdCalc::CmdCalc () CmdCalc::CmdCalc ()
{ {
@@ -52,17 +50,17 @@ int CmdCalc::execute (std::string& output)
{ {
// Configurable infix/postfix // Configurable infix/postfix
bool infix {true}; bool infix {true};
if (context.config.get ("expressions") == "postfix") if (Context::getContext ().config.get ("expressions") == "postfix")
infix = false; infix = false;
// Create an evaluator with DOM access. // Create an evaluator with DOM access.
Eval e; Eval e;
e.addSource (domSource); e.addSource (domSource);
e.debug (context.config.getBoolean ("debug")); e.debug (Context::getContext ().config.getBoolean ("debug"));
// Compile all the args into one expression. // Compile all the args into one expression.
std::string expression; std::string expression;
for (const auto& word : context.cli2.getWords ()) for (const auto& word : Context::getContext ().cli2.getWords ())
expression += word + ' '; expression += word + ' ';
// Evaluate according to preference. // Evaluate according to preference.

View File

@@ -38,8 +38,6 @@
#include <utf8.h> #include <utf8.h>
#include <main.h> #include <main.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdCalendar::CmdCalendar () CmdCalendar::CmdCalendar ()
{ {
@@ -63,8 +61,8 @@ int CmdCalendar::execute (std::string& output)
// Each month requires 28 text columns width. See how many will actually // Each month requires 28 text columns width. See how many will actually
// fit. But if a preference is specified, and it fits, use it. // fit. But if a preference is specified, and it fits, use it.
auto width = context.getWidth (); auto width = Context::getContext ().getWidth ();
auto preferredMonthsPerLine = context.config.getInteger ("monthsperline"); auto preferredMonthsPerLine = Context::getContext ().config.getInteger ("monthsperline");
auto monthsThatFit = width / 26; auto monthsThatFit = width / 26;
auto monthsPerLine = monthsThatFit; auto monthsPerLine = monthsThatFit;
@@ -74,7 +72,7 @@ int CmdCalendar::execute (std::string& output)
// Load the pending tasks. // Load the pending tasks.
handleUntil (); handleUntil ();
handleRecurrence (); handleRecurrence ();
auto tasks = context.tdb2.pending.get_tasks (); auto tasks = Context::getContext ().tdb2.pending.get_tasks ();
Datetime today; Datetime today;
auto getPendingDate = false; auto getPendingDate = false;
@@ -108,14 +106,14 @@ int CmdCalendar::execute (std::string& output)
auto argYear = 0; auto argYear = 0;
auto argWholeYear = false; auto argWholeYear = false;
for (auto& arg : context.cli2.getWords ()) for (auto& arg : Context::getContext ().cli2.getWords ())
{ {
// Some version of "calendar". // Some version of "calendar".
if (autoComplete (Lexer::lowerCase (arg), commandNames, matches, context.config.getInteger ("abbreviation.minimum")) == 1) if (autoComplete (Lexer::lowerCase (arg), commandNames, matches, Context::getContext ().config.getInteger ("abbreviation.minimum")) == 1)
continue; continue;
// "due". // "due".
else if (autoComplete (Lexer::lowerCase (arg), keywordNames, matches, context.config.getInteger ("abbreviation.minimum")) == 1) else if (autoComplete (Lexer::lowerCase (arg), keywordNames, matches, Context::getContext ().config.getInteger ("abbreviation.minimum")) == 1)
getPendingDate = true; getPendingDate = true;
// "y". // "y".
@@ -135,7 +133,7 @@ int CmdCalendar::execute (std::string& output)
} }
// "January" etc. // "January" etc.
else if (autoComplete (Lexer::lowerCase (arg), monthNames, matches, context.config.getInteger ("abbreviation.minimum")) == 1) else if (autoComplete (Lexer::lowerCase (arg), monthNames, matches, Context::getContext ().config.getInteger ("abbreviation.minimum")) == 1)
{ {
argMonth = Datetime::monthOfYear (matches[0]); argMonth = Datetime::monthOfYear (matches[0]);
if (argMonth == -1) if (argMonth == -1)
@@ -192,10 +190,10 @@ int CmdCalendar::execute (std::string& output)
yFrom = oldest.year(); yFrom = oldest.year();
} }
if (context.config.getBoolean ("calendar.offset")) if (Context::getContext ().config.getBoolean ("calendar.offset"))
{ {
auto moffset = context.config.getInteger ("calendar.offset.value") % 12; auto moffset = Context::getContext ().config.getInteger ("calendar.offset.value") % 12;
auto yoffset = context.config.getInteger ("calendar.offset.value") / 12; auto yoffset = Context::getContext ().config.getInteger ("calendar.offset.value") / 12;
mFrom += moffset; mFrom += moffset;
yFrom += yoffset; yFrom += yoffset;
if (mFrom < 1) if (mFrom < 1)
@@ -279,15 +277,15 @@ int CmdCalendar::execute (std::string& output)
} }
} }
Color color_today (context.config.get ("color.calendar.today")); Color color_today (Context::getContext ().config.get ("color.calendar.today"));
Color color_due (context.config.get ("color.calendar.due")); Color color_due (Context::getContext ().config.get ("color.calendar.due"));
Color color_duetoday (context.config.get ("color.calendar.due.today")); Color color_duetoday (Context::getContext ().config.get ("color.calendar.due.today"));
Color color_overdue (context.config.get ("color.calendar.overdue")); Color color_overdue (Context::getContext ().config.get ("color.calendar.overdue"));
Color color_weekend (context.config.get ("color.calendar.weekend")); Color color_weekend (Context::getContext ().config.get ("color.calendar.weekend"));
Color color_holiday (context.config.get ("color.calendar.holiday")); Color color_holiday (Context::getContext ().config.get ("color.calendar.holiday"));
Color color_weeknumber (context.config.get ("color.calendar.weeknumber")); Color color_weeknumber (Context::getContext ().config.get ("color.calendar.weeknumber"));
if (context.color () && context.config.getBoolean ("calendar.legend")) if (Context::getContext ().color () && Context::getContext ().config.getBoolean ("calendar.legend"))
out << "Legend: " out << "Legend: "
<< color_today.colorize ("today") << color_today.colorize ("today")
<< ", " << ", "
@@ -306,7 +304,7 @@ int CmdCalendar::execute (std::string& output)
<< optionalBlankLine () << optionalBlankLine ()
<< '\n'; << '\n';
if (context.config.get ("calendar.details") == "full" || context.config.get ("calendar.holidays") == "full") if (Context::getContext ().config.get ("calendar.details") == "full" || Context::getContext ().config.get ("calendar.holidays") == "full")
{ {
--details_mFrom; --details_mFrom;
if (details_mFrom == 0) if (details_mFrom == 0)
@@ -324,30 +322,30 @@ int CmdCalendar::execute (std::string& output)
} }
Datetime date_after (details_yFrom, details_mFrom, details_dFrom); Datetime date_after (details_yFrom, details_mFrom, details_dFrom);
auto after = date_after.toString (context.config.get ("dateformat")); auto after = date_after.toString (Context::getContext ().config.get ("dateformat"));
Datetime date_before (yTo, mTo, 1); Datetime date_before (yTo, mTo, 1);
auto before = date_before.toString (context.config.get ("dateformat")); auto before = date_before.toString (Context::getContext ().config.get ("dateformat"));
// Table with due date information // Table with due date information
if (context.config.get ("calendar.details") == "full") if (Context::getContext ().config.get ("calendar.details") == "full")
{ {
// Assert that 'report' is a valid report. // Assert that 'report' is a valid report.
auto report = context.config.get ("calendar.details.report"); auto report = Context::getContext ().config.get ("calendar.details.report");
if (context.commands.find (report) == context.commands.end ()) if (Context::getContext ().commands.find (report) == Context::getContext ().commands.end ())
throw std::string ("The setting 'calendar.details.report' must contain a single report name."); throw std::string ("The setting 'calendar.details.report' must contain a single report name.");
// TODO Fix this: cal --> task // TODO Fix this: cal --> task
// calendar --> taskendar // calendar --> taskendar
// If the executable was "cal" or equivalent, replace it with "task". // If the executable was "cal" or equivalent, replace it with "task".
auto executable = context.cli2._original_args[0].attribute ("raw"); auto executable = Context::getContext ().cli2._original_args[0].attribute ("raw");
auto cal = executable.find ("cal"); auto cal = executable.find ("cal");
if (cal != std::string::npos) if (cal != std::string::npos)
executable = executable.substr (0, cal) + PACKAGE; executable = executable.substr (0, cal) + PACKAGE;
std::vector <std::string> args; std::vector <std::string> args;
args.push_back ("rc:" + context.rc_file._data); args.push_back ("rc:" + Context::getContext ().rc_file._data);
args.push_back ("rc.due:0"); args.push_back ("rc.due:0");
args.push_back ("rc.verbose:label,affected,blank"); args.push_back ("rc.verbose:label,affected,blank");
args.push_back ("due.after:" + after); args.push_back ("due.after:" + after);
@@ -361,34 +359,34 @@ int CmdCalendar::execute (std::string& output)
} }
// Table with holiday information // Table with holiday information
if (context.config.get ("calendar.holidays") == "full") if (Context::getContext ().config.get ("calendar.holidays") == "full")
{ {
Table holTable; Table holTable;
holTable.width (context.getWidth ()); holTable.width (Context::getContext ().getWidth ());
holTable.add ("Date"); holTable.add ("Date");
holTable.add ("Holiday"); holTable.add ("Holiday");
setHeaderUnderline (holTable); setHeaderUnderline (holTable);
std::map <time_t, std::vector<std::string>> hm; // we need to store multiple holidays per day std::map <time_t, std::vector<std::string>> hm; // we need to store multiple holidays per day
for (auto& it : context.config) for (auto& it : Context::getContext ().config)
if (it.first.substr (0, 8) == "holiday.") if (it.first.substr (0, 8) == "holiday.")
if (it.first.substr (it.first.size () - 4) == "name") if (it.first.substr (it.first.size () - 4) == "name")
{ {
auto holName = context.config.get ("holiday." + it.first.substr (8, it.first.size () - 13) + ".name"); auto holName = Context::getContext ().config.get ("holiday." + it.first.substr (8, it.first.size () - 13) + ".name");
auto holDate = context.config.get ("holiday." + it.first.substr (8, it.first.size () - 13) + ".date"); auto holDate = Context::getContext ().config.get ("holiday." + it.first.substr (8, it.first.size () - 13) + ".date");
Datetime hDate (holDate.c_str (), context.config.get ("dateformat.holiday")); Datetime hDate (holDate.c_str (), Context::getContext ().config.get ("dateformat.holiday"));
if (date_after < hDate && hDate < date_before) if (date_after < hDate && hDate < date_before)
hm[hDate.toEpoch()].push_back (holName); hm[hDate.toEpoch()].push_back (holName);
} }
auto format = context.config.get ("report." + auto format = Context::getContext ().config.get ("report." +
context.config.get ("calendar.details.report") + Context::getContext ().config.get ("calendar.details.report") +
".dateformat"); ".dateformat");
if (format == "") if (format == "")
format = context.config.get ("dateformat.report"); format = Context::getContext ().config.get ("dateformat.report");
if (format == "") if (format == "")
format = context.config.get ("dateformat"); format = Context::getContext ().config.get ("dateformat");
for (auto& hm_it : hm) for (auto& hm_it : hm)
{ {
@@ -422,14 +420,14 @@ std::string CmdCalendar::renderMonths (
int monthsPerLine) int monthsPerLine)
{ {
// What day of the week does the user consider the first? // What day of the week does the user consider the first?
auto weekStart = Datetime::dayOfWeek (context.config.get ("weekstart")); auto weekStart = Datetime::dayOfWeek (Context::getContext ().config.get ("weekstart"));
if (weekStart != 0 && weekStart != 1) if (weekStart != 0 && weekStart != 1)
throw std::string ("The 'weekstart' configuration variable may only contain 'Sunday' or 'Monday'."); throw std::string ("The 'weekstart' configuration variable may only contain 'Sunday' or 'Monday'.");
// Build table for the number of months to be displayed. // Build table for the number of months to be displayed.
Table view; Table view;
setHeaderUnderline (view); setHeaderUnderline (view);
view.width (context.getWidth ()); view.width (Context::getContext ().getWidth ());
for (int i = 0 ; i < (monthsPerLine * 8); i += 8) for (int i = 0 ; i < (monthsPerLine * 8); i += 8)
{ {
if (weekStart == 1) if (weekStart == 1)
@@ -487,13 +485,13 @@ std::string CmdCalendar::renderMonths (
auto row = 0; auto row = 0;
Color color_today (context.config.get ("color.calendar.today")); Color color_today (Context::getContext ().config.get ("color.calendar.today"));
Color color_due (context.config.get ("color.calendar.due")); Color color_due (Context::getContext ().config.get ("color.calendar.due"));
Color color_duetoday (context.config.get ("color.calendar.due.today")); Color color_duetoday (Context::getContext ().config.get ("color.calendar.due.today"));
Color color_overdue (context.config.get ("color.calendar.overdue")); Color color_overdue (Context::getContext ().config.get ("color.calendar.overdue"));
Color color_weekend (context.config.get ("color.calendar.weekend")); Color color_weekend (Context::getContext ().config.get ("color.calendar.weekend"));
Color color_holiday (context.config.get ("color.calendar.holiday")); Color color_holiday (Context::getContext ().config.get ("color.calendar.holiday"));
Color color_weeknumber (context.config.get ("color.calendar.weeknumber")); Color color_weeknumber (Context::getContext ().config.get ("color.calendar.weeknumber"));
// Loop through months to be added on this line. // Loop through months to be added on this line.
for (int mpl = 0; mpl < monthsPerLine ; mpl++) for (int mpl = 0; mpl < monthsPerLine ; mpl++)
@@ -509,7 +507,7 @@ std::string CmdCalendar::renderMonths (
auto dow = temp.dayOfWeek (); auto dow = temp.dayOfWeek ();
auto woy = temp.week (); auto woy = temp.week ();
if (context.config.getBoolean ("displayweeknumber")) if (Context::getContext ().config.getBoolean ("displayweeknumber"))
view.set (row, view.set (row,
(8 * mpl), (8 * mpl),
// Make sure the week number is always 4 columns, space-padded. // Make sure the week number is always 4 columns, space-padded.
@@ -526,7 +524,7 @@ std::string CmdCalendar::renderMonths (
view.set (row, thisCol, d); view.set (row, thisCol, d);
if (context.color ()) if (Context::getContext ().color ())
{ {
Color cellColor; Color cellColor;
@@ -535,14 +533,14 @@ std::string CmdCalendar::renderMonths (
cellColor.blend (color_weekend); cellColor.blend (color_weekend);
// colorize holidays // colorize holidays
if (context.config.get ("calendar.holidays") != "none") if (Context::getContext ().config.get ("calendar.holidays") != "none")
{ {
for (auto& hol : context.config) for (auto& hol : Context::getContext ().config)
if (hol.first.substr (0, 8) == "holiday.") if (hol.first.substr (0, 8) == "holiday.")
if (hol.first.substr (hol.first.size () - 4) == "date") if (hol.first.substr (hol.first.size () - 4) == "date")
{ {
std::string value = hol.second; std::string value = hol.second;
Datetime holDate (value.c_str (), context.config.get ("dateformat.holiday")); Datetime holDate (value.c_str (), Context::getContext ().config.get ("dateformat.holiday"));
if (holDate.day () == d && if (holDate.day () == d &&
holDate.month () == months[mpl] && holDate.month () == months[mpl] &&
holDate.year () == years[mpl]) holDate.year () == years[mpl])
@@ -557,9 +555,9 @@ std::string CmdCalendar::renderMonths (
cellColor.blend (color_today); cellColor.blend (color_today);
// colorize due tasks // colorize due tasks
if (context.config.get ("calendar.details") != "none") if (Context::getContext ().config.get ("calendar.details") != "none")
{ {
context.config.set ("due", 0); Context::getContext ().config.set ("due", 0);
for (auto& task : all) for (auto& task : all)
{ {
if (task.getStatus () == Task::pending && if (task.getStatus () == Task::pending &&

View File

@@ -34,8 +34,6 @@
#include <format.h> #include <format.h>
#include <shared.h> #include <shared.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdColor::CmdColor () CmdColor::CmdColor ()
{ {
@@ -59,13 +57,13 @@ int CmdColor::execute (std::string& output)
// Get the non-attribute, non-fancy command line arguments. // Get the non-attribute, non-fancy command line arguments.
auto legend = false; auto legend = false;
auto words = context.cli2.getWords (); auto words = Context::getContext ().cli2.getWords ();
for (auto& word : words) for (auto& word : words)
if (closeEnough ("legend", word)) if (closeEnough ("legend", word))
legend = true; legend = true;
std::stringstream out; std::stringstream out;
if (context.color ()) if (Context::getContext ().color ())
{ {
// If the description contains 'legend', show all the colors currently in // If the description contains 'legend', show all the colors currently in
// use. // use.
@@ -74,13 +72,13 @@ int CmdColor::execute (std::string& output)
out << "\nHere are the colors currently in use:\n"; out << "\nHere are the colors currently in use:\n";
Table view; Table view;
view.width (context.getWidth ()); view.width (Context::getContext ().getWidth ());
if (context.config.getBoolean ("color")) if (Context::getContext ().config.getBoolean ("color"))
view.forceColor (); view.forceColor ();
view.add ("Color"); view.add ("Color");
view.add ("Definition"); view.add ("Definition");
for (auto& item : context.config) for (auto& item : Context::getContext ().config)
{ {
// Skip items with 'color' in their name, that are not referring to // Skip items with 'color' in their name, that are not referring to
// actual colors. // actual colors.
@@ -88,7 +86,7 @@ int CmdColor::execute (std::string& output)
item.first != "color" && item.first != "color" &&
item.first.find ("color") == 0) item.first.find ("color") == 0)
{ {
Color color (context.config.get (item.first)); Color color (Context::getContext ().config.get (item.first));
int row = view.addRow (); int row = view.addRow ();
view.set (row, 0, item.first, color); view.set (row, 0, item.first, color);
view.set (row, 1, item.second, color); view.set (row, 1, item.second, color);

View File

@@ -34,8 +34,6 @@
#include <util.h> #include <util.h>
#include <main.h> #include <main.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdColumns::CmdColumns () CmdColumns::CmdColumns ()
{ {
@@ -57,20 +55,20 @@ int CmdColumns::execute (std::string& output)
{ {
// Obtain the arguments from the description. That way, things like '--' // Obtain the arguments from the description. That way, things like '--'
// have already been handled. // have already been handled.
auto words = context.cli2.getWords (); auto words = Context::getContext ().cli2.getWords ();
if (words.size () > 1) if (words.size () > 1)
throw std::string ("You can only specify one search string."); throw std::string ("You can only specify one search string.");
// Include all columns in the table. // Include all columns in the table.
std::vector <std::string> names; std::vector <std::string> names;
for (const auto& col : context.columns) for (const auto& col : Context::getContext ().columns)
names.push_back (col.first); names.push_back (col.first);
std::sort (names.begin (), names.end ()); std::sort (names.begin (), names.end ());
// Render a list of column names, formats and examples. // Render a list of column names, formats and examples.
Table formats; Table formats;
formats.width (context.getWidth ()); formats.width (Context::getContext ().getWidth ());
formats.add ("Columns"); formats.add ("Columns");
formats.add ("Type"); formats.add ("Type");
formats.add ("Modifiable"); formats.add ("Modifiable");
@@ -83,15 +81,15 @@ int CmdColumns::execute (std::string& output)
if (words.size () == 0 || if (words.size () == 0 ||
find (name, words[0], false) != std::string::npos) find (name, words[0], false) != std::string::npos)
{ {
auto styles = context.columns[name]->styles (); auto styles = Context::getContext ().columns[name]->styles ();
auto examples = context.columns[name]->examples (); auto examples = Context::getContext ().columns[name]->examples ();
for (unsigned int i = 0; i < styles.size (); ++i) for (unsigned int i = 0; i < styles.size (); ++i)
{ {
auto row = formats.addRow (); auto row = formats.addRow ();
formats.set (row, 0, i == 0 ? name : ""); formats.set (row, 0, i == 0 ? name : "");
formats.set (row, 1, i == 0 ? context.columns[name]->type () : ""); formats.set (row, 1, i == 0 ? Context::getContext ().columns[name]->type () : "");
formats.set (row, 2, i == 0 ? (context.columns[name]->modifiable () ? "Modifiable" : "Read Only") : ""); formats.set (row, 2, i == 0 ? (Context::getContext ().columns[name]->modifiable () ? "Modifiable" : "Read Only") : "");
formats.set (row, 3, styles[i] + (i == 0 ? "*" : "")); formats.set (row, 3, styles[i] + (i == 0 ? "*" : ""));
formats.set (row, 4, i < examples.size () ? examples[i] : ""); formats.set (row, 4, i < examples.size () ? examples[i] : "");
} }
@@ -137,7 +135,7 @@ int CmdCompletionColumns::execute (std::string& output)
{ {
// Include all columns. // Include all columns.
std::vector <std::string> names; std::vector <std::string> names;
for (const auto& col : context.columns) for (const auto& col : Context::getContext ().columns)
names.push_back (col.first); names.push_back (col.first);
std::sort (names.begin (), names.end ()); std::sort (names.begin (), names.end ());

View File

@@ -34,8 +34,6 @@
#include <Command.h> #include <Command.h>
#include <util.h> #include <util.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdCommands::CmdCommands () CmdCommands::CmdCommands ()
{ {
@@ -56,7 +54,7 @@ CmdCommands::CmdCommands ()
int CmdCommands::execute (std::string& output) int CmdCommands::execute (std::string& output)
{ {
Table view; Table view;
view.width (context.getWidth ()); view.width (Context::getContext ().getWidth ());
view.add ("Command"); view.add ("Command");
view.add ("Category"); view.add ("Category");
view.add ("R/W", false); view.add ("R/W", false);
@@ -67,12 +65,12 @@ int CmdCommands::execute (std::string& output)
view.add ("Mods", false); view.add ("Mods", false);
view.add ("Misc", false); view.add ("Misc", false);
view.add ("Description"); view.add ("Description");
view.leftMargin (context.config.getInteger ("indent.report")); view.leftMargin (Context::getContext ().config.getInteger ("indent.report"));
view.extraPadding (context.config.getInteger ("row.padding")); view.extraPadding (Context::getContext ().config.getInteger ("row.padding"));
view.intraPadding (context.config.getInteger ("column.padding")); view.intraPadding (Context::getContext ().config.getInteger ("column.padding"));
setHeaderUnderline (view); setHeaderUnderline (view);
for (auto& command : context.commands) for (auto& command : Context::getContext ().commands)
{ {
auto row = view.addRow (); auto row = view.addRow ();
view.set (row, 0, command.first); view.set (row, 0, command.first);
@@ -133,7 +131,7 @@ int CmdCompletionCommands::execute (std::string& output)
{ {
// Get a list of all commands. // Get a list of all commands.
std::vector <std::string> commands; std::vector <std::string> commands;
for (const auto& command : context.commands) for (const auto& command : Context::getContext ().commands)
commands.push_back (command.first); commands.push_back (command.first);
// Sort alphabetically. // Sort alphabetically.
@@ -199,7 +197,7 @@ int CmdZshCommands::execute (std::string& output)
// denominator alternative: a custom struct type. // denominator alternative: a custom struct type.
std::vector <ZshCommand> commands; std::vector <ZshCommand> commands;
for (auto& command : context.commands) for (auto& command : Context::getContext ().commands)
{ {
ZshCommand zshCommand {command.second->category (), ZshCommand zshCommand {command.second->category (),
command.first, command.first,

View File

@@ -33,8 +33,6 @@
#include <shared.h> #include <shared.h>
#include <format.h> #include <format.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdConfig::CmdConfig () CmdConfig::CmdConfig ()
{ {
@@ -59,7 +57,7 @@ bool CmdConfig::setConfigVariable (
{ {
// Read .taskrc (or equivalent) // Read .taskrc (or equivalent)
std::vector <std::string> contents; std::vector <std::string> contents;
File::read (context.config.file (), contents); File::read (Context::getContext ().config.file (), contents);
auto found = false; auto found = false;
auto change = false; auto change = false;
@@ -76,7 +74,7 @@ bool CmdConfig::setConfigVariable (
{ {
found = true; found = true;
if (!confirmation || if (!confirmation ||
confirm (format ("Are you sure you want to change the value of '{1}' from '{2}' to '{3}'?", name, context.config.get (name), value))) confirm (format ("Are you sure you want to change the value of '{1}' from '{2}' to '{3}'?", name, Context::getContext ().config.get (name), value)))
{ {
line = name + '=' + json::encode (value); line = name + '=' + json::encode (value);
@@ -98,7 +96,7 @@ bool CmdConfig::setConfigVariable (
} }
if (change) if (change)
File::write (context.config.file (), contents); File::write (Context::getContext ().config.file (), contents);
return change; return change;
} }
@@ -108,7 +106,7 @@ int CmdConfig::unsetConfigVariable (const std::string& name, bool confirmation /
{ {
// Read .taskrc (or equivalent) // Read .taskrc (or equivalent)
std::vector <std::string> contents; std::vector <std::string> contents;
File::read (context.config.file (), contents); File::read (Context::getContext ().config.file (), contents);
auto found = false; auto found = false;
auto change = false; auto change = false;
@@ -143,7 +141,7 @@ int CmdConfig::unsetConfigVariable (const std::string& name, bool confirmation /
} }
if (change) if (change)
File::write (context.config.file (), contents); File::write (Context::getContext ().config.file (), contents);
if (change && found) if (change && found)
return 0; return 0;
@@ -160,7 +158,7 @@ int CmdConfig::execute (std::string& output)
std::stringstream out; std::stringstream out;
// Get the non-attribute, non-fancy command line arguments. // Get the non-attribute, non-fancy command line arguments.
std::vector <std::string> words = context.cli2.getWords (); std::vector <std::string> words = Context::getContext ().cli2.getWords ();
// Support: // Support:
// task config name value # set name to value // task config name value # set name to value
@@ -168,7 +166,7 @@ int CmdConfig::execute (std::string& output)
// task config name # remove name // task config name # remove name
if (words.size ()) if (words.size ())
{ {
auto confirmation = context.config.getBoolean ("confirmation"); auto confirmation = Context::getContext ().config.getBoolean ("confirmation");
auto found = false; auto found = false;
auto name = words[0]; auto name = words[0];
@@ -214,7 +212,7 @@ int CmdConfig::execute (std::string& output)
// Show feedback depending on whether .taskrc has been rewritten // Show feedback depending on whether .taskrc has been rewritten
if (change) if (change)
{ {
out << format ("Config file {1} modified.", context.config.file ()) out << format ("Config file {1} modified.", Context::getContext ().config.file ())
<< '\n'; << '\n';
} }
else else
@@ -250,7 +248,7 @@ CmdCompletionConfig::CmdCompletionConfig ()
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int CmdCompletionConfig::execute (std::string& output) int CmdCompletionConfig::execute (std::string& output)
{ {
auto configs = context.config.all (); auto configs = Context::getContext ().config.all ();
std::sort (configs.begin (), configs.end ()); std::sort (configs.begin (), configs.end ());
for (const auto& config : configs) for (const auto& config : configs)

View File

@@ -36,8 +36,6 @@
#include <shared.h> #include <shared.h>
#include <util.h> #include <util.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdContext::CmdContext () CmdContext::CmdContext ()
{ {
@@ -60,7 +58,7 @@ int CmdContext::execute (std::string& output)
std::stringstream out; std::stringstream out;
// Get the non-attribute, non-fancy command line arguments. // Get the non-attribute, non-fancy command line arguments.
auto words = context.cli2.getWords (); auto words = Context::getContext ().cli2.getWords ();
if (words.size () > 0) if (words.size () > 0)
{ {
auto subcommand = words[0]; auto subcommand = words[0];
@@ -110,7 +108,7 @@ std::vector <std::string> CmdContext::getContexts ()
{ {
std::vector <std::string> contexts; std::vector <std::string> contexts;
for (auto& name : context.config) for (auto& name : Context::getContext ().config)
if (name.first.substr (0, 8) == "context.") if (name.first.substr (0, 8) == "context.")
contexts.push_back (name.first.substr (8)); contexts.push_back (name.first.substr (8));
@@ -129,7 +127,7 @@ std::vector <std::string> CmdContext::getContexts ()
// //
void CmdContext::defineContext (const std::vector <std::string>& words, std::stringstream& out) void CmdContext::defineContext (const std::vector <std::string>& words, std::stringstream& out)
{ {
auto confirmation = context.config.getBoolean ("confirmation"); auto confirmation = Context::getContext ().config.getBoolean ("confirmation");
if (words.size () > 2) if (words.size () > 2)
{ {
@@ -145,12 +143,12 @@ void CmdContext::defineContext (const std::vector <std::string>& words, std::str
// Check if the value is a proper filter by filtering current pending.data // Check if the value is a proper filter by filtering current pending.data
Filter filter; Filter filter;
std::vector <Task> filtered; std::vector <Task> filtered;
auto pending = context.tdb2.pending.get_tasks (); auto pending = Context::getContext ().tdb2.pending.get_tasks ();
try try
{ {
// This result is not used, and is just to check validity. // This result is not used, and is just to check validity.
context.cli2.addFilter (value); Context::getContext ().cli2.addFilter (value);
filter.subset (pending, filtered); filter.subset (pending, filtered);
} }
catch (std::string exception) catch (std::string exception)
@@ -193,11 +191,11 @@ void CmdContext::deleteContext (const std::vector <std::string>& words, std::str
// Delete the specified context // Delete the specified context
auto name = "context." + words[1]; auto name = "context." + words[1];
auto confirmation = context.config.getBoolean ("confirmation"); auto confirmation = Context::getContext ().config.getBoolean ("confirmation");
auto rc = CmdConfig::unsetConfigVariable(name, confirmation); auto rc = CmdConfig::unsetConfigVariable(name, confirmation);
// If the currently set context was deleted, unset it // If the currently set context was deleted, unset it
if (context.config.get ("context") == words[1]) if (Context::getContext ().config.get ("context") == words[1])
CmdConfig::unsetConfigVariable("context", false); CmdConfig::unsetConfigVariable("context", false);
// Output feedback // Output feedback
@@ -226,13 +224,13 @@ void CmdContext::listContexts (std::stringstream& out)
std::sort (contexts.begin (), contexts.end ()); std::sort (contexts.begin (), contexts.end ());
Table table; Table table;
table.width (context.getWidth ()); table.width (Context::getContext ().getWidth ());
table.add ("Name"); table.add ("Name");
table.add ("Definition"); table.add ("Definition");
table.add ("Active"); table.add ("Active");
setHeaderUnderline (table); setHeaderUnderline (table);
std::string activeContext = context.config.get ("context"); std::string activeContext = Context::getContext ().config.get ("context");
for (auto& userContext : contexts) for (auto& userContext : contexts)
{ {
@@ -242,7 +240,7 @@ void CmdContext::listContexts (std::stringstream& out)
int row = table.addRow (); int row = table.addRow ();
table.set (row, 0, userContext); table.set (row, 0, userContext);
table.set (row, 1, context.config.get ("context." + userContext)); table.set (row, 1, Context::getContext ().config.get ("context." + userContext));
table.set (row, 2, active); table.set (row, 2, active);
} }
@@ -294,13 +292,13 @@ void CmdContext::setContext (const std::vector <std::string>& words, std::string
// //
void CmdContext::showContext (std::stringstream& out) void CmdContext::showContext (std::stringstream& out)
{ {
auto currentContext = context.config.get ("context"); auto currentContext = Context::getContext ().config.get ("context");
if (currentContext == "") if (currentContext == "")
out << "No context is currently applied.\n"; out << "No context is currently applied.\n";
else else
{ {
std::string currentFilter = context.config.get ("context." + currentContext); std::string currentFilter = Context::getContext ().config.get ("context." + currentContext);
out << format ("Context '{1}' with filter '{2}' is currently applied.\n", currentContext, currentFilter); out << format ("Context '{1}' with filter '{2}' is currently applied.\n", currentContext, currentFilter);
} }
} }

View File

@@ -40,8 +40,6 @@
#include <util.h> #include <util.h>
#include <main.h> #include <main.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdCustom::CmdCustom ( CmdCustom::CmdCustom (
const std::string& keyword, const std::string& keyword,
@@ -67,10 +65,10 @@ int CmdCustom::execute (std::string& output)
auto rc = 0; auto rc = 0;
// Load report configuration. // Load report configuration.
auto reportColumns = context.config.get ("report." + _keyword + ".columns"); auto reportColumns = Context::getContext ().config.get ("report." + _keyword + ".columns");
auto reportLabels = context.config.get ("report." + _keyword + ".labels"); auto reportLabels = Context::getContext ().config.get ("report." + _keyword + ".labels");
auto reportSort = context.config.get ("report." + _keyword + ".sort"); auto reportSort = Context::getContext ().config.get ("report." + _keyword + ".sort");
auto reportFilter = context.config.get ("report." + _keyword + ".filter"); auto reportFilter = Context::getContext ().config.get ("report." + _keyword + ".filter");
auto columns = split (reportColumns, ','); auto columns = split (reportColumns, ',');
validateReportColumns (columns); validateReportColumns (columns);
@@ -87,7 +85,7 @@ int CmdCustom::execute (std::string& output)
// Add the report filter to any existing filter. // Add the report filter to any existing filter.
if (reportFilter != "") if (reportFilter != "")
context.cli2.addFilter (reportFilter); Context::getContext ().cli2.addFilter (reportFilter);
// Apply filter. // Apply filter.
handleUntil (); handleUntil ();
@@ -101,10 +99,10 @@ int CmdCustom::execute (std::string& output)
sortOrder[0] == "none") sortOrder[0] == "none")
{ {
// Assemble a sequence vector that represents the tasks listed in // Assemble a sequence vector that represents the tasks listed in
// context.cli2._uuid_ranges, in the order in which they appear. This // Context::getContext ().cli2._uuid_ranges, in the order in which they appear. This
// equates to no sorting, just a specified order. // equates to no sorting, just a specified order.
sortOrder.clear (); sortOrder.clear ();
for (auto& i : context.cli2._uuid_list) for (auto& i : Context::getContext ().cli2._uuid_list)
for (unsigned int t = 0; t < filtered.size (); ++t) for (unsigned int t = 0; t < filtered.size (); ++t)
if (filtered[t].get ("uuid") == i) if (filtered[t].get ("uuid") == i)
sequence.push_back (t); sequence.push_back (t);
@@ -123,21 +121,21 @@ int CmdCustom::execute (std::string& output)
// Configure the view. // Configure the view.
ViewTask view; ViewTask view;
view.width (context.getWidth ()); view.width (Context::getContext ().getWidth ());
view.leftMargin (context.config.getInteger ("indent.report")); view.leftMargin (Context::getContext ().config.getInteger ("indent.report"));
view.extraPadding (context.config.getInteger ("row.padding")); view.extraPadding (Context::getContext ().config.getInteger ("row.padding"));
view.intraPadding (context.config.getInteger ("column.padding")); view.intraPadding (Context::getContext ().config.getInteger ("column.padding"));
if (context.color ()) if (Context::getContext ().color ())
{ {
Color label (context.config.get ("color.label")); Color label (Context::getContext ().config.get ("color.label"));
view.colorHeader (label); view.colorHeader (label);
Color label_sort (context.config.get ("color.label.sort")); Color label_sort (Context::getContext ().config.get ("color.label.sort"));
view.colorSortHeader (label_sort); view.colorSortHeader (label_sort);
// If an alternating row color is specified, notify the table. // If an alternating row color is specified, notify the table.
Color alternate (context.config.get ("color.alternate")); Color alternate (Context::getContext ().config.get ("color.alternate"));
if (alternate.nontrivial ()) if (alternate.nontrivial ())
{ {
view.colorOdd (alternate); view.colorOdd (alternate);
@@ -154,7 +152,7 @@ int CmdCustom::execute (std::string& output)
std::string name; std::string name;
bool ascending; bool ascending;
bool breakIndicator; bool breakIndicator;
context.decomposeSortField (so, name, ascending, breakIndicator); Context::getContext ().decomposeSortField (so, name, ascending, breakIndicator);
if (breakIndicator) if (breakIndicator)
view.addBreak (name); view.addBreak (name);
@@ -178,9 +176,9 @@ int CmdCustom::execute (std::string& output)
// How many lines taken up by table header? // How many lines taken up by table header?
int table_header = 0; int table_header = 0;
if (context.verbose ("label")) if (Context::getContext ().verbose ("label"))
{ {
if (context.color () && context.config.getBoolean ("fontunderline")) if (Context::getContext ().color () && Context::getContext ().config.getBoolean ("fontunderline"))
table_header = 1; // Underlining doesn't use extra line. table_header = 1; // Underlining doesn't use extra line.
else else
table_header = 2; // Dashes use an extra line. table_header = 2; // Dashes use an extra line.
@@ -189,15 +187,15 @@ int CmdCustom::execute (std::string& output)
// Report output can be limited by rows or lines. // Report output can be limited by rows or lines.
auto maxrows = 0; auto maxrows = 0;
auto maxlines = 0; auto maxlines = 0;
context.getLimits (maxrows, maxlines); Context::getContext ().getLimits (maxrows, maxlines);
// Adjust for fluff in the output. // Adjust for fluff in the output.
if (maxlines) if (maxlines)
maxlines -= table_header maxlines -= table_header
+ (context.verbose ("blank") ? 1 : 0) + (Context::getContext ().verbose ("blank") ? 1 : 0)
+ (context.verbose ("footnote") ? context.footnotes.size () : 0) + (Context::getContext ().verbose ("footnote") ? Context::getContext ().footnotes.size () : 0)
+ (context.verbose ("affected") ? 1 : 0) + (Context::getContext ().verbose ("affected") ? 1 : 0)
+ context.config.getInteger ("reserved.lines"); // For prompt, etc. + Context::getContext ().config.getInteger ("reserved.lines"); // For prompt, etc.
// Render. // Render.
std::stringstream out; std::stringstream out;
@@ -211,7 +209,7 @@ int CmdCustom::execute (std::string& output)
<< optionalBlankLine (); << optionalBlankLine ();
// Print the number of rendered tasks // Print the number of rendered tasks
if (context.verbose ("affected")) if (Context::getContext ().verbose ("affected"))
{ {
out << (filtered.size () == 1 out << (filtered.size () == 1
? "1 task" ? "1 task"
@@ -229,7 +227,7 @@ int CmdCustom::execute (std::string& output)
} }
else else
{ {
context.footnote ("No matches."); Context::getContext ().footnote ("No matches.");
rc = 1; rc = 1;
} }

View File

@@ -36,8 +36,6 @@
#define STRING_CMD_DELETE_TASK_R "Deleting recurring task {1} '{2}'." #define STRING_CMD_DELETE_TASK_R "Deleting recurring task {1} '{2}'."
#define STRING_CMD_DELETE_CONFIRM_R "This is a recurring task. Do you want to delete all pending recurrences of this same task?" #define STRING_CMD_DELETE_CONFIRM_R "This is a recurring task. Do you want to delete all pending recurrences of this same task?"
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdDelete::CmdDelete () CmdDelete::CmdDelete ()
{ {
@@ -67,7 +65,7 @@ int CmdDelete::execute (std::string&)
filter.subset (filtered); filter.subset (filtered);
if (filtered.size () == 0) if (filtered.size () == 0)
{ {
context.footnote ("No tasks specified."); Context::getContext ().footnote ("No tasks specified.");
return 1; return 1;
} }
@@ -95,21 +93,21 @@ int CmdDelete::execute (std::string&)
{ {
updateRecurrenceMask (task); updateRecurrenceMask (task);
++count; ++count;
context.tdb2.modify (task); Context::getContext ().tdb2.modify (task);
feedback_affected ("Deleting task {1} '{2}'.", task); feedback_affected ("Deleting task {1} '{2}'.", task);
feedback_unblocked (task); feedback_unblocked (task);
dependencyChainOnComplete (task); dependencyChainOnComplete (task);
if (context.verbose ("project")) if (Context::getContext ().verbose ("project"))
projectChanges[task.get ("project")] = onProjectChange (task); projectChanges[task.get ("project")] = onProjectChange (task);
// Delete siblings. // Delete siblings.
if (task.has ("parent")) if (task.has ("parent"))
{ {
if ((context.config.get ("recurrence.confirmation") == "prompt" if ((Context::getContext ().config.get ("recurrence.confirmation") == "prompt"
&& confirm (STRING_CMD_DELETE_CONFIRM_R)) || && confirm (STRING_CMD_DELETE_CONFIRM_R)) ||
context.config.getBoolean ("recurrence.confirmation")) Context::getContext ().config.getBoolean ("recurrence.confirmation"))
{ {
std::vector <Task> siblings = context.tdb2.siblings (task); std::vector <Task> siblings = Context::getContext ().tdb2.siblings (task);
for (auto& sibling : siblings) for (auto& sibling : siblings)
{ {
sibling.modify (Task::modAnnotate); sibling.modify (Task::modAnnotate);
@@ -118,7 +116,7 @@ int CmdDelete::execute (std::string&)
sibling.setAsNow ("end"); sibling.setAsNow ("end");
updateRecurrenceMask (sibling); updateRecurrenceMask (sibling);
context.tdb2.modify (sibling); Context::getContext ().tdb2.modify (sibling);
feedback_affected (STRING_CMD_DELETE_TASK_R, sibling); feedback_affected (STRING_CMD_DELETE_TASK_R, sibling);
feedback_unblocked (sibling); feedback_unblocked (sibling);
++count; ++count;
@@ -126,21 +124,21 @@ int CmdDelete::execute (std::string&)
// Delete the parent // Delete the parent
Task parent; Task parent;
context.tdb2.get (task.get ("parent"), parent); Context::getContext ().tdb2.get (task.get ("parent"), parent);
parent.setStatus (Task::deleted); parent.setStatus (Task::deleted);
if (! parent.has ("end")) if (! parent.has ("end"))
parent.setAsNow ("end"); parent.setAsNow ("end");
context.tdb2.modify (parent); Context::getContext ().tdb2.modify (parent);
} }
} }
// Task potentially has child tasks - optionally delete them. // Task potentially has child tasks - optionally delete them.
else else
{ {
std::vector <Task> children = context.tdb2.children (task); std::vector <Task> children = Context::getContext ().tdb2.children (task);
if (children.size () && if (children.size () &&
(context.config.getBoolean ("recurrence.confirmation") || (Context::getContext ().config.getBoolean ("recurrence.confirmation") ||
confirm (STRING_CMD_DELETE_CONFIRM_R))) confirm (STRING_CMD_DELETE_CONFIRM_R)))
{ {
for (auto& child : children) for (auto& child : children)
@@ -151,7 +149,7 @@ int CmdDelete::execute (std::string&)
child.setAsNow ("end"); child.setAsNow ("end");
updateRecurrenceMask (child); updateRecurrenceMask (child);
context.tdb2.modify (child); Context::getContext ().tdb2.modify (child);
feedback_affected (STRING_CMD_DELETE_TASK_R, child); feedback_affected (STRING_CMD_DELETE_TASK_R, child);
feedback_unblocked (child); feedback_unblocked (child);
++count; ++count;
@@ -180,7 +178,7 @@ int CmdDelete::execute (std::string&)
// Now list the project changes. // Now list the project changes.
for (const auto& change : projectChanges) for (const auto& change : projectChanges)
if (change.first != "") if (change.first != "")
context.footnote (change.second); Context::getContext ().footnote (change.second);
feedback_affected (count == 1 ? "Deleted {1} task." : "Deleted {1} tasks.", count); feedback_affected (count == 1 ? "Deleted {1} task." : "Deleted {1} tasks.", count);

View File

@@ -38,8 +38,6 @@
#define STRING_CMD_DENO_1 "Denotated {1} task." #define STRING_CMD_DENO_1 "Denotated {1} task."
#define STRING_CMD_DENO_N "Denotated {1} tasks." #define STRING_CMD_DENO_N "Denotated {1} tasks."
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdDenotate::CmdDenotate () CmdDenotate::CmdDenotate ()
{ {
@@ -61,7 +59,7 @@ int CmdDenotate::execute (std::string&)
{ {
auto rc = 0; auto rc = 0;
auto count = 0; auto count = 0;
auto sensitive = context.config.getBoolean ("search.case.sensitive"); auto sensitive = Context::getContext ().config.getBoolean ("search.case.sensitive");
// Apply filter. // Apply filter.
Filter filter; Filter filter;
@@ -69,13 +67,13 @@ int CmdDenotate::execute (std::string&)
filter.subset (filtered); filter.subset (filtered);
if (filtered.size () == 0) if (filtered.size () == 0)
{ {
context.footnote ("No tasks specified."); Context::getContext ().footnote ("No tasks specified.");
return 1; return 1;
} }
// Extract all the ORIGINAL MODIFICATION args as simple text patterns. // Extract all the ORIGINAL MODIFICATION args as simple text patterns.
std::string pattern = ""; std::string pattern = "";
for (auto& a : context.cli2._args) for (auto& a : Context::getContext ().cli2._args)
{ {
if (a.hasTag ("MISCELLANEOUS")) if (a.hasTag ("MISCELLANEOUS"))
{ {
@@ -136,9 +134,9 @@ int CmdDenotate::execute (std::string&)
if (permission (taskDifferences (before, task) + question, filtered.size ())) if (permission (taskDifferences (before, task) + question, filtered.size ()))
{ {
++count; ++count;
context.tdb2.modify (task); Context::getContext ().tdb2.modify (task);
feedback_affected (format ("Found annotation '{1}' and deleted it.", anno)); feedback_affected (format ("Found annotation '{1}' and deleted it.", anno));
if (context.verbose ("project")) if (Context::getContext ().verbose ("project"))
projectChanges[task.get ("project")] = onProjectChange (task, false); projectChanges[task.get ("project")] = onProjectChange (task, false);
} }
else else
@@ -159,7 +157,7 @@ int CmdDenotate::execute (std::string&)
// Now list the project changes. // Now list the project changes.
for (const auto& change : projectChanges) for (const auto& change : projectChanges)
if (change.first != "") if (change.first != "")
context.footnote (change.second); Context::getContext ().footnote (change.second);
feedback_affected (count == 1 ? STRING_CMD_DENO_1 : STRING_CMD_DENO_N, count); feedback_affected (count == 1 ? STRING_CMD_DENO_1 : STRING_CMD_DENO_N, count);
return rc; return rc;

View File

@@ -43,8 +43,6 @@
#include <gnutls/gnutls.h> #include <gnutls/gnutls.h>
#endif #endif
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdDiagnostics::CmdDiagnostics () CmdDiagnostics::CmdDiagnostics ()
{ {
@@ -69,7 +67,7 @@ CmdDiagnostics::CmdDiagnostics ()
int CmdDiagnostics::execute (std::string& output) int CmdDiagnostics::execute (std::string& output)
{ {
Color bold; Color bold;
if (context.color ()) if (Context::getContext ().color ())
bold = Color ("bold"); bold = Color ("bold");
std::stringstream out; std::stringstream out;
@@ -160,7 +158,7 @@ int CmdDiagnostics::execute (std::string& output)
<< "\n\n"; << "\n\n";
// Config: .taskrc found, readable, writable // Config: .taskrc found, readable, writable
File rcFile (context.config.file ()); File rcFile (Context::getContext ().config.file ());
out << bold.colorize ("Configuration") out << bold.colorize ("Configuration")
<< '\n' << '\n'
<< " File: " << rcFile._data << ' ' << " File: " << rcFile._data << ' '
@@ -174,7 +172,7 @@ int CmdDiagnostics::execute (std::string& output)
<< '\n'; << '\n';
// Config: data.location found, readable, writable // Config: data.location found, readable, writable
File location (context.config.get ("data.location")); File location (Context::getContext ().config.get ("data.location"));
out << " Data: " << location._data << ' ' out << " Data: " << location._data << ' '
<< (location.exists () << (location.exists ()
? "(found)" ? "(found)"
@@ -198,31 +196,31 @@ int CmdDiagnostics::execute (std::string& output)
<< '\n'; << '\n';
out << " Locking: " out << " Locking: "
<< (context.config.getBoolean ("locking") << (Context::getContext ().config.getBoolean ("locking")
? "Enabled" ? "Enabled"
: "Disabled") : "Disabled")
<< '\n'; << '\n';
out << " GC: " out << " GC: "
<< (context.config.getBoolean ("gc") << (Context::getContext ().config.getBoolean ("gc")
? "Enabled" ? "Enabled"
: "Disabled") : "Disabled")
<< '\n'; << '\n';
// Determine rc.editor/$EDITOR/$VISUAL. // Determine rc.editor/$EDITOR/$VISUAL.
char* peditor; char* peditor;
if (context.config.get ("editor") != "") if (Context::getContext ().config.get ("editor") != "")
out << " rc.editor: " << context.config.get ("editor") << '\n'; out << " rc.editor: " << Context::getContext ().config.get ("editor") << '\n';
else if ((peditor = getenv ("VISUAL")) != NULL) else if ((peditor = getenv ("VISUAL")) != NULL)
out << " $VISUAL: " << peditor << '\n'; out << " $VISUAL: " << peditor << '\n';
else if ((peditor = getenv ("EDITOR")) != NULL) else if ((peditor = getenv ("EDITOR")) != NULL)
out << " $EDITOR: " << peditor << '\n'; out << " $EDITOR: " << peditor << '\n';
out << " Server: " out << " Server: "
<< context.config.get ("taskd.server") << Context::getContext ().config.get ("taskd.server")
<< '\n'; << '\n';
auto ca_pem = context.config.get ("taskd.ca"); auto ca_pem = Context::getContext ().config.get ("taskd.ca");
out << " CA: "; out << " CA: ";
if (ca_pem != "") if (ca_pem != "")
{ {
@@ -238,7 +236,7 @@ int CmdDiagnostics::execute (std::string& output)
else else
out << "-\n"; out << "-\n";
auto cert_pem = context.config.get ("taskd.certificate"); auto cert_pem = Context::getContext ().config.get ("taskd.certificate");
out << "Certificate: "; out << "Certificate: ";
if (cert_pem != "") if (cert_pem != "")
{ {
@@ -254,7 +252,7 @@ int CmdDiagnostics::execute (std::string& output)
else else
out << "-\n"; out << "-\n";
auto key_pem = context.config.get ("taskd.key"); auto key_pem = Context::getContext ().config.get ("taskd.key");
out << " Key: "; out << " Key: ";
if (key_pem != "") if (key_pem != "")
{ {
@@ -270,7 +268,7 @@ int CmdDiagnostics::execute (std::string& output)
else else
out << "-\n"; out << "-\n";
auto trust_value = context.config.get ("taskd.trust"); auto trust_value = Context::getContext ().config.get ("taskd.trust");
if (trust_value == "strict" || if (trust_value == "strict" ||
trust_value == "ignore hostname" || trust_value == "ignore hostname" ||
trust_value == "allow all") trust_value == "allow all")
@@ -279,11 +277,11 @@ int CmdDiagnostics::execute (std::string& output)
out << " Trust: Bad value - see 'man taskrc'\n"; out << " Trust: Bad value - see 'man taskrc'\n";
out << " Ciphers: " out << " Ciphers: "
<< context.config.get ("taskd.ciphers") << Context::getContext ().config.get ("taskd.ciphers")
<< '\n'; << '\n';
// Get credentials, but mask out the key. // Get credentials, but mask out the key.
auto credentials = context.config.get ("taskd.credentials"); auto credentials = Context::getContext ().config.get ("taskd.credentials");
auto last_slash = credentials.rfind ('/'); auto last_slash = credentials.rfind ('/');
if (last_slash != std::string::npos) if (last_slash != std::string::npos)
credentials = credentials.substr (0, last_slash) credentials = credentials.substr (0, last_slash)
@@ -296,26 +294,26 @@ int CmdDiagnostics::execute (std::string& output)
// Display hook status. // Display hook status.
Path hookLocation; Path hookLocation;
if (context.config.has ("hooks.location")) if (Context::getContext ().config.has ("hooks.location"))
{ {
hookLocation = Path (context.config.get ("hooks.location")); hookLocation = Path (Context::getContext ().config.get ("hooks.location"));
} }
else else
{ {
hookLocation = Path (context.config.get ("data.location")); hookLocation = Path (Context::getContext ().config.get ("data.location"));
hookLocation += "hooks"; hookLocation += "hooks";
} }
out << bold.colorize ("Hooks") out << bold.colorize ("Hooks")
<< '\n' << '\n'
<< " System: " << " System: "
<< (context.config.getBoolean ("hooks") ? "Enabled" : "Disabled") << (Context::getContext ().config.getBoolean ("hooks") ? "Enabled" : "Disabled")
<< '\n' << '\n'
<< " Location: " << " Location: "
<< static_cast <std::string> (hookLocation) << static_cast <std::string> (hookLocation)
<< '\n'; << '\n';
auto hooks = context.hooks.list (); auto hooks = Context::getContext ().hooks.list ();
if (hooks.size ()) if (hooks.size ())
{ {
unsigned int longest = 0; unsigned int longest = 0;
@@ -397,13 +395,13 @@ int CmdDiagnostics::execute (std::string& output)
// Report terminal dimensions. // Report terminal dimensions.
out << " Terminal: " out << " Terminal: "
<< context.getWidth () << Context::getContext ().getWidth ()
<< 'x' << 'x'
<< context.getHeight () << Context::getContext ().getHeight ()
<< '\n'; << '\n';
// Scan tasks for duplicate UUIDs. // Scan tasks for duplicate UUIDs.
auto all = context.tdb2.all_tasks (); auto all = Context::getContext ().tdb2.all_tasks ();
std::map <std::string, int> seen; std::map <std::string, int> seen;
std::vector <std::string> dups; std::vector <std::string> dups;
std::string uuid; std::string uuid;
@@ -442,7 +440,7 @@ int CmdDiagnostics::execute (std::string& output)
// Check dependencies // Check dependencies
for (auto& uuid : task.getDependencyUUIDs ()) for (auto& uuid : task.getDependencyUUIDs ())
{ {
if (! context.tdb2.has (uuid)) if (! Context::getContext ().tdb2.has (uuid))
{ {
out << " " out << " "
<< format ("Task {1} depends on nonexistent task: {2}", task.get ("uuid"), uuid) << format ("Task {1} depends on nonexistent task: {2}", task.get ("uuid"), uuid)
@@ -454,7 +452,7 @@ int CmdDiagnostics::execute (std::string& output)
// Check recurrence parent // Check recurrence parent
auto parentUUID = task.get ("parent"); auto parentUUID = task.get ("parent");
if (parentUUID != "" && ! context.tdb2.has (parentUUID)) if (parentUUID != "" && ! Context::getContext ().tdb2.has (parentUUID))
{ {
out << " " out << " "
<< format ("Task {1} has nonexistent recurrence template {2}", task.get ("uuid"), parentUUID) << format ("Task {1} has nonexistent recurrence template {2}", task.get ("uuid"), parentUUID)

View File

@@ -33,8 +33,6 @@
#include <format.h> #include <format.h>
#include <main.h> #include <main.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdDone::CmdDone () CmdDone::CmdDone ()
{ {
@@ -63,7 +61,7 @@ int CmdDone::execute (std::string&)
filter.subset (filtered); filter.subset (filtered);
if (filtered.size () == 0) if (filtered.size () == 0)
{ {
context.footnote ("No tasks specified."); Context::getContext ().footnote ("No tasks specified.");
return 1; return 1;
} }
@@ -92,21 +90,21 @@ int CmdDone::execute (std::string&)
if (task.has ("start")) if (task.has ("start"))
{ {
task.remove ("start"); task.remove ("start");
if (context.config.getBoolean ("journal.time")) if (Context::getContext ().config.getBoolean ("journal.time"))
task.addAnnotation (context.config.get ("journal.time.stop.annotation")); task.addAnnotation (Context::getContext ().config.get ("journal.time.stop.annotation"));
} }
if (permission (taskDifferences (before, task) + question, filtered.size ())) if (permission (taskDifferences (before, task) + question, filtered.size ()))
{ {
updateRecurrenceMask (task); updateRecurrenceMask (task);
context.tdb2.modify (task); Context::getContext ().tdb2.modify (task);
++count; ++count;
feedback_affected ("Completed task {1} '{2}'.", task); feedback_affected ("Completed task {1} '{2}'.", task);
feedback_unblocked (task); feedback_unblocked (task);
if (!nagged) if (!nagged)
nagged = nag (task); nagged = nag (task);
dependencyChainOnComplete (task); dependencyChainOnComplete (task);
if (context.verbose ("project")) if (Context::getContext ().verbose ("project"))
projectChanges[task.get ("project")] = onProjectChange (task); projectChanges[task.get ("project")] = onProjectChange (task);
} }
else else
@@ -130,7 +128,7 @@ int CmdDone::execute (std::string&)
// Now list the project changes. // Now list the project changes.
for (const auto& change : projectChanges) for (const auto& change : projectChanges)
if (change.first != "") if (change.first != "")
context.footnote (change.second); Context::getContext ().footnote (change.second);
feedback_affected (count == 1 ? "Completed {1} task." : "Completed {1} tasks.", count); feedback_affected (count == 1 ? "Completed {1} task." : "Completed {1} tasks.", count);
return rc; return rc;

View File

@@ -33,8 +33,6 @@
#include <util.h> #include <util.h>
#include <main.h> #include <main.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdDuplicate::CmdDuplicate () CmdDuplicate::CmdDuplicate ()
{ {
@@ -63,7 +61,7 @@ int CmdDuplicate::execute (std::string&)
filter.subset (filtered); filter.subset (filtered);
if (filtered.size () == 0) if (filtered.size () == 0)
{ {
context.footnote ("No tasks specified."); Context::getContext ().footnote ("No tasks specified.");
return 1; return 1;
} }
@@ -109,21 +107,21 @@ int CmdDuplicate::execute (std::string&)
task.get ("description")), task.get ("description")),
filtered.size ())) filtered.size ()))
{ {
context.tdb2.add (dup); Context::getContext ().tdb2.add (dup);
++count; ++count;
feedback_affected ("Duplicated task {1} '{2}'.", task); feedback_affected ("Duplicated task {1} '{2}'.", task);
auto status = dup.getStatus (); auto status = dup.getStatus ();
if (context.verbose ("new-id") && if (Context::getContext ().verbose ("new-id") &&
(status == Task::pending || (status == Task::pending ||
status == Task::waiting)) status == Task::waiting))
std::cout << format ("Created task {1}.\n", dup.id); std::cout << format ("Created task {1}.\n", dup.id);
else if (context.verbose ("new-uuid") && else if (Context::getContext ().verbose ("new-uuid") &&
status != Task::recurring) status != Task::recurring)
std::cout << format ("Created task {1}.\n", dup.get ("uuid")); std::cout << format ("Created task {1}.\n", dup.get ("uuid"));
if (context.verbose ("project")) if (Context::getContext ().verbose ("project"))
projectChanges[task.get ("project")] = onProjectChange (task); projectChanges[task.get ("project")] = onProjectChange (task);
} }
else else
@@ -138,7 +136,7 @@ int CmdDuplicate::execute (std::string&)
// Now list the project changes. // Now list the project changes.
for (const auto& change : projectChanges) for (const auto& change : projectChanges)
if (change.first != "") if (change.first != "")
context.footnote (change.second); Context::getContext ().footnote (change.second);
feedback_affected (count == 1 ? "Duplicated {1} task." : "Duplicated {1} tasks.", count); feedback_affected (count == 1 ? "Duplicated {1} task." : "Duplicated {1} tasks.", count);

View File

@@ -51,8 +51,6 @@
#define STRING_EDIT_UNTIL_MOD "Until date modified." #define STRING_EDIT_UNTIL_MOD "Until date modified."
#define STRING_EDIT_WAIT_MOD "Wait date modified." #define STRING_EDIT_WAIT_MOD "Wait date modified."
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdEdit::CmdEdit () CmdEdit::CmdEdit ()
{ {
@@ -84,7 +82,7 @@ int CmdEdit::execute (std::string&)
if (! filtered.size ()) if (! filtered.size ())
{ {
context.footnote ("No matches."); Context::getContext ().footnote ("No matches.");
return 1; return 1;
} }
@@ -95,7 +93,7 @@ int CmdEdit::execute (std::string&)
if (result == CmdEdit::editResult::error) if (result == CmdEdit::editResult::error)
break; break;
else if (result == CmdEdit::editResult::changes) else if (result == CmdEdit::editResult::changes)
context.tdb2.modify (task); Context::getContext ().tdb2.modify (task);
} }
return 0; return 0;
@@ -201,7 +199,7 @@ std::string CmdEdit::formatDuration (
std::string CmdEdit::formatTask (Task task, const std::string& dateformat) std::string CmdEdit::formatTask (Task task, const std::string& dateformat)
{ {
std::stringstream before; std::stringstream before;
auto verbose = context.verbose ("edit"); auto verbose = Context::getContext ().verbose ("edit");
if (verbose) if (verbose)
before << "# The 'task <id> edit' command allows you to modify all aspects of a task\n" before << "# The 'task <id> edit' command allows you to modify all aspects of a task\n"
@@ -269,7 +267,7 @@ std::string CmdEdit::formatTask (Task task, const std::string& dateformat)
allDeps << ","; allDeps << ",";
Task t; Task t;
context.tdb2.get (dependencies[i], t); Context::getContext ().tdb2.get (dependencies[i], t);
if (t.getStatus () == Task::pending || if (t.getStatus () == Task::pending ||
t.getStatus () == Task::waiting) t.getStatus () == Task::waiting)
allDeps << t.id; allDeps << t.id;
@@ -284,8 +282,8 @@ std::string CmdEdit::formatTask (Task task, const std::string& dateformat)
// UDAs // UDAs
std::vector <std::string> udas; std::vector <std::string> udas;
for (auto& col : context.columns) for (auto& col : Context::getContext ().columns)
if (context.config.get ("uda." + col.first + ".type") != "") if (Context::getContext ().config.get ("uda." + col.first + ".type") != "")
udas.push_back (col.first); udas.push_back (col.first);
if (udas.size ()) if (udas.size ())
@@ -299,7 +297,7 @@ std::string CmdEdit::formatTask (Task task, const std::string& dateformat)
if (pad > 0) if (pad > 0)
padding = std::string (pad, ' '); padding = std::string (pad, ' ');
std::string type = context.config.get ("uda." + uda + ".type"); std::string type = Context::getContext ().config.get ("uda." + uda + ".type");
if (type == "string" || type == "numeric") if (type == "string" || type == "numeric")
before << " UDA " << uda << ": " << padding << task.get (uda) << '\n'; before << " UDA " << uda << ": " << padding << task.get (uda) << '\n';
else if (type == "date") else if (type == "date")
@@ -339,12 +337,12 @@ void CmdEdit::parseTask (Task& task, const std::string& after, const std::string
{ {
if (value != "") if (value != "")
{ {
context.footnote ("Project modified."); Context::getContext ().footnote ("Project modified.");
task.set ("project", value); task.set ("project", value);
} }
else else
{ {
context.footnote ("Project deleted."); Context::getContext ().footnote ("Project deleted.");
task.remove ("project"); task.remove ("project");
} }
} }
@@ -360,7 +358,7 @@ void CmdEdit::parseTask (Task& task, const std::string& after, const std::string
{ {
if (value != "") if (value != "")
{ {
context.footnote ("Description modified."); Context::getContext ().footnote ("Description modified.");
task.set ("description", value); task.set ("description", value);
} }
else else
@@ -373,7 +371,7 @@ void CmdEdit::parseTask (Task& task, const std::string& after, const std::string
{ {
if (value != formatDate (task, "entry", dateformat)) if (value != formatDate (task, "entry", dateformat))
{ {
context.footnote ("Creation date modified."); Context::getContext ().footnote ("Creation date modified.");
task.set ("entry", Datetime (value, dateformat).toEpochString ()); task.set ("entry", Datetime (value, dateformat).toEpochString ());
} }
} }
@@ -388,13 +386,13 @@ void CmdEdit::parseTask (Task& task, const std::string& after, const std::string
{ {
if (value != formatDate (task, "start", dateformat)) if (value != formatDate (task, "start", dateformat))
{ {
context.footnote (STRING_EDIT_START_MOD); Context::getContext ().footnote (STRING_EDIT_START_MOD);
task.set ("start", Datetime (value, dateformat).toEpochString ()); task.set ("start", Datetime (value, dateformat).toEpochString ());
} }
} }
else else
{ {
context.footnote (STRING_EDIT_START_MOD); Context::getContext ().footnote (STRING_EDIT_START_MOD);
task.set ("start", Datetime (value, dateformat).toEpochString ()); task.set ("start", Datetime (value, dateformat).toEpochString ());
} }
} }
@@ -402,7 +400,7 @@ void CmdEdit::parseTask (Task& task, const std::string& after, const std::string
{ {
if (task.get ("start") != "") if (task.get ("start") != "")
{ {
context.footnote ("Start date removed."); Context::getContext ().footnote ("Start date removed.");
task.remove ("start"); task.remove ("start");
} }
} }
@@ -415,7 +413,7 @@ void CmdEdit::parseTask (Task& task, const std::string& after, const std::string
{ {
if (value != formatDate (task, "end", dateformat)) if (value != formatDate (task, "end", dateformat))
{ {
context.footnote ("End date modified."); Context::getContext ().footnote ("End date modified.");
task.set ("end", Datetime (value, dateformat).toEpochString ()); task.set ("end", Datetime (value, dateformat).toEpochString ());
} }
} }
@@ -426,7 +424,7 @@ void CmdEdit::parseTask (Task& task, const std::string& after, const std::string
{ {
if (task.get ("end") != "") if (task.get ("end") != "")
{ {
context.footnote ("End date removed."); Context::getContext ().footnote ("End date removed.");
task.setStatus (Task::pending); task.setStatus (Task::pending);
task.remove ("end"); task.remove ("end");
} }
@@ -440,13 +438,13 @@ void CmdEdit::parseTask (Task& task, const std::string& after, const std::string
{ {
if (value != formatDate (task, "scheduled", dateformat)) if (value != formatDate (task, "scheduled", dateformat))
{ {
context.footnote (STRING_EDIT_SCHED_MOD); Context::getContext ().footnote (STRING_EDIT_SCHED_MOD);
task.set ("scheduled", Datetime (value, dateformat).toEpochString ()); task.set ("scheduled", Datetime (value, dateformat).toEpochString ());
} }
} }
else else
{ {
context.footnote (STRING_EDIT_SCHED_MOD); Context::getContext ().footnote (STRING_EDIT_SCHED_MOD);
task.set ("scheduled", Datetime (value, dateformat).toEpochString ()); task.set ("scheduled", Datetime (value, dateformat).toEpochString ());
} }
} }
@@ -454,7 +452,7 @@ void CmdEdit::parseTask (Task& task, const std::string& after, const std::string
{ {
if (task.get ("scheduled") != "") if (task.get ("scheduled") != "")
{ {
context.footnote ("Scheduled date removed."); Context::getContext ().footnote ("Scheduled date removed.");
task.remove ("scheduled"); task.remove ("scheduled");
} }
} }
@@ -467,13 +465,13 @@ void CmdEdit::parseTask (Task& task, const std::string& after, const std::string
{ {
if (value != formatDate (task, "due", dateformat)) if (value != formatDate (task, "due", dateformat))
{ {
context.footnote (STRING_EDIT_DUE_MOD); Context::getContext ().footnote (STRING_EDIT_DUE_MOD);
task.set ("due", Datetime (value, dateformat).toEpochString ()); task.set ("due", Datetime (value, dateformat).toEpochString ());
} }
} }
else else
{ {
context.footnote (STRING_EDIT_DUE_MOD); Context::getContext ().footnote (STRING_EDIT_DUE_MOD);
task.set ("due", Datetime (value, dateformat).toEpochString ()); task.set ("due", Datetime (value, dateformat).toEpochString ());
} }
} }
@@ -484,11 +482,11 @@ void CmdEdit::parseTask (Task& task, const std::string& after, const std::string
if (task.getStatus () == Task::recurring || if (task.getStatus () == Task::recurring ||
task.get ("parent") != "") task.get ("parent") != "")
{ {
context.footnote ("Cannot remove a due date from a recurring task."); Context::getContext ().footnote ("Cannot remove a due date from a recurring task.");
} }
else else
{ {
context.footnote ("Due date removed."); Context::getContext ().footnote ("Due date removed.");
task.remove ("due"); task.remove ("due");
} }
} }
@@ -502,13 +500,13 @@ void CmdEdit::parseTask (Task& task, const std::string& after, const std::string
{ {
if (value != formatDate (task, "until", dateformat)) if (value != formatDate (task, "until", dateformat))
{ {
context.footnote (STRING_EDIT_UNTIL_MOD); Context::getContext ().footnote (STRING_EDIT_UNTIL_MOD);
task.set ("until", Datetime (value, dateformat).toEpochString ()); task.set ("until", Datetime (value, dateformat).toEpochString ());
} }
} }
else else
{ {
context.footnote (STRING_EDIT_UNTIL_MOD); Context::getContext ().footnote (STRING_EDIT_UNTIL_MOD);
task.set ("until", Datetime (value, dateformat).toEpochString ()); task.set ("until", Datetime (value, dateformat).toEpochString ());
} }
} }
@@ -516,7 +514,7 @@ void CmdEdit::parseTask (Task& task, const std::string& after, const std::string
{ {
if (task.get ("until") != "") if (task.get ("until") != "")
{ {
context.footnote ("Until date removed."); Context::getContext ().footnote ("Until date removed.");
task.remove ("until"); task.remove ("until");
} }
} }
@@ -531,7 +529,7 @@ void CmdEdit::parseTask (Task& task, const std::string& after, const std::string
std::string::size_type idx = 0; std::string::size_type idx = 0;
if (p.parse (value, idx)) if (p.parse (value, idx))
{ {
context.footnote ("Recurrence modified."); Context::getContext ().footnote ("Recurrence modified.");
if (task.get ("due") != "") if (task.get ("due") != "")
{ {
task.set ("recur", value); task.set ("recur", value);
@@ -545,7 +543,7 @@ void CmdEdit::parseTask (Task& task, const std::string& after, const std::string
} }
else else
{ {
context.footnote ("Recurrence removed."); Context::getContext ().footnote ("Recurrence removed.");
task.setStatus (Task::pending); task.setStatus (Task::pending);
task.remove ("recur"); task.remove ("recur");
task.remove ("until"); task.remove ("until");
@@ -562,14 +560,14 @@ void CmdEdit::parseTask (Task& task, const std::string& after, const std::string
{ {
if (value != formatDate (task, "wait", dateformat)) if (value != formatDate (task, "wait", dateformat))
{ {
context.footnote (STRING_EDIT_WAIT_MOD); Context::getContext ().footnote (STRING_EDIT_WAIT_MOD);
task.set ("wait", Datetime (value, dateformat).toEpochString ()); task.set ("wait", Datetime (value, dateformat).toEpochString ());
task.setStatus (Task::waiting); task.setStatus (Task::waiting);
} }
} }
else else
{ {
context.footnote (STRING_EDIT_WAIT_MOD); Context::getContext ().footnote (STRING_EDIT_WAIT_MOD);
task.set ("wait", Datetime (value, dateformat).toEpochString ()); task.set ("wait", Datetime (value, dateformat).toEpochString ());
task.setStatus (Task::waiting); task.setStatus (Task::waiting);
} }
@@ -578,7 +576,7 @@ void CmdEdit::parseTask (Task& task, const std::string& after, const std::string
{ {
if (task.get ("wait") != "") if (task.get ("wait") != "")
{ {
context.footnote ("Wait date removed."); Context::getContext ().footnote ("Wait date removed.");
task.remove ("wait"); task.remove ("wait");
task.setStatus (Task::pending); task.setStatus (Task::pending);
} }
@@ -590,12 +588,12 @@ void CmdEdit::parseTask (Task& task, const std::string& after, const std::string
{ {
if (value != "") if (value != "")
{ {
context.footnote ("Parent UUID modified."); Context::getContext ().footnote ("Parent UUID modified.");
task.set ("parent", value); task.set ("parent", value);
} }
else else
{ {
context.footnote ("Parent UUID removed."); Context::getContext ().footnote ("Parent UUID removed.");
task.remove ("parent"); task.remove ("parent");
} }
} }
@@ -659,9 +657,9 @@ void CmdEdit::parseTask (Task& task, const std::string& after, const std::string
} }
// UDAs // UDAs
for (auto& col : context.columns) for (auto& col : Context::getContext ().columns)
{ {
auto type = context.config.get ("uda." + col.first + ".type"); auto type = Context::getContext ().config.get ("uda." + col.first + ".type");
if (type != "") if (type != "")
{ {
auto value = findValue (after, "\n UDA " + col.first + ":"); auto value = findValue (after, "\n UDA " + col.first + ":");
@@ -672,7 +670,7 @@ void CmdEdit::parseTask (Task& task, const std::string& after, const std::string
{ {
if (value != "") if (value != "")
{ {
context.footnote (format ("UDA {1} modified.", col.first)); Context::getContext ().footnote (format ("UDA {1} modified.", col.first));
if (type == "string") if (type == "string")
{ {
@@ -699,7 +697,7 @@ void CmdEdit::parseTask (Task& task, const std::string& after, const std::string
} }
else else
{ {
context.footnote (format ("UDA {1} deleted.", col.first)); Context::getContext ().footnote (format ("UDA {1} deleted.", col.first));
task.remove (col.first); task.remove (col.first);
} }
} }
@@ -727,7 +725,7 @@ void CmdEdit::parseTask (Task& task, const std::string& after, const std::string
CmdEdit::editResult CmdEdit::editFile (Task& task) CmdEdit::editResult CmdEdit::editFile (Task& task)
{ {
// Check for file permissions. // Check for file permissions.
Directory location (context.config.get ("data.location")); Directory location (Context::getContext ().config.get ("data.location"));
if (! location.writable ()) if (! location.writable ())
throw std::string ("Your data.location directory is not writable."); throw std::string ("Your data.location directory is not writable.");
@@ -738,9 +736,9 @@ CmdEdit::editResult CmdEdit::editFile (Task& task)
// Determine the output date format, which uses a hierarchy of definitions. // Determine the output date format, which uses a hierarchy of definitions.
// rc.dateformat.edit // rc.dateformat.edit
// rc.dateformat // rc.dateformat
auto dateformat = context.config.get ("dateformat.edit"); auto dateformat = Context::getContext ().config.get ("dateformat.edit");
if (dateformat == "") if (dateformat == "")
dateformat = context.config.get ("dateformat"); dateformat = Context::getContext ().config.get ("dateformat");
// Change directory for the editor // Change directory for the editor
auto current_dir = Directory::cwd (); auto current_dir = Directory::cwd ();
@@ -758,7 +756,7 @@ CmdEdit::editResult CmdEdit::editFile (Task& task)
File::write (file.str (), before); File::write (file.str (), before);
// Determine correct editor: .taskrc:editor > $VISUAL > $EDITOR > vi // Determine correct editor: .taskrc:editor > $VISUAL > $EDITOR > vi
auto editor = context.config.get ("editor"); auto editor = Context::getContext ().config.get ("editor");
char* peditor = getenv ("VISUAL"); char* peditor = getenv ("VISUAL");
if (editor == "" && peditor) editor = std::string (peditor); if (editor == "" && peditor) editor = std::string (peditor);
peditor = getenv ("EDITOR"); peditor = getenv ("EDITOR");

View File

@@ -30,8 +30,6 @@
#include <Context.h> #include <Context.h>
#include <shared.h> #include <shared.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdExec::CmdExec () CmdExec::CmdExec ()
{ {
@@ -51,7 +49,7 @@ CmdExec::CmdExec ()
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int CmdExec::execute (std::string&) int CmdExec::execute (std::string&)
{ {
return system (join (" ", context.cli2.getWords ()).c_str ()); return system (join (" ", Context::getContext ().cli2.getWords ()).c_str ());
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////

View File

@@ -30,8 +30,6 @@
#include <Filter.h> #include <Filter.h>
#include <main.h> #include <main.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdExport::CmdExport () CmdExport::CmdExport ()
{ {
@@ -68,11 +66,11 @@ int CmdExport::execute (std::string& output)
// Obey 'limit:N'. // Obey 'limit:N'.
int rows = 0; int rows = 0;
int lines = 0; int lines = 0;
context.getLimits (rows, lines); Context::getContext ().getLimits (rows, lines);
int limit = (rows > lines ? rows : lines); int limit = (rows > lines ? rows : lines);
// Is output contained within a JSON array? // Is output contained within a JSON array?
bool json_array = context.config.getBoolean ("json.array"); bool json_array = Context::getContext ().config.getBoolean ("json.array");
// Compose output. // Compose output.
if (json_array) if (json_array)
@@ -101,7 +99,7 @@ int CmdExport::execute (std::string& output)
if (json_array) if (json_array)
output += "]\n"; output += "]\n";
context.time_render_us += timer.total_us (); Context::getContext ().time_render_us += timer.total_us ();
return rc; return rc;
} }

View File

@@ -33,8 +33,6 @@
#include <shared.h> #include <shared.h>
#include <format.h> #include <format.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdGet::CmdGet () CmdGet::CmdGet ()
{ {
@@ -60,7 +58,7 @@ CmdGet::CmdGet ()
int CmdGet::execute (std::string& output) int CmdGet::execute (std::string& output)
{ {
std::vector <std::string> results; std::vector <std::string> results;
for (auto& arg : context.cli2._args) for (auto& arg : Context::getContext ().cli2._args)
{ {
switch (arg._lextype) switch (arg._lextype)
{ {

View File

@@ -33,8 +33,6 @@
#include <format.h> #include <format.h>
#include <util.h> #include <util.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdHelp::CmdHelp () CmdHelp::CmdHelp ()
{ {
@@ -54,7 +52,7 @@ CmdHelp::CmdHelp ()
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int CmdHelp::execute (std::string& output) int CmdHelp::execute (std::string& output)
{ {
auto words = context.cli2.getWords (); auto words = Context::getContext ().cli2.getWords ();
if (words.size () == 1 && closeEnough ("usage", words[0])) if (words.size () == 1 && closeEnough ("usage", words[0]))
output = '\n' output = '\n'
+ composeUsage () + composeUsage ()
@@ -183,7 +181,7 @@ int CmdHelp::execute (std::string& output)
std::string CmdHelp::composeUsage () const std::string CmdHelp::composeUsage () const
{ {
Table view; Table view;
view.width (context.getWidth ()); view.width (Context::getContext ().getWidth ());
view.add (""); view.add ("");
view.add (""); view.add ("");
view.add (""); view.add ("");
@@ -196,7 +194,7 @@ std::string CmdHelp::composeUsage () const
// Obsolete method of getting a list of all commands. // Obsolete method of getting a list of all commands.
std::vector <std::string> all; std::vector <std::string> all;
for (auto& cmd : context.commands) for (auto& cmd : Context::getContext ().commands)
all.push_back (cmd.first); all.push_back (cmd.first);
// Sort alphabetically by usage. // Sort alphabetically by usage.
@@ -208,8 +206,8 @@ std::string CmdHelp::composeUsage () const
if (name[0] != '_') if (name[0] != '_')
{ {
row = view.addRow (); row = view.addRow ();
view.set (row, 1, context.commands[name]->usage ()); view.set (row, 1, Context::getContext ().commands[name]->usage ());
view.set (row, 2, context.commands[name]->description ()); view.set (row, 2, Context::getContext ().commands[name]->description ());
} }
} }
@@ -219,8 +217,8 @@ std::string CmdHelp::composeUsage () const
if (name[0] == '_') if (name[0] == '_')
{ {
row = view.addRow (); row = view.addRow ();
view.set (row, 1, context.commands[name]->usage ()); view.set (row, 1, Context::getContext ().commands[name]->usage ());
view.set (row, 2, context.commands[name]->description ()); view.set (row, 2, Context::getContext ().commands[name]->description ());
} }
} }
@@ -228,7 +226,7 @@ std::string CmdHelp::composeUsage () const
row = view.addRow (); row = view.addRow ();
view.set (row, 1, " "); view.set (row, 1, " ");
for (auto& alias : context.config) for (auto& alias : Context::getContext ().config)
{ {
if (alias.first.substr (0, 6) == "alias.") if (alias.first.substr (0, 6) == "alias.")
{ {

View File

@@ -42,8 +42,6 @@
#define STRING_CMD_HISTORY_COMP "Completed" #define STRING_CMD_HISTORY_COMP "Completed"
#define STRING_CMD_HISTORY_DEL "Deleted" #define STRING_CMD_HISTORY_DEL "Deleted"
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
template<class HistoryStrategy> template<class HistoryStrategy>
CmdHistoryBase<HistoryStrategy>::CmdHistoryBase () CmdHistoryBase<HistoryStrategy>::CmdHistoryBase ()
@@ -66,21 +64,21 @@ CmdHistoryBase<HistoryStrategy>::CmdHistoryBase ()
template<class HistoryStrategy> template<class HistoryStrategy>
void CmdHistoryBase<HistoryStrategy>::outputGraphical (std::string& output) void CmdHistoryBase<HistoryStrategy>::outputGraphical (std::string& output)
{ {
auto widthOfBar = context.getWidth () - HistoryStrategy::labelWidth; auto widthOfBar = Context::getContext ().getWidth () - HistoryStrategy::labelWidth;
// Now build the view. // Now build the view.
Table view; Table view;
setHeaderUnderline (view); setHeaderUnderline (view);
view.width (context.getWidth ()); view.width (Context::getContext ().getWidth ());
HistoryStrategy::setupTableDates (view); HistoryStrategy::setupTableDates (view);
view.add ("Number Added/Completed/Deleted", true, false); // Fixed. view.add ("Number Added/Completed/Deleted", true, false); // Fixed.
Color color_add (context.config.get ("color.history.add")); Color color_add (Context::getContext ().config.get ("color.history.add"));
Color color_done (context.config.get ("color.history.done")); Color color_done (Context::getContext ().config.get ("color.history.done"));
Color color_delete (context.config.get ("color.history.delete")); Color color_delete (Context::getContext ().config.get ("color.history.delete"));
Color label (context.config.get ("color.label")); Color label (Context::getContext ().config.get ("color.label"));
// Determine the longest line, and the longest "added" line. // Determine the longest line, and the longest "added" line.
auto maxAddedLine = 0; auto maxAddedLine = 0;
@@ -121,7 +119,7 @@ void CmdHistoryBase<HistoryStrategy>::outputGraphical (std::string& output)
unsigned int deletedBar = (widthOfBar * deletedGroup[i.first]) / maxLine; unsigned int deletedBar = (widthOfBar * deletedGroup[i.first]) / maxLine;
std::string bar; std::string bar;
if (context.color ()) if (Context::getContext ().color ())
{ {
std::string aBar; std::string aBar;
if (addedGroup[i.first]) if (addedGroup[i.first])
@@ -173,7 +171,7 @@ void CmdHistoryBase<HistoryStrategy>::outputGraphical (std::string& output)
<< view.render () << view.render ()
<< '\n'; << '\n';
if (context.color ()) if (Context::getContext ().color ())
out << format ("Legend: {1}, {2}, {3}", out << format ("Legend: {1}, {2}, {3}",
color_add.colorize (STRING_CMD_HISTORY_ADDED), color_add.colorize (STRING_CMD_HISTORY_ADDED),
color_done.colorize (STRING_CMD_HISTORY_COMP), color_done.colorize (STRING_CMD_HISTORY_COMP),
@@ -185,7 +183,7 @@ void CmdHistoryBase<HistoryStrategy>::outputGraphical (std::string& output)
} }
else else
{ {
context.footnote ("No tasks."); Context::getContext ().footnote ("No tasks.");
rc = 1; rc = 1;
} }
@@ -198,7 +196,7 @@ void CmdHistoryBase<HistoryStrategy>::outputTabular (std::string& output)
{ {
Table view; Table view;
setHeaderUnderline (view); setHeaderUnderline (view);
view.width (context.getWidth ()); view.width (Context::getContext ().getWidth ());
HistoryStrategy::setupTableDates (view); HistoryStrategy::setupTableDates (view);
@@ -245,7 +243,7 @@ void CmdHistoryBase<HistoryStrategy>::outputTabular (std::string& output)
} }
Color net_color; Color net_color;
if (context.color () && net) if (Context::getContext ().color () && net)
net_color = net > 0 net_color = net > 0
? Color (Color::red) ? Color (Color::red)
: Color (Color::green); : Color (Color::green);
@@ -260,7 +258,7 @@ void CmdHistoryBase<HistoryStrategy>::outputTabular (std::string& output)
row = view.addRow (); row = view.addRow ();
Color row_color; Color row_color;
if (context.color ()) if (Context::getContext ().color ())
row_color = Color (Color::nocolor, Color::nocolor, false, true, false); row_color = Color (Color::nocolor, Color::nocolor, false, true, false);
view.set (row, HistoryStrategy::dateFieldCount - 1, "Average", row_color); view.set (row, HistoryStrategy::dateFieldCount - 1, "Average", row_color);
@@ -277,7 +275,7 @@ void CmdHistoryBase<HistoryStrategy>::outputTabular (std::string& output)
<< '\n'; << '\n';
else else
{ {
context.footnote ("No tasks."); Context::getContext ().footnote ("No tasks.");
rc = 1; rc = 1;
} }

View File

@@ -33,8 +33,6 @@
#include <main.h> #include <main.h>
#include <shared.h> #include <shared.h>
extern Context context;
std::string zshColonReplacement = ","; std::string zshColonReplacement = ",";
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -72,7 +70,7 @@ int CmdIDs::execute (std::string& output)
std::sort (ids.begin (), ids.end ()); std::sort (ids.begin (), ids.end ());
output = compressIds (ids) + '\n'; output = compressIds (ids) + '\n';
context.headers.clear (); Context::getContext ().headers.clear ();
return 0; return 0;
} }
@@ -166,7 +164,7 @@ int CmdCompletionIds::execute (std::string& output)
std::sort (ids.begin (), ids.end ()); std::sort (ids.begin (), ids.end ());
output = join ("\n", ids) + '\n'; output = join ("\n", ids) + '\n';
context.headers.clear (); Context::getContext ().headers.clear ();
return 0; return 0;
} }
@@ -207,7 +205,7 @@ int CmdZshCompletionIds::execute (std::string& output)
output = out.str (); output = out.str ();
context.headers.clear (); Context::getContext ().headers.clear ();
return 0; return 0;
} }
@@ -244,7 +242,7 @@ int CmdUUIDs::execute (std::string& output)
std::sort (uuids.begin (), uuids.end ()); std::sort (uuids.begin (), uuids.end ());
output = join (" ", uuids) + '\n'; output = join (" ", uuids) + '\n';
context.headers.clear (); Context::getContext ().headers.clear ();
return 0; return 0;
} }
@@ -281,7 +279,7 @@ int CmdCompletionUuids::execute (std::string& output)
std::sort (uuids.begin (), uuids.end ()); std::sort (uuids.begin (), uuids.end ());
output = join ("\n", uuids) + '\n'; output = join ("\n", uuids) + '\n';
context.headers.clear (); Context::getContext ().headers.clear ();
return 0; return 0;
} }
@@ -320,7 +318,7 @@ int CmdZshCompletionUuids::execute (std::string& output)
output = out.str (); output = out.str ();
context.headers.clear (); Context::getContext ().headers.clear ();
return 0; return 0;
} }

View File

@@ -33,8 +33,6 @@
#include <shared.h> #include <shared.h>
#include <util.h> #include <util.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdImport::CmdImport () CmdImport::CmdImport ()
{ {
@@ -58,7 +56,7 @@ int CmdImport::execute (std::string&)
auto count = 0; auto count = 0;
// Get filenames from command line arguments. // Get filenames from command line arguments.
auto words = context.cli2.getWords (); auto words = Context::getContext ().cli2.getWords ();
if (! words.size () || if (! words.size () ||
(words.size () == 1 && words[0] == "-")) (words.size () == 1 && words[0] == "-"))
{ {
@@ -91,7 +89,7 @@ int CmdImport::execute (std::string&)
} }
} }
context.footnote (format ("Imported {1} tasks.", count)); Context::getContext ().footnote (format ("Imported {1} tasks.", count));
return rc; return rc;
} }
@@ -177,7 +175,7 @@ void CmdImport::importSingleTask (json::object* obj)
// Check whether the imported task is new or a modified existing task. // Check whether the imported task is new or a modified existing task.
Task before; Task before;
if (context.tdb2.get (task.get ("uuid"), before)) if (Context::getContext ().tdb2.get (task.get ("uuid"), before))
{ {
// We need to neglect updates from attributes with dynamic defaults // We need to neglect updates from attributes with dynamic defaults
// unless they have been explicitly specified on import. // unless they have been explicitly specified on import.
@@ -214,7 +212,7 @@ void CmdImport::importSingleTask (json::object* obj)
} }
else else
{ {
context.tdb2.add (task); Context::getContext ().tdb2.add (task);
std::cout << " add "; std::cout << " add ";
} }

View File

@@ -38,8 +38,6 @@
#include <format.h> #include <format.h>
#include <util.h> #include <util.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdInfo::CmdInfo () CmdInfo::CmdInfo ()
{ {
@@ -74,23 +72,23 @@ int CmdInfo::execute (std::string& output)
if (! filtered.size ()) if (! filtered.size ())
{ {
context.footnote ("No matches."); Context::getContext ().footnote ("No matches.");
rc = 1; rc = 1;
} }
// Get the undo data. // Get the undo data.
std::vector <std::string> undo; std::vector <std::string> undo;
if (context.config.getBoolean ("journal.info")) if (Context::getContext ().config.getBoolean ("journal.info"))
undo = context.tdb2.undo.get_lines (); undo = Context::getContext ().tdb2.undo.get_lines ();
// Determine the output date format, which uses a hierarchy of definitions. // Determine the output date format, which uses a hierarchy of definitions.
// rc.dateformat.info // rc.dateformat.info
// rc.dateformat // rc.dateformat
auto dateformat = context.config.get ("dateformat.info"); auto dateformat = Context::getContext ().config.get ("dateformat.info");
if (dateformat == "") if (dateformat == "")
dateformat = context.config.get ("dateformat"); dateformat = Context::getContext ().config.get ("dateformat");
auto dateformatanno = context.config.get ("dateformat.annotation"); auto dateformatanno = Context::getContext ().config.get ("dateformat.annotation");
if (dateformatanno == "") if (dateformatanno == "")
dateformatanno = dateformat; dateformatanno = dateformat;
@@ -99,10 +97,10 @@ int CmdInfo::execute (std::string& output)
for (auto& task : filtered) for (auto& task : filtered)
{ {
Table view; Table view;
view.width (context.getWidth ()); view.width (Context::getContext ().getWidth ());
if (context.config.getBoolean ("obfuscate")) if (Context::getContext ().config.getBoolean ("obfuscate"))
view.obfuscate (); view.obfuscate ();
if (context.color ()) if (Context::getContext ().color ())
view.forceColor (); view.forceColor ();
view.add ("Name"); view.add ("Name");
view.add ("Value"); view.add ("Value");
@@ -121,7 +119,7 @@ int CmdInfo::execute (std::string& output)
Color c; Color c;
autoColorize (task, c); autoColorize (task, c);
auto description = task.get ("description"); auto description = task.get ("description");
auto indent = context.config.getInteger ("indent.annotation"); auto indent = Context::getContext ().config.getInteger ("indent.annotation");
for (auto& anno : task.getAnnotations ()) for (auto& anno : task.getAnnotations ())
description += '\n' description += '\n'
@@ -381,9 +379,9 @@ int CmdInfo::execute (std::string& output)
std::string type; std::string type;
for (auto& att: all) for (auto& att: all)
{ {
if (context.columns.find (att) != context.columns.end ()) if (Context::getContext ().columns.find (att) != Context::getContext ().columns.end ())
{ {
Column* col = context.columns[att]; Column* col = Context::getContext ().columns[att];
if (col->is_uda ()) if (col->is_uda ())
{ {
auto value = task.get (att); auto value = task.get (att);
@@ -415,7 +413,7 @@ int CmdInfo::execute (std::string& output)
for (auto& att : all) for (auto& att : all)
{ {
if (att.substr (0, 11) != "annotation_" && if (att.substr (0, 11) != "annotation_" &&
context.columns.find (att) == context.columns.end ()) Context::getContext ().columns.find (att) == Context::getContext ().columns.end ())
{ {
row = view.addRow (); row = view.addRow ();
view.set (row, 0, '[' + att); view.set (row, 0, '[' + att);
@@ -428,19 +426,19 @@ int CmdInfo::execute (std::string& output)
if (task.urgency () != 0.0) if (task.urgency () != 0.0)
{ {
setHeaderUnderline (urgencyDetails); setHeaderUnderline (urgencyDetails);
if (context.color ()) if (Context::getContext ().color ())
{ {
Color alternate (context.config.get ("color.alternate")); Color alternate (Context::getContext ().config.get ("color.alternate"));
urgencyDetails.colorOdd (alternate); urgencyDetails.colorOdd (alternate);
urgencyDetails.intraColorOdd (alternate); urgencyDetails.intraColorOdd (alternate);
} }
if (context.config.getBoolean ("obfuscate")) if (Context::getContext ().config.getBoolean ("obfuscate"))
urgencyDetails.obfuscate (); urgencyDetails.obfuscate ();
if (context.config.getBoolean ("color")) if (Context::getContext ().config.getBoolean ("color"))
view.forceColor (); view.forceColor ();
urgencyDetails.width (context.getWidth ()); urgencyDetails.width (Context::getContext ().getWidth ());
urgencyDetails.add (""); // Attribute urgencyDetails.add (""); // Attribute
urgencyDetails.add (""); // Value urgencyDetails.add (""); // Value
urgencyDetails.add (""); // * urgencyDetails.add (""); // *
@@ -529,16 +527,16 @@ int CmdInfo::execute (std::string& output)
Table journal; Table journal;
setHeaderUnderline (journal); setHeaderUnderline (journal);
if (context.config.getBoolean ("obfuscate")) if (Context::getContext ().config.getBoolean ("obfuscate"))
journal.obfuscate (); journal.obfuscate ();
if (context.config.getBoolean ("color")) if (Context::getContext ().config.getBoolean ("color"))
journal.forceColor (); journal.forceColor ();
journal.width (context.getWidth ()); journal.width (Context::getContext ().getWidth ());
journal.add ("Date"); journal.add ("Date");
journal.add ("Modification"); journal.add ("Modification");
if (context.config.getBoolean ("journal.info") && if (Context::getContext ().config.getBoolean ("journal.info") &&
undo.size () > 3) undo.size () > 3)
{ {
// Scan the undo data for entries matching this task, without making // Scan the undo data for entries matching this task, without making

View File

@@ -30,8 +30,6 @@
#include <format.h> #include <format.h>
#include <main.h> #include <main.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdLog::CmdLog () CmdLog::CmdLog ()
{ {
@@ -64,12 +62,12 @@ int CmdLog::execute (std::string& output)
if (task.has ("wait")) if (task.has ("wait"))
throw std::string ("You cannot log waiting tasks."); throw std::string ("You cannot log waiting tasks.");
context.tdb2.add (task); Context::getContext ().tdb2.add (task);
if (context.verbose ("project")) if (Context::getContext ().verbose ("project"))
context.footnote (onProjectChange (task)); Context::getContext ().footnote (onProjectChange (task));
if (context.verbose ("new-uuid")) if (Context::getContext ().verbose ("new-uuid"))
output = format ("Logged task {1}.\n", task.get ("uuid")); output = format ("Logged task {1}.\n", task.get ("uuid"));
return 0; return 0;

View File

@@ -29,8 +29,6 @@
#include <Context.h> #include <Context.h>
#include <util.h> #include <util.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdLogo::CmdLogo () CmdLogo::CmdLogo ()
{ {
@@ -83,10 +81,10 @@ int CmdLogo::execute (std::string& output)
"" ""
}; };
if (! context.color ()) if (! Context::getContext ().color ())
throw std::string ("The logo command requires that color support is enabled."); throw std::string ("The logo command requires that color support is enabled.");
std::string indent (context.config.getInteger ("indent.report"), ' '); std::string indent (Context::getContext ().config.getInteger ("indent.report"), ' ');
output += optionalBlankLine (); output += optionalBlankLine ();
for (int line = 0; data[line][0]; ++line) for (int line = 0; data[line][0]; ++line)

View File

@@ -36,8 +36,6 @@
#define STRING_CMD_MODIFY_TASK_R "Modifying recurring task {1} '{2}'." #define STRING_CMD_MODIFY_TASK_R "Modifying recurring task {1} '{2}'."
#define STRING_CMD_MODIFY_RECUR "This is a recurring task. Do you want to modify all pending recurrences of this same task?" #define STRING_CMD_MODIFY_RECUR "This is a recurring task. Do you want to modify all pending recurrences of this same task?"
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdModify::CmdModify () CmdModify::CmdModify ()
{ {
@@ -65,7 +63,7 @@ int CmdModify::execute (std::string&)
filter.subset (filtered); filter.subset (filtered);
if (filtered.size () == 0) if (filtered.size () == 0)
{ {
context.footnote ("No tasks specified."); Context::getContext ().footnote ("No tasks specified.");
return 1; return 1;
} }
@@ -104,7 +102,7 @@ int CmdModify::execute (std::string&)
// Now list the project changes. // Now list the project changes.
for (const auto& change : projectChanges) for (const auto& change : projectChanges)
if (change.first != "") if (change.first != "")
context.footnote (change.second); Context::getContext ().footnote (change.second);
feedback_affected (count == 1 ? "Modified {1} task." : "Modified {1} tasks.", count); feedback_affected (count == 1 ? "Modified {1} task." : "Modified {1} tasks.", count);
return rc; return rc;
@@ -143,8 +141,8 @@ int CmdModify::modifyAndUpdate (
updateRecurrenceMask (after); updateRecurrenceMask (after);
feedback_affected ("Modifying task {1} '{2}'.", after); feedback_affected ("Modifying task {1} '{2}'.", after);
feedback_unblocked (after); feedback_unblocked (after);
context.tdb2.modify (after); Context::getContext ().tdb2.modify (after);
if (context.verbose ("project") && projectChanges) if (Context::getContext ().verbose ("project") && projectChanges)
(*projectChanges)[after.get ("project")] = onProjectChange (before, after); (*projectChanges)[after.get ("project")] = onProjectChange (before, after);
// Task has siblings - modify them. // Task has siblings - modify them.
@@ -165,11 +163,11 @@ int CmdModify::modifyRecurrenceSiblings (
{ {
auto count = 0; auto count = 0;
if ((context.config.get ("recurrence.confirmation") == "prompt" if ((Context::getContext ().config.get ("recurrence.confirmation") == "prompt"
&& confirm (STRING_CMD_MODIFY_RECUR)) || && confirm (STRING_CMD_MODIFY_RECUR)) ||
context.config.getBoolean ("recurrence.confirmation")) Context::getContext ().config.getBoolean ("recurrence.confirmation"))
{ {
std::vector <Task> siblings = context.tdb2.siblings (task); std::vector <Task> siblings = Context::getContext ().tdb2.siblings (task);
for (auto& sibling : siblings) for (auto& sibling : siblings)
{ {
Task alternate (sibling); Task alternate (sibling);
@@ -178,16 +176,16 @@ int CmdModify::modifyRecurrenceSiblings (
++count; ++count;
feedback_affected (STRING_CMD_MODIFY_TASK_R, sibling); feedback_affected (STRING_CMD_MODIFY_TASK_R, sibling);
feedback_unblocked (sibling); feedback_unblocked (sibling);
context.tdb2.modify (sibling); Context::getContext ().tdb2.modify (sibling);
if (context.verbose ("project") && projectChanges) if (Context::getContext ().verbose ("project") && projectChanges)
(*projectChanges)[sibling.get ("project")] = onProjectChange (alternate, sibling); (*projectChanges)[sibling.get ("project")] = onProjectChange (alternate, sibling);
} }
// Modify the parent // Modify the parent
Task parent; Task parent;
context.tdb2.get (task.get ("parent"), parent); Context::getContext ().tdb2.get (task.get ("parent"), parent);
parent.modify (Task::modReplace); parent.modify (Task::modReplace);
context.tdb2.modify (parent); Context::getContext ().tdb2.modify (parent);
} }
return count; return count;
@@ -200,9 +198,9 @@ int CmdModify::modifyRecurrenceParent (
{ {
auto count = 0; auto count = 0;
auto children = context.tdb2.children (task); auto children = Context::getContext ().tdb2.children (task);
if (children.size () && if (children.size () &&
(! context.config.getBoolean ("recurrence.confirmation") || (! Context::getContext ().config.getBoolean ("recurrence.confirmation") ||
confirm (STRING_CMD_MODIFY_RECUR))) confirm (STRING_CMD_MODIFY_RECUR)))
{ {
for (auto& child : children) for (auto& child : children)
@@ -210,8 +208,8 @@ int CmdModify::modifyRecurrenceParent (
Task alternate (child); Task alternate (child);
child.modify (Task::modReplace); child.modify (Task::modReplace);
updateRecurrenceMask (child); updateRecurrenceMask (child);
context.tdb2.modify (child); Context::getContext ().tdb2.modify (child);
if (context.verbose ("project") && projectChanges) if (Context::getContext ().verbose ("project") && projectChanges)
(*projectChanges)[child.get ("project")] = onProjectChange (alternate, child); (*projectChanges)[child.get ("project")] = onProjectChange (alternate, child);
++count; ++count;
feedback_affected (STRING_CMD_MODIFY_TASK_R, child); feedback_affected (STRING_CMD_MODIFY_TASK_R, child);

View File

@@ -33,8 +33,6 @@
#include <format.h> #include <format.h>
#include <main.h> #include <main.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdPrepend::CmdPrepend () CmdPrepend::CmdPrepend ()
{ {
@@ -63,7 +61,7 @@ int CmdPrepend::execute (std::string&)
filter.subset (filtered); filter.subset (filtered);
if (filtered.size () == 0) if (filtered.size () == 0)
{ {
context.footnote ("No tasks specified."); Context::getContext ().footnote ("No tasks specified.");
return 1; return 1;
} }
@@ -85,33 +83,33 @@ int CmdPrepend::execute (std::string&)
if (permission (taskDifferences (before, task) + question, filtered.size ())) if (permission (taskDifferences (before, task) + question, filtered.size ()))
{ {
context.tdb2.modify (task); Context::getContext ().tdb2.modify (task);
++count; ++count;
feedback_affected ("Prepending to task {1} '{2}'.", task); feedback_affected ("Prepending to task {1} '{2}'.", task);
if (context.verbose ("project")) if (Context::getContext ().verbose ("project"))
projectChanges[task.get ("project")] = onProjectChange (task, false); projectChanges[task.get ("project")] = onProjectChange (task, false);
// Prepend to siblings. // Prepend to siblings.
if (task.has ("parent")) if (task.has ("parent"))
{ {
if ((context.config.get ("recurrence.confirmation") == "prompt" if ((Context::getContext ().config.get ("recurrence.confirmation") == "prompt"
&& confirm ("This is a recurring task. Do you want to prepend to all pending recurrences of this same task?")) || && confirm ("This is a recurring task. Do you want to prepend to all pending recurrences of this same task?")) ||
context.config.getBoolean ("recurrence.confirmation")) Context::getContext ().config.getBoolean ("recurrence.confirmation"))
{ {
std::vector <Task> siblings = context.tdb2.siblings (task); std::vector <Task> siblings = Context::getContext ().tdb2.siblings (task);
for (auto& sibling : siblings) for (auto& sibling : siblings)
{ {
sibling.modify (Task::modPrepend, true); sibling.modify (Task::modPrepend, true);
context.tdb2.modify (sibling); Context::getContext ().tdb2.modify (sibling);
++count; ++count;
feedback_affected ("Prepending to recurring task {1} '{2}'.", sibling); feedback_affected ("Prepending to recurring task {1} '{2}'.", sibling);
} }
// Prepend to the parent // Prepend to the parent
Task parent; Task parent;
context.tdb2.get (task.get ("parent"), parent); Context::getContext ().tdb2.get (task.get ("parent"), parent);
parent.modify (Task::modPrepend, true); parent.modify (Task::modPrepend, true);
context.tdb2.modify (parent); Context::getContext ().tdb2.modify (parent);
} }
} }
} }
@@ -127,7 +125,7 @@ int CmdPrepend::execute (std::string&)
// Now list the project changes. // Now list the project changes.
for (auto& change : projectChanges) for (auto& change : projectChanges)
if (change.first != "") if (change.first != "")
context.footnote (change.second); Context::getContext ().footnote (change.second);
feedback_affected (count == 1 ? "Prepended {1} task." : "Prepended {1} tasks.", count); feedback_affected (count == 1 ? "Prepended {1} task." : "Prepended {1} tasks.", count);
return rc; return rc;

View File

@@ -35,8 +35,6 @@
#include <util.h> #include <util.h>
#include <main.h> #include <main.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdProjects::CmdProjects () CmdProjects::CmdProjects ()
{ {
@@ -61,10 +59,10 @@ int CmdProjects::execute (std::string& output)
// Get all the tasks. // Get all the tasks.
handleUntil (); handleUntil ();
handleRecurrence (); handleRecurrence ();
auto tasks = context.tdb2.pending.get_tasks (); auto tasks = Context::getContext ().tdb2.pending.get_tasks ();
if (context.config.getBoolean ("list.all.projects")) if (Context::getContext ().config.getBoolean ("list.all.projects"))
for (auto& task : context.tdb2.completed.get_tasks ()) for (auto& task : Context::getContext ().tdb2.completed.get_tasks ())
tasks.push_back (task); tasks.push_back (task);
// Apply the filter. // Apply the filter.
@@ -106,7 +104,7 @@ int CmdProjects::execute (std::string& output)
{ {
// Render a list of project names from the map. // Render a list of project names from the map.
Table view; Table view;
view.width (context.getWidth ()); view.width (Context::getContext ().getWidth ());
view.add ("Project"); view.add ("Project");
view.add ("Tasks", false); view.add ("Tasks", false);
setHeaderUnderline (view); setHeaderUnderline (view);
@@ -180,10 +178,10 @@ int CmdCompletionProjects::execute (std::string& output)
// Get all the tasks. // Get all the tasks.
handleUntil (); handleUntil ();
handleRecurrence (); handleRecurrence ();
auto tasks = context.tdb2.pending.get_tasks (); auto tasks = Context::getContext ().tdb2.pending.get_tasks ();
if (context.config.getBoolean ("list.all.projects")) if (Context::getContext ().config.getBoolean ("list.all.projects"))
for (auto& task : context.tdb2.completed.get_tasks ()) for (auto& task : Context::getContext ().tdb2.completed.get_tasks ())
tasks.push_back (task); tasks.push_back (task);
// Apply the filter. // Apply the filter.

View File

@@ -32,8 +32,6 @@
#include <format.h> #include <format.h>
#include <shared.h> #include <shared.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdPurge::CmdPurge () CmdPurge::CmdPurge ()
{ {
@@ -57,7 +55,7 @@ CmdPurge::CmdPurge ()
// - child tasks // - child tasks
void CmdPurge::purgeTask (Task& task, int& count) void CmdPurge::purgeTask (Task& task, int& count)
{ {
context.tdb2.purge (task); Context::getContext ().tdb2.purge (task);
handleDeps (task); handleDeps (task);
handleChildren (task, count); handleChildren (task, count);
count++; count++;
@@ -70,14 +68,14 @@ void CmdPurge::handleDeps (Task& task)
{ {
std::string uuid = task.get ("uuid"); std::string uuid = task.get ("uuid");
for (auto& blockedConst: context.tdb2.all_tasks ()) for (auto& blockedConst: Context::getContext ().tdb2.all_tasks ())
{ {
Task& blocked = const_cast<Task&>(blockedConst); Task& blocked = const_cast<Task&>(blockedConst);
if (blocked.has ("depends") && if (blocked.has ("depends") &&
blocked.get ("depends").find (uuid) != std::string::npos) blocked.get ("depends").find (uuid) != std::string::npos)
{ {
blocked.removeDependency (uuid); blocked.removeDependency (uuid);
context.tdb2.modify (blocked); Context::getContext ().tdb2.modify (blocked);
} }
} }
} }
@@ -95,7 +93,7 @@ void CmdPurge::handleChildren (Task& task, int& count)
std::vector<Task> children; std::vector<Task> children;
// Find all child tasks // Find all child tasks
for (auto& childConst: context.tdb2.all_tasks ()) for (auto& childConst: Context::getContext ().tdb2.all_tasks ())
{ {
Task& child = const_cast<Task&> (childConst); Task& child = const_cast<Task&> (childConst);
@@ -120,8 +118,8 @@ void CmdPurge::handleChildren (Task& task, int& count)
task.get ("description"), task.get ("description"),
children.size ()); children.size ());
if (context.config.getBoolean ("recurrence.confirmation") || if (Context::getContext ().config.getBoolean ("recurrence.confirmation") ||
(context.config.get ("recurrence.confirmation") == "prompt" (Context::getContext ().config.get ("recurrence.confirmation") == "prompt"
&& confirm (question))) && confirm (question)))
{ {
for (auto& child: children) for (auto& child: children)
@@ -145,7 +143,7 @@ int CmdPurge::execute (std::string&)
filter.subset (filtered); filter.subset (filtered);
if (filtered.size () == 0) if (filtered.size () == 0)
{ {
context.footnote ("No tasks specified."); Context::getContext ().footnote ("No tasks specified.");
return 1; return 1;
} }

View File

@@ -32,8 +32,6 @@
#include <format.h> #include <format.h>
#include <util.h> #include <util.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdReports::CmdReports () CmdReports::CmdReports ()
{ {
@@ -56,7 +54,7 @@ int CmdReports::execute (std::string& output)
std::vector <std::string> reports; std::vector <std::string> reports;
// Add custom reports. // Add custom reports.
for (auto& i : context.config) for (auto& i : Context::getContext ().config)
{ {
if (i.first.substr (0, 7) == "report.") if (i.first.substr (0, 7) == "report.")
{ {
@@ -85,7 +83,7 @@ int CmdReports::execute (std::string& output)
// Compose the output. // Compose the output.
std::stringstream out; std::stringstream out;
Table view; Table view;
view.width (context.getWidth ()); view.width (Context::getContext ().getWidth ());
view.add ("Report"); view.add ("Report");
view.add ("Description"); view.add ("Description");
setHeaderUnderline (view); setHeaderUnderline (view);
@@ -94,7 +92,7 @@ int CmdReports::execute (std::string& output)
{ {
int row = view.addRow (); int row = view.addRow ();
view.set (row, 0, report); view.set (row, 0, report);
view.set (row, 1, context.commands[report]->description ()); view.set (row, 1, Context::getContext ().commands[report]->description ());
} }
out << optionalBlankLine () out << optionalBlankLine ()

View File

@@ -39,7 +39,6 @@
#define STRING_CMD_SHOW_DIFFER_COLOR "These are highlighted in {1} above." #define STRING_CMD_SHOW_DIFFER_COLOR "These are highlighted in {1} above."
#define STRING_CMD_SHOW_CONFIG_ERROR "Configuration error: {1} contains an unrecognized value '{2}'." #define STRING_CMD_SHOW_CONFIG_ERROR "Configuration error: {1} contains an unrecognized value '{2}'."
extern Context context;
extern std::string configurationDefaults; extern std::string configurationDefaults;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -66,11 +65,11 @@ int CmdShow::execute (std::string& output)
// Obtain the arguments from the description. That way, things like '--' // Obtain the arguments from the description. That way, things like '--'
// have already been handled. // have already been handled.
std::vector <std::string> words = context.cli2.getWords (); std::vector <std::string> words = Context::getContext ().cli2.getWords ();
if (words.size () > 1) if (words.size () > 1)
throw std::string ("You can only specify 'all' or a search string."); throw std::string ("You can only specify 'all' or a search string.");
int width = context.getWidth (); int width = Context::getContext ().getWidth ();
// Complain about configuration variables that are not recognized. // Complain about configuration variables that are not recognized.
// These are the regular configuration variables. // These are the regular configuration variables.
@@ -224,7 +223,7 @@ int CmdShow::execute (std::string& output)
recognized += "_forcecolor "; recognized += "_forcecolor ";
std::vector <std::string> unrecognized; std::vector <std::string> unrecognized;
for (auto& i : context.config) for (auto& i : Context::getContext ().config)
{ {
// Disallow partial matches by tacking a leading and trailing space on each // Disallow partial matches by tacking a leading and trailing space on each
// variable name. // variable name.
@@ -259,7 +258,7 @@ int CmdShow::execute (std::string& output)
Configuration default_config; Configuration default_config;
default_config.parse (configurationDefaults); default_config.parse (configurationDefaults);
for (auto& i : context.config) for (auto& i : Context::getContext ().config)
if (i.second != default_config.get (i.first)) if (i.second != default_config.get (i.first))
default_values.push_back (i.first); default_values.push_back (i.first);
@@ -272,10 +271,10 @@ int CmdShow::execute (std::string& output)
Color error; Color error;
Color warning; Color warning;
if (context.color ()) if (Context::getContext ().color ())
{ {
error = Color (context.config.get ("color.error")); error = Color (Context::getContext ().config.get ("color.error"));
warning = Color (context.config.get ("color.warning")); warning = Color (Context::getContext ().config.get ("color.warning"));
} }
bool issue_error = false; bool issue_error = false;
@@ -291,7 +290,7 @@ int CmdShow::execute (std::string& output)
section = ""; section = "";
std::string::size_type loc; std::string::size_type loc;
for (auto& i : context.config) for (auto& i : Context::getContext ().config)
{ {
loc = i.first.find (section, 0); loc = i.first.find (section, 0);
if (loc != std::string::npos) if (loc != std::string::npos)
@@ -333,7 +332,7 @@ int CmdShow::execute (std::string& output)
{ {
out << "Some of your .taskrc variables differ from the default values.\n"; out << "Some of your .taskrc variables differ from the default values.\n";
if (context.color () && warning.nontrivial ()) if (Context::getContext ().color () && warning.nontrivial ())
out << " " out << " "
<< format (STRING_CMD_SHOW_DIFFER_COLOR, warning.colorize ("color")) << format (STRING_CMD_SHOW_DIFFER_COLOR, warning.colorize ("color"))
<< "\n\n"; << "\n\n";
@@ -347,7 +346,7 @@ int CmdShow::execute (std::string& output)
for (auto& i : unrecognized) for (auto& i : unrecognized)
out << " " << i << '\n'; out << " " << i << '\n';
if (context.color () && error.nontrivial ()) if (Context::getContext ().color () && error.nontrivial ())
out << '\n' << format (STRING_CMD_SHOW_DIFFER_COLOR, error.colorize ("color")); out << '\n' << format (STRING_CMD_SHOW_DIFFER_COLOR, error.colorize ("color"));
out << "\n\n"; out << "\n\n";
@@ -360,7 +359,7 @@ int CmdShow::execute (std::string& output)
// TODO Check for referenced but missing string files. // TODO Check for referenced but missing string files.
// Check for bad values in rc.calendar.details. // Check for bad values in rc.calendar.details.
std::string calendardetails = context.config.get ("calendar.details"); std::string calendardetails = Context::getContext ().config.get ("calendar.details");
if (calendardetails != "full" && if (calendardetails != "full" &&
calendardetails != "sparse" && calendardetails != "sparse" &&
calendardetails != "none") calendardetails != "none")
@@ -368,7 +367,7 @@ int CmdShow::execute (std::string& output)
<< '\n'; << '\n';
// Check for bad values in rc.calendar.holidays. // Check for bad values in rc.calendar.holidays.
std::string calendarholidays = context.config.get ("calendar.holidays"); std::string calendarholidays = Context::getContext ().config.get ("calendar.holidays");
if (calendarholidays != "full" && if (calendarholidays != "full" &&
calendarholidays != "sparse" && calendarholidays != "sparse" &&
calendarholidays != "none") calendarholidays != "none")
@@ -378,14 +377,14 @@ int CmdShow::execute (std::string& output)
// Verify installation. This is mentioned in the documentation as the way // Verify installation. This is mentioned in the documentation as the way
// to ensure everything is properly installed. // to ensure everything is properly installed.
if (context.config.size () == 0) if (Context::getContext ().config.size () == 0)
{ {
out << "Configuration error: .taskrc contains no entries.\n"; out << "Configuration error: .taskrc contains no entries.\n";
rc = 1; rc = 1;
} }
else else
{ {
Directory location (context.config.get ("data.location")); Directory location (Context::getContext ().config.get ("data.location"));
if (location._data == "") if (location._data == "")
out << "Configuration error: data.location not specified in .taskrc file.\n"; out << "Configuration error: data.location not specified in .taskrc file.\n";
@@ -413,13 +412,13 @@ CmdShowRaw::CmdShowRaw ()
int CmdShowRaw::execute (std::string& output) int CmdShowRaw::execute (std::string& output)
{ {
// Get all the settings and sort alphabetically by name. // Get all the settings and sort alphabetically by name.
auto all = context.config.all (); auto all = Context::getContext ().config.all ();
std::sort (all.begin (), all.end ()); std::sort (all.begin (), all.end ());
// Display them all. // Display them all.
std::stringstream out; std::stringstream out;
for (auto& i : all) for (auto& i : all)
out << i << '=' << context.config.get (i) << '\n'; out << i << '=' << Context::getContext ().config.get (i) << '\n';
output = out.str (); output = out.str ();
return 0; return 0;

View File

@@ -33,8 +33,6 @@
#include <format.h> #include <format.h>
#include <util.h> #include <util.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdStart::CmdStart () CmdStart::CmdStart ()
{ {
@@ -63,7 +61,7 @@ int CmdStart::execute (std::string&)
filter.subset (filtered); filter.subset (filtered);
if (filtered.size () == 0) if (filtered.size () == 0)
{ {
context.footnote ("No tasks specified."); Context::getContext ().footnote ("No tasks specified.");
return 1; return 1;
} }
@@ -91,19 +89,19 @@ int CmdStart::execute (std::string&)
task.setStatus (Task::pending); task.setStatus (Task::pending);
} }
if (context.config.getBoolean ("journal.time")) if (Context::getContext ().config.getBoolean ("journal.time"))
task.addAnnotation (context.config.get ("journal.time.start.annotation")); task.addAnnotation (Context::getContext ().config.get ("journal.time.start.annotation"));
if (permission (taskDifferences (before, task) + question, filtered.size ())) if (permission (taskDifferences (before, task) + question, filtered.size ()))
{ {
updateRecurrenceMask (task); updateRecurrenceMask (task);
context.tdb2.modify (task); Context::getContext ().tdb2.modify (task);
++count; ++count;
feedback_affected ("Starting task {1} '{2}'.", task); feedback_affected ("Starting task {1} '{2}'.", task);
if (!nagged) if (!nagged)
nagged = nag (task); nagged = nag (task);
dependencyChainOnStart (task); dependencyChainOnStart (task);
if (context.verbose ("project")) if (Context::getContext ().verbose ("project"))
projectChanges[task.get ("project")] = onProjectChange (task, false); projectChanges[task.get ("project")] = onProjectChange (task, false);
} }
else else
@@ -127,7 +125,7 @@ int CmdStart::execute (std::string&)
// Now list the project changes. // Now list the project changes.
for (auto& change : projectChanges) for (auto& change : projectChanges)
if (change.first != "") if (change.first != "")
context.footnote (change.second); Context::getContext ().footnote (change.second);
feedback_affected (count == 1 ? "Started {1} task." : "Started {1} tasks.", count); feedback_affected (count == 1 ? "Started {1} task." : "Started {1} tasks.", count);
return rc; return rc;

View File

@@ -38,8 +38,6 @@
#include <format.h> #include <format.h>
#include <util.h> #include <util.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdStats::CmdStats () CmdStats::CmdStats ()
{ {
@@ -62,23 +60,23 @@ int CmdStats::execute (std::string& output)
int rc = 0; int rc = 0;
std::stringstream out; std::stringstream out;
std::string dateformat = context.config.get ("dateformat"); std::string dateformat = Context::getContext ().config.get ("dateformat");
// Go get the file sizes. // Go get the file sizes.
size_t dataSize = context.tdb2.pending._file.size () size_t dataSize = Context::getContext ().tdb2.pending._file.size ()
+ context.tdb2.completed._file.size () + Context::getContext ().tdb2.completed._file.size ()
+ context.tdb2.undo._file.size () + Context::getContext ().tdb2.undo._file.size ()
+ context.tdb2.backlog._file.size (); + Context::getContext ().tdb2.backlog._file.size ();
// Count the undo transactions. // Count the undo transactions.
std::vector <std::string> undoTxns = context.tdb2.undo.get_lines (); std::vector <std::string> undoTxns = Context::getContext ().tdb2.undo.get_lines ();
int undoCount = 0; int undoCount = 0;
for (auto& tx : undoTxns) for (auto& tx : undoTxns)
if (tx == "---") if (tx == "---")
++undoCount; ++undoCount;
// Count the backlog transactions. // Count the backlog transactions.
std::vector <std::string> backlogTxns = context.tdb2.backlog.get_lines (); std::vector <std::string> backlogTxns = Context::getContext ().tdb2.backlog.get_lines ();
int backlogCount = 0; int backlogCount = 0;
for (auto& tx : backlogTxns) for (auto& tx : backlogTxns)
if (tx[0] == '{') if (tx[0] == '{')
@@ -86,7 +84,7 @@ int CmdStats::execute (std::string& output)
// Get all the tasks. // Get all the tasks.
Filter filter; Filter filter;
std::vector <Task> all = context.tdb2.all_tasks (); std::vector <Task> all = Context::getContext ().tdb2.all_tasks ();
std::vector <Task> filtered; std::vector <Task> filtered;
filter.subset (all, filtered); filter.subset (all, filtered);
@@ -155,7 +153,7 @@ int CmdStats::execute (std::string& output)
// Create a table for output. // Create a table for output.
Table view; Table view;
view.width (context.getWidth ()); view.width (Context::getContext ().getWidth ());
view.intraPadding (2); view.intraPadding (2);
view.add ("Category"); view.add ("Category");
view.add ("Data"); view.add ("Data");
@@ -280,9 +278,9 @@ int CmdStats::execute (std::string& output)
} }
// If an alternating row color is specified, notify the table. // If an alternating row color is specified, notify the table.
if (context.color ()) if (Context::getContext ().color ())
{ {
Color alternate (context.config.get ("color.alternate")); Color alternate (Context::getContext ().config.get ("color.alternate"));
if (alternate.nontrivial ()) if (alternate.nontrivial ())
{ {
view.colorOdd (alternate); view.colorOdd (alternate);

View File

@@ -32,8 +32,6 @@
#include <main.h> #include <main.h>
#include <format.h> #include <format.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdStop::CmdStop () CmdStop::CmdStop ()
{ {
@@ -62,7 +60,7 @@ int CmdStop::execute (std::string&)
filter.subset (filtered); filter.subset (filtered);
if (filtered.size () == 0) if (filtered.size () == 0)
{ {
context.footnote ("No tasks specified."); Context::getContext ().footnote ("No tasks specified.");
return 1; return 1;
} }
@@ -83,17 +81,17 @@ int CmdStop::execute (std::string&)
task.modify (Task::modAnnotate); task.modify (Task::modAnnotate);
task.remove ("start"); task.remove ("start");
if (context.config.getBoolean ("journal.time")) if (Context::getContext ().config.getBoolean ("journal.time"))
task.addAnnotation (context.config.get ("journal.time.stop.annotation")); task.addAnnotation (Context::getContext ().config.get ("journal.time.stop.annotation"));
if (permission (taskDifferences (before, task) + question, filtered.size ())) if (permission (taskDifferences (before, task) + question, filtered.size ()))
{ {
updateRecurrenceMask (task); updateRecurrenceMask (task);
context.tdb2.modify (task); Context::getContext ().tdb2.modify (task);
++count; ++count;
feedback_affected ("Stopping task {1} '{2}'.", task); feedback_affected ("Stopping task {1} '{2}'.", task);
dependencyChainOnStart (task); dependencyChainOnStart (task);
if (context.verbose ("project")) if (Context::getContext ().verbose ("project"))
projectChanges[task.get ("project")] = onProjectChange (task, false); projectChanges[task.get ("project")] = onProjectChange (task, false);
} }
else else
@@ -117,7 +115,7 @@ int CmdStop::execute (std::string&)
// Now list the project changes. // Now list the project changes.
for (auto& change : projectChanges) for (auto& change : projectChanges)
if (change.first != "") if (change.first != "")
context.footnote (change.second); Context::getContext ().footnote (change.second);
feedback_affected (count == 1 ? "Stopped {1} task." : "Stopped {1} tasks.", count); feedback_affected (count == 1 ? "Stopped {1} task." : "Stopped {1} tasks.", count);
return rc; return rc;

View File

@@ -37,8 +37,6 @@
#include <util.h> #include <util.h>
#include <main.h> #include <main.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdSummary::CmdSummary () CmdSummary::CmdSummary ()
{ {
@@ -62,7 +60,7 @@ CmdSummary::CmdSummary ()
int CmdSummary::execute (std::string& output) int CmdSummary::execute (std::string& output)
{ {
int rc = 0; int rc = 0;
bool showAllProjects = context.config.getBoolean ("summary.all.projects"); bool showAllProjects = Context::getContext ().config.getBoolean ("summary.all.projects");
// Apply filter. // Apply filter.
handleUntil (); handleUntil ();
@@ -132,7 +130,7 @@ int CmdSummary::execute (std::string& output)
// Create a table for output. // Create a table for output.
Table view; Table view;
view.width (context.getWidth ()); view.width (Context::getContext ().getWidth ());
view.add ("Project"); view.add ("Project");
view.add ("Remaining", false); view.add ("Remaining", false);
view.add ("Avg age", false); view.add ("Avg age", false);
@@ -142,10 +140,10 @@ int CmdSummary::execute (std::string& output)
Color bar_color; Color bar_color;
Color bg_color; Color bg_color;
if (context.color ()) if (Context::getContext ().color ())
{ {
bar_color = Color (context.config.get ("color.summary.bar")); bar_color = Color (Context::getContext ().config.get ("color.summary.bar"));
bg_color = Color (context.config.get ("color.summary.background")); bg_color = Color (Context::getContext ().config.get ("color.summary.background"));
} }
int barWidth = 30; int barWidth = 30;
@@ -183,7 +181,7 @@ int CmdSummary::execute (std::string& output)
std::string bar; std::string bar;
std::string subbar; std::string subbar;
if (context.color ()) if (Context::getContext ().color ())
{ {
bar += bar_color.colorize (std::string ( completedBar, ' ')); bar += bar_color.colorize (std::string ( completedBar, ' '));
bar += bg_color.colorize (std::string (barWidth - completedBar, ' ')); bar += bg_color.colorize (std::string (barWidth - completedBar, ' '));

View File

@@ -36,8 +36,6 @@
#include <format.h> #include <format.h>
#include <util.h> #include <util.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdSync::CmdSync () CmdSync::CmdSync ()
{ {
@@ -67,12 +65,12 @@ int CmdSync::execute (std::string& output)
// Loog for the 'init' keyword to indicate one-time pending.data upload. // Loog for the 'init' keyword to indicate one-time pending.data upload.
bool first_time_init = false; bool first_time_init = false;
std::vector <std::string> words = context.cli2.getWords (); std::vector <std::string> words = Context::getContext ().cli2.getWords ();
for (auto& word : words) for (auto& word : words)
{ {
if (closeEnough ("initialize", word, 4)) if (closeEnough ("initialize", word, 4))
{ {
if (!context.config.getBoolean ("confirmation") || if (!Context::getContext ().config.getBoolean ("confirmation") ||
confirm ("Please confirm that you wish to upload all your tasks to the Taskserver")) confirm ("Please confirm that you wish to upload all your tasks to the Taskserver"))
first_time_init = true; first_time_init = true;
else else
@@ -81,13 +79,13 @@ int CmdSync::execute (std::string& output)
} }
// If no server is set up, quit. // If no server is set up, quit.
std::string connection = context.config.get ("taskd.server"); std::string connection = Context::getContext ().config.get ("taskd.server");
if (connection == "" || if (connection == "" ||
connection.rfind (':') == std::string::npos) connection.rfind (':') == std::string::npos)
throw std::string ("Taskserver is not configured."); throw std::string ("Taskserver is not configured.");
// Obtain credentials. // Obtain credentials.
std::string credentials_string = context.config.get ("taskd.credentials"); std::string credentials_string = Context::getContext ().config.get ("taskd.credentials");
if (credentials_string == "") if (credentials_string == "")
throw std::string ("Taskserver credentials malformed."); throw std::string ("Taskserver credentials malformed.");
@@ -96,7 +94,7 @@ int CmdSync::execute (std::string& output)
throw std::string ("Taskserver credentials malformed."); throw std::string ("Taskserver credentials malformed.");
// This was a Boolean value in 2.3.0, and is a tri-state since 2.4.0. // This was a Boolean value in 2.3.0, and is a tri-state since 2.4.0.
std::string trust_value = context.config.get ("taskd.trust"); std::string trust_value = Context::getContext ().config.get ("taskd.trust");
if (trust_value != "strict" && if (trust_value != "strict" &&
trust_value != "ignore hostname" && trust_value != "ignore hostname" &&
trust_value != "allow all") trust_value != "allow all")
@@ -109,18 +107,18 @@ int CmdSync::execute (std::string& output)
trust = TLSClient::ignore_hostname; trust = TLSClient::ignore_hostname;
// CA must exist, if provided. // CA must exist, if provided.
File ca (context.config.get ("taskd.ca")); File ca (Context::getContext ().config.get ("taskd.ca"));
if (ca._data != "" && ! ca.exists ()) if (ca._data != "" && ! ca.exists ())
throw std::string ("CA certificate not found."); throw std::string ("CA certificate not found.");
if (trust == TLSClient::allow_all && ca._data != "") if (trust == TLSClient::allow_all && ca._data != "")
throw std::string ("You should either provide a CA certificate or override verification, but not both."); throw std::string ("You should either provide a CA certificate or override verification, but not both.");
File certificate (context.config.get ("taskd.certificate")); File certificate (Context::getContext ().config.get ("taskd.certificate"));
if (! certificate.exists ()) if (! certificate.exists ())
throw std::string ("Taskserver certificate missing."); throw std::string ("Taskserver certificate missing.");
File key (context.config.get ("taskd.key")); File key (Context::getContext ().config.get ("taskd.key"));
if (! key.exists ()) if (! key.exists ())
throw std::string ("Taskserver key missing."); throw std::string ("Taskserver key missing.");
@@ -132,9 +130,9 @@ int CmdSync::execute (std::string& output)
{ {
// Delete backlog.data. Because if we're uploading everything, the list of // Delete backlog.data. Because if we're uploading everything, the list of
// deltas is meaningless. // deltas is meaningless.
context.tdb2.backlog._file.truncate (); Context::getContext ().tdb2.backlog._file.truncate ();
auto all_tasks = context.tdb2.all_tasks (); auto all_tasks = Context::getContext ().tdb2.all_tasks ();
for (auto& i : all_tasks) for (auto& i : all_tasks)
{ {
payload += i.composeJSON () + '\n'; payload += i.composeJSON () + '\n';
@@ -143,7 +141,7 @@ int CmdSync::execute (std::string& output)
} }
else else
{ {
std::vector <std::string> lines = context.tdb2.backlog.get_lines (); std::vector <std::string> lines = Context::getContext ().tdb2.backlog.get_lines ();
for (auto& i : lines) for (auto& i : lines)
{ {
if (i[0] == '{') if (i[0] == '{')
@@ -169,7 +167,7 @@ int CmdSync::execute (std::string& output)
request.setPayload (payload); request.setPayload (payload);
if (context.verbose ("sync")) if (Context::getContext ().verbose ("sync"))
out << format ("Syncing with {1}", connection) out << format ("Syncing with {1}", connection)
<< '\n'; << '\n';
@@ -189,10 +187,10 @@ int CmdSync::execute (std::string& output)
{ {
Color colorAdded; Color colorAdded;
Color colorChanged; Color colorChanged;
if (context.color ()) if (Context::getContext ().color ())
{ {
colorAdded = Color (context.config.get ("color.sync.added")); colorAdded = Color (Context::getContext ().config.get ("color.sync.added"));
colorChanged = Color (context.config.get ("color.sync.changed")); colorChanged = Color (Context::getContext ().config.get ("color.sync.changed"));
} }
int download_count = 0; int download_count = 0;
@@ -203,7 +201,7 @@ int CmdSync::execute (std::string& output)
// the payload, so if there are two or more lines, then we have merging // the payload, so if there are two or more lines, then we have merging
// to perform, otherwise it's just a backlog.data update. // to perform, otherwise it's just a backlog.data update.
if (lines.size () > 1) if (lines.size () > 1)
context.tdb2.all_tasks (); Context::getContext ().tdb2.all_tasks ();
std::string sync_key = ""; std::string sync_key = "";
for (auto& line : lines) for (auto& line : lines)
@@ -217,33 +215,33 @@ int CmdSync::execute (std::string& output)
// Is it a new task from the server, or an update to an existing one? // Is it a new task from the server, or an update to an existing one?
Task dummy; Task dummy;
if (context.tdb2.get (uuid, dummy)) if (Context::getContext ().tdb2.get (uuid, dummy))
{ {
if (context.verbose ("sync")) if (Context::getContext ().verbose ("sync"))
out << " " out << " "
<< colorChanged.colorize ( << colorChanged.colorize (
format ("modify {1} '{2}'", format ("modify {1} '{2}'",
uuid, uuid,
from_server.get ("description"))) from_server.get ("description")))
<< '\n'; << '\n';
context.tdb2.modify (from_server, false); Context::getContext ().tdb2.modify (from_server, false);
} }
else else
{ {
if (context.verbose ("sync")) if (Context::getContext ().verbose ("sync"))
out << " " out << " "
<< colorAdded.colorize ( << colorAdded.colorize (
format (" add {1} '{2}'", format (" add {1} '{2}'",
uuid, uuid,
from_server.get ("description"))) from_server.get ("description")))
<< '\n'; << '\n';
context.tdb2.add (from_server, false); Context::getContext ().tdb2.add (from_server, false);
} }
} }
else if (line != "") else if (line != "")
{ {
sync_key = line; sync_key = line;
context.debug ("Sync key " + sync_key); Context::getContext ().debug ("Sync key " + sync_key);
} }
// Otherwise line is blank, so ignore it. // Otherwise line is blank, so ignore it.
@@ -254,46 +252,46 @@ int CmdSync::execute (std::string& output)
if (sync_key != "") if (sync_key != "")
{ {
// Truncate backlog.data, save new sync_key. // Truncate backlog.data, save new sync_key.
context.tdb2.backlog._file.truncate (); Context::getContext ().tdb2.backlog._file.truncate ();
context.tdb2.backlog.clear_tasks (); Context::getContext ().tdb2.backlog.clear_tasks ();
context.tdb2.backlog.clear_lines (); Context::getContext ().tdb2.backlog.clear_lines ();
context.tdb2.backlog.add_line (sync_key + '\n'); Context::getContext ().tdb2.backlog.add_line (sync_key + '\n');
// Present a clear status message. // Present a clear status message.
if (upload_count == 0 && download_count == 0) if (upload_count == 0 && download_count == 0)
// Note: should not happen - expect code 201 instead. // Note: should not happen - expect code 201 instead.
context.footnote ("Sync successful."); Context::getContext ().footnote ("Sync successful.");
else if (upload_count == 0 && download_count > 0) else if (upload_count == 0 && download_count > 0)
context.footnote (format ("Sync successful. {1} changes downloaded.", download_count)); Context::getContext ().footnote (format ("Sync successful. {1} changes downloaded.", download_count));
else if (upload_count > 0 && download_count == 0) else if (upload_count > 0 && download_count == 0)
context.footnote (format ("Sync successful. {1} changes uploaded.", upload_count)); Context::getContext ().footnote (format ("Sync successful. {1} changes uploaded.", upload_count));
else if (upload_count > 0 && download_count > 0) else if (upload_count > 0 && download_count > 0)
context.footnote (format ("Sync successful. {1} changes uploaded, {2} changes downloaded.", upload_count, download_count)); Context::getContext ().footnote (format ("Sync successful. {1} changes uploaded, {2} changes downloaded.", upload_count, download_count));
} }
status = 0; status = 0;
} }
else if (code == "201") else if (code == "201")
{ {
context.footnote ("Sync successful. No changes."); Context::getContext ().footnote ("Sync successful. No changes.");
status = 0; status = 0;
} }
else if (code == "301") else if (code == "301")
{ {
std::string new_server = response.get ("info"); std::string new_server = response.get ("info");
context.config.set ("taskd.server", new_server); Context::getContext ().config.set ("taskd.server", new_server);
context.error ("The server account has been relocated. Please update your configuration using:"); Context::getContext ().error ("The server account has been relocated. Please update your configuration using:");
context.error (" " + format ("task config taskd.server {1}", new_server)); Context::getContext ().error (" " + format ("task config taskd.server {1}", new_server));
status = 2; status = 2;
} }
else if (code == "430") else if (code == "430")
{ {
context.error ("Sync failed. Either your credentials are incorrect, or your account doesn't exist on the Taskserver."); Context::getContext ().error ("Sync failed. Either your credentials are incorrect, or your account doesn't exist on the Taskserver.");
status = 2; status = 2;
} }
else else
{ {
context.error (format ("Sync failed. The Taskserver returned error: {1} {2}", Context::getContext ().error (format ("Sync failed. The Taskserver returned error: {1} {2}",
code, code,
response.get ("status"))); response.get ("status")));
status = 2; status = 2;
@@ -303,10 +301,10 @@ int CmdSync::execute (std::string& output)
std::string to_be_displayed = response.get ("messages"); std::string to_be_displayed = response.get ("messages");
if (to_be_displayed != "") if (to_be_displayed != "")
{ {
if (context.verbose ("footnote")) if (Context::getContext ().verbose ("footnote"))
context.footnote (to_be_displayed); Context::getContext ().footnote (to_be_displayed);
else else
context.debug (to_be_displayed); Context::getContext ().debug (to_be_displayed);
} }
} }
@@ -319,11 +317,11 @@ int CmdSync::execute (std::string& output)
// - No signal/cable // - No signal/cable
else else
{ {
context.error ("Sync failed. Could not connect to the Taskserver."); Context::getContext ().error ("Sync failed. Could not connect to the Taskserver.");
status = 1; status = 1;
} }
if (context.verbose ("sync")) if (Context::getContext ().verbose ("sync"))
out << '\n'; out << '\n';
output = out.str (); output = out.str ();
@@ -365,10 +363,10 @@ bool CmdSync::send (
try try
{ {
TLSClient client; TLSClient client;
client.debug (context.config.getInteger ("debug.tls")); client.debug (Context::getContext ().config.getInteger ("debug.tls"));
client.trust (trust); client.trust (trust);
client.ciphers (context.config.get ("taskd.ciphers")); client.ciphers (Context::getContext ().config.get ("taskd.ciphers"));
client.init (ca, certificate, key); client.init (ca, certificate, key);
client.connect (server, port); client.connect (server, port);
client.send (request.serialize () + '\n'); client.send (request.serialize () + '\n');
@@ -383,7 +381,7 @@ bool CmdSync::send (
catch (std::string& error) catch (std::string& error)
{ {
context.error (error); Context::getContext ().error (error);
} }
// Indicate message failed. // Indicate message failed.

View File

@@ -35,8 +35,6 @@
#include <format.h> #include <format.h>
#include <util.h> #include <util.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdTags::CmdTags () CmdTags::CmdTags ()
{ {
@@ -60,10 +58,10 @@ int CmdTags::execute (std::string& output)
std::stringstream out; std::stringstream out;
// Get all the tasks. // Get all the tasks.
auto tasks = context.tdb2.pending.get_tasks (); auto tasks = Context::getContext ().tdb2.pending.get_tasks ();
if (context.config.getBoolean ("list.all.tags")) if (Context::getContext ().config.getBoolean ("list.all.tags"))
for (auto& task : context.tdb2.completed.get_tasks ()) for (auto& task : Context::getContext ().tdb2.completed.get_tasks ())
tasks.push_back (task); tasks.push_back (task);
int quantity = tasks.size (); int quantity = tasks.size ();
@@ -89,20 +87,20 @@ int CmdTags::execute (std::string& output)
{ {
// Render a list of tags names from the map. // Render a list of tags names from the map.
Table view; Table view;
view.width (context.getWidth ()); view.width (Context::getContext ().getWidth ());
view.add ("Tag"); view.add ("Tag");
view.add ("Count", false); view.add ("Count", false);
setHeaderUnderline (view); setHeaderUnderline (view);
Color bold; Color bold;
if (context.color ()) if (Context::getContext ().color ())
bold = Color ("bold"); bold = Color ("bold");
bool special = false; bool special = false;
for (auto& i : unique) for (auto& i : unique)
{ {
// Highlight the special tags. // Highlight the special tags.
special = (context.color () && special = (Context::getContext ().color () &&
(i.first == "nocolor" || (i.first == "nocolor" ||
i.first == "nonag" || i.first == "nonag" ||
i.first == "nocal" || i.first == "nocal" ||
@@ -118,20 +116,20 @@ int CmdTags::execute (std::string& output)
<< optionalBlankLine (); << optionalBlankLine ();
if (unique.size () == 1) if (unique.size () == 1)
context.footnote ("1 tag"); Context::getContext ().footnote ("1 tag");
else else
context.footnote (format ("{1} tags", unique.size ())); Context::getContext ().footnote (format ("{1} tags", unique.size ()));
if (quantity == 1) if (quantity == 1)
context.footnote ("(1 task)"); Context::getContext ().footnote ("(1 task)");
else else
context.footnote (format ("({1} tasks)", quantity)); Context::getContext ().footnote (format ("({1} tasks)", quantity));
out << '\n'; out << '\n';
} }
else else
{ {
context.footnote ("No tags."); Context::getContext ().footnote ("No tags.");
rc = 1; rc = 1;
} }
@@ -159,10 +157,10 @@ CmdCompletionTags::CmdCompletionTags ()
int CmdCompletionTags::execute (std::string& output) int CmdCompletionTags::execute (std::string& output)
{ {
// Get all the tasks. // Get all the tasks.
auto tasks = context.tdb2.pending.get_tasks (); auto tasks = Context::getContext ().tdb2.pending.get_tasks ();
if (context.config.getBoolean ("complete.all.tags")) if (Context::getContext ().config.getBoolean ("complete.all.tags"))
for (auto& task : context.tdb2.completed.get_tasks ()) for (auto& task : Context::getContext ().tdb2.completed.get_tasks ())
tasks.push_back (task); tasks.push_back (task);
// Apply filter. // Apply filter.

View File

@@ -37,8 +37,6 @@
#include <util.h> #include <util.h>
#include <format.h> #include <format.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdTimesheet::CmdTimesheet () CmdTimesheet::CmdTimesheet ()
{ {
@@ -62,7 +60,7 @@ int CmdTimesheet::execute (std::string& output)
// Detect a filter. // Detect a filter.
bool hasFilter {false}; bool hasFilter {false};
for (auto& a : context.cli2._args) for (auto& a : Context::getContext ().cli2._args)
{ {
if (a.hasTag ("FILTER")) if (a.hasTag ("FILTER"))
{ {
@@ -73,10 +71,10 @@ int CmdTimesheet::execute (std::string& output)
if (! hasFilter) if (! hasFilter)
{ {
auto defaultFilter = context.config.get ("report.timesheet.filter"); auto defaultFilter = Context::getContext ().config.get ("report.timesheet.filter");
if (defaultFilter == "") if (defaultFilter == "")
defaultFilter = "(+PENDING and start.after:now-4wks) or (+COMPLETED and end.after:now-4wks)"; defaultFilter = "(+PENDING and start.after:now-4wks) or (+COMPLETED and end.after:now-4wks)";
context.cli2.addFilter (defaultFilter); Context::getContext ().cli2.addFilter (defaultFilter);
} }
// Apply filter to get a set of tasks. // Apply filter to get a set of tasks.
@@ -115,8 +113,8 @@ int CmdTimesheet::execute (std::string& output)
// Render the completed table. // Render the completed table.
Table table; Table table;
table.width (context.getWidth ()); table.width (Context::getContext ().getWidth ());
if (context.config.getBoolean ("obfuscate")) if (Context::getContext ().config.getBoolean ("obfuscate"))
table.obfuscate (); table.obfuscate ();
table.add ("Wk"); table.add ("Wk");
table.add ("Date"); table.add ("Date");
@@ -127,7 +125,7 @@ int CmdTimesheet::execute (std::string& output)
table.add ("Task"); table.add ("Task");
setHeaderUnderline (table); setHeaderUnderline (table);
auto dateformat = context.config.get ("dateformat"); auto dateformat = Context::getContext ().config.get ("dateformat");
int previous_week = -1; int previous_week = -1;
std::string previous_date = ""; std::string previous_date = "";
@@ -189,7 +187,7 @@ int CmdTimesheet::execute (std::string& output)
<< table.render () << table.render ()
<< '\n'; << '\n';
if (context.verbose ("affected")) if (Context::getContext ().verbose ("affected"))
out << format ("{1} completed, {2} started.", num_completed, num_started) out << format ("{1} completed, {2} started.", num_completed, num_started)
<< '\n'; << '\n';

View File

@@ -36,8 +36,6 @@
#include <shared.h> #include <shared.h>
#include <util.h> #include <util.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdUDAs::CmdUDAs () CmdUDAs::CmdUDAs ()
{ {
@@ -61,7 +59,7 @@ int CmdUDAs::execute (std::string& output)
std::stringstream out; std::stringstream out;
std::vector <std::string> udas; std::vector <std::string> udas;
for (auto& name : context.config) for (auto& name : Context::getContext ().config)
{ {
if (name.first.substr (0, 4) == "uda." && if (name.first.substr (0, 4) == "uda." &&
name.first.find (".type") != std::string::npos) name.first.find (".type") != std::string::npos)
@@ -84,7 +82,7 @@ int CmdUDAs::execute (std::string& output)
// Render a list of UDA name, type, label, allowed values, // Render a list of UDA name, type, label, allowed values,
// possible default value, and finally the usage count. // possible default value, and finally the usage count.
Table table; Table table;
table.width (context.getWidth ()); table.width (Context::getContext ().getWidth ());
table.add ("Name"); table.add ("Name");
table.add ("Type"); table.add ("Type");
table.add ("Label"); table.add ("Label");
@@ -95,10 +93,10 @@ int CmdUDAs::execute (std::string& output)
for (auto& uda : udas) for (auto& uda : udas)
{ {
std::string type = context.config.get ("uda." + uda + ".type"); std::string type = Context::getContext ().config.get ("uda." + uda + ".type");
std::string label = context.config.get ("uda." + uda + ".label"); std::string label = Context::getContext ().config.get ("uda." + uda + ".label");
std::string values = context.config.get ("uda." + uda + ".values"); std::string values = Context::getContext ().config.get ("uda." + uda + ".values");
std::string defval = context.config.get ("uda." + uda + ".default"); std::string defval = Context::getContext ().config.get ("uda." + uda + ".default");
if (label == "") if (label == "")
label = uda; label = uda;
@@ -137,7 +135,7 @@ int CmdUDAs::execute (std::string& output)
{ {
for (auto& att : i.data) for (auto& att : i.data)
if (att.first.substr (0, 11) != "annotation_" && if (att.first.substr (0, 11) != "annotation_" &&
context.columns.find (att.first) == context.columns.end ()) Context::getContext ().columns.find (att.first) == Context::getContext ().columns.end ())
orphans[att.first]++; orphans[att.first]++;
} }
@@ -145,7 +143,7 @@ int CmdUDAs::execute (std::string& output)
{ {
// Display the orphans and their counts. // Display the orphans and their counts.
Table orphanTable; Table orphanTable;
orphanTable.width (context.getWidth ()); orphanTable.width (Context::getContext ().getWidth ());
orphanTable.add ("Orphan UDA"); orphanTable.add ("Orphan UDA");
orphanTable.add ("Usage Count"); orphanTable.add ("Usage Count");
setHeaderUnderline (orphanTable); setHeaderUnderline (orphanTable);
@@ -190,7 +188,7 @@ CmdCompletionUDAs::CmdCompletionUDAs ()
int CmdCompletionUDAs::execute (std::string& output) int CmdCompletionUDAs::execute (std::string& output)
{ {
std::vector <std::string> udas; std::vector <std::string> udas;
for (auto& name : context.config) for (auto& name : Context::getContext ().config)
{ {
if (name.first.substr (0, 4) == "uda." && if (name.first.substr (0, 4) == "uda." &&
name.first.find (".type") != std::string::npos) name.first.find (".type") != std::string::npos)

View File

@@ -28,8 +28,6 @@
#include <CmdUndo.h> #include <CmdUndo.h>
#include <Context.h> #include <Context.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdUndo::CmdUndo () CmdUndo::CmdUndo ()
{ {
@@ -49,7 +47,7 @@ CmdUndo::CmdUndo ()
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int CmdUndo::execute (std::string&) int CmdUndo::execute (std::string&)
{ {
context.tdb2.revert (); Context::getContext ().tdb2.revert ();
return 0; return 0;
} }

View File

@@ -32,8 +32,6 @@
#include <Filter.h> #include <Filter.h>
#include <format.h> #include <format.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdUnique::CmdUnique () CmdUnique::CmdUnique ()
{ {
@@ -63,13 +61,13 @@ int CmdUnique::execute (std::string& output)
std::string attribute {}; std::string attribute {};
// Just the first arg. // Just the first arg.
auto words = context.cli2.getWords (); auto words = Context::getContext ().cli2.getWords ();
if (words.size () == 0) if (words.size () == 0)
throw std::string ("An attribute must be specified. See 'task _columns'."); throw std::string ("An attribute must be specified. See 'task _columns'.");
attribute = words[0]; attribute = words[0];
std::string canonical; std::string canonical;
if (! context.cli2.canonicalize (canonical, "attribute", attribute)) if (! Context::getContext ().cli2.canonicalize (canonical, "attribute", attribute))
throw std::string ("You must specify an attribute or UDA."); throw std::string ("You must specify an attribute or UDA.");
// Find the unique set of matching tasks. // Find the unique set of matching tasks.
@@ -92,7 +90,7 @@ int CmdUnique::execute (std::string& output)
for (auto& value : values) for (auto& value : values)
output += value + '\n'; output += value + '\n';
context.headers.clear (); Context::getContext ().headers.clear ();
return 0; return 0;
} }

View File

@@ -34,8 +34,6 @@
#include <main.h> #include <main.h>
#include <format.h> #include <format.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdUrgency::CmdUrgency () CmdUrgency::CmdUrgency ()
{ {
@@ -62,7 +60,7 @@ int CmdUrgency::execute (std::string& output)
if (filtered.size () == 0) if (filtered.size () == 0)
{ {
context.footnote ("No tasks specified."); Context::getContext ().footnote ("No tasks specified.");
return 1; return 1;
} }

View File

@@ -36,8 +36,6 @@
#include <shared.h> #include <shared.h>
#include <format.h> #include <format.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
CmdVersion::CmdVersion () CmdVersion::CmdVersion ()
{ {
@@ -60,7 +58,7 @@ int CmdVersion::execute (std::string& output)
std::stringstream out; std::stringstream out;
// Create a table for the disclaimer. // Create a table for the disclaimer.
int width = context.getWidth (); int width = Context::getContext ().getWidth ();
Table disclaimer; Table disclaimer;
disclaimer.width (width); disclaimer.width (width);
disclaimer.add (""); disclaimer.add ("");
@@ -73,7 +71,7 @@ int CmdVersion::execute (std::string& output)
link.set (link.addRow (), 0, "Documentation for Taskwarrior can be found using 'man task', 'man taskrc', 'man task-color', 'man task-sync' or at http://taskwarrior.org"); link.set (link.addRow (), 0, "Documentation for Taskwarrior can be found using 'man task', 'man taskrc', 'man task-color', 'man task-sync' or at http://taskwarrior.org");
Color bold; Color bold;
if (context.color ()) if (Context::getContext ().color ())
bold = Color ("bold"); bold = Color ("bold");
out << '\n' out << '\n'

View File

@@ -90,8 +90,6 @@
#include <ColProject.h> #include <ColProject.h>
#include <ColDue.h> #include <ColDue.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
void Command::factory (std::map <std::string, Command*>& all) void Command::factory (std::map <std::string, Command*>& all)
{ {
@@ -174,7 +172,7 @@ void Command::factory (std::map <std::string, Command*>& all)
// Instantiate a command object for each custom report. // Instantiate a command object for each custom report.
std::vector <std::string> reports; std::vector <std::string> reports;
for (auto &i : context.config) for (auto &i : Context::getContext ().config)
{ {
if (i.first.substr (0, 7) == "report.") if (i.first.substr (0, 7) == "report.")
{ {
@@ -194,7 +192,7 @@ void Command::factory (std::map <std::string, Command*>& all)
c = new CmdCustom ( c = new CmdCustom (
report, report,
"task <filter> " + report, "task <filter> " + report,
context.config.get ("report." + report + ".description")); Context::getContext ().config.get ("report." + report + ".description"));
all[c->keyword ()] = c; all[c->keyword ()] = c;
} }
@@ -334,8 +332,8 @@ bool Command::permission (
// What remains are write commands that have not yet selected 'all' or 'quit'. // What remains are write commands that have not yet selected 'all' or 'quit'.
// Describe the task. // Describe the task.
bool confirmation = context.config.getBoolean ("confirmation"); bool confirmation = Context::getContext ().config.getBoolean ("confirmation");
unsigned int bulk = context.config.getInteger ("bulk"); unsigned int bulk = Context::getContext ().config.getInteger ("bulk");
// Quantity 1 modifications have optional confirmation, and only (y/n). // Quantity 1 modifications have optional confirmation, and only (y/n).
if (quantity == 1) if (quantity == 1)
@@ -353,7 +351,7 @@ bool Command::permission (
if ((bulk == 0 || quantity < bulk) && (!_needs_confirm || !confirmation)) if ((bulk == 0 || quantity < bulk) && (!_needs_confirm || !confirmation))
return true; return true;
if (context.verbose ("blank") && !_first_iteration) if (Context::getContext ().verbose ("blank") && !_first_iteration)
std::cout << '\n'; std::cout << '\n';
int answer = confirm4 (question); int answer = confirm4 (question);
_first_iteration = false; _first_iteration = false;

View File

@@ -36,15 +36,13 @@
#define STRING_DEPEND_BLOCKED "Task {1} is blocked by:" #define STRING_DEPEND_BLOCKED "Task {1} is blocked by:"
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
std::vector <Task> dependencyGetBlocked (const Task& task) std::vector <Task> dependencyGetBlocked (const Task& task)
{ {
auto uuid = task.get ("uuid"); auto uuid = task.get ("uuid");
std::vector <Task> blocked; std::vector <Task> blocked;
for (auto& it : context.tdb2.pending.get_tasks ()) for (auto& it : Context::getContext ().tdb2.pending.get_tasks ())
if (it.getStatus () != Task::completed && if (it.getStatus () != Task::completed &&
it.getStatus () != Task::deleted && it.getStatus () != Task::deleted &&
it.has ("depends") && it.has ("depends") &&
@@ -61,7 +59,7 @@ std::vector <Task> dependencyGetBlocking (const Task& task)
std::vector <Task> blocking; std::vector <Task> blocking;
if (depends != "") if (depends != "")
for (auto& it : context.tdb2.pending.get_tasks ()) for (auto& it : Context::getContext ().tdb2.pending.get_tasks ())
if (it.getStatus () != Task::completed && if (it.getStatus () != Task::completed &&
it.getStatus () != Task::deleted && it.getStatus () != Task::deleted &&
depends.find (it.get ("uuid")) != std::string::npos) depends.find (it.get ("uuid")) != std::string::npos)
@@ -95,7 +93,7 @@ bool dependencyIsCircular (const Task& task)
// fact that we do not visit any task twice // fact that we do not visit any task twice
for (unsigned int i = 0; i < deps_current.size (); i++) for (unsigned int i = 0; i < deps_current.size (); i++)
{ {
if (context.tdb2.get (deps_current[i], current)) if (Context::getContext ().tdb2.get (deps_current[i], current))
{ {
auto current_uuid = current.get ("uuid"); auto current_uuid = current.get ("uuid");
@@ -160,7 +158,7 @@ void dependencyChainOnComplete (Task& task)
auto blocked = dependencyGetBlocked (task); auto blocked = dependencyGetBlocked (task);
// Nag about broken chain. // Nag about broken chain.
if (context.config.getBoolean ("dependency.reminder")) if (Context::getContext ().config.getBoolean ("dependency.reminder"))
{ {
std::cout << format (STRING_DEPEND_BLOCKED, task.identifier ()) std::cout << format (STRING_DEPEND_BLOCKED, task.identifier ())
<< '\n'; << '\n';
@@ -172,7 +170,7 @@ void dependencyChainOnComplete (Task& task)
// If there are both blocking and blocked tasks, the chain is broken. // If there are both blocking and blocked tasks, the chain is broken.
if (blocked.size ()) if (blocked.size ())
{ {
if (context.config.getBoolean ("dependency.reminder")) if (Context::getContext ().config.getBoolean ("dependency.reminder"))
{ {
std::cout << "and is blocking:\n"; std::cout << "and is blocking:\n";
@@ -180,7 +178,7 @@ void dependencyChainOnComplete (Task& task)
std::cout << " " << b.id << ' ' << b.get ("description") << '\n'; std::cout << " " << b.id << ' ' << b.get ("description") << '\n';
} }
if (!context.config.getBoolean ("dependency.confirmation") || if (!Context::getContext ().config.getBoolean ("dependency.confirmation") ||
confirm ("Would you like the dependency chain fixed?")) confirm ("Would you like the dependency chain fixed?"))
{ {
// Repair the chain - everything in blocked should now depend on // Repair the chain - everything in blocked should now depend on
@@ -195,10 +193,10 @@ void dependencyChainOnComplete (Task& task)
// Now update TDB2, now that the updates have all occurred. // Now update TDB2, now that the updates have all occurred.
for (auto& left : blocked) for (auto& left : blocked)
context.tdb2.modify (left); Context::getContext ().tdb2.modify (left);
for (auto& right : blocking) for (auto& right : blocking)
context.tdb2.modify (right); Context::getContext ().tdb2.modify (right);
} }
} }
} }
@@ -207,7 +205,7 @@ void dependencyChainOnComplete (Task& task)
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
void dependencyChainOnStart (Task& task) void dependencyChainOnStart (Task& task)
{ {
if (context.config.getBoolean ("dependency.reminder")) if (Context::getContext ().config.getBoolean ("dependency.reminder"))
{ {
auto blocking = dependencyGetBlocking (task); auto blocking = dependencyGetBlocking (task);

View File

@@ -40,8 +40,6 @@
#include <shared.h> #include <shared.h>
#include <format.h> #include <format.h>
extern Context context;
static void countTasks (const std::vector <Task>&, const std::string&, int&, int&); static void countTasks (const std::vector <Task>&, const std::string&, int&, int&);
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -242,16 +240,16 @@ std::string taskInfoDifferences (
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
std::string renderAttribute (const std::string& name, const std::string& value, const std::string& format /* = "" */) std::string renderAttribute (const std::string& name, const std::string& value, const std::string& format /* = "" */)
{ {
if (context.columns.find (name) != context.columns.end ()) if (Context::getContext ().columns.find (name) != Context::getContext ().columns.end ())
{ {
Column* col = context.columns[name]; Column* col = Context::getContext ().columns[name];
if (col && if (col &&
col->type () == "date" && col->type () == "date" &&
value != "") value != "")
{ {
Datetime d ((time_t)strtol (value.c_str (), NULL, 10)); Datetime d ((time_t)strtol (value.c_str (), NULL, 10));
if (format == "") if (format == "")
return d.toString (context.config.get ("dateformat")); return d.toString (Context::getContext ().config.get ("dateformat"));
return d.toString (format); return d.toString (format);
} }
@@ -265,7 +263,7 @@ std::string renderAttribute (const std::string& name, const std::string& value,
// <string> // <string>
void feedback_affected (const std::string& effect) void feedback_affected (const std::string& effect)
{ {
if (context.verbose ("affected")) if (Context::getContext ().verbose ("affected"))
std::cout << effect << "\n"; std::cout << effect << "\n";
} }
@@ -277,7 +275,7 @@ void feedback_affected (const std::string& effect)
// {1} Quantity // {1} Quantity
void feedback_affected (const std::string& effect, int quantity) void feedback_affected (const std::string& effect, int quantity)
{ {
if (context.verbose ("affected")) if (Context::getContext ().verbose ("affected"))
std::cout << format (effect, quantity) std::cout << format (effect, quantity)
<< "\n"; << "\n";
} }
@@ -291,7 +289,7 @@ void feedback_affected (const std::string& effect, int quantity)
// {2} Description // {2} Description
void feedback_affected (const std::string& effect, const Task& task) void feedback_affected (const std::string& effect, const Task& task)
{ {
if (context.verbose ("affected")) if (Context::getContext ().verbose ("affected"))
{ {
std::cout << format (effect, std::cout << format (effect,
task.identifier (true), task.identifier (true),
@@ -346,7 +344,7 @@ void feedback_reserved_tags (const std::string& tag)
// Implements feedback when adding special tags to a task. // Implements feedback when adding special tags to a task.
void feedback_special_tags (const Task& task, const std::string& tag) void feedback_special_tags (const Task& task, const std::string& tag)
{ {
if (context.verbose ("special")) if (Context::getContext ().verbose ("special"))
{ {
std::string msg; std::string msg;
std::string explanation; std::string explanation;
@@ -372,7 +370,7 @@ void feedback_special_tags (const Task& task, const std::string& tag)
// Unblocked <id> '<description>' // Unblocked <id> '<description>'
void feedback_unblocked (const Task& task) void feedback_unblocked (const Task& task)
{ {
if (context.verbose ("affected")) if (Context::getContext ().verbose ("affected"))
{ {
// Get a list of tasks that depended on this task. // Get a list of tasks that depended on this task.
auto blocked = dependencyGetBlocked (task); auto blocked = dependencyGetBlocked (task);
@@ -404,18 +402,18 @@ void feedback_unblocked (const Task& task)
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
void feedback_backlog () void feedback_backlog ()
{ {
if (context.config.get ("taskd.server") != "" && if (Context::getContext ().config.get ("taskd.server") != "" &&
context.verbose ("sync")) Context::getContext ().verbose ("sync"))
{ {
int count = 0; int count = 0;
std::vector <std::string> lines = context.tdb2.backlog.get_lines (); std::vector <std::string> lines = Context::getContext ().tdb2.backlog.get_lines ();
for (auto& line : lines) for (auto& line : lines)
if ((line)[0] == '{') if ((line)[0] == '{')
++count; ++count;
if (count) if (count)
context.footnote (format (count > 1 ? "There are {1} local changes. Sync required." Context::getContext ().footnote (format (count > 1 ? "There are {1} local changes. Sync required."
: "There is {1} local change. Sync required.", count)); : "There is {1} local change. Sync required.", count));
} }
} }
@@ -434,7 +432,7 @@ std::string onProjectChange (Task& task, bool scope /* = true */)
// Count pending and done tasks, for this project. // Count pending and done tasks, for this project.
int count_pending = 0; int count_pending = 0;
int count_done = 0; int count_done = 0;
std::vector <Task> all = context.tdb2.all_tasks (); std::vector <Task> all = Context::getContext ().tdb2.all_tasks ();
countTasks (all, project, count_pending, count_done); countTasks (all, project, count_pending, count_done);
// count_done count_pending percentage // count_done count_pending percentage
@@ -483,7 +481,7 @@ std::string onExpiration (Task& task)
{ {
std::stringstream msg; std::stringstream msg;
if (context.verbose ("affected")) if (Context::getContext ().verbose ("affected"))
msg << format ("Task {1} '{2}' expired and was deleted.", msg << format ("Task {1} '{2}' expired and was deleted.",
task.identifier (true), task.identifier (true),
task.get ("description")); task.get ("description"));

View File

@@ -32,8 +32,6 @@
#define STRING_LEGACY_PRIORITY "Legacy attribute found. Please change '{1}' to '{2}'." #define STRING_LEGACY_PRIORITY "Legacy attribute found. Please change '{1}' to '{2}'."
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
void legacyColumnMap (std::string& name) void legacyColumnMap (std::string& name)
{ {
@@ -57,7 +55,7 @@ void legacyColumnMap (std::string& name)
auto found = legacyMap.find (name); auto found = legacyMap.find (name);
if (found != legacyMap.end ()) if (found != legacyMap.end ())
{ {
context.footnote (format (STRING_LEGACY_PRIORITY, name, found->second)); Context::getContext ().footnote (format (STRING_LEGACY_PRIORITY, name, found->second));
name = found->second; name = found->second;
} }
} }
@@ -85,7 +83,7 @@ void legacySortColumnMap (std::string& name)
auto found = legacyMap.find (name); auto found = legacyMap.find (name);
if (found != legacyMap.end ()) if (found != legacyMap.end ())
{ {
context.footnote (format (STRING_LEGACY_PRIORITY, name, found->second)); Context::getContext ().footnote (format (STRING_LEGACY_PRIORITY, name, found->second));
name = found->second; name = found->second;
} }
} }
@@ -94,7 +92,7 @@ void legacySortColumnMap (std::string& name)
std::string legacyCheckForDeprecatedVariables () std::string legacyCheckForDeprecatedVariables ()
{ {
std::vector <std::string> deprecated; std::vector <std::string> deprecated;
for (auto& it : context.config) for (auto& it : Context::getContext ().config)
{ {
// 2014-07-04: report.*.limit removed. // 2014-07-04: report.*.limit removed.
// 2016-02-24: alias._query removed. // 2016-02-24: alias._query removed.
@@ -135,12 +133,12 @@ std::string legacyCheckForDeprecatedVariables ()
std::string legacyCheckForDeprecatedColumns () std::string legacyCheckForDeprecatedColumns ()
{ {
std::vector <std::string> deprecated; std::vector <std::string> deprecated;
for (auto& it : context.config) for (auto& it : Context::getContext ().config)
{ {
if (it.first.find ("report") == 0) if (it.first.find ("report") == 0)
{ {
// Deprecated in 2.0.0 // Deprecated in 2.0.0
std::string value = context.config.get (it.first); std::string value = Context::getContext ().config.get (it.first);
if (value.find ("entry_time") != std::string::npos || if (value.find ("entry_time") != std::string::npos ||
value.find ("start_time") != std::string::npos || value.find ("start_time") != std::string::npos ||
value.find ("end_time") != std::string::npos) value.find ("end_time") != std::string::npos)
@@ -156,7 +154,7 @@ std::string legacyCheckForDeprecatedColumns ()
out << "Your .taskrc file contains reports with deprecated columns. Please check for entry_time, start_time or end_time in:\n"; out << "Your .taskrc file contains reports with deprecated columns. Please check for entry_time, start_time or end_time in:\n";
for (const auto& dep : deprecated) for (const auto& dep : deprecated)
out << " " << dep << "=" << context.config.get (dep) << "\n"; out << " " << dep << "=" << Context::getContext ().config.get (dep) << "\n";
out << "\n"; out << "\n";
} }

View File

@@ -30,13 +30,14 @@
#include <cstring> #include <cstring>
#include <Context.h> #include <Context.h>
Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int main (int argc, const char** argv) int main (int argc, const char** argv)
{ {
int status {0}; int status {0};
Context globalContext;
Context::setContext (&globalContext);
// Lightweight version checking that doesn't require initialization or any I/O. // Lightweight version checking that doesn't require initialization or any I/O.
if (argc == 2 && !strcmp (argv[1], "--version")) if (argc == 2 && !strcmp (argv[1], "--version"))
{ {
@@ -46,9 +47,9 @@ int main (int argc, const char** argv)
{ {
try try
{ {
status = context.initialize (argc, argv); status = Context::getContext ().initialize (argc, argv);
if (status == 0) if (status == 0)
status = context.run (); status = Context::getContext ().run ();
} }
catch (const std::string& error) catch (const std::string& error)

View File

@@ -27,8 +27,6 @@
#include <cmake.h> #include <cmake.h>
#include <Context.h> #include <Context.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Returns a Boolean indicator as to whether a nag message was generated, so // Returns a Boolean indicator as to whether a nag message was generated, so
// that commands can control the number of nag messages displayed (ie one is // that commands can control the number of nag messages displayed (ie one is
@@ -42,18 +40,18 @@ bool nag (Task& task)
if (task.hasTag ("nonag")) if (task.hasTag ("nonag"))
return false; return false;
auto msg = context.config.get ("nag"); auto msg = Context::getContext ().config.get ("nag");
if (msg != "") if (msg != "")
{ {
// Scan all pending, non-recurring tasks. // Scan all pending, non-recurring tasks.
auto pending = context.tdb2.pending.get_tasks (); auto pending = Context::getContext ().tdb2.pending.get_tasks ();
for (auto& t : pending) for (auto& t : pending)
{ {
if ((t.getStatus () == Task::pending || if ((t.getStatus () == Task::pending ||
t.getStatus () == Task::waiting) && t.getStatus () == Task::waiting) &&
t.urgency () > task.urgency ()) t.urgency () > task.urgency ())
{ {
context.footnote (msg); Context::getContext ().footnote (msg);
return true; return true;
} }
} }

View File

@@ -46,9 +46,6 @@
#include <util.h> #include <util.h>
#include <main.h> #include <main.h>
// Global context for use by all.
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Scans all tasks, and for any recurring tasks, determines whether any new // Scans all tasks, and for any recurring tasks, determines whether any new
// child tasks need to be generated to fill gaps. // child tasks need to be generated to fill gaps.
@@ -61,10 +58,10 @@ void handleRecurrence ()
// Recurrence can be disabled. // Recurrence can be disabled.
// Note: This is currently a workaround for TD-44, TW-1520. // Note: This is currently a workaround for TD-44, TW-1520.
if (! context.config.getBoolean ("recurrence")) if (! Context::getContext ().config.getBoolean ("recurrence"))
return; return;
auto tasks = context.tdb2.pending.get_tasks (); auto tasks = Context::getContext ().tdb2.pending.get_tasks ();
Datetime now; Datetime now;
// Look at all tasks and find any recurring ones. // Look at all tasks and find any recurring ones.
@@ -79,8 +76,8 @@ void handleRecurrence ()
{ {
// Determine the end date. // Determine the end date.
t.setStatus (Task::deleted); t.setStatus (Task::deleted);
context.tdb2.modify (t); Context::getContext ().tdb2.modify (t);
context.footnote (onExpiration (t)); Context::getContext ().footnote (onExpiration (t));
continue; continue;
} }
@@ -98,7 +95,7 @@ void handleRecurrence ()
Task rec (t); // Clone the parent. Task rec (t); // Clone the parent.
rec.setStatus (Task::pending); // Change the status. rec.setStatus (Task::pending); // Change the status.
rec.id = context.tdb2.next_id (); // New ID. rec.id = Context::getContext ().tdb2.next_id (); // New ID.
rec.set ("uuid", uuid ()); // New UUID. rec.set ("uuid", uuid ()); // New UUID.
rec.set ("parent", t.get ("uuid")); // Remember mom. rec.set ("parent", t.get ("uuid")); // Remember mom.
rec.setAsNow ("entry"); // New entry date. rec.setAsNow ("entry"); // New entry date.
@@ -123,7 +120,7 @@ void handleRecurrence ()
rec.remove ("mask"); // Remove the mask of the parent. rec.remove ("mask"); // Remove the mask of the parent.
// Add the new task to the DB. // Add the new task to the DB.
context.tdb2.add (rec); Context::getContext ().tdb2.add (rec);
} }
++i; ++i;
@@ -133,10 +130,10 @@ void handleRecurrence ()
if (changed) if (changed)
{ {
t.set ("mask", mask); t.set ("mask", mask);
context.tdb2.modify (t); Context::getContext ().tdb2.modify (t);
if (context.verbose ("recur")) if (Context::getContext ().verbose ("recur"))
context.footnote (format ("Creating recurring task instance '{1}'", t.get ("description"))); Context::getContext ().footnote (format ("Creating recurring task instance '{1}'", t.get ("description")));
} }
} }
} }
@@ -164,7 +161,7 @@ bool generateDueDates (Task& parent, std::vector <Datetime>& allDue)
specificEnd = true; specificEnd = true;
} }
auto recurrence_limit = context.config.getInteger ("recurrence.limit"); auto recurrence_limit = Context::getContext ().config.getInteger ("recurrence.limit");
int recurrence_counter = 0; int recurrence_counter = 0;
Datetime now; Datetime now;
for (Datetime i = due; ; i = getNextRecurrence (i, recur)) for (Datetime i = due; ; i = getNextRecurrence (i, recur))
@@ -375,7 +372,7 @@ void updateRecurrenceMask (Task& task)
Task parent; Task parent;
if (uuid != "" && if (uuid != "" &&
context.tdb2.get (uuid, parent)) Context::getContext ().tdb2.get (uuid, parent))
{ {
unsigned int index = strtol (task.get ("imask").c_str (), NULL, 10); unsigned int index = strtol (task.get ("imask").c_str (), NULL, 10);
auto mask = parent.get ("mask"); auto mask = parent.get ("mask");
@@ -401,7 +398,7 @@ void updateRecurrenceMask (Task& task)
} }
parent.set ("mask", mask); parent.set ("mask", mask);
context.tdb2.modify (parent); Context::getContext ().tdb2.modify (parent);
} }
} }

View File

@@ -32,8 +32,6 @@
#include <unicode.h> #include <unicode.h>
#include <main.h> #include <main.h>
extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Checklist: // Checklist:
// - last: Most recently generated instance integer. The first instance // - last: Most recently generated instance integer. The first instance
@@ -73,7 +71,7 @@ static Datetime generateNextDueDate (
Duration dur (period); Duration dur (period);
auto normalized = dur.formatISO (); auto normalized = dur.formatISO ();
context.debug (" period " + period + " --> " + normalized); Context::getContext ().debug (" period " + period + " --> " + normalized);
if (! dur._year && if (! dur._year &&
dur._month && dur._month &&
@@ -271,13 +269,13 @@ static std::vector <Datetime> generateAllDueDates (const Task& templateTask)
// Determine due date, recur period and until date. // Determine due date, recur period and until date.
Datetime due (templateTask.get_date ("due")); Datetime due (templateTask.get_date ("due"));
context.debug (" due " + due.toISOLocalExtended ()); Context::getContext ().debug (" due " + due.toISOLocalExtended ());
auto recur = templateTask.get ("recur"); auto recur = templateTask.get ("recur");
context.debug (" recur " + recur); Context::getContext ().debug (" recur " + recur);
auto lastN = std::max (1, templateTask.get_int ("last")); auto lastN = std::max (1, templateTask.get_int ("last"));
context.debug (format (" last {1}", lastN)); Context::getContext ().debug (format (" last {1}", lastN));
bool end_in_sight = false; bool end_in_sight = false;
Datetime until; Datetime until;
@@ -285,11 +283,11 @@ static std::vector <Datetime> generateAllDueDates (const Task& templateTask)
{ {
until = Datetime (templateTask.get ("until")); until = Datetime (templateTask.get ("until"));
end_in_sight = true; end_in_sight = true;
context.debug (" until " + until.toISOLocalExtended ()); Context::getContext ().debug (" until " + until.toISOLocalExtended ());
} }
auto recurrence_limit = context.config.getInteger ("recurrence.limit"); auto recurrence_limit = Context::getContext ().config.getInteger ("recurrence.limit");
context.debug (format (" recurrence.limit {1}", recurrence_limit)); Context::getContext ().debug (format (" recurrence.limit {1}", recurrence_limit));
int recurrence_counter = 0; int recurrence_counter = 0;
Datetime now; Datetime now;
@@ -321,8 +319,8 @@ static std::vector <Datetime> generateAllDueDates (const Task& templateTask)
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
static void synthesizeTasks (const Task& templateTask) static void synthesizeTasks (const Task& templateTask)
{ {
context.debug ("synthesizeTasks start"); Context::getContext ().debug ("synthesizeTasks start");
context.debug (" template " + templateTask.get ("uuid")); Context::getContext ().debug (" template " + templateTask.get ("uuid"));
// TODO 'due' = starting point // TODO 'due' = starting point
// TODO 'recur' = frequency // TODO 'recur' = frequency
@@ -330,11 +328,11 @@ static void synthesizeTasks (const Task& templateTask)
auto all = generateAllDueDates (templateTask); auto all = generateAllDueDates (templateTask);
for (auto& date : all) for (auto& date : all)
context.debug (" date " + date.toISOLocalExtended ()); Context::getContext ().debug (" date " + date.toISOLocalExtended ());
// TODO Create task instances for each period between N and now. // TODO Create task instances for each period between N and now.
context.debug ("synthesizeTasks end"); Context::getContext ().debug ("synthesizeTasks end");
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -342,8 +340,8 @@ static void synthesizeTasks (const Task& templateTask)
void handleRecurrence2 () void handleRecurrence2 ()
{ {
// Note: Disabling recurrence is currently a workaround for TD-44, TW-1520. // Note: Disabling recurrence is currently a workaround for TD-44, TW-1520.
if (context.config.getBoolean ("recurrence")) if (Context::getContext ().config.getBoolean ("recurrence"))
for (auto& t : context.tdb2.pending.get_tasks ()) for (auto& t : Context::getContext ().tdb2.pending.get_tasks ())
if (t.getStatus () == Task::recurring) if (t.getStatus () == Task::recurring)
synthesizeTasks (t); synthesizeTasks (t);
} }
@@ -353,7 +351,7 @@ void handleRecurrence2 ()
void handleUntil () void handleUntil ()
{ {
Datetime now; Datetime now;
auto tasks = context.tdb2.pending.get_tasks (); auto tasks = Context::getContext ().tdb2.pending.get_tasks ();
for (auto& t : tasks) for (auto& t : tasks)
{ {
// TODO What about expiring template tasks? // TODO What about expiring template tasks?
@@ -363,10 +361,10 @@ void handleUntil ()
auto until = Datetime (t.get_date ("until")); auto until = Datetime (t.get_date ("until"));
if (until < now) if (until < now)
{ {
context.debug (format ("handleUntil: recurrence expired until {1} < now {2}", until.toISOLocalExtended (), now.toISOLocalExtended ())); Context::getContext ().debug (format ("handleUntil: recurrence expired until {1} < now {2}", until.toISOLocalExtended (), now.toISOLocalExtended ()));
t.setStatus (Task::deleted); t.setStatus (Task::deleted);
context.tdb2.modify(t); Context::getContext ().tdb2.modify(t);
context.footnote (onExpiration (t)); Context::getContext ().footnote (onExpiration (t));
} }
} }
} }

View File

@@ -31,8 +31,6 @@
#include <shared.h> #include <shared.h>
#include <main.h> #include <main.h>
extern Context context;
static std::map <std::string, Color> gsColor; static std::map <std::string, Color> gsColor;
static std::vector <std::string> gsPrecedence; static std::vector <std::string> gsPrecedence;
static Datetime now; static Datetime now;
@@ -41,7 +39,7 @@ static Datetime now;
void initializeColorRules () void initializeColorRules ()
{ {
// If color is not enable/supported, short circuit. // If color is not enable/supported, short circuit.
if (! context.color ()) if (! Context::getContext ().color ())
return; return;
try try
@@ -52,7 +50,7 @@ void initializeColorRules ()
// Load all the configuration values, filter to only the ones that begin with // Load all the configuration values, filter to only the ones that begin with
// "color.", then store name/value in gsColor, and name in rules. // "color.", then store name/value in gsColor, and name in rules.
std::vector <std::string> rules; std::vector <std::string> rules;
for (const auto& v : context.config) for (const auto& v : Context::getContext ().config)
{ {
if (! v.first.compare (0, 6, "color.", 6)) if (! v.first.compare (0, 6, "color.", 6))
{ {
@@ -66,7 +64,7 @@ void initializeColorRules ()
// Load the rule.precedence.color list, split it, then autocomplete against // Load the rule.precedence.color list, split it, then autocomplete against
// the 'rules' vector loaded above. // the 'rules' vector loaded above.
std::vector <std::string> results; std::vector <std::string> results;
auto precedence = split (context.config.get ("rule.precedence.color"), ','); auto precedence = split (Context::getContext ().config.get ("rule.precedence.color"), ',');
for (const auto& p : precedence) for (const auto& p : precedence)
{ {
@@ -81,7 +79,7 @@ void initializeColorRules ()
catch (const std::string& e) catch (const std::string& e)
{ {
context.error (e); Context::getContext ().error (e);
} }
} }
@@ -149,7 +147,7 @@ static void colorizeTag (Task& task, const std::string& rule, const Color& base,
static void colorizeProject (Task& task, const std::string& rule, const Color& base, Color& c, bool merge) static void colorizeProject (Task& task, const std::string& rule, const Color& base, Color& c, bool merge)
{ {
// Observe the case sensitivity setting. // Observe the case sensitivity setting.
bool sensitive = context.config.getBoolean ("search.case.sensitive"); bool sensitive = Context::getContext ().config.getBoolean ("search.case.sensitive");
auto project = task.get ("project"); auto project = task.get ("project");
auto rule_trunc = rule.substr (14); auto rule_trunc = rule.substr (14);
@@ -178,7 +176,7 @@ static void colorizeTagNone (Task& task, const Color& base, Color& c, bool merge
static void colorizeKeyword (Task& task, const std::string& rule, const Color& base, Color& c, bool merge) static void colorizeKeyword (Task& task, const std::string& rule, const Color& base, Color& c, bool merge)
{ {
// Observe the case sensitivity setting. // Observe the case sensitivity setting.
auto sensitive = context.config.getBoolean ("search.case.sensitive"); auto sensitive = Context::getContext ().config.getBoolean ("search.case.sensitive");
// The easiest thing to check is the description, because it is just one // The easiest thing to check is the description, because it is just one
// attribute. // attribute.
@@ -286,14 +284,14 @@ static void colorizeDeleted (Task& task, const Color& base, Color& c, bool merge
void autoColorize (Task& task, Color& c) void autoColorize (Task& task, Color& c)
{ {
// The special tag 'nocolor' overrides all auto and specific colorization. // The special tag 'nocolor' overrides all auto and specific colorization.
if (! context.color () || if (! Context::getContext ().color () ||
task.hasTag ("nocolor")) task.hasTag ("nocolor"))
{ {
c = Color (); c = Color ();
return; return;
} }
auto merge = context.config.getBoolean ("rule.color.merge"); auto merge = Context::getContext ().config.getBoolean ("rule.color.merge");
// Note: c already contains colors specifically assigned via command. // Note: c already contains colors specifically assigned via command.
// Note: These rules form a hierarchy - the last rule is King, hence the // Note: These rules form a hierarchy - the last rule is King, hence the

View File

@@ -35,8 +35,6 @@
#include <shared.h> #include <shared.h>
#include <format.h> #include <format.h>
extern Context context;
static std::vector <Task>* global_data = NULL; static std::vector <Task>* global_data = NULL;
static std::vector <std::string> global_keys; static std::vector <std::string> global_keys;
static bool sort_compare (int, int); static bool sort_compare (int, int);
@@ -58,7 +56,7 @@ void sort_tasks (
if (order.size ()) if (order.size ())
std::stable_sort (order.begin (), order.end (), sort_compare); std::stable_sort (order.begin (), order.end (), sort_compare);
context.time_sort_us += timer.total_us (); Context::getContext ().time_sort_us += timer.total_us ();
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
@@ -79,7 +77,7 @@ static bool sort_compare (int left, int right)
for (auto& k : global_keys) for (auto& k : global_keys)
{ {
context.decomposeSortField (k, field, ascending, breakIndicator); Context::getContext ().decomposeSortField (k, field, ascending, breakIndicator);
// Urgency. // Urgency.
if (field == "urgency") if (field == "urgency")
@@ -170,8 +168,8 @@ static bool sort_compare (int left, int right)
return !ascending; return !ascending;
// Sort on the first dependency. // Sort on the first dependency.
left_number = context.tdb2.id (left_string.substr (0, 36)); left_number = Context::getContext ().tdb2.id (left_string.substr (0, 36));
right_number = context.tdb2.id (right_string.substr (0, 36)); right_number = Context::getContext ().tdb2.id (right_string.substr (0, 36));
if (left_number == right_number) if (left_number == right_number)
continue; continue;
@@ -196,7 +194,7 @@ static bool sort_compare (int left, int right)
} }
// UDAs. // UDAs.
else if ((column = context.columns[field]) != NULL) else if ((column = Context::getContext ().columns[field]) != NULL)
{ {
std::string type = column->type (); std::string type = column->type ();
if (type == "numeric") if (type == "numeric")

View File

@@ -63,8 +63,6 @@
#define STRING_UTIL_CONFIRM_ALL_U "All" #define STRING_UTIL_CONFIRM_ALL_U "All"
#define STRING_UTIL_CONFIRM_QUIT "quit" #define STRING_UTIL_CONFIRM_QUIT "quit"
extern Context context;
static const char* newline = "\n"; static const char* newline = "\n";
static const char* noline = ""; static const char* noline = "";
@@ -107,7 +105,7 @@ int confirm4 (const std::string& question)
std::string answer {""}; std::string answer {""};
std::getline (std::cin, answer); std::getline (std::cin, answer);
context.debug ("STDIN '" + answer + '\''); Context::getContext ().debug ("STDIN '" + answer + '\'');
answer = std::cin.eof () ? STRING_UTIL_CONFIRM_QUIT : Lexer::lowerCase (Lexer::trim (answer)); answer = std::cin.eof () ? STRING_UTIL_CONFIRM_QUIT : Lexer::lowerCase (Lexer::trim (answer));
autoComplete (answer, options, matches, 1); // Hard-coded 1. autoComplete (answer, options, matches, 1); // Hard-coded 1.
} }
@@ -278,32 +276,32 @@ bool nontrivial (const std::string& input)
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
const char* optionalBlankLine () const char* optionalBlankLine ()
{ {
return context.verbose ("blank") ? newline : noline; return Context::getContext ().verbose ("blank") ? newline : noline;
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
void setHeaderUnderline (Table& table) void setHeaderUnderline (Table& table)
{ {
// If an alternating row color is specified, notify the table. // If an alternating row color is specified, notify the table.
if (context.color ()) if (Context::getContext ().color ())
{ {
Color alternate (context.config.get ("color.alternate")); Color alternate (Context::getContext ().config.get ("color.alternate"));
table.colorOdd (alternate); table.colorOdd (alternate);
table.intraColorOdd (alternate); table.intraColorOdd (alternate);
if (context.config.getBoolean ("fontunderline")) if (Context::getContext ().config.getBoolean ("fontunderline"))
{ {
table.colorHeader (Color ("underline " + context.config.get ("color.label"))); table.colorHeader (Color ("underline " + Context::getContext ().config.get ("color.label")));
} }
else else
{ {
table.colorHeader (Color (context.config.get ("color.label"))); table.colorHeader (Color (Context::getContext ().config.get ("color.label")));
table.underlineHeaders (); table.underlineHeaders ();
} }
} }
else else
{ {
if (context.config.getBoolean ("fontunderline")) if (Context::getContext ().config.getBoolean ("fontunderline"))
table.colorHeader (Color ("underline")); table.colorHeader (Color ("underline"));
else else
table.underlineHeaders (); table.underlineHeaders ();

View File

@@ -30,8 +30,6 @@
#include <main.h> #include <main.h>
#include <test.h> #include <test.h>
Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int main (int, char**) int main (int, char**)
{ {

View File

@@ -25,13 +25,9 @@
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
#include <cmake.h> #include <cmake.h>
#include <iostream> // TODO Remove.
#include <test.h> #include <test.h>
#include <DOM.h> #include <DOM.h>
#include <Variant.h> #include <Variant.h>
#include <Context.h>
Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
bool providerString (const std::string& path, Variant& var) bool providerString (const std::string& path, Variant& var)
@@ -72,7 +68,7 @@ int main (int, char**)
dom.addSource ("name.next", &providerString); dom.addSource ("name.next", &providerString);
dom.addSource ("name.size", &providerString); dom.addSource ("name.size", &providerString);
dom.addSource ("foo", &providerString); dom.addSource ("foo", &providerString);
std::cout << dom.dump () << '\n'; t.diag (dom.dump ());
t.is (dom.count (), 4, "DOM now contains 4 nodes"); t.is (dom.count (), 4, "DOM now contains 4 nodes");
t.ok (dom.valid ("name"), "DOM 'name' valid"); t.ok (dom.valid ("name"), "DOM 'name' valid");

View File

@@ -27,9 +27,6 @@
#include <cmake.h> #include <cmake.h>
#include <test.h> #include <test.h>
#include <Eval.h> #include <Eval.h>
#include <Context.h>
Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// A few hard-coded symbols. // A few hard-coded symbols.

View File

@@ -29,8 +29,6 @@
#include <main.h> #include <main.h>
#include <test.h> #include <test.h>
Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int main (int, char**) int main (int, char**)
{ {

View File

@@ -31,8 +31,6 @@
#include <util.h> #include <util.h>
#include <test.h> #include <test.h>
Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int main (int, char**) int main (int, char**)
{ {

View File

@@ -28,9 +28,6 @@
#include <iostream> #include <iostream>
#include <test.h> #include <test.h>
#include <Variant.h> #include <Variant.h>
#include <Context.h>
Context context;
#define EPSILON 0.001 #define EPSILON 0.001

View File

@@ -28,9 +28,6 @@
#include <iostream> #include <iostream>
#include <test.h> #include <test.h>
#include <Variant.h> #include <Variant.h>
#include <Context.h>
Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int main (int, char**) int main (int, char**)

View File

@@ -28,9 +28,6 @@
#include <iostream> #include <iostream>
#include <test.h> #include <test.h>
#include <Variant.h> #include <Variant.h>
#include <Context.h>
Context context;
#define EPSILON 0.001 #define EPSILON 0.001

View File

@@ -28,9 +28,6 @@
#include <iostream> #include <iostream>
#include <test.h> #include <test.h>
#include <Variant.h> #include <Variant.h>
#include <Context.h>
Context context;
#define EPSILON 0.0001 #define EPSILON 0.0001

View File

@@ -28,9 +28,6 @@
#include <iostream> #include <iostream>
#include <test.h> #include <test.h>
#include <Variant.h> #include <Variant.h>
#include <Context.h>
Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int main (int, char**) int main (int, char**)

View File

@@ -28,9 +28,6 @@
#include <iostream> #include <iostream>
#include <test.h> #include <test.h>
#include <Variant.h> #include <Variant.h>
#include <Context.h>
Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int main (int, char**) int main (int, char**)

View File

@@ -28,9 +28,6 @@
#include <iostream> #include <iostream>
#include <test.h> #include <test.h>
#include <Variant.h> #include <Variant.h>
#include <Context.h>
Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int main (int, char**) int main (int, char**)

View File

@@ -28,9 +28,6 @@
#include <iostream> #include <iostream>
#include <test.h> #include <test.h>
#include <Variant.h> #include <Variant.h>
#include <Context.h>
Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int main (int, char**) int main (int, char**)

View File

@@ -28,9 +28,6 @@
#include <iostream> #include <iostream>
#include <test.h> #include <test.h>
#include <Variant.h> #include <Variant.h>
#include <Context.h>
Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int main (int, char**) int main (int, char**)

Some files were not shown because too many files have changed in this diff Show More