From 9486eb2fde3914d43630a8ac2c2d14c1e13755aa Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 13 May 2018 18:48:42 -0400 Subject: [PATCH 001/879] Docs: Updated for 2.5.2 --- ChangeLog | 2 ++ NEWS | 41 ++++++++++++++--------------------------- 2 files changed, 16 insertions(+), 27 deletions(-) diff --git a/ChangeLog b/ChangeLog index bc2164ccb..c3b07431c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,5 @@ +2.5.2 (?) ? + 2.5.1 (2016-02-24) 8b4ae3b54b44dfbd00b96cdd6dceb8dfe7cc1ea0 - TD-104 Unrecognized taskwarrior file format diff --git a/NEWS b/NEWS index 3aaa93582..288e649e2 100644 --- a/NEWS +++ b/NEWS @@ -1,38 +1,25 @@ -New Features in Taskwarrior 2.5.1 - - - As a bug-fix, code cleanup and performance release, new features are - limited to only small tweaks. - - The 'help' command now takes a 'usage' argument, which displays only the - command usage. - -New Commands in Taskwarrior 2.5.1 - - - None. - -New Configuration Options in Taskwarrior 2.5.1 - - - New 'relative' column format for 'date' type columns does what 'remaining' - and 'countdown' do, but in one format. - -Newly Deprecated Features in Taskwarrior 2.5.1 +New Features in Taskwarrior 2.5.2 - -Removed Features in 2.5.1 +New Commands in Taskwarrior 2.5.2 + + - + +New Configuration Options in Taskwarrior 2.5.2 + + - + +Newly Deprecated Features in Taskwarrior 2.5.2 + + - + +Removed Features in 2.5.2 - - There is no longer a 16-color default configuration for some platforms, - making all platforms 256-color. - - The configuration setting 'burndown.bias' is no longer used. - - The algorithm used to estimate completion on the 'burndown' reports has - been replaced by something less icky. Estimates are now based on the net - completion rate after the peak number of pending tasks. - - The unused 'dom' and 'shell.prompt' configuration settings were removed. Known Issues - - https://bug.tasktools.org/ - Taskwarrior has been built and tested on the following configurations: * OS X From 2d77ad8aabd035e41c1b7102ceda45ebf0904577 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 13 May 2018 18:55:24 -0400 Subject: [PATCH 002/879] Build: Bumped version to 2.5.2 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e96e0a64b..a8c580d8f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,7 +7,7 @@ include (CheckStructHasMember) set (HAVE_CMAKE true) project (task) -set (PROJECT_VERSION "2.5.1") +set (PROJECT_VERSION "2.5.2") OPTION (ENABLE_SYNC "Enable 'task sync' support" ON) From a12fb177e22a6754975b3b9f71b7b2df04f8c723 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 13 May 2018 18:58:27 -0400 Subject: [PATCH 003/879] Bumped ref page to 2.5.2 --- doc/ref/task-ref.pages | Bin 292624 -> 279390 bytes doc/ref/task-ref.pdf | Bin 131250 -> 126218 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/ref/task-ref.pages b/doc/ref/task-ref.pages index 249c66b92977cff936474acdae17b6d10b446e2c..6607a8614f8e94f45eac7f123e1e9220048406f4 100644 GIT binary patch delta 189935 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

W@P~e} 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 HVQ>F0jFq;s delta 203003 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⁡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�&hJcUc2&mY2jnoHMh8VJ_y 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%0Dh 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 z%0DHNHb1vmMRW+Wi*)DBDxF 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 l;@ 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

|so4EKb{2$m9XfPBgU@|02XFjBxo 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 JC6%Rc{~yO|mL>oI delta 76604 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%0ApY9JS|H^ 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 F{|_X)5uE@4 From aa0db81300641573cd09e06b07e022113bae32e5 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 13 May 2018 19:01:45 -0400 Subject: [PATCH 004/879] Cleanup: Removed deprecated alias._query setting --- ChangeLog | 12 +++++++++--- DEVELOPER | 8 ++++---- NEWS | 1 + src/legacy.cpp | 8 ++++---- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index c3b07431c..32916e3a5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,6 @@ -2.5.2 (?) ? +2.5.2 () - + +- Removed deprecated 'alias._query' setting. 2.5.1 (2016-02-24) 8b4ae3b54b44dfbd00b96cdd6dceb8dfe7cc1ea0 @@ -110,8 +112,14 @@ - The 'run_all' script was not correctly using exit code 0 when all tests pass (thanks to Gordon Ball). +<<<<<<< HEAD ------ current release --------------------------- +||||||| parent of 19b2151f... Cleanup: Removed deprecated 'alias._query' setting +======= +------ old releases ------------------------------ + +>>>>>>> 19b2151f... Cleanup: Removed deprecated 'alias._query' setting 2.5.0 (2015-10-21) dd5968a61b1fab258b38879cfdbb7d67f1bcd550 - TW-20 Task edit loses annotation precision, causing journal updating code @@ -325,8 +333,6 @@ added. - When GC is turned off, disable the query shortcuts, which no longer apply. ------- old releases ------------------------------ - 2.4.4 (2015-05-10) df49aaba126484b668c41d3ff9301f8d8ec49987 - TW-69 wait dates relative to due date (thanks to John Florian). diff --git a/DEVELOPER b/DEVELOPER index 6af9d9631..8eb0b44cc 100644 --- a/DEVELOPER +++ b/DEVELOPER @@ -10,7 +10,7 @@ How to Build Taskwarrior Obtain and build code: $ git clone https://git.tasktools.org/scm/tm/task.git task.git $ cd task.git - $ git checkout 2.5.0 # Latest dev branch + $ git checkout 2.6.0 # Latest dev branch $ cmake -DCMAKE_BUILD_TYPE=debug . # debug or release. Default: neither. $ make VERBOSE=1 # Shows details @@ -158,11 +158,11 @@ Work in Progress Current Codebase Condition 'master' branch: - - 2.4.4 Current release, locked. + - 2.5.1 Current release, locked. - '2.5.0' branch: + '2.6.0' branch: - Current development branch no plans yet. --- -2015-09-07 Updated for 2.5.0 +2016-02-24 Updated for 2.6.0 diff --git a/NEWS b/NEWS index 288e649e2..01a955d27 100644 --- a/NEWS +++ b/NEWS @@ -17,6 +17,7 @@ Newly Deprecated Features in Taskwarrior 2.5.2 Removed Features in 2.5.2 + - Removed 'alias._query' default configuration. Known Issues diff --git a/src/legacy.cpp b/src/legacy.cpp index 6139505fd..be4039cf0 100644 --- a/src/legacy.cpp +++ b/src/legacy.cpp @@ -96,22 +96,21 @@ std::string legacyCheckForDeprecatedVariables () for (auto& it : context.config) { // 2014-07-04: report.*.limit removed. + // 2016-02-24: alias._query removed. + // Deprecated in 2.5.0. // report.*.annotations if (it.first.length () > 19 && it.first.substr (0, 7) == "report." && it.first.substr (it.first.length () - 12) == ".annotations") deprecated.push_back (it.first); + // Deprecated in 2.5.0. if (it.first == "next" || it.first == "annotations" || it.first == "export.ical.class") deprecated.push_back (it.first); - // Deprecated іn 2.4.0. - if (it.first == "alias._query") - deprecated.push_back (it.first); - // Deprecated in 2.5.0. if (it.first == "urgency.inherit.coefficient") deprecated.push_back (it.first); @@ -140,6 +139,7 @@ std::string legacyCheckForDeprecatedColumns () { if (it.first.find ("report") == 0) { + // Deprecated in 2.0.0 std::string value = context.config.get (it.first); if (value.find ("entry_time") != std::string::npos || value.find ("start_time") != std::string::npos || From 88bd2fc9e2121a252780f336e6c596a64b5c9f13 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Wed, 24 Feb 2016 23:26:39 -0500 Subject: [PATCH 005/879] Context: Combined interactive.cpp and Context.cpp --- src/CMakeLists.txt | 1 - src/Context.cpp | 72 ++++++++++++++++++++++++++++++ src/interactive.cpp | 105 -------------------------------------------- 3 files changed, 72 insertions(+), 106 deletions(-) delete mode 100644 src/interactive.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 35c182b56..fde10cd3c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -31,7 +31,6 @@ set (task_SRCS CLI2.cpp CLI2.h dependency.cpp feedback.cpp i18n.h - interactive.cpp legacy.cpp recur.cpp rules.cpp diff --git a/src/Context.cpp b/src/Context.cpp index c1195be8c..98edcd635 100644 --- a/src/Context.cpp +++ b/src/Context.cpp @@ -42,10 +42,18 @@ #include #include #include + #ifdef HAVE_COMMIT #include #endif +#include +#include + +#ifdef SOLARIS +#include +#endif + // Supported modifiers, synonyms on the same line. static const char* modifierNames[] = { @@ -469,6 +477,70 @@ int Context::dispatch (std::string &out) return commands["help"]->execute (out); } +//////////////////////////////////////////////////////////////////////////////// +int Context::getWidth () +{ + // Determine window size. + int width = config.getInteger ("defaultwidth"); + + // A zero width value means 'infinity', which is approximated here by 2^16. + if (width == 0) + return 65536; + + if (config.getBoolean ("detection")) + { + if (terminal_width == 0 && + terminal_height == 0) + { + unsigned short buff[4]; + if (ioctl (STDOUT_FILENO, TIOCGWINSZ, &buff) != -1) + { + terminal_height = buff[0]; + terminal_width = buff[1]; + } + } + + width = terminal_width; + + // Ncurses does this, and perhaps we need to as well, to avoid a problem on + // Cygwin where the display goes right up to the terminal width, and causes + // an odd color wrapping problem. + if (config.getBoolean ("avoidlastcolumn")) + --width; + } + + return width; +} + +//////////////////////////////////////////////////////////////////////////////// +int Context::getHeight () +{ + // Determine window size. + int height = config.getInteger ("defaultheight"); + + // A zero height value means 'infinity', which is approximated here by 2^16. + if (height == 0) + return 65536; + + if (config.getBoolean ("detection")) + { + if (terminal_width == 0 && + terminal_height == 0) + { + unsigned short buff[4]; + if (ioctl (STDOUT_FILENO, TIOCGWINSZ, &buff) != -1) + { + terminal_height = buff[0]; + terminal_width = buff[1]; + } + } + + height = terminal_height; + } + + return height; +} + //////////////////////////////////////////////////////////////////////////////// bool Context::color () { diff --git a/src/interactive.cpp b/src/interactive.cpp deleted file mode 100644 index 1b1dc54ba..000000000 --- a/src/interactive.cpp +++ /dev/null @@ -1,105 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// -// Copyright 2006 - 2016, Paul Beckingham, Federico Hernandez. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -// http://www.opensource.org/licenses/mit-license.php -// -//////////////////////////////////////////////////////////////////////////////// - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef SOLARIS -#include -#endif - -//////////////////////////////////////////////////////////////////////////////// -int Context::getWidth () -{ - // Determine window size. - int width = config.getInteger ("defaultwidth"); - - // A zero width value means 'infinity', which is approximated here by 2^16. - if (width == 0) - return 65536; - - if (config.getBoolean ("detection")) - { - if (terminal_width == 0 && - terminal_height == 0) - { - unsigned short buff[4]; - if (ioctl (STDOUT_FILENO, TIOCGWINSZ, &buff) != -1) - { - terminal_height = buff[0]; - terminal_width = buff[1]; - } - } - - width = terminal_width; - - // Ncurses does this, and perhaps we need to as well, to avoid a problem on - // Cygwin where the display goes right up to the terminal width, and causes - // an odd color wrapping problem. - if (config.getBoolean ("avoidlastcolumn")) - --width; - } - - return width; -} - -//////////////////////////////////////////////////////////////////////////////// -int Context::getHeight () -{ - // Determine window size. - int height = config.getInteger ("defaultheight"); - - // A zero height value means 'infinity', which is approximated here by 2^16. - if (height == 0) - return 65536; - - if (config.getBoolean ("detection")) - { - if (terminal_width == 0 && - terminal_height == 0) - { - unsigned short buff[4]; - if (ioctl (STDOUT_FILENO, TIOCGWINSZ, &buff) != -1) - { - terminal_height = buff[0]; - terminal_width = buff[1]; - } - } - - height = terminal_height; - } - - return height; -} - -//////////////////////////////////////////////////////////////////////////////// From abefdd506c8315746e26a10c4940e93785cbe00d Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Wed, 24 Feb 2016 23:43:23 -0500 Subject: [PATCH 006/879] Cleanup: Removed redundant processing of OS name --- src/DOM.cpp | 31 ++++--------------------------- src/commands/CmdDiagnostics.cpp | 26 +------------------------- src/util.cpp | 27 +++++++++++++++++++++++++++ src/util.h | 2 ++ 4 files changed, 34 insertions(+), 52 deletions(-) diff --git a/src/DOM.cpp b/src/DOM.cpp index 4d49cf352..f938412c2 100644 --- a/src/DOM.cpp +++ b/src/DOM.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include extern Context context; @@ -58,14 +59,14 @@ bool getDOM (const std::string& name, Variant& value) if (name == "") return false; - int len = name.length (); + auto len = name.length (); Nibbler n (name); // rc. --> context.config if (len > 3 && ! name.compare (0, 3, "rc.", 3)) { - std::string key = name.substr (3); + auto key = name.substr (3); auto c = context.config.find (key); if (c != context.config.end ()) { @@ -117,8 +118,6 @@ bool getDOM (const std::string& name, Variant& value) throw format (STRING_DOM_UNREC, name); } - // TODO stats. - // system. --> Implement locally. if (len > 7 && ! name.compare (0, 7, "system.", 7)) @@ -133,29 +132,7 @@ bool getDOM (const std::string& name, Variant& value) // OS type. else if (name == "system.os") { -#if defined (DARWIN) - value = Variant ("Darwin"); -#elif defined (SOLARIS) - value = Variant ("Solaris"); -#elif defined (CYGWIN) - value = Variant ("Cygwin"); -#elif defined (HAIKU) - value = Variant ("Haiku"); -#elif defined (OPENBSD) - value = Variant ("OpenBSD"); -#elif defined (FREEBSD) - value = Variant ("FreeBSD"); -#elif defined (NETBSD) - value = Variant ("NetBSD"); -#elif defined (LINUX) - value = Variant ("Linux"); -#elif defined (KFREEBSD) - value = Variant ("GNU/kFreeBSD"); -#elif defined (GNUHURD) - value = Variant ("GNU/Hurd"); -#else - value = Variant (STRING_DOM_UNKNOWN); -#endif + value = Variant (osName ()); return true; } else diff --git a/src/commands/CmdDiagnostics.cpp b/src/commands/CmdDiagnostics.cpp index 9ccb47abd..77076ed44 100644 --- a/src/commands/CmdDiagnostics.cpp +++ b/src/commands/CmdDiagnostics.cpp @@ -79,31 +79,7 @@ int CmdDiagnostics::execute (std::string& output) << bold.colorize (PACKAGE_STRING) << "\n"; - out << " " << STRING_CMD_DIAG_PLATFORM << ": " - << -#if defined (DARWIN) - "Darwin" -#elif defined (SOLARIS) - "Solaris" -#elif defined (CYGWIN) - "Cygwin" -#elif defined (HAIKU) - "Haiku" -#elif defined (OPENBSD) - "OpenBSD" -#elif defined (FREEBSD) - "FreeBSD" -#elif defined (NETBSD) - "NetBSD" -#elif defined (LINUX) - "Linux" -#elif defined (KFREEBSD) - "GNU/kFreeBSD" -#elif defined (GNUHURD) - "GNU/Hurd" -#else - STRING_CMD_DIAG_UNKNOWN -#endif + out << " " << STRING_CMD_DIAG_PLATFORM << ": " << osName () << "\n\n"; // Compiler. diff --git a/src/util.cpp b/src/util.cpp index 9b07c09af..0d7c6e3a8 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -484,4 +484,31 @@ time_t timegm (struct tm *tm) #endif //////////////////////////////////////////////////////////////////////////////// +std::string osName () +{ +#if defined (DARWIN) + return "Darwin"; +#elif defined (SOLARIS) + return "Solaris"; +#elif defined (CYGWIN) + return "Cygwin"; +#elif defined (HAIKU) + return "Haiku"; +#elif defined (OPENBSD) + return "OpenBSD"; +#elif defined (FREEBSD) + return "FreeBSD"; +#elif defined (NETBSD) + return "NetBSD"; +#elif defined (LINUX) + return "Linux"; +#elif defined (KFREEBSD) + return "GNU/kFreeBSD"; +#elif defined (GNUHURD) + return "GNU/Hurd"; +#else + return STRING_DOM_UNKNOWN; +#endif +} +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/util.h b/src/util.h index cec0ae8b5..078fadbe6 100644 --- a/src/util.h +++ b/src/util.h @@ -65,5 +65,7 @@ const std::vector extractParents ( time_t timegm (struct tm *tm); #endif +std::string osName (); + #endif //////////////////////////////////////////////////////////////////////////////// From 9e5a0f0e61055f1525c8533cd1067fd7fd77d44f Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Wed, 24 Feb 2016 23:55:46 -0500 Subject: [PATCH 007/879] Rules: Improved use of 'const' and 'auto' --- src/rules.cpp | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/src/rules.cpp b/src/rules.cpp index 192cc425f..dc4accd76 100644 --- a/src/rules.cpp +++ b/src/rules.cpp @@ -53,7 +53,7 @@ void initializeColorRules () // Load all the configuration values, filter to only the ones that begin with // "color.", then store name/value in gsColor, and name in rules. std::vector rules; - for (auto& v : context.config) + for (const auto& v : context.config) { if (! v.first.compare (0, 6, "color.", 6)) { @@ -70,7 +70,7 @@ void initializeColorRules () std::vector precedence; split (precedence, context.config.get ("rule.precedence.color"), ','); - for (auto& p : precedence) + for (const auto& p : precedence) { // Add the leading "color." string. std::string rule = "color." + p; @@ -90,13 +90,12 @@ void initializeColorRules () //////////////////////////////////////////////////////////////////////////////// static void applyColor (const Color& base, Color& c, bool merge) { - if (merge) - c.blend (base); - else - c = base; + if (merge) + c.blend (base); + else + c = base; } - //////////////////////////////////////////////////////////////////////////////// static void colorizeBlocked (Task& task, const Color& base, Color& c, bool merge) { @@ -154,8 +153,8 @@ static void colorizeProject (Task& task, const std::string& rule, const Color& b // Observe the case sensitivity setting. bool sensitive = context.config.getBoolean ("search.case.sensitive"); - std::string project = task.get ("project"); - std::string rule_trunc = rule.substr (14); + auto project = task.get ("project"); + auto rule_trunc = rule.substr (14); // Match project names leftmost. if (rule_trunc.length () <= project.length ()) @@ -181,7 +180,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) { // Observe the case sensitivity setting. - bool sensitive = context.config.getBoolean ("search.case.sensitive"); + auto sensitive = context.config.getBoolean ("search.case.sensitive"); // The easiest thing to check is the description, because it is just one // attribute. @@ -192,10 +191,10 @@ static void colorizeKeyword (Task& task, const std::string& rule, const Color& b // first match. else { - for (auto& it : task.data) + for (const auto& att : task.data) { - if (! it.first.compare (0, 11, "annotation_", 11) && - find (it.second, rule.substr (14), sensitive) != std::string::npos) + if (! att.first.compare (0, 11, "annotation_", 11) && + find (att.second, rule.substr (14), sensitive) != std::string::npos) { applyColor (base, c, merge); return; @@ -208,7 +207,7 @@ static void colorizeKeyword (Task& task, const std::string& rule, const Color& b static void colorizeUDA (Task& task, const std::string& rule, const Color& base, Color& c, bool merge) { // Is the rule color.uda.name.value or color.uda.name? - size_t pos = rule.find (".", 10); + auto pos = rule.find (".", 10); if (pos == std::string::npos) { if (task.has (rule.substr (10))) @@ -216,8 +215,8 @@ static void colorizeUDA (Task& task, const std::string& rule, const Color& base, } else { - const std::string uda = rule.substr (10, pos - 10); - const std::string val = rule.substr (pos + 1); + auto uda = rule.substr (10, pos - 10); + auto val = rule.substr (pos + 1); if ((val == "none" && ! task.has (uda)) || task.get (uda) == val) applyColor (base, c, merge); @@ -229,7 +228,7 @@ static void colorizeDue (Task& task, const Color& base, Color& c, bool merge) { if (task.has ("due")) { - Task::status status = task.getStatus (); + auto status = task.getStatus (); if (status != Task::completed && status != Task::deleted && task.getDateState ("due") == Task::dateAfterToday) @@ -242,8 +241,8 @@ static void colorizeDueToday (Task& task, const Color& base, Color& c, bool merg { if (task.has ("due")) { - Task::status status = task.getStatus (); - Task::dateState dateState = task.getDateState ("due"); + auto status = task.getStatus (); + auto dateState = task.getDateState ("due"); if (status != Task::completed && status != Task::deleted && (dateState == Task::dateLaterToday || dateState == Task::dateEarlierToday)) @@ -256,7 +255,7 @@ static void colorizeOverdue (Task& task, const Color& base, Color& c, bool merge { if (task.has ("due")) { - Task::status status = task.getStatus (); + auto status = task.getStatus (); if (status != Task::completed && status != Task::deleted && task.getDateState ("due") == Task::dateBeforeToday) @@ -296,7 +295,7 @@ void autoColorize (Task& task, Color& c) return; } - bool merge = context.config.getBoolean ("rule.color.merge"); + auto merge = context.config.getBoolean ("rule.color.merge"); // Note: c already contains colors specifically assigned via command. // Note: These rules form a hierarchy - the last rule is King, hence the From 48167f53ebaaa6f411e271a74a68d3cec8019313 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Thu, 25 Feb 2016 00:19:38 -0500 Subject: [PATCH 008/879] Cleanup: Converted all sprintf to snprintf --- src/Task.cpp | 2 +- src/Variant.cpp | 4 ++-- src/commands/CmdBurndown.cpp | 16 ++++++++-------- src/commands/CmdColor.cpp | 2 +- src/commands/CmdLogo.cpp | 4 ++-- src/commands/CmdSummary.cpp | 2 +- src/recur.cpp | 18 +++++------------- src/util.cpp | 8 ++++---- 8 files changed, 24 insertions(+), 32 deletions(-) diff --git a/src/Task.cpp b/src/Task.cpp index 35191c9b6..5dee6f25e 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -180,7 +180,7 @@ const std::string Task::identifier (bool shortened /* = false */) const void Task::setAsNow (const std::string& att) { char now[16]; - sprintf (now, "%u", (unsigned int) time (NULL)); + snprintf (now, 16, "%u", (unsigned int) time (NULL)); set (att, now); recalc_urgency = true; diff --git a/src/Variant.cpp b/src/Variant.cpp index c99b31525..1de474e85 100644 --- a/src/Variant.cpp +++ b/src/Variant.cpp @@ -1782,7 +1782,7 @@ void Variant::cast (const enum type new_type) case type_string: { char temp[24]; - sprintf (temp, "%d", _integer); + snprintf (temp, 24, "%d", _integer); _string = temp; } break; @@ -1800,7 +1800,7 @@ void Variant::cast (const enum type new_type) case type_string: { char temp[24]; - sprintf (temp, "%g", _real); + snprintf (temp, 24, "%g", _real); _string = temp; } break; diff --git a/src/commands/CmdBurndown.cpp b/src/commands/CmdBurndown.cpp index 3cf04e2fc..5151b3712 100644 --- a/src/commands/CmdBurndown.cpp +++ b/src/commands/CmdBurndown.cpp @@ -467,9 +467,9 @@ std::string Chart::render () // Draw y-axis labels. char label [12]; - sprintf (label, "%*d", _max_label, _labels[2]); + snprintf (label, 12, "%*d", _max_label, _labels[2]); _grid.replace (LOC (1, _max_label - strlen (label)), strlen (label), label); - sprintf (label, "%*d", _max_label, _labels[1]); + snprintf (label, 12, "%*d", _max_label, _labels[1]); _grid.replace (LOC (1 + (_graph_height / 2), _max_label - strlen (label)), strlen (label), label); _grid.replace (LOC (_graph_height + 1, _max_label - 1), 1, "0"); @@ -527,7 +527,7 @@ std::string Chart::render () calculateRates (); char rate[12]; if (_net_fix_rate != 0.0) - sprintf (rate, "%.1f/d", _net_fix_rate); + snprintf (rate, 12, "%.1f/d", _net_fix_rate); else strcpy (rate, "-"); @@ -729,24 +729,24 @@ void Chart::generateBars () std::string month = ISO8601d::monthName (cursor.month ()); bar._major_label = month.substr (0, 3); - sprintf (str, "%02d", cursor.day ()); + snprintf (str, 12, "%02d", cursor.day ()); bar._minor_label = str; } break; case 'W': // year/week - sprintf (str, "%d", cursor.year ()); + snprintf (str, 12, "%d", cursor.year ()); bar._major_label = str; - sprintf (str, "%02d", cursor.weekOfYear (0)); + snprintf (str, 12, "%02d", cursor.weekOfYear (0)); bar._minor_label = str; break; case 'M': // year/month - sprintf (str, "%d", cursor.year ()); + snprintf (str, 12, "%d", cursor.year ()); bar._major_label = str; - sprintf (str, "%02d", cursor.month ()); + snprintf (str, 12, "%02d", cursor.month ()); bar._minor_label = str; break; } diff --git a/src/commands/CmdColor.cpp b/src/commands/CmdColor.cpp index 64672d271..6fe0e3b2e 100644 --- a/src/commands/CmdColor.cpp +++ b/src/commands/CmdColor.cpp @@ -219,7 +219,7 @@ int CmdColor::execute (std::string& output) char label [12]; for (int g = 0; g < 6; ++g) { - sprintf (label, " %d", g); + snprintf (label, 12, " %d", g); out << Color::colorize (label, "bold green"); for (int r = 0; r < 6; ++r) { diff --git a/src/commands/CmdLogo.cpp b/src/commands/CmdLogo.cpp index 8a1c2c408..744c7e641 100644 --- a/src/commands/CmdLogo.cpp +++ b/src/commands/CmdLogo.cpp @@ -108,7 +108,7 @@ int CmdLogo::execute (std::string& output) { value += 167; char block [24]; - sprintf (block, "\033[48;5;%dm \033[0m", value); + snprintf (block, 24, "\033[48;5;%dm \033[0m", value); output += block; } } @@ -122,7 +122,7 @@ int CmdLogo::execute (std::string& output) { value += 167; char block [24]; - sprintf (block, "\033[48;5;%dm \033[0m", value); + snprintf (block, 24, "\033[48;5;%dm \033[0m", value); output += block; } } diff --git a/src/commands/CmdSummary.cpp b/src/commands/CmdSummary.cpp index 90da8328d..04e06ce4b 100644 --- a/src/commands/CmdSummary.cpp +++ b/src/commands/CmdSummary.cpp @@ -199,7 +199,7 @@ int CmdSummary::execute (std::string& output) char percent[12] = "0%"; if (c + p) - sprintf (percent, "%d%%", 100 * c / (c + p)); + snprintf (percent, 12, "%d%%", 100 * c / (c + p)); view.set (row, 3, percent); processed.push_back (i.first); } diff --git a/src/recur.cpp b/src/recur.cpp index 2c8b3f670..6ee2179fc 100644 --- a/src/recur.cpp +++ b/src/recur.cpp @@ -37,7 +37,6 @@ #include #include #include - #include #include #include @@ -80,10 +79,10 @@ void handleRecurrence () } // Get the mask from the parent task. - std::string mask = t.get ("mask"); + auto mask = t.get ("mask"); // Iterate over the due dates, and check each against the mask. - bool changed = false; + auto changed = false; unsigned int i = 0; for (auto& d : due) { @@ -97,18 +96,14 @@ void handleRecurrence () rec.set ("uuid", uuid ()); // New UUID. rec.set ("parent", t.get ("uuid")); // Remember mom. rec.setAsNow ("entry"); // New entry date. - - char dueDate[16]; - sprintf (dueDate, "%u", (unsigned int) d.toEpoch ()); - rec.set ("due", dueDate); // Store generated due date. + rec.set ("due", format (d.toEpoch ())); if (t.has ("wait")) { ISO8601d old_wait (t.get_date ("wait")); ISO8601d old_due (t.get_date ("due")); ISO8601d due (d); - sprintf (dueDate, "%u", (unsigned int) (due + (old_wait - old_due)).toEpoch ()); - rec.set ("wait", dueDate); + rec.set ("wait", format ((due + (old_wait - old_due)).toEpoch ())); rec.setStatus (Task::waiting); mask += 'W'; } @@ -118,10 +113,7 @@ void handleRecurrence () rec.setStatus (Task::pending); } - char indexMask[12]; - sprintf (indexMask, "%u", (unsigned int) i); - rec.set ("imask", indexMask); // Store index into mask. - + rec.set ("imask", i); rec.remove ("mask"); // Remove the mask of the parent. // Add the new task to the DB. diff --git a/src/util.cpp b/src/util.cpp index 0d7c6e3a8..2db86148d 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -155,10 +155,10 @@ std::string formatBytes (size_t bytes) { char formatted[24]; - if (bytes >= 995000000) sprintf (formatted, "%.1f %s", (bytes / 1000000000.0), STRING_UTIL_GIBIBYTES); - else if (bytes >= 995000) sprintf (formatted, "%.1f %s", (bytes / 1000000.0), STRING_UTIL_MEBIBYTES); - else if (bytes >= 995) sprintf (formatted, "%.1f %s", (bytes / 1000.0), STRING_UTIL_KIBIBYTES); - else sprintf (formatted, "%d %s", (int)bytes, STRING_UTIL_BYTES); + if (bytes >= 995000000) snprintf (formatted, 24, "%.1f %s", (bytes / 1000000000.0), STRING_UTIL_GIBIBYTES); + else if (bytes >= 995000) snprintf (formatted, 24, "%.1f %s", (bytes / 1000000.0), STRING_UTIL_MEBIBYTES); + else if (bytes >= 995) snprintf (formatted, 24, "%.1f %s", (bytes / 1000.0), STRING_UTIL_KIBIBYTES); + else snprintf (formatted, 24, "%d %s", (int)bytes, STRING_UTIL_BYTES); return Lexer::commify (formatted); } From 677c2e87b520ea2f6ed8ffbde74cfeccc3ed51b7 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Thu, 25 Feb 2016 00:21:52 -0500 Subject: [PATCH 009/879] calc: Uses osName() to reduce string literals --- src/calc.cpp | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/src/calc.cpp b/src/calc.cpp index be0b83f33..681f6af00 100644 --- a/src/calc.cpp +++ b/src/calc.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include Context context; @@ -83,29 +84,7 @@ int main (int argc, char** argv) { std::cout << "\n" << format (STRING_CMD_VERSION_BUILT, "calc", VERSION) -#if defined (DARWIN) - << "darwin" -#elif defined (SOLARIS) - << "solaris" -#elif defined (CYGWIN) - << "cygwin" -#elif defined (HAIKU) - << "haiku" -#elif defined (OPENBSD) - << "openbsd" -#elif defined (FREEBSD) - << "freebsd" -#elif defined (NETBSD) - << "netbsd" -#elif defined (LINUX) - << "linux" -#elif defined (KFREEBSD) - << "gnu-kfreebsd" -#elif defined (GNUHURD) - << "gnu-hurd" -#else - << STRING_CMD_VERSION_UNKNOWN -#endif + << osName () << "\n" << STRING_CMD_VERSION_COPY << "\n" From 2980f5d3ce517a510b068661b4f8411d04f94ec2 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 28 Feb 2016 11:09:00 -0500 Subject: [PATCH 010/879] TD-64: sync conflict deleted all annotations of the task - Thanks to Markus Beppler, Konstantin Vorobyev. --- AUTHORS | 2 +- ChangeLog | 2 ++ src/Task.cpp | 6 ++++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/AUTHORS b/AUTHORS index 32b8d3752..1e2e01e2c 100644 --- a/AUTHORS +++ b/AUTHORS @@ -126,7 +126,7 @@ The following submitted code, packages or analysis, and deserve special thanks: Sunil Joshi Misty De Meo Kent R. Spillner - Konstantin + Konstantin Vorobyev Thanks to the following, who submitted detailed bug reports and excellent suggestions: diff --git a/ChangeLog b/ChangeLog index 32916e3a5..672d258af 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,7 @@ 2.5.2 () - +- TD-64 sync conflict deleted all annotations of the task + (thanks to Markus Beppler, Konstantin Vorobyev). - Removed deprecated 'alias._query' setting. 2.5.1 (2016-02-24) 8b4ae3b54b44dfbd00b96cdd6dceb8dfe7cc1ea0 diff --git a/src/Task.cpp b/src/Task.cpp index 5dee6f25e..23e3a44a5 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -270,6 +270,9 @@ void Task::set (const std::string& name, const std::string& value) { data[name] = json::decode (value); + if (! name.compare (0, 11, "annotation_", 11)) + ++annotation_count; + recalc_urgency = true; } @@ -286,6 +289,9 @@ void Task::remove (const std::string& name) { if (data.erase (name)) recalc_urgency = true; + + if (! name.compare (0, 11, "annotation_", 11)) + --annotation_count; } //////////////////////////////////////////////////////////////////////////////// From bf4b08efd252a0105d08404ddc38711fa4a024f6 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 28 Feb 2016 11:19:29 -0500 Subject: [PATCH 011/879] =?UTF-8?q?TW-1741:=20Warning=20"ignoring=20return?= =?UTF-8?q?=20value=20of=20=E2=80=98int=20ftruncate"=20while=20doing=20mak?= =?UTF-8?q?e=20on=20xubuntu15.10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Thanks to Sunil Joshi. --- src/FS.cpp | 4 +++- src/l10n/deu-DEU.h | 1 + src/l10n/eng-USA.h | 1 + src/l10n/epo-RUS.h | 1 + src/l10n/esp-ESP.h | 1 + src/l10n/fra-FRA.h | 1 + src/l10n/ita-ITA.h | 1 + src/l10n/jpn-JPN.h | 1 + src/l10n/pol-POL.h | 1 + src/l10n/por-PRT.h | 1 + 10 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/FS.cpp b/src/FS.cpp index 04a84b80b..72bb9c72d 100644 --- a/src/FS.cpp +++ b/src/FS.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -556,7 +557,8 @@ void File::truncate () open (); if (_fh) - (void) ftruncate (_h, 0); + if (ftruncate (_h, 0)) + throw format (STRING_FILE_TRUNCATE, errno, strerror (errno)); } //////////////////////////////////////////////////////////////////////////////// diff --git a/src/l10n/deu-DEU.h b/src/l10n/deu-DEU.h index cbf9e5aa1..7f74bff50 100644 --- a/src/l10n/deu-DEU.h +++ b/src/l10n/deu-DEU.h @@ -796,6 +796,7 @@ // File #define STRING_FILE_PERMS "Taskwarrior hat die erforderlichen Rechte auf '{1}' nicht." +#define STRING_FILE_TRUNCATE "Could not truncate file: {1} {2}" // helpers #define STRING_HELPER_PROJECT_CHANGE "The project '{1}' has changed." diff --git a/src/l10n/eng-USA.h b/src/l10n/eng-USA.h index 559ce72d5..b97777e13 100644 --- a/src/l10n/eng-USA.h +++ b/src/l10n/eng-USA.h @@ -794,6 +794,7 @@ // File #define STRING_FILE_PERMS "Taskwarrior does not have the correct permissions for '{1}'." +#define STRING_FILE_TRUNCATE "Could not truncate file: {1} {2}" // helpers #define STRING_HELPER_PROJECT_CHANGE "The project '{1}' has changed." diff --git a/src/l10n/epo-RUS.h b/src/l10n/epo-RUS.h index 1ca0d4fae..30ff8b1c4 100644 --- a/src/l10n/epo-RUS.h +++ b/src/l10n/epo-RUS.h @@ -796,6 +796,7 @@ // File #define STRING_FILE_PERMS "Taskwarrior ne havas la bezonatan permeson por '{1}'." +#define STRING_FILE_TRUNCATE "Could not truncate file: {1} {2}" // helpers #define STRING_HELPER_PROJECT_CHANGE "The project '{1}' has changed." diff --git a/src/l10n/esp-ESP.h b/src/l10n/esp-ESP.h index a1d855704..225993a90 100644 --- a/src/l10n/esp-ESP.h +++ b/src/l10n/esp-ESP.h @@ -804,6 +804,7 @@ // File #define STRING_FILE_PERMS "Taskwarrior no tiene los permisos adecuados para '{1}'." +#define STRING_FILE_TRUNCATE "Could not truncate file: {1} {2}" // helpers #define STRING_HELPER_PROJECT_CHANGE "El proyecto '{1}' ha cambiado." diff --git a/src/l10n/fra-FRA.h b/src/l10n/fra-FRA.h index 84c3996a8..98a25db4a 100644 --- a/src/l10n/fra-FRA.h +++ b/src/l10n/fra-FRA.h @@ -796,6 +796,7 @@ // File #define STRING_FILE_PERMS "Taskwarrior does not have the correct permissions for '{1}'." +#define STRING_FILE_TRUNCATE "Could not truncate file: {1} {2}" // helpers #define STRING_HELPER_PROJECT_CHANGE "The project '{1}' has changed." diff --git a/src/l10n/ita-ITA.h b/src/l10n/ita-ITA.h index eeb3125c1..d804d44e2 100644 --- a/src/l10n/ita-ITA.h +++ b/src/l10n/ita-ITA.h @@ -795,6 +795,7 @@ // File #define STRING_FILE_PERMS "Taskwarrior non dispone dei permessi corretti per '{1}'." +#define STRING_FILE_TRUNCATE "Could not truncate file: {1} {2}" // helpers #define STRING_HELPER_PROJECT_CHANGE "Il progetto '{1}' è stato modificat." diff --git a/src/l10n/jpn-JPN.h b/src/l10n/jpn-JPN.h index b19f8298f..ac6b31f4c 100644 --- a/src/l10n/jpn-JPN.h +++ b/src/l10n/jpn-JPN.h @@ -796,6 +796,7 @@ // File #define STRING_FILE_PERMS "Taskwarrior does not have the correct permissions for '{1}'." +#define STRING_FILE_TRUNCATE "Could not truncate file: {1} {2}" // helpers #define STRING_HELPER_PROJECT_CHANGE "The project '{1}' has changed." diff --git a/src/l10n/pol-POL.h b/src/l10n/pol-POL.h index 7d0fd121c..dec6b975e 100644 --- a/src/l10n/pol-POL.h +++ b/src/l10n/pol-POL.h @@ -796,6 +796,7 @@ // File #define STRING_FILE_PERMS "Taskwarrior nie posiada praw dostępu do '{1}'." +#define STRING_FILE_TRUNCATE "Could not truncate file: {1} {2}" // helpers #define STRING_HELPER_PROJECT_CHANGE "The project '{1}' has changed." diff --git a/src/l10n/por-PRT.h b/src/l10n/por-PRT.h index 556467d6e..9d2ef8b74 100644 --- a/src/l10n/por-PRT.h +++ b/src/l10n/por-PRT.h @@ -796,6 +796,7 @@ // File #define STRING_FILE_PERMS "O taskwarrior não encontrou as permissões corretas em '{1}'." +#define STRING_FILE_TRUNCATE "Could not truncate file: {1} {2}" // helpers #define STRING_HELPER_PROJECT_CHANGE "The project '{1}' has changed." From cbdd04e506e37a181aaccc2cc22493e35bef357a Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Thu, 17 Mar 2016 17:17:22 -0400 Subject: [PATCH 012/879] CmdDiagnostics: Typo --- src/commands/CmdDiagnostics.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/CmdDiagnostics.cpp b/src/commands/CmdDiagnostics.cpp index 77076ed44..a71fa5190 100644 --- a/src/commands/CmdDiagnostics.cpp +++ b/src/commands/CmdDiagnostics.cpp @@ -280,7 +280,7 @@ int CmdDiagnostics::execute (std::string& output) << credentials << "\n\n"; - // Disaply hook status. + // Display hook status. Path hookLocation (context.config.get ("data.location")); hookLocation += "hooks"; From f10a3d623241812fdddf0e083a63dc44961107a6 Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sat, 19 Mar 2016 20:18:41 +0100 Subject: [PATCH 013/879] TDB2: Add capability to purge tasks out of data files --- src/TDB2.cpp | 33 ++++++++++++++++++++++++++++++--- src/TDB2.h | 4 ++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/TDB2.cpp b/src/TDB2.cpp index 22dff8a72..5d501eb9b 100644 --- a/src/TDB2.cpp +++ b/src/TDB2.cpp @@ -218,6 +218,21 @@ bool TF2::modify_task (const Task& task) return false; } +//////////////////////////////////////////////////////////////////////////////// +bool TF2::purge_task (const Task& task) +{ + // Bail out if task is not found in this file + std::string uuid = task.get ("uuid"); + if (!has (uuid)) + return false; + + // Mark the task to be purged + _purged_tasks.insert (uuid); + _dirty = true; + + return true; +} + //////////////////////////////////////////////////////////////////////////////// void TF2::add_line (const std::string& line) { @@ -248,7 +263,7 @@ void TF2::commit () if (_dirty) { // Special case: added but no modified means just append to the file. - if (!_modified_tasks.size () && + if (!_modified_tasks.size () && !_purged_tasks.size () && (_added_tasks.size () || _added_lines.size ())) { if (_file.open ()) @@ -284,7 +299,9 @@ void TF2::commit () // Only write out _tasks, because any deltas have already been applied. _file.append (std::string("")); // Seek to end of file for (auto& task : _tasks) - _file.write_raw (task.composeF4 () + "\n"); + // Skip over the tasks that are marked to be purged + if (_purged_tasks.find (task.get ("uuid")) == _purged_tasks.end ()) + _file.write_raw (task.composeF4 () + "\n"); // Write out all the added lines. _file.append (_added_lines); @@ -492,6 +509,7 @@ void TF2::clear () _tasks.clear (); _added_tasks.clear (); _modified_tasks.clear (); + _purged_tasks.clear (); _lines.clear (); _added_lines.clear (); _I2U.clear (); @@ -565,17 +583,19 @@ const std::string TF2::dump () std::string tasks = green.colorize (rightJustifyZero ((int) _tasks.size (), 4)); std::string tasks_added = red.colorize (rightJustifyZero ((int) _added_tasks.size (), 3)); std::string tasks_modified = yellow.colorize (rightJustifyZero ((int) _modified_tasks.size (), 3)); + std::string tasks_purged = red.colorize (rightJustifyZero ((int) _purged_tasks.size (), 3)); std::string lines = green.colorize (rightJustifyZero ((int) _lines.size (), 4)); std::string lines_added = red.colorize (rightJustifyZero ((int) _added_lines.size (), 3)); char buffer[256]; // Composed string is actually 246 bytes. Yikes. - snprintf (buffer, 256, "%14s %s %s T%s+%s~%s L%s+%s", + snprintf (buffer, 256, "%14s %s %s T%s+%s~%s-%s L%s+%s", label.c_str (), mode.c_str (), hygiene.c_str (), tasks.c_str (), tasks_added.c_str (), tasks_modified.c_str (), + tasks_purged.c_str (), lines.c_str (), lines_added.c_str ()); @@ -649,6 +669,13 @@ void TDB2::modify (Task& task, bool add_to_backlog /* = true */) update (task, add_to_backlog); } +//////////////////////////////////////////////////////////////////////////////// +void TDB2::purge (Task& task) +{ + // Delete the task from completed.data + completed.purge_task (task); +} + //////////////////////////////////////////////////////////////////////////////// void TDB2::update ( Task& task, diff --git a/src/TDB2.h b/src/TDB2.h index b05aa21a7..a830355e4 100644 --- a/src/TDB2.h +++ b/src/TDB2.h @@ -28,6 +28,7 @@ #define INCLUDED_TDB2 #include +#include #include #include #include @@ -54,6 +55,7 @@ public: void add_task (Task&); bool modify_task (const Task&); + bool purge_task (const Task&); void add_line (const std::string&); void clear_tasks (); void clear_lines (); @@ -90,6 +92,7 @@ public: std::vector _added_tasks; std::vector _modified_tasks; + std::unordered_set _purged_tasks; std::vector _lines; std::vector _added_lines; File _file; @@ -110,6 +113,7 @@ public: void set_location (const std::string&); void add (Task&, bool add_to_backlog = true); void modify (Task&, bool add_to_backlog = true); + void purge (Task&); void commit (); void get_changes (std::vector &); void revert (); From 70a0e256b0c62029d8b3132aa0ef2c54dab18c47 Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sat, 19 Mar 2016 21:18:41 +0100 Subject: [PATCH 014/879] CmdPurge: Add initial implementation --- src/commands/CMakeLists.txt | 1 + src/commands/CmdPurge.cpp | 80 +++++++++++++++++++++++++++++++++++++ src/commands/CmdPurge.h | 41 +++++++++++++++++++ src/commands/Command.cpp | 2 + src/l10n/eng-USA.h | 2 + 5 files changed, 126 insertions(+) create mode 100644 src/commands/CmdPurge.cpp create mode 100644 src/commands/CmdPurge.h diff --git a/src/commands/CMakeLists.txt b/src/commands/CMakeLists.txt index cd6f7a519..575e351e7 100644 --- a/src/commands/CMakeLists.txt +++ b/src/commands/CMakeLists.txt @@ -40,6 +40,7 @@ set (commands_SRCS Command.cpp Command.h CmdModify.cpp CmdModify.h CmdPrepend.cpp CmdPrepend.h CmdProjects.cpp CmdProjects.h + CmdPurge.cpp CmdPurge.h CmdReports.cpp CmdReports.h CmdShow.cpp CmdShow.h CmdStart.cpp CmdStart.h diff --git a/src/commands/CmdPurge.cpp b/src/commands/CmdPurge.cpp new file mode 100644 index 000000000..5ca665efe --- /dev/null +++ b/src/commands/CmdPurge.cpp @@ -0,0 +1,80 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2006 - 2016, Paul Beckingham, Federico Hernandez. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +// http://www.opensource.org/licenses/mit-license.php +// +//////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include + +extern Context context; + +//////////////////////////////////////////////////////////////////////////////// +CmdPurge::CmdPurge () +{ + _keyword = "purge"; + _usage = "task purge"; + _description = STRING_CMD_PURGE_USAGE; + _read_only = false; + _displays_id = false; + _needs_confirm = true; + _needs_gc = false; + _uses_context = true; + _accepts_filter = true; + _accepts_modifications = false; + _accepts_miscellaneous = false; + _category = Command::Category::operation; +} + +//////////////////////////////////////////////////////////////////////////////// +int CmdPurge::execute (std::string&) +{ + int rc = 0; + int count = 0; + + // Apply filter. + Filter filter; + std::vector filtered; + filter.subset (filtered); + if (filtered.size () == 0) + { + context.footnote (STRING_FEEDBACK_NO_TASKS_SP); + return 1; + } + + for (auto& task : filtered) + { + if (task.getStatus () == Task::deleted) + { + context.tdb2.purge (task); + count++; + } + } + + return rc; +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/commands/CmdPurge.h b/src/commands/CmdPurge.h new file mode 100644 index 000000000..8e9c76446 --- /dev/null +++ b/src/commands/CmdPurge.h @@ -0,0 +1,41 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2006 - 2016, Paul Beckingham, Federico Hernandez. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +// http://www.opensource.org/licenses/mit-license.php +// +//////////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_CMDPURGE +#define INCLUDED_CMDPURGE + +#include +#include + +class CmdPurge : public Command +{ +public: + CmdPurge (); + int execute (std::string&); +}; + +#endif +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/commands/Command.cpp b/src/commands/Command.cpp index 29025d994..4783afc68 100644 --- a/src/commands/Command.cpp +++ b/src/commands/Command.cpp @@ -70,6 +70,7 @@ #include #include #include +#include #include #include #include @@ -145,6 +146,7 @@ void Command::factory (std::map & all) c = new CmdModify (); all[c->keyword ()] = c; c = new CmdPrepend (); all[c->keyword ()] = c; c = new CmdProjects (); all[c->keyword ()] = c; + c = new CmdPurge (); all[c->keyword ()] = c; c = new CmdReports (); all[c->keyword ()] = c; c = new CmdShow (); all[c->keyword ()] = c; c = new CmdShowRaw (); all[c->keyword ()] = c; diff --git a/src/l10n/eng-USA.h b/src/l10n/eng-USA.h index b97777e13..cbc038b76 100644 --- a/src/l10n/eng-USA.h +++ b/src/l10n/eng-USA.h @@ -396,6 +396,8 @@ #define STRING_CMD_DUPLICATE_1 "Duplicated {1} task." #define STRING_CMD_DUPLICATE_N "Duplicated {1} tasks." +#define STRING_CMD_PURGE_USAGE "Removes the specified task from the data files. Causes permanent loss of data." + #define STRING_CMD_START_USAGE "Marks specified task as started" #define STRING_CMD_START_NO "Task not started." #define STRING_CMD_START_ALREADY "Task {1} '{2}' already started." From 909b2e271367fa5bf8d4e648e06c22a08d89626c Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sat, 19 Mar 2016 23:05:59 +0100 Subject: [PATCH 015/879] CmdPurge: Remove purged tasks from dependencies --- src/commands/CmdPurge.cpp | 23 ++++++++++++++++++++--- src/l10n/eng-USA.h | 2 ++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/commands/CmdPurge.cpp b/src/commands/CmdPurge.cpp index 5ca665efe..2156e9777 100644 --- a/src/commands/CmdPurge.cpp +++ b/src/commands/CmdPurge.cpp @@ -29,6 +29,7 @@ #include #include #include +#include extern Context context; @@ -55,9 +56,10 @@ int CmdPurge::execute (std::string&) int rc = 0; int count = 0; - // Apply filter. Filter filter; std::vector filtered; + + // Apply filter. filter.subset (filtered); if (filtered.size () == 0) { @@ -67,13 +69,28 @@ int CmdPurge::execute (std::string&) for (auto& task : filtered) { + std::string uuid = task.get ("uuid"); + if (task.getStatus () == Task::deleted) { - context.tdb2.purge (task); - count++; + context.tdb2.purge (task); + count++; + + // Remove dependencies on the task being purged + for (auto& blockedConst: context.tdb2.all_tasks ()) + { + Task& blocked = const_cast(blockedConst); + if (blocked.has ("depends") && + blocked.get ("depends").find (uuid) != std::string::npos) + { + blocked.removeDependency (uuid); + context.tdb2.modify (blocked); + } + } } } + feedback_affected (count == 1 ? STRING_CMD_PURGE_1 : STRING_CMD_PURGE_N, count); return rc; } diff --git a/src/l10n/eng-USA.h b/src/l10n/eng-USA.h index cbc038b76..750e9dc61 100644 --- a/src/l10n/eng-USA.h +++ b/src/l10n/eng-USA.h @@ -397,6 +397,8 @@ #define STRING_CMD_DUPLICATE_N "Duplicated {1} tasks." #define STRING_CMD_PURGE_USAGE "Removes the specified task from the data files. Causes permanent loss of data." +#define STRING_CMD_PURGE_1 "Purged {1} task." +#define STRING_CMD_PURGE_N "Purged {1} tasks." #define STRING_CMD_START_USAGE "Marks specified task as started" #define STRING_CMD_START_NO "Task not started." From ffce61da4b76051a0921da100c424751fc0719e3 Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sun, 20 Mar 2016 01:40:29 +0100 Subject: [PATCH 016/879] CmdPurge: Require GC run prior to execution Since TDB2::purge method allows purging of the tasks only on competed.data file, we need to make sure that all the tasks that were supposed to be moved to completed.data have been moved - in other words, we need to run GC. This allows for diract usage of purge after delete, that is: $ task delete $ task purge working as expected. --- src/commands/CmdPurge.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/commands/CmdPurge.cpp b/src/commands/CmdPurge.cpp index 2156e9777..12cf14c3a 100644 --- a/src/commands/CmdPurge.cpp +++ b/src/commands/CmdPurge.cpp @@ -42,7 +42,7 @@ CmdPurge::CmdPurge () _read_only = false; _displays_id = false; _needs_confirm = true; - _needs_gc = false; + _needs_gc = true; _uses_context = true; _accepts_filter = true; _accepts_modifications = false; From ec1a7b4b40619764fe9e9c736baa9c6fad4f693c Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sun, 20 Mar 2016 01:45:20 +0100 Subject: [PATCH 017/879] DEVELOPER: Use multiple jobs during make --- DEVELOPER | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DEVELOPER b/DEVELOPER index 8eb0b44cc..1fbc9197a 100644 --- a/DEVELOPER +++ b/DEVELOPER @@ -12,7 +12,7 @@ How to Build Taskwarrior $ cd task.git $ git checkout 2.6.0 # Latest dev branch $ cmake -DCMAKE_BUILD_TYPE=debug . # debug or release. Default: neither. - $ make VERBOSE=1 # Shows details + $ make VERBOSE=1 -j8 # Shows details, builds using 8 jobs Running Test Suite: $ cd tests From 233d8e3ebfb4d4c8de10a43afc93e9cd8f7be467 Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sun, 20 Mar 2016 02:03:42 +0100 Subject: [PATCH 018/879] tests: Add coverage for purge command --- test/purge.t | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100755 test/purge.t diff --git a/test/purge.t b/test/purge.t new file mode 100755 index 000000000..7b8363683 --- /dev/null +++ b/test/purge.t @@ -0,0 +1,79 @@ +#!/usr/bin/env python2.7 +# -*- coding: utf-8 -*- +############################################################################### +# +# Copyright 2006 - 2016, Paul Beckingham, Federico Hernandez. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# +# http://www.opensource.org/licenses/mit-license.php +# +############################################################################### + +import sys +import os +import unittest +# Ensure python finds the local simpletap module +sys.path.append(os.path.dirname(os.path.abspath(__file__))) + +from basetest import Task, TestCase + + +class TestDelete(TestCase): + def setUp(self): + self.t = Task() + + def test_add_delete_purge(self): + """Verify that add/delete/purge successfully purges a task""" + self.t("add one") + uuid = self.t("_get 1.uuid")[1].strip() + + code, out, err = self.t("1 delete", input="y\n") + self.assertIn("Deleted 1 task.", out) + + code, out, err = self.t(uuid + " purge") + self.assertIn("Purged 1 task.", out) + + code, out, err = self.t("uuids") + self.assertNotIn(uuid, out) + + def test_purge_remove_deps(self): + """Verify that purge command removes dependency references""" + self.t("add one") + self.t("add two dep:1") + uuid = self.t("_get 1.uuid")[1].strip() + + code, out, err = self.t("1 delete", input="y\n") + self.assertIn("Deleted 1 task.", out) + + code, out, err = self.t(uuid + " purge") + self.assertIn("Purged 1 task.", out) + + code, out, err = self.t("uuids") + self.assertNotIn(uuid, out) + + dependencies = self.t("_get 1.depends")[1].strip() + self.assertNotIn(uuid, dependencies) + + +if __name__ == "__main__": + from simpletap import TAPTestRunner + unittest.main(testRunner=TAPTestRunner()) + +# vim: ai sts=4 et sw=4 ft=python From 1091cc23aff6231bf8d8818a4db9f2444b71b3c3 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sat, 19 Mar 2016 21:51:34 -0400 Subject: [PATCH 019/879] Docs: Added MAKEFLAGS example --- DEVELOPER | 1 + 1 file changed, 1 insertion(+) diff --git a/DEVELOPER b/DEVELOPER index 1fbc9197a..10c24f159 100644 --- a/DEVELOPER +++ b/DEVELOPER @@ -13,6 +13,7 @@ How to Build Taskwarrior $ git checkout 2.6.0 # Latest dev branch $ cmake -DCMAKE_BUILD_TYPE=debug . # debug or release. Default: neither. $ make VERBOSE=1 -j8 # Shows details, builds using 8 jobs + # Alternately 'export MAKEFLAGS=-j 8'. Running Test Suite: $ cd tests From 58cee899b0ffac6669886317528f285da04b7cab Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sat, 19 Mar 2016 21:57:01 -0400 Subject: [PATCH 020/879] L10N: Propagated new strings to all LANGS --- src/l10n/deu-DEU.h | 4 ++++ src/l10n/eng-USA.h | 2 +- src/l10n/epo-RUS.h | 4 ++++ src/l10n/esp-ESP.h | 4 ++++ src/l10n/fra-FRA.h | 4 ++++ src/l10n/ita-ITA.h | 4 ++++ src/l10n/jpn-JPN.h | 4 ++++ src/l10n/pol-POL.h | 4 ++++ src/l10n/por-PRT.h | 4 ++++ 9 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/l10n/deu-DEU.h b/src/l10n/deu-DEU.h index 7f74bff50..e3b4a003c 100644 --- a/src/l10n/deu-DEU.h +++ b/src/l10n/deu-DEU.h @@ -398,6 +398,10 @@ #define STRING_CMD_DUPLICATE_1 "{1} Aufgabe verdoppelt." #define STRING_CMD_DUPLICATE_N "{1} Aufgaben verdoppelt." +#define STRING_CMD_PURGE_USAGE "Removes the specified tasks from the data files. Causes permanent loss of data." +#define STRING_CMD_PURGE_1 "Purged {1} task." +#define STRING_CMD_PURGE_N "Purged {1} tasks." + #define STRING_CMD_START_USAGE "Kennzeichnet die gewählte Aufgabe als begonnen." #define STRING_CMD_START_NO "Aufgabe nicht begonnen." #define STRING_CMD_START_ALREADY "Aufgabe {1} '{2}' ist bereits gestartet." diff --git a/src/l10n/eng-USA.h b/src/l10n/eng-USA.h index 750e9dc61..857628cf4 100644 --- a/src/l10n/eng-USA.h +++ b/src/l10n/eng-USA.h @@ -396,7 +396,7 @@ #define STRING_CMD_DUPLICATE_1 "Duplicated {1} task." #define STRING_CMD_DUPLICATE_N "Duplicated {1} tasks." -#define STRING_CMD_PURGE_USAGE "Removes the specified task from the data files. Causes permanent loss of data." +#define STRING_CMD_PURGE_USAGE "Removes the specified tasks from the data files. Causes permanent loss of data." #define STRING_CMD_PURGE_1 "Purged {1} task." #define STRING_CMD_PURGE_N "Purged {1} tasks." diff --git a/src/l10n/epo-RUS.h b/src/l10n/epo-RUS.h index 30ff8b1c4..1412ce5b9 100644 --- a/src/l10n/epo-RUS.h +++ b/src/l10n/epo-RUS.h @@ -398,6 +398,10 @@ #define STRING_CMD_DUPLICATE_1 "Kopiis {1} taskon." #define STRING_CMD_DUPLICATE_N "Kopiis {1} taskojn." +#define STRING_CMD_PURGE_USAGE "Removes the specified tasks from the data files. Causes permanent loss of data." +#define STRING_CMD_PURGE_1 "Purged {1} task." +#define STRING_CMD_PURGE_N "Purged {1} tasks." + #define STRING_CMD_START_USAGE "Markas la specifatan taskon kiel ekita" #define STRING_CMD_START_NO "Ne ekis taskon." #define STRING_CMD_START_ALREADY "Tasko {1} '{2}' jam ekita." diff --git a/src/l10n/esp-ESP.h b/src/l10n/esp-ESP.h index 225993a90..15e3f638d 100644 --- a/src/l10n/esp-ESP.h +++ b/src/l10n/esp-ESP.h @@ -403,6 +403,10 @@ #define STRING_CMD_DUPLICATE_1 "Duplicada {1} tarea." #define STRING_CMD_DUPLICATE_N "Duplicadas {1} tareas." +#define STRING_CMD_PURGE_USAGE "Removes the specified tasks from the data files. Causes permanent loss of data." +#define STRING_CMD_PURGE_1 "Purged {1} task." +#define STRING_CMD_PURGE_N "Purged {1} tasks." + #define STRING_CMD_START_USAGE "Marca la tarea especificada como comenzada" #define STRING_CMD_START_NO "Tarea no comenzada." #define STRING_CMD_START_ALREADY "Tarea {1} '{2}' ya comenzada." diff --git a/src/l10n/fra-FRA.h b/src/l10n/fra-FRA.h index 98a25db4a..8ca0a4f0e 100644 --- a/src/l10n/fra-FRA.h +++ b/src/l10n/fra-FRA.h @@ -398,6 +398,10 @@ #define STRING_CMD_DUPLICATE_1 "Duplicated {1} task." #define STRING_CMD_DUPLICATE_N "Duplicated {1} tasks." +#define STRING_CMD_PURGE_USAGE "Removes the specified tasks from the data files. Causes permanent loss of data." +#define STRING_CMD_PURGE_1 "Purged {1} task." +#define STRING_CMD_PURGE_N "Purged {1} tasks." + #define STRING_CMD_START_USAGE "Marks specified task as started" #define STRING_CMD_START_NO "Tâche non démarrée." #define STRING_CMD_START_ALREADY "Tâche {1} '{2}' déjà démarré." diff --git a/src/l10n/ita-ITA.h b/src/l10n/ita-ITA.h index d804d44e2..f5a6e48ac 100644 --- a/src/l10n/ita-ITA.h +++ b/src/l10n/ita-ITA.h @@ -397,6 +397,10 @@ #define STRING_CMD_DUPLICATE_1 "Task {1} duplicato." #define STRING_CMD_DUPLICATE_N "Task {1} duplicati." +#define STRING_CMD_PURGE_USAGE "Removes the specified tasks from the data files. Causes permanent loss of data." +#define STRING_CMD_PURGE_1 "Purged {1} task." +#define STRING_CMD_PURGE_N "Purged {1} tasks." + #define STRING_CMD_START_USAGE "Contrassegna i task specificati come avviati" #define STRING_CMD_START_NO "Task non avviato." #define STRING_CMD_START_ALREADY "Task {1} '{2}' già avviati." diff --git a/src/l10n/jpn-JPN.h b/src/l10n/jpn-JPN.h index ac6b31f4c..a6d8b0c7b 100644 --- a/src/l10n/jpn-JPN.h +++ b/src/l10n/jpn-JPN.h @@ -398,6 +398,10 @@ #define STRING_CMD_DUPLICATE_1 "重複した {1} タスク。" #define STRING_CMD_DUPLICATE_N "重複した {1} タスク。" +#define STRING_CMD_PURGE_USAGE "Removes the specified tasks from the data files. Causes permanent loss of data." +#define STRING_CMD_PURGE_1 "Purged {1} task." +#define STRING_CMD_PURGE_N "Purged {1} tasks." + #define STRING_CMD_START_USAGE "Marks specified task as started" #define STRING_CMD_START_NO "タスク は開始していません。" #define STRING_CMD_START_ALREADY "タスク {1} '{2}' は既に開始しています。" diff --git a/src/l10n/pol-POL.h b/src/l10n/pol-POL.h index dec6b975e..529599321 100644 --- a/src/l10n/pol-POL.h +++ b/src/l10n/pol-POL.h @@ -398,6 +398,10 @@ #define STRING_CMD_DUPLICATE_1 "Skopiowano {1} zadanie." #define STRING_CMD_DUPLICATE_N "Skopiowano {1} zadań." +#define STRING_CMD_PURGE_USAGE "Removes the specified tasks from the data files. Causes permanent loss of data." +#define STRING_CMD_PURGE_1 "Purged {1} task." +#define STRING_CMD_PURGE_N "Purged {1} tasks." + #define STRING_CMD_START_USAGE "Oznacza zadanie jako uruchomione" #define STRING_CMD_START_NO "Zadanie nie uruchomione" #define STRING_CMD_START_ALREADY "Zadanie {1} '{2}' jest już uruchomione" diff --git a/src/l10n/por-PRT.h b/src/l10n/por-PRT.h index 9d2ef8b74..f310a6d2d 100644 --- a/src/l10n/por-PRT.h +++ b/src/l10n/por-PRT.h @@ -398,6 +398,10 @@ #define STRING_CMD_DUPLICATE_1 "Duplicada {1} tarefa." #define STRING_CMD_DUPLICATE_N "Duplicadas {1} tarefas." +#define STRING_CMD_PURGE_USAGE "Removes the specified tasks from the data files. Causes permanent loss of data." +#define STRING_CMD_PURGE_1 "Purged {1} task." +#define STRING_CMD_PURGE_N "Purged {1} tasks." + #define STRING_CMD_START_USAGE "Assinala a tarefa especificada como iniciada" #define STRING_CMD_START_NO "Tarefa não iniciada." #define STRING_CMD_START_ALREADY "Tarefa {1} '{2}' já iniciada." From 894eb3ab7990632989b4b37485bcf96de015d4c4 Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sun, 20 Mar 2016 10:02:29 +0100 Subject: [PATCH 021/879] CmdPurge: Prompt before purging a task --- src/commands/CmdPurge.cpp | 27 ++++++++++++++++++--------- src/l10n/eng-USA.h | 1 + 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/commands/CmdPurge.cpp b/src/commands/CmdPurge.cpp index 12cf14c3a..1d9143e43 100644 --- a/src/commands/CmdPurge.cpp +++ b/src/commands/CmdPurge.cpp @@ -30,6 +30,7 @@ #include #include #include +#include extern Context context; @@ -73,18 +74,26 @@ int CmdPurge::execute (std::string&) if (task.getStatus () == Task::deleted) { - context.tdb2.purge (task); - count++; + std::string question; + question = format (STRING_CMD_PURGE_CONFIRM, + task.identifier (true), + task.get ("description")); - // Remove dependencies on the task being purged - for (auto& blockedConst: context.tdb2.all_tasks ()) + if (permission (question, filtered.size ())) { - Task& blocked = const_cast(blockedConst); - if (blocked.has ("depends") && - blocked.get ("depends").find (uuid) != std::string::npos) + context.tdb2.purge (task); + count++; + + // Remove dependencies on the task being purged + for (auto& blockedConst: context.tdb2.all_tasks ()) { - blocked.removeDependency (uuid); - context.tdb2.modify (blocked); + Task& blocked = const_cast(blockedConst); + if (blocked.has ("depends") && + blocked.get ("depends").find (uuid) != std::string::npos) + { + blocked.removeDependency (uuid); + context.tdb2.modify (blocked); + } } } } diff --git a/src/l10n/eng-USA.h b/src/l10n/eng-USA.h index 857628cf4..3bded4f9e 100644 --- a/src/l10n/eng-USA.h +++ b/src/l10n/eng-USA.h @@ -399,6 +399,7 @@ #define STRING_CMD_PURGE_USAGE "Removes the specified tasks from the data files. Causes permanent loss of data." #define STRING_CMD_PURGE_1 "Purged {1} task." #define STRING_CMD_PURGE_N "Purged {1} tasks." +#define STRING_CMD_PURGE_CONFIRM "Permanently remove task {1} '{2}'?" #define STRING_CMD_START_USAGE "Marks specified task as started" #define STRING_CMD_START_NO "Task not started." From c04bdc48aae54f482bf3bc18b840585b0b45e970 Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sun, 20 Mar 2016 15:16:05 +0100 Subject: [PATCH 022/879] CmdPurge: Move dependency handling into separate method --- src/commands/CmdPurge.cpp | 32 ++++++++++++++++++++------------ src/commands/CmdPurge.h | 2 ++ 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/commands/CmdPurge.cpp b/src/commands/CmdPurge.cpp index 1d9143e43..ef9816e3e 100644 --- a/src/commands/CmdPurge.cpp +++ b/src/commands/CmdPurge.cpp @@ -51,6 +51,25 @@ CmdPurge::CmdPurge () _category = Command::Category::operation; } +//////////////////////////////////////////////////////////////////////////////// +// Makes sure that any task having the dependency on the task being purged +// has that dependency removed, to preserve referential integrity. +void CmdPurge::handleDeps (Task& task) +{ + std::string uuid = task.get ("uuid"); + + for (auto& blockedConst: context.tdb2.all_tasks ()) + { + Task& blocked = const_cast(blockedConst); + if (blocked.has ("depends") && + blocked.get ("depends").find (uuid) != std::string::npos) + { + blocked.removeDependency (uuid); + context.tdb2.modify (blocked); + } + } +} + //////////////////////////////////////////////////////////////////////////////// int CmdPurge::execute (std::string&) { @@ -82,19 +101,8 @@ int CmdPurge::execute (std::string&) if (permission (question, filtered.size ())) { context.tdb2.purge (task); + handleDeps(task); count++; - - // Remove dependencies on the task being purged - for (auto& blockedConst: context.tdb2.all_tasks ()) - { - Task& blocked = const_cast(blockedConst); - if (blocked.has ("depends") && - blocked.get ("depends").find (uuid) != std::string::npos) - { - blocked.removeDependency (uuid); - context.tdb2.modify (blocked); - } - } } } } diff --git a/src/commands/CmdPurge.h b/src/commands/CmdPurge.h index 8e9c76446..76644f3b3 100644 --- a/src/commands/CmdPurge.h +++ b/src/commands/CmdPurge.h @@ -32,6 +32,8 @@ class CmdPurge : public Command { +private: + void handleDeps (Task& task); public: CmdPurge (); int execute (std::string&); From 3e65c3af5e84f59bd10df75c9fe9be25c4c95cd9 Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sun, 20 Mar 2016 15:45:15 +0100 Subject: [PATCH 023/879] CmdPurge: Simplify implementation --- src/commands/CmdPurge.cpp | 23 ++++++++++++++++------- src/commands/CmdPurge.h | 1 + 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/commands/CmdPurge.cpp b/src/commands/CmdPurge.cpp index ef9816e3e..040598c19 100644 --- a/src/commands/CmdPurge.cpp +++ b/src/commands/CmdPurge.cpp @@ -51,6 +51,16 @@ CmdPurge::CmdPurge () _category = Command::Category::operation; } +//////////////////////////////////////////////////////////////////////////////// +// Purges the task, while taking care of: +// - dependencies on this task +void CmdPurge::purgeTask (Task& task, int& count) +{ + context.tdb2.purge (task); + handleDeps (task); + count++; +} + //////////////////////////////////////////////////////////////////////////////// // Makes sure that any task having the dependency on the task being purged // has that dependency removed, to preserve referential integrity. @@ -89,8 +99,11 @@ int CmdPurge::execute (std::string&) for (auto& task : filtered) { - std::string uuid = task.get ("uuid"); - + // Allow purging of deleted tasks only. Hence no need to deal with: + // - unblocked tasks notifications (deleted tasks are not blocking) + // - project changes (deleted tasks not included in progress) + // It also has the nice property of being explicit - users need to + // mark tasks as deleted before purging. if (task.getStatus () == Task::deleted) { std::string question; @@ -99,11 +112,7 @@ int CmdPurge::execute (std::string&) task.get ("description")); if (permission (question, filtered.size ())) - { - context.tdb2.purge (task); - handleDeps(task); - count++; - } + purgeTask (task, count); } } diff --git a/src/commands/CmdPurge.h b/src/commands/CmdPurge.h index 76644f3b3..7081e9776 100644 --- a/src/commands/CmdPurge.h +++ b/src/commands/CmdPurge.h @@ -33,6 +33,7 @@ class CmdPurge : public Command { private: + void purgeTask (Task& task, int& count); void handleDeps (Task& task); public: CmdPurge (); From 181f098958bafa22be5d82ea1ad47a12fc15aa4a Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sun, 20 Mar 2016 15:46:17 +0100 Subject: [PATCH 024/879] TDB2: Fix wrong comment --- src/TDB2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TDB2.cpp b/src/TDB2.cpp index 5d501eb9b..0f3e696c3 100644 --- a/src/TDB2.cpp +++ b/src/TDB2.cpp @@ -1408,7 +1408,7 @@ const std::vector TDB2::children (Task& task) if (i.getStatus () != Task::completed && i.getStatus () != Task::deleted) { - // If task has the same parent, it is a sibling. + // If task has the given task as a parent, it is a child task. if (i.get ("parent") == parent) results.push_back (i); } From 2467200a3b3eb51a715f8a6a55a8e878174b774f Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sun, 20 Mar 2016 17:25:03 +0100 Subject: [PATCH 025/879] CmdPurge: Handle child tasks of recurrence templates --- src/commands/CmdPurge.cpp | 53 +++++++++++++++++++++++++++++++++++++++ src/commands/CmdPurge.h | 1 + src/l10n/eng-USA.h | 3 +++ 3 files changed, 57 insertions(+) diff --git a/src/commands/CmdPurge.cpp b/src/commands/CmdPurge.cpp index 040598c19..ab6d3b4b7 100644 --- a/src/commands/CmdPurge.cpp +++ b/src/commands/CmdPurge.cpp @@ -31,6 +31,7 @@ #include #include #include +#include extern Context context; @@ -54,10 +55,12 @@ CmdPurge::CmdPurge () //////////////////////////////////////////////////////////////////////////////// // Purges the task, while taking care of: // - dependencies on this task +// - child tasks void CmdPurge::purgeTask (Task& task, int& count) { context.tdb2.purge (task); handleDeps (task); + handleChildren (task, count); count++; } @@ -80,6 +83,56 @@ void CmdPurge::handleDeps (Task& task) } } +//////////////////////////////////////////////////////////////////////////////// +// Makes sure that with any recurrence parent are all the child tasks removed +// as well. If user chooses not to, the whole command is aborted. +void CmdPurge::handleChildren (Task& task, int& count) +{ + // If this is not a recurrence parent, we have no job here + if (!task.has ("mask")) + return; + + std::string uuid = task.get ("uuid"); + std::vector children; + + // Find all child tasks + for (auto& childConst: context.tdb2.all_tasks ()) + { + Task& child = const_cast (childConst); + + if (child.get ("parent") == uuid) + { + if (child.getStatus () != Task::deleted) + // In case any child task is not deleted, bail out + throw format (STRING_CMD_PURGE_NDEL_CHILD, + task.get ("description"), + child.identifier (true)); + else + children.push_back (child); + } + } + + // If there are no children, our job is done + if (children.empty ()) + return; + + // Ask for confirmation to purge them, if needed + std::string question = format (STRING_CMD_PURGE_CONFIRM_R, + task.get ("description"), + children.size ()); + + if (context.config.getBoolean ("recurrence.confirmation") || + (context.config.get ("recurrence.confirmation") == "prompt" + && confirm (question))) + { + for (auto& child: children) + purgeTask (child, count); + } + else + throw std::string (STRING_CMD_PURGE_ABRT); +} + + //////////////////////////////////////////////////////////////////////////////// int CmdPurge::execute (std::string&) { diff --git a/src/commands/CmdPurge.h b/src/commands/CmdPurge.h index 7081e9776..3bb0f2c82 100644 --- a/src/commands/CmdPurge.h +++ b/src/commands/CmdPurge.h @@ -34,6 +34,7 @@ class CmdPurge : public Command { private: void purgeTask (Task& task, int& count); + void handleChildren (Task& task, int& count); void handleDeps (Task& task); public: CmdPurge (); diff --git a/src/l10n/eng-USA.h b/src/l10n/eng-USA.h index 3bded4f9e..84de21d6b 100644 --- a/src/l10n/eng-USA.h +++ b/src/l10n/eng-USA.h @@ -397,9 +397,12 @@ #define STRING_CMD_DUPLICATE_N "Duplicated {1} tasks." #define STRING_CMD_PURGE_USAGE "Removes the specified tasks from the data files. Causes permanent loss of data." +#define STRING_CMD_PURGE_ABRT "Purge operation aborted." #define STRING_CMD_PURGE_1 "Purged {1} task." #define STRING_CMD_PURGE_N "Purged {1} tasks." #define STRING_CMD_PURGE_CONFIRM "Permanently remove task {1} '{2}'?" +#define STRING_CMD_PURGE_CONFIRM_R "Task '{1}' is a recurrence template. All its {2} deleted children tasks will be purged as well. Continue?" +#define STRING_CMD_PURGE_NDEL_CHILD "Task '{1}' is a recurrence template. Its child task {2} must be deleted before it can be purged." #define STRING_CMD_START_USAGE "Marks specified task as started" #define STRING_CMD_START_NO "Task not started." From 46a36a10a50095459f05c0acff7a3769e19c9835 Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sun, 20 Mar 2016 17:33:42 +0100 Subject: [PATCH 026/879] tests: The purge command now requires confirmation --- test/purge.t | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/purge.t b/test/purge.t index 7b8363683..cce3bf733 100755 --- a/test/purge.t +++ b/test/purge.t @@ -47,7 +47,7 @@ class TestDelete(TestCase): code, out, err = self.t("1 delete", input="y\n") self.assertIn("Deleted 1 task.", out) - code, out, err = self.t(uuid + " purge") + code, out, err = self.t(uuid + " purge", input="y\n") self.assertIn("Purged 1 task.", out) code, out, err = self.t("uuids") @@ -62,7 +62,7 @@ class TestDelete(TestCase): code, out, err = self.t("1 delete", input="y\n") self.assertIn("Deleted 1 task.", out) - code, out, err = self.t(uuid + " purge") + code, out, err = self.t(uuid + " purge", input="y\n") self.assertIn("Purged 1 task.", out) code, out, err = self.t("uuids") From cae0f15245067ec4f9e46448ef5ee7d0f6e78faf Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sun, 20 Mar 2016 18:26:16 +0100 Subject: [PATCH 027/879] tests: Expand test cases for purge command --- test/purge.t | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-) diff --git a/test/purge.t b/test/purge.t index cce3bf733..afa2ddd3c 100755 --- a/test/purge.t +++ b/test/purge.t @@ -54,7 +54,7 @@ class TestDelete(TestCase): self.assertNotIn(uuid, out) def test_purge_remove_deps(self): - """Verify that purge command removes dependency references""" + """Purge command removes broken dependency references""" self.t("add one") self.t("add two dep:1") uuid = self.t("_get 1.uuid")[1].strip() @@ -71,6 +71,86 @@ class TestDelete(TestCase): dependencies = self.t("_get 1.depends")[1].strip() self.assertNotIn(uuid, dependencies) + def test_purge_children(self): + """Purge command indirectly purges child tasks""" + self.t("add one recur:daily due:yesterday") + uuid = self.t("_get 1.uuid")[1].strip() + + # A dummy call to report, so that recurrence tasks get generated + self.t("list") + + code, out, err = self.t("1 delete", input="y\ny\n") + self.assertIn("Deleted 4 tasks.", out) + + code, out, err = self.t(uuid + " purge", input="y\ny\n") + self.assertIn("Purged 4 tasks.", out) + + code, out, err = self.t("uuids") + self.assertEqual('\n', out) + + def test_purge_children_fail_pending(self): + """Purge aborts if task has pending children""" + self.t("add one recur:daily due:yesterday") + uuid = self.t("_get 1.uuid")[1].strip() + + # A dummy call to report, so that recurrence tasks get generated + self.t("list") + + code, out, err = self.t("1 delete", input="y\nn\n") + self.assertIn("Deleted 1 task.", out) + + code, out, err = self.t.runError(uuid + " purge", input="y\n") + self.assertIn("child task 1 must be deleted before", err) + + # Check that nothing was purged + code, out, err = self.t("count") + self.assertEqual('4\n', out) + + def test_purge_children_fail_confirm(self): + """Purge aborts if user does not agree with it affecting child tasks""" + self.t("add one recur:daily due:yesterday") + uuid = self.t("_get 1.uuid")[1].strip() + + # A dummy call to report, so that recurrence tasks get generated + self.t("list") + + code, out, err = self.t("1 delete", input="y\ny\n") + self.assertIn("Deleted 4 tasks.", out) + + # Do not agree with purging of the child tasks + code, out, err = self.t.runError(uuid + " purge", input="y\nn\n") + self.assertIn("Purge operation aborted.", err) + + # Check that nothing was purged + code, out, err = self.t("count") + self.assertEqual('4\n', out) + + def test_purge_children(self): + """Purge command removes dependencies on indirectly purged tasks""" + self.t("add one recur:daily due:yesterday") + uuid = self.t("_get 1.uuid")[1].strip() + + # A dummy call to report, so that recurrence tasks get generated + self.t("list") + self.t("add two dep:4") + + # Check that the dependency is present + dependencies = self.t("_get 5.depends")[1].strip() + self.assertNotEqual("", dependencies) + + code, out, err = self.t("1 delete", input="y\ny\n") + self.assertIn("Deleted 4 tasks.", out) + + code, out, err = self.t(uuid + " purge", input="y\ny\n") + self.assertIn("Purged 4 tasks.", out) + + # Make sure we are dealing with the intended task + description = self.t("_get 1.description")[1].strip() + self.assertEqual("two", description) + + # Check that the dependency was removed + dependencies = self.t("_get 1.depends")[1].strip() + self.assertEqual("", dependencies) if __name__ == "__main__": from simpletap import TAPTestRunner From 75b220dbc418ea1c795a68f2bcef37cd68692fc1 Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sun, 20 Mar 2016 19:21:07 +0100 Subject: [PATCH 028/879] docs: Document new purge command --- doc/man/task.1.in | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/man/task.1.in b/doc/man/task.1.in index 684143e74..d6f8d2f51 100644 --- a/doc/man/task.1.in +++ b/doc/man/task.1.in @@ -376,6 +376,14 @@ Modifies the existing task with provided information. .B task prepend Prepends description text to an existing task. +.TP +.B task purge +Permanently removes the specified tasks from the data files. Only +tasks that are alredy deleted can be purged. This command has a +local-only effect and changes introduced by it are not synced. + +Warning: causes permanent, non-revertible loss of data. + .TP .B task start Marks the specified tasks as started. From 3cb974de49243e5a391478f246cf06cb9c0c113e Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sun, 20 Mar 2016 19:24:44 +0100 Subject: [PATCH 029/879] Docs: Update ChangeLog and NEWS --- ChangeLog | 6 ++++-- NEWS | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 672d258af..ac1dd4669 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,9 @@ 2.5.2 () - -- TD-64 sync conflict deleted all annotations of the task - (thanks to Markus Beppler, Konstantin Vorobyev). +- TD-64 sync conflict deleted all annotations of the task + (thanks to Markus Beppler, Konstantin Vorobyev). +- TW-1785 Purge command to remove deleted tasks + (thanks to Paul Beckingham) - Removed deprecated 'alias._query' setting. 2.5.1 (2016-02-24) 8b4ae3b54b44dfbd00b96cdd6dceb8dfe7cc1ea0 diff --git a/NEWS b/NEWS index 01a955d27..ec110212d 100644 --- a/NEWS +++ b/NEWS @@ -5,7 +5,7 @@ New Features in Taskwarrior 2.5.2 New Commands in Taskwarrior 2.5.2 - - + - The 'purge' command was introduced. New Configuration Options in Taskwarrior 2.5.2 From dbec3ad33ff08cc6e13cdf75a91e59a2d004c1a1 Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sun, 20 Mar 2016 19:28:09 +0100 Subject: [PATCH 030/879] l10n: Propagate the purge-related strings into language files --- src/l10n/deu-DEU.h | 4 ++++ src/l10n/epo-RUS.h | 4 ++++ src/l10n/esp-ESP.h | 4 ++++ src/l10n/fra-FRA.h | 4 ++++ src/l10n/ita-ITA.h | 4 ++++ src/l10n/jpn-JPN.h | 4 ++++ src/l10n/pol-POL.h | 4 ++++ src/l10n/por-PRT.h | 4 ++++ 8 files changed, 32 insertions(+) diff --git a/src/l10n/deu-DEU.h b/src/l10n/deu-DEU.h index e3b4a003c..3135d37ac 100644 --- a/src/l10n/deu-DEU.h +++ b/src/l10n/deu-DEU.h @@ -399,8 +399,12 @@ #define STRING_CMD_DUPLICATE_N "{1} Aufgaben verdoppelt." #define STRING_CMD_PURGE_USAGE "Removes the specified tasks from the data files. Causes permanent loss of data." +#define STRING_CMD_PURGE_ABRT "Purge operation aborted." #define STRING_CMD_PURGE_1 "Purged {1} task." #define STRING_CMD_PURGE_N "Purged {1} tasks." +#define STRING_CMD_PURGE_CONFIRM "Permanently remove task {1} '{2}'?" +#define STRING_CMD_PURGE_CONFIRM_R "Task '{1}' is a recurrence template. All its {2} deleted children tasks will be purged as well. Continue?" +#define STRING_CMD_PURGE_NDEL_CHILD "Task '{1}' is a recurrence template. Its child task {2} must be deleted before it can be purged." #define STRING_CMD_START_USAGE "Kennzeichnet die gewählte Aufgabe als begonnen." #define STRING_CMD_START_NO "Aufgabe nicht begonnen." diff --git a/src/l10n/epo-RUS.h b/src/l10n/epo-RUS.h index 1412ce5b9..cb07b51e7 100644 --- a/src/l10n/epo-RUS.h +++ b/src/l10n/epo-RUS.h @@ -399,8 +399,12 @@ #define STRING_CMD_DUPLICATE_N "Kopiis {1} taskojn." #define STRING_CMD_PURGE_USAGE "Removes the specified tasks from the data files. Causes permanent loss of data." +#define STRING_CMD_PURGE_ABRT "Purge operation aborted." #define STRING_CMD_PURGE_1 "Purged {1} task." #define STRING_CMD_PURGE_N "Purged {1} tasks." +#define STRING_CMD_PURGE_CONFIRM "Permanently remove task {1} '{2}'?" +#define STRING_CMD_PURGE_CONFIRM_R "Task '{1}' is a recurrence template. All its {2} deleted children tasks will be purged as well. Continue?" +#define STRING_CMD_PURGE_NDEL_CHILD "Task '{1}' is a recurrence template. Its child task {2} must be deleted before it can be purged." #define STRING_CMD_START_USAGE "Markas la specifatan taskon kiel ekita" #define STRING_CMD_START_NO "Ne ekis taskon." diff --git a/src/l10n/esp-ESP.h b/src/l10n/esp-ESP.h index 15e3f638d..4ca54b673 100644 --- a/src/l10n/esp-ESP.h +++ b/src/l10n/esp-ESP.h @@ -404,8 +404,12 @@ #define STRING_CMD_DUPLICATE_N "Duplicadas {1} tareas." #define STRING_CMD_PURGE_USAGE "Removes the specified tasks from the data files. Causes permanent loss of data." +#define STRING_CMD_PURGE_ABRT "Purge operation aborted." #define STRING_CMD_PURGE_1 "Purged {1} task." #define STRING_CMD_PURGE_N "Purged {1} tasks." +#define STRING_CMD_PURGE_CONFIRM "Permanently remove task {1} '{2}'?" +#define STRING_CMD_PURGE_CONFIRM_R "Task '{1}' is a recurrence template. All its {2} deleted children tasks will be purged as well. Continue?" +#define STRING_CMD_PURGE_NDEL_CHILD "Task '{1}' is a recurrence template. Its child task {2} must be deleted before it can be purged." #define STRING_CMD_START_USAGE "Marca la tarea especificada como comenzada" #define STRING_CMD_START_NO "Tarea no comenzada." diff --git a/src/l10n/fra-FRA.h b/src/l10n/fra-FRA.h index 8ca0a4f0e..4046ed457 100644 --- a/src/l10n/fra-FRA.h +++ b/src/l10n/fra-FRA.h @@ -399,8 +399,12 @@ #define STRING_CMD_DUPLICATE_N "Duplicated {1} tasks." #define STRING_CMD_PURGE_USAGE "Removes the specified tasks from the data files. Causes permanent loss of data." +#define STRING_CMD_PURGE_ABRT "Purge operation aborted." #define STRING_CMD_PURGE_1 "Purged {1} task." #define STRING_CMD_PURGE_N "Purged {1} tasks." +#define STRING_CMD_PURGE_CONFIRM "Permanently remove task {1} '{2}'?" +#define STRING_CMD_PURGE_CONFIRM_R "Task '{1}' is a recurrence template. All its {2} deleted children tasks will be purged as well. Continue?" +#define STRING_CMD_PURGE_NDEL_CHILD "Task '{1}' is a recurrence template. Its child task {2} must be deleted before it can be purged." #define STRING_CMD_START_USAGE "Marks specified task as started" #define STRING_CMD_START_NO "Tâche non démarrée." diff --git a/src/l10n/ita-ITA.h b/src/l10n/ita-ITA.h index f5a6e48ac..95e0da6b2 100644 --- a/src/l10n/ita-ITA.h +++ b/src/l10n/ita-ITA.h @@ -398,8 +398,12 @@ #define STRING_CMD_DUPLICATE_N "Task {1} duplicati." #define STRING_CMD_PURGE_USAGE "Removes the specified tasks from the data files. Causes permanent loss of data." +#define STRING_CMD_PURGE_ABRT "Purge operation aborted." #define STRING_CMD_PURGE_1 "Purged {1} task." #define STRING_CMD_PURGE_N "Purged {1} tasks." +#define STRING_CMD_PURGE_CONFIRM "Permanently remove task {1} '{2}'?" +#define STRING_CMD_PURGE_CONFIRM_R "Task '{1}' is a recurrence template. All its {2} deleted children tasks will be purged as well. Continue?" +#define STRING_CMD_PURGE_NDEL_CHILD "Task '{1}' is a recurrence template. Its child task {2} must be deleted before it can be purged." #define STRING_CMD_START_USAGE "Contrassegna i task specificati come avviati" #define STRING_CMD_START_NO "Task non avviato." diff --git a/src/l10n/jpn-JPN.h b/src/l10n/jpn-JPN.h index a6d8b0c7b..e82ba9bc7 100644 --- a/src/l10n/jpn-JPN.h +++ b/src/l10n/jpn-JPN.h @@ -399,8 +399,12 @@ #define STRING_CMD_DUPLICATE_N "重複した {1} タスク。" #define STRING_CMD_PURGE_USAGE "Removes the specified tasks from the data files. Causes permanent loss of data." +#define STRING_CMD_PURGE_ABRT "Purge operation aborted." #define STRING_CMD_PURGE_1 "Purged {1} task." #define STRING_CMD_PURGE_N "Purged {1} tasks." +#define STRING_CMD_PURGE_CONFIRM "Permanently remove task {1} '{2}'?" +#define STRING_CMD_PURGE_CONFIRM_R "Task '{1}' is a recurrence template. All its {2} deleted children tasks will be purged as well. Continue?" +#define STRING_CMD_PURGE_NDEL_CHILD "Task '{1}' is a recurrence template. Its child task {2} must be deleted before it can be purged." #define STRING_CMD_START_USAGE "Marks specified task as started" #define STRING_CMD_START_NO "タスク は開始していません。" diff --git a/src/l10n/pol-POL.h b/src/l10n/pol-POL.h index 529599321..1264c3f6f 100644 --- a/src/l10n/pol-POL.h +++ b/src/l10n/pol-POL.h @@ -399,8 +399,12 @@ #define STRING_CMD_DUPLICATE_N "Skopiowano {1} zadań." #define STRING_CMD_PURGE_USAGE "Removes the specified tasks from the data files. Causes permanent loss of data." +#define STRING_CMD_PURGE_ABRT "Purge operation aborted." #define STRING_CMD_PURGE_1 "Purged {1} task." #define STRING_CMD_PURGE_N "Purged {1} tasks." +#define STRING_CMD_PURGE_CONFIRM "Permanently remove task {1} '{2}'?" +#define STRING_CMD_PURGE_CONFIRM_R "Task '{1}' is a recurrence template. All its {2} deleted children tasks will be purged as well. Continue?" +#define STRING_CMD_PURGE_NDEL_CHILD "Task '{1}' is a recurrence template. Its child task {2} must be deleted before it can be purged." #define STRING_CMD_START_USAGE "Oznacza zadanie jako uruchomione" #define STRING_CMD_START_NO "Zadanie nie uruchomione" diff --git a/src/l10n/por-PRT.h b/src/l10n/por-PRT.h index f310a6d2d..0de68ed5c 100644 --- a/src/l10n/por-PRT.h +++ b/src/l10n/por-PRT.h @@ -399,8 +399,12 @@ #define STRING_CMD_DUPLICATE_N "Duplicadas {1} tarefas." #define STRING_CMD_PURGE_USAGE "Removes the specified tasks from the data files. Causes permanent loss of data." +#define STRING_CMD_PURGE_ABRT "Purge operation aborted." #define STRING_CMD_PURGE_1 "Purged {1} task." #define STRING_CMD_PURGE_N "Purged {1} tasks." +#define STRING_CMD_PURGE_CONFIRM "Permanently remove task {1} '{2}'?" +#define STRING_CMD_PURGE_CONFIRM_R "Task '{1}' is a recurrence template. All its {2} deleted children tasks will be purged as well. Continue?" +#define STRING_CMD_PURGE_NDEL_CHILD "Task '{1}' is a recurrence template. Its child task {2} must be deleted before it can be purged." #define STRING_CMD_START_USAGE "Assinala a tarefa especificada como iniciada" #define STRING_CMD_START_NO "Tarefa não iniciada." From 726c31f8deeadf2f50e21de5ce18052ba1e181a4 Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Tue, 22 Mar 2016 02:49:01 +0100 Subject: [PATCH 031/879] dependencyIsCircular: Do not visit one node multiple times --- src/dependency.cpp | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/dependency.cpp b/src/dependency.cpp index 608f0b5bc..124610d6f 100644 --- a/src/dependency.cpp +++ b/src/dependency.cpp @@ -75,7 +75,11 @@ bool dependencyIsCircular (const Task& task) auto task_uuid = task.get ("uuid"); std::stack s; + std::unordered_set visited; + s.push (task); + visited.insert (task_uuid); + while (! s.empty ()) { Task& current = s.top (); @@ -83,21 +87,25 @@ bool dependencyIsCircular (const Task& task) current.getDependencies (deps_current); // This is a basic depth first search that always terminates given the - // assumption that any cycles in the dependency graph must have been - // introduced by the task that is being checked. - // Since any previous cycles would have been prevented by this very - // function, this is a reasonable assumption. + // fact that we do not visit any task twice for (unsigned int i = 0; i < deps_current.size (); i++) { if (context.tdb2.get (deps_current[i], current)) { - if (task_uuid == current.get ("uuid")) + auto current_uuid = current.get ("uuid"); + + if (task_uuid == current_uuid) { // Cycle found, initial task reached for the second time! return true; } - s.push (current); + if (visited.find (current_uuid) == visited.end ()) + { + // Push the task to the stack, if it has not been processed yet + s.push (current); + visited.insert (current_uuid); + } } } From 75403c0ec1dff020a36f39f38ff303b5d2db44d2 Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Tue, 22 Mar 2016 02:50:48 +0100 Subject: [PATCH 032/879] TW-1772: Implementation of circular dependency detection is inefficient - Thanks to Michael Meier. --- AUTHORS | 1 + ChangeLog | 2 ++ 2 files changed, 3 insertions(+) diff --git a/AUTHORS b/AUTHORS index 1e2e01e2c..2f2743f28 100644 --- a/AUTHORS +++ b/AUTHORS @@ -288,3 +288,4 @@ suggestions: pawprint Reg Yaroslav Molochko + Michael Meier diff --git a/ChangeLog b/ChangeLog index ac1dd4669..547d963d2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,8 @@ (thanks to Markus Beppler, Konstantin Vorobyev). - TW-1785 Purge command to remove deleted tasks (thanks to Paul Beckingham) +- TW-1772 Implementation of circular dependency detection is + inefficient (thanks to Michael Meier). - Removed deprecated 'alias._query' setting. 2.5.1 (2016-02-24) 8b4ae3b54b44dfbd00b96cdd6dceb8dfe7cc1ea0 From 8a50d8b6a974cfbc719919502c7a82104820833b Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Tue, 22 Mar 2016 23:42:23 +0100 Subject: [PATCH 033/879] validate: Pending tasks cannot have end attribute set --- src/Task.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Task.cpp b/src/Task.cpp index 23e3a44a5..6ac7c952c 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -1491,6 +1491,10 @@ void Task::validate (bool applyDefault /* = true */) (! has ("end") || get ("end") == "")) setAsNow ("end"); + // Pending tasks cannot have an end date, remove if present + if ((status == Task::pending) && (get ("end") != "")) + remove ("end"); + // Provide an entry date unless user already specified one. if (! has ("modified") || get ("modified") == "") setAsNow ("modified"); From c42a73d57262ce7f4292229915a143292ab97871 Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Tue, 22 Mar 2016 23:43:27 +0100 Subject: [PATCH 034/879] tests: Add test for TW-1788 --- test/start.t | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/start.t b/test/start.t index a1d143864..63befe283 100755 --- a/test/start.t +++ b/test/start.t @@ -95,6 +95,19 @@ class TestStart(TestCase): code, out, err = self.t("long") self.assertIn("Nu stannar vi", out) + def test_start_remove_end(self): + """Verify that starting a task removes end timestamp""" + self.t("add one") + uuid = self.t('_get 1.uuid')[1].strip() + + self.t("1 done") + task = self.t.export()[0] + self.assertIn("end", task) + + self.t(uuid + " start") + task = self.t.export()[0] + self.assertNotIn("end", task) + class TestActiveTaskHandling(TestCase): def setUp(self): From 1980df89c06c9c36d5c90822c367f5d13e05818b Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Tue, 22 Mar 2016 23:43:49 +0100 Subject: [PATCH 035/879] TW-1788: Closing a reopened task does not update the end time - Thanks to Ralph Bean. --- ChangeLog | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ChangeLog b/ChangeLog index 547d963d2..a55d9cd98 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,6 +6,8 @@ (thanks to Paul Beckingham) - TW-1772 Implementation of circular dependency detection is inefficient (thanks to Michael Meier). +- TW-1788 Closing a reopened task does not update the end time (thanks + to Ralph Bean). - Removed deprecated 'alias._query' setting. 2.5.1 (2016-02-24) 8b4ae3b54b44dfbd00b96cdd6dceb8dfe7cc1ea0 From 6d6bdebb57f16f84a7a3df59b8761f84fb195bfd Mon Sep 17 00:00:00 2001 From: Tom Sydney Kerckhove Date: Sat, 26 Mar 2016 15:30:02 +0100 Subject: [PATCH 036/879] Docs: fixed inconsistency in the spelling of CMake --- AUTHORS | 1 + INSTALL | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/AUTHORS b/AUTHORS index 2f2743f28..3cb2e526a 100644 --- a/AUTHORS +++ b/AUTHORS @@ -127,6 +127,7 @@ The following submitted code, packages or analysis, and deserve special thanks: Misty De Meo Kent R. Spillner Konstantin Vorobyev + Tom Sydney Kerckhove Thanks to the following, who submitted detailed bug reports and excellent suggestions: diff --git a/INSTALL b/INSTALL index 034caee9a..1c6a5e862 100644 --- a/INSTALL +++ b/INSTALL @@ -9,7 +9,7 @@ Dependencies ------------ You will need the CMake build system installed in order to build Taskwarrior -from source. More information on cmake can be obtained at http://cmake.org +from source. More information on CMake can be obtained at http://cmake.org You will also need: - make From 7f91e014a0efb26f47c779b0950f213da6f1a83a Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sat, 26 Mar 2016 21:21:51 -0400 Subject: [PATCH 037/879] Tests: Typo in test --- test/version.t | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/version.t b/test/version.t index 5880ee5c2..76e8a2f58 100755 --- a/test/version.t +++ b/test/version.t @@ -110,7 +110,7 @@ class TestVersion(TestCase): self.assertIn(expected, out) def test_version_option(self): - """Verify that 'task --version' returnes something valid""" + """Verify that 'task --version' returns something valid""" code, out, err = self.t("--version") self.assertRegexpMatches(out, r'^\d\.\d+\.\d+(\.\w+)?$') From ea8a499769ae1e2982f6403a3076b967edead04d Mon Sep 17 00:00:00 2001 From: Lynoure Braakman Date: Sun, 27 Mar 2016 22:34:57 +0200 Subject: [PATCH 038/879] juhannus as an alternative name for midsommarafton --- AUTHORS | 1 + ChangeLog | 6 ++++-- doc/man/task.1.in | 2 ++ src/Dates.cpp | 5 +++-- test/dates.t.cpp | 2 ++ 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/AUTHORS b/AUTHORS index 3cb2e526a..681ec89e5 100644 --- a/AUTHORS +++ b/AUTHORS @@ -128,6 +128,7 @@ The following submitted code, packages or analysis, and deserve special thanks: Kent R. Spillner Konstantin Vorobyev Tom Sydney Kerckhove + Lynoure Braakman Thanks to the following, who submitted detailed bug reports and excellent suggestions: diff --git a/ChangeLog b/ChangeLog index a55d9cd98..114e8b526 100644 --- a/ChangeLog +++ b/ChangeLog @@ -6,8 +6,10 @@ (thanks to Paul Beckingham) - TW-1772 Implementation of circular dependency detection is inefficient (thanks to Michael Meier). -- TW-1788 Closing a reopened task does not update the end time (thanks - to Ralph Bean). +- TW-1788 Closing a reopened task does not update the end time + (thanks to Ralph Bean). +- Added 'juhannus' as a synonym for 'midsommarafton' + (thanks to Lynoure Braakman). - Removed deprecated 'alias._query' setting. 2.5.1 (2016-02-24) 8b4ae3b54b44dfbd00b96cdd6dceb8dfe7cc1ea0 diff --git a/doc/man/task.1.in b/doc/man/task.1.in index d6f8d2f51..3a9670b91 100644 --- a/doc/man/task.1.in +++ b/doc/man/task.1.in @@ -1048,6 +1048,8 @@ task ... due:pentecost task ... due:midsommar .br task ... due:midsommarafton +.br +task ... due:juhannus .RE .SS FREQUENCIES diff --git a/src/Dates.cpp b/src/Dates.cpp index a0b5035c2..a721b6a49 100644 --- a/src/Dates.cpp +++ b/src/Dates.cpp @@ -93,7 +93,7 @@ static void midsommar (struct tm* t) static void midsommarafton (struct tm* t) { t->tm_mon = 5; // June. - t->tm_mday = 19; // Saturday after 20th. + t->tm_mday = 19; // Friday after 19th. t->tm_hour = t->tm_min = t->tm_sec = 0; // Midnight. t->tm_isdst = -1; // Probably DST, but check. @@ -491,7 +491,8 @@ bool namedDates (const std::string& name, Variant& value) value = Variant (mktime (t), Variant::type_date); } - else if (closeEnough ("midsommarafton", name, minimum)) + else if (closeEnough ("midsommarafton", name, minimum) || + closeEnough ("juhannus", name, minimum)) { Variant valueNow = Variant (mktime (t), Variant::type_date); midsommarafton (t); diff --git a/test/dates.t.cpp b/test/dates.t.cpp index 0b1b9edc3..1075a0178 100644 --- a/test/dates.t.cpp +++ b/test/dates.t.cpp @@ -146,6 +146,7 @@ int main (int, char**) Variant var_false; testInit (t, "false", var_false); Variant midsommar; testInit (t, "midsommar", midsommar); Variant midsommarafton; testInit (t, "midsommarafton", midsommarafton); + Variant juhannus; testInit (t, "juhannus", juhannus); Variant first; testInit (t, "1st", first); Variant second; testInit (t, "2nd", second); Variant third; testInit (t, "3rd", third); @@ -173,6 +174,7 @@ int main (int, char**) t.ok (easter < eastermonday, "easter < eastermonday"); t.ok (easter < midsommarafton, "easter < midsommarafton"); t.ok (midsommarafton < midsommar, "midsommarafton < midsommar"); + t.ok (juhannus == midsommarafton, "juhannus == midsommarafton"); return 0; } From c44900bf8fe325005324888437d4c53a9095365a Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Tue, 29 Mar 2016 07:52:38 -0400 Subject: [PATCH 039/879] Task: Deprecated the 'DUETODAY' virtual tag, which is a synonym for the 'TODAY' virtual tag. - Thanks to Tomas Babej --- ChangeLog | 2 ++ NEWS | 3 ++- doc/man/task.1.in | 1 - src/Task.cpp | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 114e8b526..2d391d74c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -10,6 +10,8 @@ (thanks to Ralph Bean). - Added 'juhannus' as a synonym for 'midsommarafton' (thanks to Lynoure Braakman). +- Deprecated the 'DUETODAY' virtual tag, which is a synonym for the 'TODAY' + virtual tag. - Removed deprecated 'alias._query' setting. 2.5.1 (2016-02-24) 8b4ae3b54b44dfbd00b96cdd6dceb8dfe7cc1ea0 diff --git a/NEWS b/NEWS index ec110212d..622098373 100644 --- a/NEWS +++ b/NEWS @@ -13,7 +13,8 @@ New Configuration Options in Taskwarrior 2.5.2 Newly Deprecated Features in Taskwarrior 2.5.2 - - + - The 'DUETODAY' virtual tag is a synonym for the 'TODAY' virtual tag, and is + not needed. Removed Features in 2.5.2 diff --git a/doc/man/task.1.in b/doc/man/task.1.in index 3a9670b91..ac6707c6e 100644 --- a/doc/man/task.1.in +++ b/doc/man/task.1.in @@ -682,7 +682,6 @@ are: COMPLETED Matches if the task has completed status DELETED Matches if the task has deleted status DUE Matches if the task is due - DUETODAY Matches if the task is due today LATEST Matches if the task is the newest added task MONTH Matches if the task is due this month ORPHAN Matches if the task has any orphaned UDA values diff --git a/src/Task.cpp b/src/Task.cpp index 6ac7c952c..884e7f23e 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -1212,7 +1212,7 @@ bool Task::hasTag (const std::string& tag) const #ifdef PRODUCT_TASKWARRIOR if (tag == "READY") return is_ready (); if (tag == "DUE") return is_due (); - if (tag == "DUETODAY") return is_duetoday (); + if (tag == "DUETODAY") return is_duetoday (); // 2016-03-29: Deprecated in 2.6.0 if (tag == "TODAY") return is_duetoday (); if (tag == "YESTERDAY") return is_dueyesterday (); if (tag == "TOMORROW") return is_duetomorrow (); From 81ac8e2be9b5caed31950f99636080c549e57609 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Tue, 29 Mar 2016 22:56:07 -0400 Subject: [PATCH 040/879] Tests: Updated test harness --- test/test.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/test.cpp b/test/test.cpp index de1e9f1d2..60ddd3cf5 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -416,7 +416,9 @@ void UnitTest::diag (const std::string& text) { auto start = text.find_first_not_of (" \t\n\r\f"); auto end = text.find_last_not_of (" \t\n\r\f"); - std::cout << "# " << text.substr (start, end - start + 1) << "\n"; + if (start != std::string::npos && + end != std::string::npos) + std::cout << "# " << text.substr (start, end - start + 1) << "\n"; } /////////////////////////////////////////////////////////////////////////////// From 1ebc8034b4bccdfdf016a9937667d7e7993e18e1 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sat, 2 Apr 2016 15:08:35 -0400 Subject: [PATCH 041/879] TW-1791: taskrc(5) manpage: spurious "pri." in rule.precedence.color - Thanks to Sebastien Badia. --- AUTHORS | 2 +- ChangeLog | 2 ++ doc/man/taskrc.5.in | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/AUTHORS b/AUTHORS index 681ec89e5..24b3f475a 100644 --- a/AUTHORS +++ b/AUTHORS @@ -129,6 +129,7 @@ The following submitted code, packages or analysis, and deserve special thanks: Konstantin Vorobyev Tom Sydney Kerckhove Lynoure Braakman + Sebastien Badia Thanks to the following, who submitted detailed bug reports and excellent suggestions: @@ -276,7 +277,6 @@ suggestions: James Cline Ryan Simon W. Jackson - Sebastien Badia Michale Meier Svetoslav Trochev Marc Cornellà diff --git a/ChangeLog b/ChangeLog index 2d391d74c..ad1a9674c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -8,6 +8,8 @@ inefficient (thanks to Michael Meier). - TW-1788 Closing a reopened task does not update the end time (thanks to Ralph Bean). +- TW-1791 taskrc(5) manpage: spurious "pri." in rule.precedence.color + (thanks to Sebastien Badia). - Added 'juhannus' as a synonym for 'midsommarafton' (thanks to Lynoure Braakman). - Deprecated the 'DUETODAY' virtual tag, which is a synonym for the 'TODAY' diff --git a/doc/man/taskrc.5.in b/doc/man/taskrc.5.in index 2de7799bf..83294dd83 100644 --- a/doc/man/taskrc.5.in +++ b/doc/man/taskrc.5.in @@ -1056,7 +1056,7 @@ Colors the output of the sync command. .TP .B rule.precedence.color=due.today,active,blocking,blocked,overdue,due, .B scheduled,keyword.,project.,tag.,uda.,recurring, -.B pri.,tagged,completed,deleted +.B tagged,completed,deleted .RS This setting specifies the precedence of the color rules, from highest to lowest. Note that the prefix 'color.' is omitted (for brevity), and that any From 084383a644ad2c2689fe0f1961d060c40a36cfa0 Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sun, 3 Apr 2016 11:05:32 +0200 Subject: [PATCH 042/879] feedback: Use task identifiers instead of IDs During construction of a feedback string for a dependency change, a list of IDs of the dependencies was used. However, if the tasks being referred to are already deleted / completed, their respective IDs are all 0s. Use shortened UUIDs in such case. --- src/Task.cpp | 16 ++++++++++++++++ src/Task.h | 1 + src/feedback.cpp | 50 +++++++++++++++++++++++++++--------------------- 3 files changed, 45 insertions(+), 22 deletions(-) diff --git a/src/Task.cpp b/src/Task.cpp index 884e7f23e..d53f8a540 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -1177,6 +1177,22 @@ void Task::getDependencies (std::vector & all) const all.clear (); split (all, get ("depends"), ','); } + +//////////////////////////////////////////////////////////////////////////////// +void Task::getDependencies (std::vector & all) const +{ + std::vector deps; + split (deps, get ("depends"), ','); + + all.clear (); + + for (auto& dep : deps) + { + Task task; + context.tdb2.get (dep, task); + all.push_back (task); + } +} #endif //////////////////////////////////////////////////////////////////////////////// diff --git a/src/Task.h b/src/Task.h index 47245b588..474049179 100644 --- a/src/Task.h +++ b/src/Task.h @@ -142,6 +142,7 @@ public: void removeDependency (const std::string&); void getDependencies (std::vector &) const; void getDependencies (std::vector &) const; + void getDependencies (std::vector &) const; void getUDAOrphans (std::vector &) const; diff --git a/src/feedback.cpp b/src/feedback.cpp index 213eb3b09..49f5a4556 100644 --- a/src/feedback.cpp +++ b/src/feedback.cpp @@ -44,6 +44,20 @@ extern Context context; static void countTasks (const std::vector &, const std::string&, int&, int&); +//////////////////////////////////////////////////////////////////////////////// +// Converts a vector of tasks to a human-readable string that represents the tasks. +std::string taskIdentifiers (const std::vector & tasks) +{ + std::vector identifiers; + for (auto task: tasks) + identifiers.push_back (task.identifier (true)); + + std::string result; + join (result, ", ", identifiers); + + return result; +} + //////////////////////////////////////////////////////////////////////////////// std::string taskDifferences (const Task& before, const Task& after) { @@ -72,13 +86,11 @@ std::string taskDifferences (const Task& before, const Task& after) { if (name == "depends") { - std::vector deps_after; + std::vector deps_after; after.getDependencies (deps_after); - std::string to; - join (to, ", ", deps_after); out << " - " - << format (STRING_FEEDBACK_DEP_SET, to) + << format (STRING_FEEDBACK_DEP_SET, taskIdentifiers (deps_after)) << "\n"; } else @@ -100,15 +112,13 @@ std::string taskDifferences (const Task& before, const Task& after) { if (name == "depends") { - std::vector deps_before; + std::vector deps_before; before.getDependencies (deps_before); - std::string from; - join (from, ", ", deps_before); + std::string from = taskIdentifiers (deps_before); - std::vector deps_after; + std::vector deps_after; after.getDependencies (deps_after); - std::string to; - join (to, ", ", deps_after); + std::string to = taskIdentifiers (deps_after); out << " - " << format (STRING_FEEDBACK_DEP_MOD, from, to) @@ -161,10 +171,9 @@ std::string taskInfoDifferences ( { if (name == "depends") { - std::vector deps_before; + std::vector deps_before; before.getDependencies (deps_before); - std::string from; - join (from, ", ", deps_before); + std::string from = taskIdentifiers (deps_before); out << format (STRING_FEEDBACK_DEP_DEL, from) << "\n"; @@ -191,10 +200,9 @@ std::string taskInfoDifferences ( { if (name == "depends") { - std::vector deps_after; + std::vector deps_after; after.getDependencies (deps_after); - std::string to; - join (to, ", ", deps_after); + std::string to = taskIdentifiers (deps_after); out << format (STRING_FEEDBACK_DEP_WAS_SET, to) << "\n"; @@ -225,15 +233,13 @@ std::string taskInfoDifferences ( { if (name == "depends") { - std::vector deps_before; + std::vector deps_before; before.getDependencies (deps_before); - std::string from; - join (from, ", ", deps_before); + std::string from = taskIdentifiers (deps_before); - std::vector deps_after; + std::vector deps_after; after.getDependencies (deps_after); - std::string to; - join (to, ", ", deps_after); + std::string to = taskIdentifiers (deps_after); out << format (STRING_FEEDBACK_DEP_WAS_MOD, from, to) << "\n"; From 8dfd71ccc6064d8c33292845f535dabfb4b17643 Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sun, 3 Apr 2016 19:28:21 +0200 Subject: [PATCH 043/879] TW-1792: The info command uses '0' to reference dependencies on non-pending tasks - Thanks to Paul Beckingham for providing screenshots capturing the bug. --- ChangeLog | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ChangeLog b/ChangeLog index ad1a9674c..9ccb71b5f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -10,6 +10,8 @@ (thanks to Ralph Bean). - TW-1791 taskrc(5) manpage: spurious "pri." in rule.precedence.color (thanks to Sebastien Badia). +- TW-1792 The info command uses '0' to reference dependencies on non- + pending tasks. - Added 'juhannus' as a synonym for 'midsommarafton' (thanks to Lynoure Braakman). - Deprecated the 'DUETODAY' virtual tag, which is a synonym for the 'TODAY' From 300e7e125ea97dba41961f22d55843f5561deadd Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sat, 9 Apr 2016 16:18:07 -0400 Subject: [PATCH 044/879] cmake: Use the CXXSniffer --- CMakeLists.txt | 89 ++++++------------------------------------ cmake/CXXSniffer.cmake | 51 ++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 76 deletions(-) create mode 100644 cmake/CXXSniffer.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index a8c580d8f..011c6a59b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,6 @@ cmake_minimum_required (VERSION 2.8) set(CMAKE_LEGACY_CYGWIN_WIN32 0) # Remove when CMake >= 2.8.4 is required +set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake") include (CheckFunctionExists) include (CheckStructHasMember) @@ -8,6 +9,7 @@ set (HAVE_CMAKE true) project (task) set (PROJECT_VERSION "2.5.2") +include (CXXSniffer) OPTION (ENABLE_SYNC "Enable 'task sync' support" ON) @@ -18,82 +20,6 @@ else (ENABLE_SYNC) message (WARNING "ENABLE_SYNC=OFF. Not building sync support.") endif (ENABLE_SYNC) -message ("CMAKE_SYSTEM_NAME ${CMAKE_SYSTEM_NAME}") - -include (CheckCXXCompilerFlag) - -# NOTE: If we are to actually use C++11 features, we should either require -# a compiler that supports the -std=c++11 flag or check for the -# features used. -# Relying on -std=c++0x or even -std=gnu++0x is highly volatile. - -CHECK_CXX_COMPILER_FLAG("-std=c++11" _HAS_CXX11) -CHECK_CXX_COMPILER_FLAG("-std=c++0x" _HAS_CXX0X) -CHECK_CXX_COMPILER_FLAG("-std=gnu++0x" _HAS_GNU0X) - -if (_HAS_CXX11) - set (_CXX11_FLAGS "-std=c++11") -elseif (_HAS_CXX0X) - message (WARNING "Enabling -std=c++0x draft compile flag. Your compiler does not support the standard '-std=c++11' option. Consider upgrading.") - set (_CXX11_FLAGS "-std=c++0x") -elseif (_HAS_GNU0X) - message (WARNING "Enabling -std=gnu++0x draft compile flag. Your compiler does not support the standard '-std=c++11' option. Consider upgrading.") - set (_CXX11_FLAGS "-std=gnu++0x") -else (_HAS_CXX11) - message (FATAL_ERROR "C++11 support missing. Try upgrading your C++ compiler. If you have a good reason for using an outdated compiler, please let us know at support@taskwarrior.org.") -endif (_HAS_CXX11) - -if (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") - set (_CXX11_FLAGS "${_CXX11_FLAGS} -stdlib=libc++") -endif (${CMAKE_CXX_COMPILER_ID} STREQUAL "Clang") - -if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") - set (LINUX true) -elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - set (DARWIN true) -elseif (${CMAKE_SYSTEM_NAME} MATCHES "kFreeBSD") - set (KFREEBSD true) -elseif (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") - set (FREEBSD true) -elseif (${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD") - set (OPENBSD true) -elseif (${CMAKE_SYSTEM_NAME} MATCHES "NetBSD") - set (NETBSD true) -elseif (${CMAKE_SYSTEM_NAME} MATCHES "SunOS") - set (SOLARIS true) -elseif (${CMAKE_SYSTEM_NAME} STREQUAL "GNU") - set (GNUHURD true) -elseif (${CMAKE_SYSTEM_NAME} STREQUAL "CYGWIN") - set (CYGWIN true) - # NOTE: Not setting -std=gnu++0x leads to compile errors even with - # GCC 4.8.3, and debugging those leads to insanity. Adding this - # workaround instead of fixing Cygwin. - set (_CXX11_FLAGS "-std=gnu++0x") -else (${CMAKE_SYSTEM_NAME} MATCHES "Linux") - set (UNKNOWN true) -endif (${CMAKE_SYSTEM_NAME} MATCHES "Linux") - -set (CMAKE_CXX_FLAGS "${_CXX11_FLAGS} ${CMAKE_CXX_FLAGS}") - -set (CMAKE_CXX_FLAGS "-Wall -Wsign-compare -Wreturn-type ${CMAKE_CXX_FLAGS}") - -if (NETBSD) - # Since readline, etc likely to be in /usr/pkg/lib, not standard library - # Otherwise will remove links during install - set (CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) -endif (NETBSD) - -if (FREEBSD) -SET (TASK_MAN1DIR man/man1 CACHE STRING "Installation directory for man pages, section 1") -SET (TASK_MAN5DIR man/man5 CACHE STRING "Installation directory for man pages, section 5") -else (FREEBSD) -SET (TASK_MAN1DIR share/man/man1 CACHE STRING "Installation directory for man pages, section 1") -SET (TASK_MAN5DIR share/man/man5 CACHE STRING "Installation directory for man pages, section 5") -endif (FREEBSD) -SET (TASK_DOCDIR share/doc/task CACHE STRING "Installation directory for doc files") -SET (TASK_RCDIR "${TASK_DOCDIR}/rc" CACHE STRING "Installation directory for configuration files") -SET (TASK_BINDIR bin CACHE STRING "Installation directory for the binary") - message ("-- Looking for SHA1 references") if (EXISTS ${CMAKE_SOURCE_DIR}/.git/index) set (HAVE_COMMIT true) @@ -113,6 +39,17 @@ set (PACKAGE_TARNAME "${PACKAGE}") set (PACKAGE_VERSION "${VERSION}") set (PACKAGE_STRING "${PACKAGE} ${VERSION}") +if (FREEBSD) +SET (TASK_MAN1DIR man/man1 CACHE STRING "Installation directory for man pages, section 1") +SET (TASK_MAN5DIR man/man5 CACHE STRING "Installation directory for man pages, section 5") +else (FREEBSD) +SET (TASK_MAN1DIR share/man/man1 CACHE STRING "Installation directory for man pages, section 1") +SET (TASK_MAN5DIR share/man/man5 CACHE STRING "Installation directory for man pages, section 5") +endif (FREEBSD) +SET (TASK_DOCDIR share/doc/task CACHE STRING "Installation directory for doc files") +SET (TASK_RCDIR "${TASK_DOCDIR}/rc" CACHE STRING "Installation directory for configuration files") +SET (TASK_BINDIR bin CACHE STRING "Installation directory for the binary") + if (USE_GNUTLS) message ("-- Looking for GnuTLS") find_package (GnuTLS) diff --git a/cmake/CXXSniffer.cmake b/cmake/CXXSniffer.cmake new file mode 100644 index 000000000..96062263b --- /dev/null +++ b/cmake/CXXSniffer.cmake @@ -0,0 +1,51 @@ +message ("-- Configuring C++11") +message ("-- System: ${CMAKE_SYSTEM_NAME}") + +include (CheckCXXCompilerFlag) + +# NOTE: Phase out -std=gnu++0x and --std=c++0x as soon as realistically possible. +CHECK_CXX_COMPILER_FLAG("-std=c++11" _HAS_CXX11) +CHECK_CXX_COMPILER_FLAG("-std=c++0x" _HAS_CXX0X) +CHECK_CXX_COMPILER_FLAG("-std=gnu++0x" _HAS_GNU0X) + +if (_HAS_CXX11) + set (_CXX11_FLAGS "-std=c++11") +elseif (_HAS_CXX0X) + message (WARNING "Enabling -std=c++0x draft compile flag. Your compiler does not support the standard '-std=c++11' option. Consider upgrading.") + set (_CXX11_FLAGS "-std=c++0x") +elseif (_HAS_GNU0X) + message (WARNING "Enabling -std=gnu++0x draft compile flag. Your compiler does not support the standard '-std=c++11' option. Consider upgrading.") + set (_CXX11_FLAGS "-std=gnu++0x") +else (_HAS_CXX11) + message (FATAL_ERROR "C++11 support missing. Try upgrading your C++ compiler. If you have a good reason for using an outdated compiler, please let us know at support@taskwarrior.org.") +endif (_HAS_CXX11) + +if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") + set (LINUX true) +elseif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + set (DARWIN true) + set (_CXX11_FLAGS "${_CXX11_FLAGS} -stdlib=libc++") +elseif (${CMAKE_SYSTEM_NAME} MATCHES "kFreeBSD") + set (KFREEBSD true) +elseif (${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + set (FREEBSD true) +elseif (${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD") + set (OPENBSD true) +elseif (${CMAKE_SYSTEM_NAME} MATCHES "NetBSD") + set (NETBSD true) +elseif (${CMAKE_SYSTEM_NAME} MATCHES "SunOS") + set (SOLARIS true) +elseif (${CMAKE_SYSTEM_NAME} STREQUAL "GNU") + set (GNUHURD true) +elseif (${CMAKE_SYSTEM_NAME} STREQUAL "CYGWIN") + set (CYGWIN true) + # NOTE: Not setting -std=gnu++0x leads to compile errors even with + # GCC 4.8.3, and debugging those leads to insanity. Adding this + # workaround instead of fixing Cygwin. + set (_CXX11_FLAGS "-std=gnu++0x") +else (${CMAKE_SYSTEM_NAME} MATCHES "Linux") + set (UNKNOWN true) +endif (${CMAKE_SYSTEM_NAME} MATCHES "Linux") + +set (CMAKE_CXX_FLAGS "${_CXX11_FLAGS} ${CMAKE_CXX_FLAGS}") +set (CMAKE_CXX_FLAGS "-Wall -Wextra -Wsign-compare -Wreturn-type ${CMAKE_CXX_FLAGS}") From dde7e6781d39b9a1e8d4ac12c7156c9183a30ce6 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sat, 9 Apr 2016 16:18:35 -0400 Subject: [PATCH 045/879] Tests: Wrong test count causes unexpected 'green' in test results --- test/dates.t.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/dates.t.cpp b/test/dates.t.cpp index 1075a0178..9a73bdba3 100644 --- a/test/dates.t.cpp +++ b/test/dates.t.cpp @@ -55,7 +55,7 @@ void testInit (UnitTest& t, const std::string& value, Variant& var) //////////////////////////////////////////////////////////////////////////////// int main (int, char**) { - UnitTest t (104); + UnitTest t (106); Variant sunday; testInit (t, "sunday", sunday); Variant monday; testInit (t, "monday", monday); From 4395818e7208426e89b44ca560a726cf877238f0 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Wed, 13 Apr 2016 16:35:08 -0400 Subject: [PATCH 046/879] CMake: Added snotty comment about CMake bullshit --- test/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 9cb997f31..411b61571 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,7 +1,11 @@ cmake_minimum_required (VERSION 2.8) + +# See this CMake issue before complaining about the following. +# https://cmake.org/Bug/view.php?id=16062 if(POLICY CMP0037) cmake_policy(SET CMP0037 OLD) endif() + include_directories (${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/src/commands From ea2faa0607d73c2da49f9fd5ab80b43b22f4411b Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Fri, 15 Apr 2016 07:55:21 -0400 Subject: [PATCH 047/879] TW-1795: Calendar underline on Day padding - Thanks to Renato Alves. --- ChangeLog | 2 ++ src/commands/CmdCalendar.cpp | 10 +++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9ccb71b5f..71a472aea 100644 --- a/ChangeLog +++ b/ChangeLog @@ -12,6 +12,8 @@ (thanks to Sebastien Badia). - TW-1792 The info command uses '0' to reference dependencies on non- pending tasks. +- TW-1795 Calendar underline on Day padding + (thanks to Renato Alves). - Added 'juhannus' as a synonym for 'midsommarafton' (thanks to Lynoure Braakman). - Deprecated the 'DUETODAY' virtual tag, which is a synonym for the 'TODAY' diff --git a/src/commands/CmdCalendar.cpp b/src/commands/CmdCalendar.cpp index 8a3c6cae5..36a9823ad 100644 --- a/src/commands/CmdCalendar.cpp +++ b/src/commands/CmdCalendar.cpp @@ -440,7 +440,7 @@ std::string CmdCalendar::renderMonths ( { if (weekStart == 1) { - view.add (Column::factory ("string.right", " ")); + view.add (Column::factory ("string.right", "")); view.add (Column::factory ("string.right", utf8_substr (ISO8601d::dayName (1), 0, 2))); view.add (Column::factory ("string.right", utf8_substr (ISO8601d::dayName (2), 0, 2))); view.add (Column::factory ("string.right", utf8_substr (ISO8601d::dayName (3), 0, 2))); @@ -451,7 +451,7 @@ std::string CmdCalendar::renderMonths ( } else { - view.add (Column::factory ("string.right", " ")); + view.add (Column::factory ("string.right", "")); view.add (Column::factory ("string.right", utf8_substr (ISO8601d::dayName (0), 0, 2))); view.add (Column::factory ("string.right", utf8_substr (ISO8601d::dayName (1), 0, 2))); view.add (Column::factory ("string.right", utf8_substr (ISO8601d::dayName (2), 0, 2))); @@ -516,7 +516,11 @@ std::string CmdCalendar::renderMonths ( int woy = temp.weekOfYear (weekStart); if (context.config.getBoolean ("displayweeknumber")) - view.set (row, (8 * mpl), woy, color_weeknumber); + view.set (row, + (8 * mpl), + // Make sure the week number is always 4 columns, space-padded. + format ((woy < 10 ? " {1}" : " {1}"), woy), + color_weeknumber); // Calculate column id. int thisCol = dow + // 0 = Sunday From c6e190118fee85280aef327f4031f9c82ca36f25 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Fri, 15 Apr 2016 08:06:17 -0400 Subject: [PATCH 048/879] Tests: Removed broken test - It was not only broken between easter and midsommarafton, but just performing an additional comparison. Not needed. --- test/dates.t.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/dates.t.cpp b/test/dates.t.cpp index 9a73bdba3..044e892a9 100644 --- a/test/dates.t.cpp +++ b/test/dates.t.cpp @@ -55,7 +55,7 @@ void testInit (UnitTest& t, const std::string& value, Variant& var) //////////////////////////////////////////////////////////////////////////////// int main (int, char**) { - UnitTest t (106); + UnitTest t (105); Variant sunday; testInit (t, "sunday", sunday); Variant monday; testInit (t, "monday", monday); @@ -172,7 +172,6 @@ int main (int, char**) t.ok (now < someday, "now < someday"); t.ok (goodfriday < easter, "goodfriday < easter"); t.ok (easter < eastermonday, "easter < eastermonday"); - t.ok (easter < midsommarafton, "easter < midsommarafton"); t.ok (midsommarafton < midsommar, "midsommarafton < midsommar"); t.ok (juhannus == midsommarafton, "juhannus == midsommarafton"); From 079e2f3008d55dfb80a016f8e4890a90c7c33900 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Thu, 28 Apr 2016 21:02:09 -0400 Subject: [PATCH 049/879] L10N: Fixed ambiguity in the esp-ESP localization - Thanks to Fidel Mato. --- ChangeLog | 2 ++ src/l10n/esp-ESP.h | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 71a472aea..c09eb28f0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -19,6 +19,8 @@ - Deprecated the 'DUETODAY' virtual tag, which is a synonym for the 'TODAY' virtual tag. - Removed deprecated 'alias._query' setting. +- Fixed ambiguity in the esp-ESP localization + (thanks to Fidel Mato). 2.5.1 (2016-02-24) 8b4ae3b54b44dfbd00b96cdd6dceb8dfe7cc1ea0 diff --git a/src/l10n/esp-ESP.h b/src/l10n/esp-ESP.h index 4ca54b673..c46fd745e 100644 --- a/src/l10n/esp-ESP.h +++ b/src/l10n/esp-ESP.h @@ -1048,7 +1048,7 @@ #define STRING_UTIL_CONFIRM_NO "no" // |esp-ESP|==|eng-USA| #define STRING_UTIL_CONFIRM_ALL "todos" #define STRING_UTIL_CONFIRM_ALL_U "Todos" -#define STRING_UTIL_CONFIRM_QUIT "sal" +#define STRING_UTIL_CONFIRM_QUIT "canc" #define STRING_UTIL_GIBIBYTES "GiB" // |esp-ESP|==|eng-USA| #define STRING_UTIL_MEBIBYTES "MiB" // |esp-ESP|==|eng-USA| #define STRING_UTIL_KIBIBYTES "KiB" // |esp-ESP|==|eng-USA| From a7153a082fb86b8ca6419f5487722161f9abeb4c Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sun, 1 May 2016 22:21:36 +0200 Subject: [PATCH 050/879] NEWS: Deprecate new-uuid verbosity option --- ChangeLog | 2 ++ NEWS | 2 ++ 2 files changed, 4 insertions(+) diff --git a/ChangeLog b/ChangeLog index c09eb28f0..c45ed259d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -21,6 +21,8 @@ - Removed deprecated 'alias._query' setting. - Fixed ambiguity in the esp-ESP localization (thanks to Fidel Mato). +- Deprecated the 'new-uuid' verbosity option, since its functionality can be + removed by merging with 'new-id'. 2.5.1 (2016-02-24) 8b4ae3b54b44dfbd00b96cdd6dceb8dfe7cc1ea0 diff --git a/NEWS b/NEWS index 622098373..51f974152 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,8 @@ Newly Deprecated Features in Taskwarrior 2.5.2 - The 'DUETODAY' virtual tag is a synonym for the 'TODAY' virtual tag, and is not needed. + - The 'new-uuid' verbosity option is to be removed due to being redundant, its + functionality will be merged with 'new-id' option. Removed Features in 2.5.2 From f29583d81da4436b53d95e8cba176091cb1b16eb Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 8 May 2016 16:36:25 -0400 Subject: [PATCH 051/879] util: Corrected comment --- src/util.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/util.cpp b/src/util.cpp index 2db86148d..e36bc251d 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -399,8 +399,8 @@ int execute ( #undef max //////////////////////////////////////////////////////////////////////////////// -// Accept a list of projects, and return an indented list -// that reflects the hierarchy. +// Accept a list of projects, and return an indented list that reflects the +// hierarchy. // // Input - "one" // "one.two" From 038126d59c368230941a7c1cad0b42b5b94d9387 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 8 May 2016 16:37:19 -0400 Subject: [PATCH 052/879] ColTypeDate: Fixed countdown format only showing values in the past --- src/columns/ColTypeDate.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/columns/ColTypeDate.cpp b/src/columns/ColTypeDate.cpp index c46f87eca..33cdc96b3 100644 --- a/src/columns/ColTypeDate.cpp +++ b/src/columns/ColTypeDate.cpp @@ -94,8 +94,7 @@ void ColumnTypeDate::measure (Task& task, unsigned int& minimum, unsigned int& m else if (_style == "countdown") { ISO8601d now; - if (now > date) - minimum = maximum = ISO8601p (now - date).formatVague ().length (); + minimum = maximum = ISO8601p (now - date).formatVague ().length (); } else if (_style == "julian") { @@ -167,8 +166,7 @@ void ColumnTypeDate::render ( else if (_style == "countdown") { ISO8601d now; - if (now > date) - renderStringRight (lines, width, color, ISO8601p (now - date).formatVague ()); + renderStringRight (lines, width, color, ISO8601p (now - date).formatVague ()); } else if (_style == "julian") renderStringRight (lines, width, color, format (date.toJulian (), 13, 12)); From 7d2d06dbcdc4b6a9517d483b8fdf8f59c39e4db5 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 8 May 2016 16:41:24 -0400 Subject: [PATCH 053/879] Task: Corrected false-positive warning about relative dates --- ChangeLog | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ChangeLog b/ChangeLog index c45ed259d..ae8a73bb3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -23,6 +23,8 @@ (thanks to Fidel Mato). - Deprecated the 'new-uuid' verbosity option, since its functionality can be removed by merging with 'new-id'. +- Correct a false-positive warning when a due date is removed and a wait is + added. 2.5.1 (2016-02-24) 8b4ae3b54b44dfbd00b96cdd6dceb8dfe7cc1ea0 From 0683e1477721a69e98c2943de01d4bcf4d3652a3 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Fri, 20 May 2016 10:56:20 -0500 Subject: [PATCH 054/879] Cleanup: Removed debug output --- src/Task.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Task.cpp b/src/Task.cpp index d53f8a540..0e8cbf9bc 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -2008,7 +2008,6 @@ float Task::urgency_blocking () const // It came from the Command base object, but doesn't really belong there either. void Task::modify (modType type, bool text_required /* = false */) { - context.debug ("Task::modify"); std::string label = " MODIFICATION "; // Need this for later comparison. From bac71c76704211d279557d6539297db45e144e4b Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Fri, 20 May 2016 11:13:46 -0500 Subject: [PATCH 055/879] TW-1806: project:ide is not allowed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Thanks to Slaven ʙanovic. --- AUTHORS | 1 + ChangeLog | 2 ++ src/Eval.cpp | 2 +- src/columns/ColProject.cpp | 31 +++++++++++++++++++++++-------- src/l10n/deu-DEU.h | 1 + src/l10n/eng-USA.h | 1 + src/l10n/epo-RUS.h | 1 + src/l10n/esp-ESP.h | 1 + src/l10n/fra-FRA.h | 1 + src/l10n/ita-ITA.h | 1 + src/l10n/jpn-JPN.h | 1 + src/l10n/pol-POL.h | 1 + src/l10n/por-PRT.h | 1 + 13 files changed, 36 insertions(+), 9 deletions(-) diff --git a/AUTHORS b/AUTHORS index 24b3f475a..dec886fdb 100644 --- a/AUTHORS +++ b/AUTHORS @@ -291,3 +291,4 @@ suggestions: Reg Yaroslav Molochko Michael Meier + Slaven ʙanovic diff --git a/ChangeLog b/ChangeLog index ae8a73bb3..21a9a0934 100644 --- a/ChangeLog +++ b/ChangeLog @@ -14,6 +14,8 @@ pending tasks. - TW-1795 Calendar underline on Day padding (thanks to Renato Alves). +- TW-1806 project:ide is not allowed + (thanks to Slaven ʙanovic). - Added 'juhannus' as a synonym for 'midsommarafton' (thanks to Lynoure Braakman). - Deprecated the 'DUETODAY' virtual tag, which is a synonym for the 'TODAY' diff --git a/src/Eval.cpp b/src/Eval.cpp index 7a4d9fc61..9736d0981 100644 --- a/src/Eval.cpp +++ b/src/Eval.cpp @@ -387,7 +387,7 @@ void Eval::evaluatePostfixStack ( // If there is more than one variant left on the stack, then the original // expression was not valid. if (values.size () != 1) - throw std::string (STRING_EVAL_NO_EVAL); + throw std::string (STRING_EVAL_NOT_EXPRESSION); result = values[0]; } diff --git a/src/columns/ColProject.cpp b/src/columns/ColProject.cpp index 0e803aae9..f94a967f0 100644 --- a/src/columns/ColProject.cpp +++ b/src/columns/ColProject.cpp @@ -124,15 +124,30 @@ void ColumnProject::modify (Task& task, const std::string& value) if (lexer.token (domRef, type) && type == Lexer::Type::dom) { - Eval e; - e.addSource (domSource); - e.addSource (namedDates); - contextTask = task; + try + { + Eval e; + e.addSource (domSource); + e.addSource (namedDates); + contextTask = task; - Variant v; - e.evaluateInfixExpression (value, v); - task.set (_name, (std::string) v); - context.debug (label + _name + " <-- '" + (std::string) v + "' <-- '" + value + "'"); + Variant v; + e.evaluateInfixExpression (value, v); + task.set (_name, (std::string) v); + context.debug (label + _name + " <-- '" + (std::string) v + "' <-- '" + value + "'"); + } + catch (const std::string& e) + { + // If the expression failed because it didn't look like an expression, + // simply store it as-is. + if (e == STRING_EVAL_NOT_EXPRESSION) + { + task.set (_name, value); + context.debug (label + _name + " <-- '" + value + "'"); + } + else + throw; + } } else { diff --git a/src/l10n/deu-DEU.h b/src/l10n/deu-DEU.h index 3135d37ac..960195312 100644 --- a/src/l10n/deu-DEU.h +++ b/src/l10n/deu-DEU.h @@ -681,6 +681,7 @@ #define STRING_EVAL_UNSUPPORTED "Nicht unterstützter Operator: '{1}'." #define STRING_EVAL_OP_EXPECTED "Operator erwartet." #define STRING_EVAL_NO_EVAL "Der Ausdruck konnte nicht ausgewertet werden." +#define STRING_EVAL_NOT_EXPRESSION "The value is not an expression." #define STRING_PAREN_MISMATCH "Ungültige Klammerung in Ausdruck." // edit diff --git a/src/l10n/eng-USA.h b/src/l10n/eng-USA.h index 84de21d6b..0e58ee66a 100644 --- a/src/l10n/eng-USA.h +++ b/src/l10n/eng-USA.h @@ -679,6 +679,7 @@ #define STRING_EVAL_UNSUPPORTED "Unsupported operator '{1}'." #define STRING_EVAL_OP_EXPECTED "Operator expected." #define STRING_EVAL_NO_EVAL "The expression could not be evaluated." +#define STRING_EVAL_NOT_EXPRESSION "The value is not an expression." #define STRING_PAREN_MISMATCH "Mismatched parentheses in expression" // edit diff --git a/src/l10n/epo-RUS.h b/src/l10n/epo-RUS.h index cb07b51e7..fa09d5ee6 100644 --- a/src/l10n/epo-RUS.h +++ b/src/l10n/epo-RUS.h @@ -681,6 +681,7 @@ #define STRING_EVAL_UNSUPPORTED "Ne subtenas infikson '{1}'." #define STRING_EVAL_OP_EXPECTED "Anticipis infikson." #define STRING_EVAL_NO_EVAL "Ne povis kalkuli la esprimon." +#define STRING_EVAL_NOT_EXPRESSION "The value is not an expression." #define STRING_PAREN_MISMATCH "Malbalancataj parentezoj en esprimo" // edit diff --git a/src/l10n/esp-ESP.h b/src/l10n/esp-ESP.h index c46fd745e..303f2723d 100644 --- a/src/l10n/esp-ESP.h +++ b/src/l10n/esp-ESP.h @@ -690,6 +690,7 @@ #define STRING_EVAL_UNSUPPORTED "Operador no soportado '{1}'." #define STRING_EVAL_OP_EXPECTED "Se esperaba operador." #define STRING_EVAL_NO_EVAL "La expresión podría no ser evaluada." +#define STRING_EVAL_NOT_EXPRESSION "The value is not an expression." #define STRING_PAREN_MISMATCH "Paréntesis desemparejados en expresión" // edit diff --git a/src/l10n/fra-FRA.h b/src/l10n/fra-FRA.h index 4046ed457..5bb47aef0 100644 --- a/src/l10n/fra-FRA.h +++ b/src/l10n/fra-FRA.h @@ -681,6 +681,7 @@ #define STRING_EVAL_UNSUPPORTED "Unsupported operator '{1}'." #define STRING_EVAL_OP_EXPECTED "Operator expected." #define STRING_EVAL_NO_EVAL "The expression could not be evaluated." +#define STRING_EVAL_NOT_EXPRESSION "The value is not an expression." #define STRING_PAREN_MISMATCH "Mismatched parentheses in expression" // edit diff --git a/src/l10n/ita-ITA.h b/src/l10n/ita-ITA.h index 95e0da6b2..86d8969d5 100644 --- a/src/l10n/ita-ITA.h +++ b/src/l10n/ita-ITA.h @@ -680,6 +680,7 @@ #define STRING_EVAL_UNSUPPORTED "Operatore non supportato '{1}'." #define STRING_EVAL_OP_EXPECTED "Operator expected." #define STRING_EVAL_NO_EVAL "The expression could not be evaluated." +#define STRING_EVAL_NOT_EXPRESSION "The value is not an expression." #define STRING_PAREN_MISMATCH "Mismatched parentheses in expression" // edit diff --git a/src/l10n/jpn-JPN.h b/src/l10n/jpn-JPN.h index e82ba9bc7..4ef19a050 100644 --- a/src/l10n/jpn-JPN.h +++ b/src/l10n/jpn-JPN.h @@ -681,6 +681,7 @@ #define STRING_EVAL_UNSUPPORTED "Unsupported operator '{1}'." #define STRING_EVAL_OP_EXPECTED "Operator expected." #define STRING_EVAL_NO_EVAL "式を評価出来ません。" +#define STRING_EVAL_NOT_EXPRESSION "The value is not an expression." #define STRING_PAREN_MISMATCH "Mismatched parentheses in expression" // edit diff --git a/src/l10n/pol-POL.h b/src/l10n/pol-POL.h index 1264c3f6f..c6e1d7723 100644 --- a/src/l10n/pol-POL.h +++ b/src/l10n/pol-POL.h @@ -681,6 +681,7 @@ #define STRING_EVAL_UNSUPPORTED "Niewspierany operator '{1}'." #define STRING_EVAL_OP_EXPECTED "Oczekiwany operator." #define STRING_EVAL_NO_EVAL "Wyrażenie nie może być przetworzone." +#define STRING_EVAL_NOT_EXPRESSION "The value is not an expression." #define STRING_PAREN_MISMATCH "Niedopasowane nawiasy w wyrażeniu" // edit diff --git a/src/l10n/por-PRT.h b/src/l10n/por-PRT.h index 0de68ed5c..0c73f794e 100644 --- a/src/l10n/por-PRT.h +++ b/src/l10n/por-PRT.h @@ -681,6 +681,7 @@ #define STRING_EVAL_UNSUPPORTED "Operador não suportado '{1}'." #define STRING_EVAL_OP_EXPECTED "Operador em falta." #define STRING_EVAL_NO_EVAL "Não foi possível calcular a expressão." +#define STRING_EVAL_NOT_EXPRESSION "The value is not an expression." #define STRING_PAREN_MISMATCH "Parentesis incompatíveis na expressão." // edit From 271d55506a07ea6b51bff2fb9a1c1ac44cd3c2a0 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Fri, 20 May 2016 14:41:08 -0500 Subject: [PATCH 056/879] TW-1807: dateformat lacks a flag to display day of week - Thanks to Ellington Santos. --- AUTHORS | 1 + ChangeLog | 2 ++ doc/man/taskrc.5.in | 2 ++ src/ISO8601.cpp | 1 + 4 files changed, 6 insertions(+) diff --git a/AUTHORS b/AUTHORS index dec886fdb..d79ffd0af 100644 --- a/AUTHORS +++ b/AUTHORS @@ -292,3 +292,4 @@ suggestions: Yaroslav Molochko Michael Meier Slaven ʙanovic + Ellington Santos diff --git a/ChangeLog b/ChangeLog index 21a9a0934..33e42580a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16,6 +16,8 @@ (thanks to Renato Alves). - TW-1806 project:ide is not allowed (thanks to Slaven ʙanovic). +- TW-1807 dateformat lacks a flag to display day of week + (thanks to Ellington Santos). - Added 'juhannus' as a synonym for 'midsommarafton' (thanks to Lynoure Braakman). - Deprecated the 'DUETODAY' virtual tag, which is a synonym for the 'TODAY' diff --git a/doc/man/taskrc.5.in b/doc/man/taskrc.5.in index 83294dd83..837e94858 100644 --- a/doc/man/taskrc.5.in +++ b/doc/man/taskrc.5.in @@ -583,6 +583,8 @@ S two-digit seconds, for example 07 or 47 J three-digit Julian day, for example 023 or 365 .br j Julian day, for example 23 or 365 +.br +w Week day, for example 0 for Monday, 5 for Friday .RE .RE diff --git a/src/ISO8601.cpp b/src/ISO8601.cpp index bf3282627..2edf511af 100644 --- a/src/ISO8601.cpp +++ b/src/ISO8601.cpp @@ -1122,6 +1122,7 @@ const std::string ISO8601d::toString ( case 'S': formatted << std::setw (2) << std::setfill ('0') << this->second (); break; case 'j': formatted << this->dayOfYear (); break; case 'J': formatted << std::setw (3) << std::setfill ('0') << this->dayOfYear (); break; + case 'w': formatted << this->dayOfWeek (); break; default: formatted << static_cast (c); break; } } From c99754391f16be0bdad9a9271dfdc80bff46f9dc Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Fri, 20 May 2016 14:47:34 -0500 Subject: [PATCH 057/879] Tests: Added 'w' dateformat test --- test/iso8601d.t.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/iso8601d.t.cpp b/test/iso8601d.t.cpp index 938532335..431b570ca 100644 --- a/test/iso8601d.t.cpp +++ b/test/iso8601d.t.cpp @@ -72,9 +72,9 @@ void testParse ( int main (int, char**) { #ifdef PRODUCT_TASKWARRIOR - UnitTest t (1025); + UnitTest t (1026); #else - UnitTest t (996); + UnitTest t (997); #endif ISO8601d iso; @@ -657,6 +657,7 @@ int main (int, char**) t.is (r32.toString ("v"), "44", "2015-10-28T12:55:00 -> v -> 44"); t.is (r32.toString ("J"), "301", "2015-10-28T12:55:00 -> J -> 301"); t.is (r32.toString ("j"), "301", "2015-10-28T12:55:00 -> j -> 301"); + t.is (r32.toString ("w"), "3", "2015-10-28T12:55:00 -> w -> 3"); // Test all parse options. ISO8601d r33 ("2015 10 28 19 28 01", "Y M D H N S"); From 0820549b4c1615079854bd050a0f3771b6d2ae91 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Mon, 30 May 2016 14:04:49 -0400 Subject: [PATCH 058/879] ISO8601: Added ::sameQuarter --- src/ISO8601.cpp | 7 +++++++ src/ISO8601.h | 31 ++++++++++++++++--------------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/ISO8601.cpp b/src/ISO8601.cpp index 2edf511af..8a94621b5 100644 --- a/src/ISO8601.cpp +++ b/src/ISO8601.cpp @@ -1574,6 +1574,13 @@ bool ISO8601d::sameMonth (const ISO8601d& rhs) const this->month () == rhs.month (); } +//////////////////////////////////////////////////////////////////////////////// +bool ISO8601d::sameQuarter (const ISO8601d& rhs) const +{ + return (this->year () == rhs.year ()) && + ((this->month () - 1) / 4) == ((rhs.month () - 1) / 4); +} + //////////////////////////////////////////////////////////////////////////////// bool ISO8601d::sameYear (const ISO8601d& rhs) const { diff --git a/src/ISO8601.h b/src/ISO8601.h index c7b7cd027..b3f82e5aa 100644 --- a/src/ISO8601.h +++ b/src/ISO8601.h @@ -86,26 +86,27 @@ public: int minute () const; int second () const; - bool operator== (const ISO8601d&) const; - bool operator!= (const ISO8601d&) const; - bool operator< (const ISO8601d&) const; - bool operator> (const ISO8601d&) const; - bool operator<= (const ISO8601d&) const; - bool operator>= (const ISO8601d&) const; - bool sameHour (const ISO8601d&) const; - bool sameDay (const ISO8601d&) const; - bool sameWeek (const ISO8601d&) const; - bool sameMonth (const ISO8601d&) const; - bool sameYear (const ISO8601d&) const; + bool operator== (const ISO8601d&) const; + bool operator!= (const ISO8601d&) const; + bool operator< (const ISO8601d&) const; + bool operator> (const ISO8601d&) const; + bool operator<= (const ISO8601d&) const; + bool operator>= (const ISO8601d&) const; + bool sameHour (const ISO8601d&) const; + bool sameDay (const ISO8601d&) const; + bool sameWeek (const ISO8601d&) const; + bool sameMonth (const ISO8601d&) const; + bool sameQuarter (const ISO8601d&) const; + bool sameYear (const ISO8601d&) const; ISO8601d operator+ (const int); ISO8601d operator- (const int); ISO8601d& operator+= (const int); ISO8601d& operator-= (const int); time_t operator- (const ISO8601d&); - void operator-- (); // Prefix - void operator-- (int); // Postfix - void operator++ (); // Prefix - void operator++ (int); // Postfix + void operator-- (); // Prefix + void operator-- (int); // Postfix + void operator++ (); // Prefix + void operator++ (int); // Postfix private: void clear (); From 8e8e0201f073b60198f356cec5af0a7b2c8db756 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Mon, 30 May 2016 14:09:49 -0400 Subject: [PATCH 059/879] Tests: Added ::sameQuarter tests --- test/iso8601d.t.cpp | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/test/iso8601d.t.cpp b/test/iso8601d.t.cpp index 431b570ca..e6d67c481 100644 --- a/test/iso8601d.t.cpp +++ b/test/iso8601d.t.cpp @@ -72,9 +72,9 @@ void testParse ( int main (int, char**) { #ifdef PRODUCT_TASKWARRIOR - UnitTest t (1026); + UnitTest t (1032); #else - UnitTest t (997); + UnitTest t (1003); #endif ISO8601d iso; @@ -256,27 +256,31 @@ int main (int, char**) // Loose comparisons. ISO8601d left ("7/4/2008", "m/d/Y"); ISO8601d comp1 ("7/4/2008", "m/d/Y"); - t.ok (left.sameDay (comp1), "7/4/2008 is on the same day as 7/4/2008"); - t.ok (left.sameWeek (comp1), "7/4/2008 is on the same week as 7/4/2008"); - t.ok (left.sameMonth (comp1), "7/4/2008 is in the same month as 7/4/2008"); - t.ok (left.sameYear (comp1), "7/4/2008 is in the same year as 7/4/2008"); + t.ok (left.sameDay (comp1), "7/4/2008 is on the same day as 7/4/2008"); + t.ok (left.sameWeek (comp1), "7/4/2008 is on the same week as 7/4/2008"); + t.ok (left.sameMonth (comp1), "7/4/2008 is in the same month as 7/4/2008"); + t.ok (left.sameQuarter (comp1), "7/4/2008 is in the same quarter as 7/4/2008"); + t.ok (left.sameYear (comp1), "7/4/2008 is in the same year as 7/4/2008"); ISO8601d comp2 ("7/5/2008", "m/d/Y"); - t.notok (left.sameDay (comp2), "7/4/2008 is not on the same day as 7/5/2008"); - t.ok (left.sameMonth (comp2), "7/4/2008 is in the same month as 7/5/2008"); - t.ok (left.sameYear (comp2), "7/4/2008 is in the same year as 7/5/2008"); + t.notok (left.sameDay (comp2), "7/4/2008 is not on the same day as 7/5/2008"); + t.ok (left.sameMonth (comp2), "7/4/2008 is in the same month as 7/5/2008"); + t.ok (left.sameQuarter (comp2), "7/4/2008 is in the same quarter as 7/5/2008"); + t.ok (left.sameYear (comp2), "7/4/2008 is in the same year as 7/5/2008"); ISO8601d comp3 ("8/4/2008", "m/d/Y"); - t.notok (left.sameDay (comp3), "7/4/2008 is not on the same day as 8/4/2008"); - t.notok (left.sameWeek (comp3), "7/4/2008 is not on the same week as 8/4/2008"); - t.notok (left.sameMonth (comp3), "7/4/2008 is not in the same month as 8/4/2008"); - t.ok (left.sameYear (comp3), "7/4/2008 is in the same year as 8/4/2008"); + t.notok (left.sameDay (comp3), "7/4/2008 is not on the same day as 8/4/2008"); + t.notok (left.sameWeek (comp3), "7/4/2008 is not on the same week as 8/4/2008"); + t.notok (left.sameMonth (comp3), "7/4/2008 is not in the same month as 8/4/2008"); + t.ok (left.sameQuarter (comp3), "7/4/2008 is in the same quarter as 8/4/2008"); + t.ok (left.sameYear (comp3), "7/4/2008 is in the same year as 8/4/2008"); ISO8601d comp4 ("7/4/2009", "m/d/Y"); - t.notok (left.sameDay (comp4), "7/4/2008 is not on the same day as 7/4/2009"); - t.notok (left.sameWeek (comp3), "7/4/2008 is not on the same week as 7/4/2009"); - t.notok (left.sameMonth (comp4), "7/4/2008 is not in the same month as 7/4/2009"); - t.notok (left.sameYear (comp4), "7/4/2008 is not in the same year as 7/4/2009"); + t.notok (left.sameDay (comp4), "7/4/2008 is not on the same day as 7/4/2009"); + t.notok (left.sameWeek (comp4), "7/4/2008 is not on the same week as 7/4/2009"); + t.notok (left.sameMonth (comp4), "7/4/2008 is not in the same month as 7/4/2009"); + t.notok (left.sameQuarter (comp4), "7/4/2008 is not in the same quarter as 7/4/2009"); + t.notok (left.sameYear (comp4), "7/4/2008 is not in the same year as 7/4/2009"); // Validity. t.ok (ISO8601d::valid (2, 29, 2008), "valid: 2/29/2008"); @@ -528,6 +532,7 @@ int main (int, char**) ISO8601d r13 ("eom"); t.ok (r13.sameMonth (now), "eom in same month as now"); + t.ok (r13.sameQuarter (now), "eom in same quarter as now"); ISO8601d r14 ("eocm"); t.ok (r14.sameMonth (now), "eocm in same month as now"); @@ -546,6 +551,7 @@ int main (int, char**) ISO8601d r18 ("socm"); t.ok (r18.sameMonth (now), "socm in same month as now"); + t.ok (r18.sameQuarter (now), "socm in same quarter as now"); ISO8601d r19 ("soy"); t.notok (r19.sameYear (now), "soy not in same year as now"); From 62944cdf6f8e06debd94f2607cc5fe7c6afecd93 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Mon, 30 May 2016 14:11:07 -0400 Subject: [PATCH 060/879] Task: Added QUARTER virtual tag --- src/Task.cpp | 20 ++++++++++++++++++++ src/Task.h | 1 + 2 files changed, 21 insertions(+) diff --git a/src/Task.cpp b/src/Task.cpp index 0e8cbf9bc..bfa1f8214 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -474,6 +474,25 @@ bool Task::is_duemonth () const return false; } +//////////////////////////////////////////////////////////////////////////////// +bool Task::is_duequarter () const +{ + if (has ("due")) + { + Task::status status = getStatus (); + + if (status != Task::completed && + status != Task::deleted) + { + ISO8601d due (get_date ("due")); + if (due.sameQuarter (ISO8601d ())) + return true; + } + } + + return false; +} + //////////////////////////////////////////////////////////////////////////////// bool Task::is_dueyear () const { @@ -1235,6 +1254,7 @@ bool Task::hasTag (const std::string& tag) const if (tag == "OVERDUE") return is_overdue (); if (tag == "WEEK") return is_dueweek (); if (tag == "MONTH") return is_duemonth (); + if (tag == "QUARTER") return is_duequarter (); if (tag == "YEAR") return is_dueyear (); #endif if (tag == "ACTIVE") return has ("start"); diff --git a/src/Task.h b/src/Task.h index 474049179..b4cf6d336 100644 --- a/src/Task.h +++ b/src/Task.h @@ -107,6 +107,7 @@ public: bool is_duetomorrow () const; bool is_dueweek () const; bool is_duemonth () const; + bool is_duequarter () const; bool is_dueyear () const; bool is_overdue () const; bool is_udaPresent () const; From edeac7e6a26b6ae902703d7f273949af6ec00445 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Mon, 30 May 2016 14:11:29 -0400 Subject: [PATCH 061/879] Task: Made better use of ::sameN methods --- src/Task.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/Task.cpp b/src/Task.cpp index bfa1f8214..6a9e10f13 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -445,8 +445,7 @@ bool Task::is_dueweek () const status != Task::deleted) { ISO8601d due (get_date ("due")); - if (due >= ISO8601d ("socw") && - due <= ISO8601d ("eocw")) + if (due.sameWeek (ISO8601d ())) return true; } } @@ -465,8 +464,7 @@ bool Task::is_duemonth () const status != Task::deleted) { ISO8601d due (get_date ("due")); - if (due >= ISO8601d ("socm") && - due <= ISO8601d ("eocm")) + if (due.sameMonth (ISO8601d ())) return true; } } @@ -503,9 +501,8 @@ bool Task::is_dueyear () const if (status != Task::completed && status != Task::deleted) { - ISO8601d now; ISO8601d due (get_date ("due")); - if (now.year () == due.year ()) + if (due.sameYear (ISO8601d ())) return true; } } From 6358b22289aa603760a5e671a33ab5925aa7cf7a Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Mon, 30 May 2016 14:13:03 -0400 Subject: [PATCH 062/879] Docs: Added QUARTER virtual tag --- ChangeLog | 1 + NEWS | 2 +- doc/man/task.1.in | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 33e42580a..8be8ed9bd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -29,6 +29,7 @@ removed by merging with 'new-id'. - Correct a false-positive warning when a due date is removed and a wait is added. +- Added 'QUARTER' virtual tag. 2.5.1 (2016-02-24) 8b4ae3b54b44dfbd00b96cdd6dceb8dfe7cc1ea0 diff --git a/NEWS b/NEWS index 51f974152..4d739de4e 100644 --- a/NEWS +++ b/NEWS @@ -1,7 +1,7 @@ New Features in Taskwarrior 2.5.2 - - + - The 'QUARTER' virutal tag was added. New Commands in Taskwarrior 2.5.2 diff --git a/doc/man/task.1.in b/doc/man/task.1.in index ac6707c6e..c279e2230 100644 --- a/doc/man/task.1.in +++ b/doc/man/task.1.in @@ -690,6 +690,7 @@ are: PENDING Matches if the task has pending status PRIORITY Matches if the task has a priority PROJECT Matches if the task has a project + QUARTER Matches if the task is due this quarter READY Matches if the task is actionable SCHEDULED Matches if the task is scheduled TAGGED Matches if the task has tags From 071adeeba4f20991b096c5c8f6e3e206b1080a3d Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 12 Jun 2016 14:58:10 -0400 Subject: [PATCH 063/879] TW-1813: Range filter doesn't work - Thanks to george js. --- AUTHORS | 1 + ChangeLog | 2 ++ 2 files changed, 3 insertions(+) diff --git a/AUTHORS b/AUTHORS index d79ffd0af..e4eb5a1c2 100644 --- a/AUTHORS +++ b/AUTHORS @@ -293,3 +293,4 @@ suggestions: Michael Meier Slaven ʙanovic Ellington Santos + george js diff --git a/ChangeLog b/ChangeLog index 8be8ed9bd..d8c8e1c2a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -18,6 +18,8 @@ (thanks to Slaven ʙanovic). - TW-1807 dateformat lacks a flag to display day of week (thanks to Ellington Santos). +- TW-1813 Range filter doesn't work + (thanks to george js). - Added 'juhannus' as a synonym for 'midsommarafton' (thanks to Lynoure Braakman). - Deprecated the 'DUETODAY' virtual tag, which is a synonym for the 'TODAY' From 54aaac99641316747a2cdb135d53534ee58aadfc Mon Sep 17 00:00:00 2001 From: Tomas Babej Date: Sun, 12 Jun 2016 21:02:37 +0200 Subject: [PATCH 064/879] TW-61: Extract only tasks with annotations - Thanks to Aikido Guy. - Note: This is just bookkeeping commit, the solution (+ANNOTATED virtual tag) is present since 2.3.0. --- ChangeLog | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ChangeLog b/ChangeLog index d8c8e1c2a..e4e4b71d2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,8 @@ - TD-64 sync conflict deleted all annotations of the task (thanks to Markus Beppler, Konstantin Vorobyev). +- TW-61 Extract only tasks with annotations + (thanks to Aikido Guy) - TW-1785 Purge command to remove deleted tasks (thanks to Paul Beckingham) - TW-1772 Implementation of circular dependency detection is From 1efeea38843a87c10c1b75473381aafc92a2383c Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Tue, 14 Jun 2016 19:36:52 -0400 Subject: [PATCH 065/879] L10N: Removed unused strings --- src/l10n/deu-DEU.h | 8 -------- src/l10n/eng-USA.h | 8 -------- src/l10n/epo-RUS.h | 8 -------- src/l10n/esp-ESP.h | 8 -------- src/l10n/fra-FRA.h | 8 -------- src/l10n/ita-ITA.h | 8 -------- src/l10n/jpn-JPN.h | 8 -------- src/l10n/pol-POL.h | 8 -------- src/l10n/por-PRT.h | 8 -------- 9 files changed, 72 deletions(-) diff --git a/src/l10n/deu-DEU.h b/src/l10n/deu-DEU.h index 960195312..4cb7e32b7 100644 --- a/src/l10n/deu-DEU.h +++ b/src/l10n/deu-DEU.h @@ -162,12 +162,6 @@ #define STRING_VARIANT_MOD_ZERO "Divisionsrest von null kann nicht berechnet werden" #define STRING_VARIANT_SQRT_NEG "Quadratwurzel einer negativen Zahl kann nicht berechnet werden." -// Dates -// -// These are errors generated when parsing date values. -#define STRING_DATES_MONTH_31 "Fehler: Kein Monat hat mehr als 31 Tage." -#define STRING_DATES_ORD_MISMATCH "Fehler: Zahl und Ordinalsuffix passen nicht (z.B., '1st', nicht '1nd')." - // Color #define STRING_COLOR_UNRECOGNIZED "Farbe '{1}' nicht erkannt." @@ -501,7 +495,6 @@ // STRING_CMD_DIAG_* strings all appear on the 'diag' command output. #define STRING_CMD_DIAG_USAGE "Platform, build and environment details" #define STRING_CMD_DIAG_PLATFORM "Platform" -#define STRING_CMD_DIAG_UNKNOWN "" #define STRING_CMD_DIAG_COMPILER "Compiler" #define STRING_CMD_DIAG_VERSION "Version" #define STRING_CMD_DIAG_CAPS "Caps" @@ -760,7 +753,6 @@ #define STRING_ASSUME_INFO "Kein Befehl angegeben - nehme 'information' an." #define STRING_INFINITE_LOOP "Beende Ersetzung, weil mehr als {1} Änderungen durchgeführt wurden - Schutz vor Endlosschleifen." #define STRING_UDA_TYPE "UDAs müssen vom Typ 'string', 'date', 'duration' oder 'numeric' sein." -#define STRING_UDA_TYPE_MISSING "uda.{1}.type nicht gefunden. Das UDA '{1}' muss einen festgelegten Typ haben." #define STRING_UDA_NUMERIC "Der Wert '{1}' ist kein zulässiger Zahlenwert." #define STRING_UDA_COLLISION "Das UDA '{1}' hat den selben Namen wie eine eingebaute Eigenschaft, und ist daher nicht erlaubt." #define STRING_INVALID_MOD "Die '{1}'-Eigenschaft erlaubt keinen Wert '{2}'." diff --git a/src/l10n/eng-USA.h b/src/l10n/eng-USA.h index 0e58ee66a..29575dad4 100644 --- a/src/l10n/eng-USA.h +++ b/src/l10n/eng-USA.h @@ -162,12 +162,6 @@ #define STRING_VARIANT_MOD_ZERO "Cannot modulo zero" #define STRING_VARIANT_SQRT_NEG "Cannot take the square root of a negative number." -// Dates -// -// These are errors generated when parsing date values. -#define STRING_DATES_MONTH_31 "Error: no month has more than 31 days." -#define STRING_DATES_ORD_MISMATCH "Error: number and ordinal don't match (e.g., '1st', not '1nd')." - // Color #define STRING_COLOR_UNRECOGNIZED "The color '{1}' is not recognized." @@ -499,7 +493,6 @@ // STRING_CMD_DIAG_* strings all appear on the 'diag' command output. #define STRING_CMD_DIAG_USAGE "Platform, build and environment details" #define STRING_CMD_DIAG_PLATFORM "Platform" -#define STRING_CMD_DIAG_UNKNOWN "" #define STRING_CMD_DIAG_COMPILER "Compiler" #define STRING_CMD_DIAG_VERSION "Version" #define STRING_CMD_DIAG_CAPS "Caps" @@ -758,7 +751,6 @@ #define STRING_ASSUME_INFO "No command specified - assuming 'information'." #define STRING_INFINITE_LOOP "Terminated substitution because more than {1} changes were made - infinite loop protection." #define STRING_UDA_TYPE "User defined attributes may only be of type 'string', 'date', 'duration' or 'numeric'." -#define STRING_UDA_TYPE_MISSING "uda.{1}.type not found. The UDA '{1}' must have a type specified." #define STRING_UDA_NUMERIC "The value '{1}' is not a valid numeric value." #define STRING_UDA_COLLISION "The UDA named '{1}' is the same as a core attribute, and is not permitted." #define STRING_INVALID_MOD "The '{1}' attribute does not allow a value of '{2}'." diff --git a/src/l10n/epo-RUS.h b/src/l10n/epo-RUS.h index fa09d5ee6..6594bf211 100644 --- a/src/l10n/epo-RUS.h +++ b/src/l10n/epo-RUS.h @@ -162,12 +162,6 @@ #define STRING_VARIANT_MOD_ZERO "Ne povas moduli nulon" #define STRING_VARIANT_SQRT_NEG "Ne povas kalkuli kvadratan radikon de negativa nombro." -// Dates -// -// These are errors generated when parsing date values. -#define STRING_DATES_MONTH_31 "Eraro: nenia monato havas pli de 31 tagojn." -#define STRING_DATES_ORD_MISMATCH "Eraro: la ordosufikso ne kongruas kun la nombro (ĝuste '1st', malĝuste '1nd')." - // Color #define STRING_COLOR_UNRECOGNIZED "Koloro '{1}' ne rekonata." @@ -501,7 +495,6 @@ // STRING_CMD_DIAG_* strings all appear on the 'diag' command output. #define STRING_CMD_DIAG_USAGE "Platform, build and environment details" #define STRING_CMD_DIAG_PLATFORM "Platform" -#define STRING_CMD_DIAG_UNKNOWN "" #define STRING_CMD_DIAG_COMPILER "Compiler" #define STRING_CMD_DIAG_VERSION "Version" #define STRING_CMD_DIAG_CAPS "Caps" @@ -760,7 +753,6 @@ #define STRING_ASSUME_INFO "Nenia komando specifita. Supozanta 'information'." #define STRING_INFINITE_LOOP "Finis anstataŭon ĉar ekzistas pli de {1} ŝanĝoj - protekto kontraŭ senfina ripeton." #define STRING_UDA_TYPE "La tipo de uzanto-definitaj atributoj devas esti 'string', 'date', 'duration', aŭ 'numeric'." -#define STRING_UDA_TYPE_MISSING "Ne trovis uda.{1}.type. Oni devas specifid la tipo de UDA '{1}'." #define STRING_UDA_NUMERIC "Valoro '{1}' ne estas valida nombra valoro." #define STRING_UDA_COLLISION "UDA '{1}' kaj enkonstruita atributo havas la saman nomon. Tio estas malpermesita." #define STRING_INVALID_MOD "Atributo '{1}' ne permesas valoron '{2}'." diff --git a/src/l10n/esp-ESP.h b/src/l10n/esp-ESP.h index 303f2723d..e42d0b90f 100644 --- a/src/l10n/esp-ESP.h +++ b/src/l10n/esp-ESP.h @@ -162,12 +162,6 @@ #define STRING_VARIANT_MOD_ZERO "No se puede modular cero" #define STRING_VARIANT_SQRT_NEG "No se puede calcular la raíz cuadrada de un tipo desconocido" -// Dates -// -// These are errors generated when parsing date values. -#define STRING_DATES_MONTH_31 "Error: no hay ningún mes que tenga más de 31 días." -#define STRING_DATES_ORD_MISMATCH "Error: el sufijo ordinal no corresponde al número (i.e. '1st', no '1nd')." - // Color #define STRING_COLOR_UNRECOGNIZED "El color '{1}' no se reconoce." @@ -507,7 +501,6 @@ #define STRING_CMD_SYNC_TRUST_OBS "Los ajustes de 'taskd.trust' ahora solo pueden contener uno de los valores 'strict', 'ignore hostname' o 'allow all'." #define STRING_CMD_DIAG_USAGE "Detalles de plataforma, construcción y entorno" #define STRING_CMD_DIAG_PLATFORM "Plataforma" -#define STRING_CMD_DIAG_UNKNOWN "" #define STRING_CMD_DIAG_COMPILER "Compilador" #define STRING_CMD_DIAG_VERSION "Versión" #define STRING_CMD_DIAG_CAPS "Capacidades" @@ -769,7 +762,6 @@ #define STRING_ASSUME_INFO "No especificó un comando - asumido 'information'." #define STRING_INFINITE_LOOP "Sustitución terminada debido a que se hicieron más de {1} cambios - protección contra ciclo eterno." #define STRING_UDA_TYPE "Los atributos definidos por el usuario solamente pueden ser de los tipos 'string', 'date', 'duration' o 'numeric'." -#define STRING_UDA_TYPE_MISSING "No se encontró uda.{1}.type . El UDA '{1}' debe tener algún tipo especificado." #define STRING_UDA_NUMERIC "El valor '{1}' no es un valor numérico válido." #define STRING_UDA_COLLISION "El UDA denominado '{1}' es el mismo que un atributo del núcleo, y no está permitido." #define STRING_INVALID_MOD "El atributo '{1}' no admite un valor '{2}'." diff --git a/src/l10n/fra-FRA.h b/src/l10n/fra-FRA.h index 5bb47aef0..46847ffa1 100644 --- a/src/l10n/fra-FRA.h +++ b/src/l10n/fra-FRA.h @@ -162,12 +162,6 @@ #define STRING_VARIANT_MOD_ZERO "Ne peut pas moduler zéro" #define STRING_VARIANT_SQRT_NEG "Ne peut pas calculer la racine carrée d'un nombre négatif." -// Dates -// -// These are errors generated when parsing date values. -#define STRING_DATES_MONTH_31 "Erreur : aucun mois n'a plus de 31 jours." -#define STRING_DATES_ORD_MISMATCH "Erreur : le nombre ne correspond pas à l'ordinal (ie '1st', pas '1nd')." - // Color #define STRING_COLOR_UNRECOGNIZED "La couleur '{1}' n'est pas reconnue." @@ -501,7 +495,6 @@ // STRING_CMD_DIAG_* strings all appear on the 'diag' command output. #define STRING_CMD_DIAG_USAGE "Platform, build and environment details" #define STRING_CMD_DIAG_PLATFORM "Platform" -#define STRING_CMD_DIAG_UNKNOWN "" #define STRING_CMD_DIAG_COMPILER "Compiler" #define STRING_CMD_DIAG_VERSION "Version" #define STRING_CMD_DIAG_CAPS "Caps" @@ -760,7 +753,6 @@ #define STRING_ASSUME_INFO "No command specified - assuming 'information'." #define STRING_INFINITE_LOOP "Substitution arrêté parce que plus de {1} changements ont été faits - protection contre les boucles infinies." #define STRING_UDA_TYPE "User defined attributes may only be of type 'string', 'date', 'duration' or 'numeric'." -#define STRING_UDA_TYPE_MISSING "uda.{1}.type introuvable. L'ADU '{1}' doit avoir un type déclaré." #define STRING_UDA_NUMERIC "The value '{1}' is not a valid numeric value." #define STRING_UDA_COLLISION "L'ADU nommé '{1}' est le même qu'un attribut du noyau, et ce n'est pas autorisé." #define STRING_INVALID_MOD "The '{1}' attribute does not allow a value of '{2}'." diff --git a/src/l10n/ita-ITA.h b/src/l10n/ita-ITA.h index 86d8969d5..858b257da 100644 --- a/src/l10n/ita-ITA.h +++ b/src/l10n/ita-ITA.h @@ -162,12 +162,6 @@ #define STRING_VARIANT_MOD_ZERO "Cannot modulo zero" #define STRING_VARIANT_SQRT_NEG "Cannot take the square root of a negative number." -// Dates -// -// These are errors generated when parsing date values. -#define STRING_DATES_MONTH_31 "Error: no month has more than 31 days." -#define STRING_DATES_ORD_MISMATCH "Error: number and ordinal don't match (e.g., '1st', not '1nd')." - // Color #define STRING_COLOR_UNRECOGNIZED "Il colore '{1}' non è riconosciuto." @@ -500,7 +494,6 @@ // STRING_CMD_DIAG_* strings all appear on the 'diag' command output. #define STRING_CMD_DIAG_USAGE "Dettagli su piattaforma, build e ambiente" #define STRING_CMD_DIAG_PLATFORM "Piattaforma" -#define STRING_CMD_DIAG_UNKNOWN "" #define STRING_CMD_DIAG_COMPILER "Compilatore" #define STRING_CMD_DIAG_VERSION "Versione" #define STRING_CMD_DIAG_CAPS "Caps" @@ -759,7 +752,6 @@ #define STRING_ASSUME_INFO "Nessun comando specificato - si assume 'information'." #define STRING_INFINITE_LOOP "Sostituzione terminata poiché più di {1} modifiche sono state fatte - protezione da ciclo infinito" #define STRING_UDA_TYPE "Gli User defined attribute possono solo essere di tipo 'string', 'date', 'duration' o 'numeric'." -#define STRING_UDA_TYPE_MISSING "uda.{1}.type non trovato. L'UDA '{1}' deve avere un tipo specificato." #define STRING_UDA_NUMERIC "Il valore '{1}' non è un valore numerico valido." #define STRING_UDA_COLLISION "L'UDA '{1}' ha lo stesso nome di un attributo di sistema, e ciò non è permesso." #define STRING_INVALID_MOD "L'attributo '{1}' non ammette un valore pari a '{2}'." diff --git a/src/l10n/jpn-JPN.h b/src/l10n/jpn-JPN.h index 4ef19a050..4f53cba27 100644 --- a/src/l10n/jpn-JPN.h +++ b/src/l10n/jpn-JPN.h @@ -162,12 +162,6 @@ #define STRING_VARIANT_MOD_ZERO "零で剰余を取ることは出来ません。" #define STRING_VARIANT_SQRT_NEG "負の数は平方根を計算できません。" -// Dates -// -// These are errors generated when parsing date values. -#define STRING_DATES_MONTH_31 "エラー: 月の日付は31日まで。" -#define STRING_DATES_ORD_MISMATCH "Error: number and ordinal don't match (e.g., '1st', not '1nd')." - // Color #define STRING_COLOR_UNRECOGNIZED "The color '{1}' is not recognized." @@ -501,7 +495,6 @@ // STRING_CMD_DIAG_* strings all appear on the 'diag' command output. #define STRING_CMD_DIAG_USAGE "Platform, build and environment details" #define STRING_CMD_DIAG_PLATFORM "Platform" -#define STRING_CMD_DIAG_UNKNOWN "" #define STRING_CMD_DIAG_COMPILER "Compiler" #define STRING_CMD_DIAG_VERSION "Version" #define STRING_CMD_DIAG_CAPS "Caps" @@ -760,7 +753,6 @@ #define STRING_ASSUME_INFO "コマンドが指定されていません - 'information' を仮定します。" #define STRING_INFINITE_LOOP "Terminated substitution because more than {1} changes were made - infinite loop protection." #define STRING_UDA_TYPE "User defined attributes may only be of type 'string', 'date', 'duration' or 'numeric'." -#define STRING_UDA_TYPE_MISSING "uda.{1}.type not found. The UDA '{1}' must have a type specified." #define STRING_UDA_NUMERIC "The value '{1}' is not a valid numeric value." #define STRING_UDA_COLLISION "The UDA named '{1}' is the same as a core attribute, and is not permitted." #define STRING_INVALID_MOD "The '{1}' attribute does not allow a value of '{2}'." diff --git a/src/l10n/pol-POL.h b/src/l10n/pol-POL.h index c6e1d7723..8e5d82760 100644 --- a/src/l10n/pol-POL.h +++ b/src/l10n/pol-POL.h @@ -162,12 +162,6 @@ #define STRING_VARIANT_MOD_ZERO "Nie można uzyskać modulo z zera" #define STRING_VARIANT_SQRT_NEG "Nie można wyciągnąć pierwiastka kwadratowego z wartości ujemnej." -// Dates -// -// These are errors generated when parsing date values. -#define STRING_DATES_MONTH_31 "Błąd: żaden miesiąc nie ma więcej niż 31 dni." -#define STRING_DATES_ORD_MISMATCH "Błąd: niepoprawny sufix (np., '1st', nie '1nd')." - // Color #define STRING_COLOR_UNRECOGNIZED "Kolor '{1}' nie został rozpoznany." @@ -501,7 +495,6 @@ // STRING_CMD_DIAG_* strings all appear on the 'diag' command output. #define STRING_CMD_DIAG_USAGE "Szczegóły platformy i środowiska budowania" #define STRING_CMD_DIAG_PLATFORM "Platforma" -#define STRING_CMD_DIAG_UNKNOWN "" #define STRING_CMD_DIAG_COMPILER "Kompilator" #define STRING_CMD_DIAG_VERSION "Wersja" #define STRING_CMD_DIAG_CAPS "Flagi" @@ -760,7 +753,6 @@ #define STRING_ASSUME_INFO "Nie podano polecenia - zakładam 'information'." #define STRING_INFINITE_LOOP "Podstawienie anulowane ponieważ wykonano więcej niż {1} zmian - zabezpieczenie przed zapętleniem." #define STRING_UDA_TYPE "Atrybuty definiowane przez użytkownika mogą być typu 'string', 'date', 'duration' lub 'numeric'." -#define STRING_UDA_TYPE_MISSING "uda.{1}.type nie znaleziony. UDA '{1}' musi posiadać typ." #define STRING_UDA_NUMERIC "Wartość '{1}' nie jest poprawną wartością numeryczną." #define STRING_UDA_COLLISION "Nazwa UDA '{1}' jest jedną z nazw atrybutów podstawowych i dlatego jest niedozwolona." #define STRING_INVALID_MOD "Atrybut '{1}' nie zezwala na wartość '{2}'." diff --git a/src/l10n/por-PRT.h b/src/l10n/por-PRT.h index 0c73f794e..c8859b024 100644 --- a/src/l10n/por-PRT.h +++ b/src/l10n/por-PRT.h @@ -162,12 +162,6 @@ #define STRING_VARIANT_MOD_ZERO "Impossível calcular módulo de zero" #define STRING_VARIANT_SQRT_NEG "Impossível calcular a raiz quadrada de um número negativo." -// Dates -// -// These are errors generated when parsing date values. -#define STRING_DATES_MONTH_31 "Erro: nenhum mês tem mais de 31 dias." -#define STRING_DATES_ORD_MISMATCH "Erro: correspondencia inválida entre número e ordinal (usar '1st', e não '1nd')." - // Color #define STRING_COLOR_UNRECOGNIZED "A cor '{1}' não é reconhecida." @@ -501,7 +495,6 @@ // STRING_CMD_DIAG_* strings all appear on the 'diag' command output. #define STRING_CMD_DIAG_USAGE "Plataforma, versão e detalhes de ambiente" #define STRING_CMD_DIAG_PLATFORM "Plataforma" -#define STRING_CMD_DIAG_UNKNOWN "" #define STRING_CMD_DIAG_COMPILER "Compilador" #define STRING_CMD_DIAG_VERSION "Versão" #define STRING_CMD_DIAG_CAPS "Capacidades" @@ -760,7 +753,6 @@ #define STRING_ASSUME_INFO "Nenhum comando especificado - assumindo 'information'." #define STRING_INFINITE_LOOP "Substituição terminada. Efectuadas mais de {1} alterações - protecção de ciclos infinitos." #define STRING_UDA_TYPE "Atributos definidos pelo utilizador (UDAs) apenas podem ser do tipo 'texto', 'data', 'duração' ou 'numérico'." -#define STRING_UDA_TYPE_MISSING "uda.{1}.type não encontrado. É necessário especificar um tipo no 'UDA' '{1}'." #define STRING_UDA_NUMERIC "O valor '{1}' não é um valor numérico válido." #define STRING_UDA_COLLISION "O UDA '{1}' tem o mesmo nome que um atributo interno, tal não é permitido." #define STRING_INVALID_MOD "O atributo '{1}' não permite o valor '{2}'." From 395329fb6c3b3b67e07e7c1430712486eb11a375 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Tue, 14 Jun 2016 19:38:36 -0400 Subject: [PATCH 066/879] TW-1820: Install with -DLANGUAGE=2 flag not work. - Thanks to E. Manuel Cerr'on Angeles --- AUTHORS | 1 + ChangeLog | 2 ++ src/l10n/esp-ESP.h | 1 + 3 files changed, 4 insertions(+) diff --git a/AUTHORS b/AUTHORS index e4eb5a1c2..93f150806 100644 --- a/AUTHORS +++ b/AUTHORS @@ -294,3 +294,4 @@ suggestions: Slaven ʙanovic Ellington Santos george js + E. Manuel Cerr'on Angeles diff --git a/ChangeLog b/ChangeLog index e4e4b71d2..f36852b8b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -22,6 +22,8 @@ (thanks to Ellington Santos). - TW-1813 Range filter doesn't work (thanks to george js). +- TW-1820 Install with -DLANGUAGE=2 flag not work. + (thanks to E. Manuel Cerr'on Angeles) - Added 'juhannus' as a synonym for 'midsommarafton' (thanks to Lynoure Braakman). - Deprecated the 'DUETODAY' virtual tag, which is a synonym for the 'TODAY' diff --git a/src/l10n/esp-ESP.h b/src/l10n/esp-ESP.h index e42d0b90f..1a512c4d7 100644 --- a/src/l10n/esp-ESP.h +++ b/src/l10n/esp-ESP.h @@ -769,6 +769,7 @@ #define STRING_TLS_INIT_FAIL "Error inicializando TLS. {1}" #define STRING_ERROR_DETAILS "El ajuste 'calendar.details.report' debe contener un único nombre de informe." #define STRING_ERROR_NO_FILTER "Los filtros de línea de comando no están soportados por este comando." +#define STRING_ERROR_CONFIRM_SIGINT "Interrupted: No changes made." #define STRING_ERROR_BAD_STATUS "El estatus '{1}' no es válido." // Feedback From 35ab335cb2205d6e7086a3a490869c83569de75e Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Fri, 24 Jun 2016 22:23:49 -0400 Subject: [PATCH 067/879] Docs: Removed one suggestion for reporting bugs --- NEWS | 4 ---- 1 file changed, 4 deletions(-) diff --git a/NEWS b/NEWS index 4d739de4e..3b35a1b08 100644 --- a/NEWS +++ b/NEWS @@ -41,10 +41,6 @@ encounter a bug, please enter a new issue at: https://bug.tasktools.org -Or you can also report the issue in the forums at: - - https://answers.tasktools.org - Or just send a message to: support@taskwarrior.org From 83ddb3f99f310f12d27e7a5e6ca3d176cd6c24cc Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sat, 25 Jun 2016 17:12:00 -0400 Subject: [PATCH 068/879] libshared: Added libshared --- .gitmodules | 3 +++ src/libshared | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 src/libshared diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..919cbabcb --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "src/libshared"] + path = src/libshared + url = https://git.tasktools.org/scm/tm/libshared.git diff --git a/src/libshared b/src/libshared new file mode 160000 index 000000000..144d37263 --- /dev/null +++ b/src/libshared @@ -0,0 +1 @@ +Subproject commit 144d37263c52aef3e0959e1b891785da3911ece5 From d33a62ffa6df974a4d25e672e9d4deafb458f367 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sat, 25 Jun 2016 17:22:27 -0400 Subject: [PATCH 069/879] libshared: Integrated the submodule - Integrated RX. --- src/CMakeLists.txt | 77 ++++++++--------- src/RX.cpp | 159 ------------------------------------ src/RX.h | 58 ------------- src/columns/CMakeLists.txt | 1 + src/commands/CMakeLists.txt | 1 + test/rx.t.cpp | 142 -------------------------------- 6 files changed, 41 insertions(+), 397 deletions(-) delete mode 100644 src/RX.cpp delete mode 100644 src/RX.h delete mode 100644 test/rx.t.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fde10cd3c..d3d7880c5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -3,52 +3,53 @@ include_directories (${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/src/commands ${CMAKE_SOURCE_DIR}/src/columns + ${CMAKE_SOURCE_DIR}/src/libshared/src ${TASK_INCLUDE_DIRS}) -set (task_SRCS CLI2.cpp CLI2.h - Color.cpp Color.h - Config.cpp Config.h - Context.cpp Context.h - DOM.cpp DOM.h - Dates.cpp Dates.h - Eval.cpp Eval.h - Filter.cpp Filter.h - FS.cpp FS.h - Hooks.cpp Hooks.h - ISO8601.cpp ISO8601.h - JSON.cpp JSON.h - Lexer.cpp Lexer.h - Msg.cpp Msg.h - Nibbler.cpp Nibbler.h - RX.cpp RX.h - TDB2.cpp TDB2.h - Task.cpp Task.h - Timer.cpp Timer.h - TLSClient.cpp TLSClient.h - Variant.cpp Variant.h - ViewTask.cpp ViewTask.h - ViewText.cpp ViewText.h - dependency.cpp - feedback.cpp - i18n.h - legacy.cpp - recur.cpp - rules.cpp - sort.cpp - text.cpp text.h - utf8.cpp utf8.h - util.cpp util.h - wcwidth6.cpp) +add_library (task CLI2.cpp CLI2.h + Color.cpp Color.h + Config.cpp Config.h + Context.cpp Context.h + DOM.cpp DOM.h + Dates.cpp Dates.h + Eval.cpp Eval.h + Filter.cpp Filter.h + FS.cpp FS.h + Hooks.cpp Hooks.h + ISO8601.cpp ISO8601.h + JSON.cpp JSON.h + Lexer.cpp Lexer.h + Msg.cpp Msg.h + Nibbler.cpp Nibbler.h + TDB2.cpp TDB2.h + Task.cpp Task.h + Timer.cpp Timer.h + TLSClient.cpp TLSClient.h + Variant.cpp Variant.h + ViewTask.cpp ViewTask.h + ViewText.cpp ViewText.h + dependency.cpp + feedback.cpp + i18n.h + legacy.cpp + recur.cpp + rules.cpp + sort.cpp + text.cpp text.h + utf8.cpp utf8.h + util.cpp util.h + wcwidth6.cpp) + +add_library (libshared libshared/src/RX.cpp libshared/src/RX.h) -add_library (task STATIC ${task_SRCS}) add_executable (task_executable main.cpp) add_executable (calc_executable calc.cpp) add_executable (lex_executable lex.cpp) # Yes, 'task' is included twice, otherwise linking fails on assorted OSes. -target_link_libraries (task_executable task commands columns task ${TASK_LIBRARIES}) -target_link_libraries (calc_executable task commands columns task ${TASK_LIBRARIES}) -target_link_libraries (lex_executable task commands columns task ${TASK_LIBRARIES}) +target_link_libraries (task_executable task commands columns libshared task ${TASK_LIBRARIES}) +target_link_libraries (calc_executable task commands columns libshared task ${TASK_LIBRARIES}) +target_link_libraries (lex_executable task commands columns libshared task ${TASK_LIBRARIES}) set_property (TARGET task_executable PROPERTY OUTPUT_NAME "task") diff --git a/src/RX.cpp b/src/RX.cpp deleted file mode 100644 index b68a063b7..000000000 --- a/src/RX.cpp +++ /dev/null @@ -1,159 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// -// Copyright 2006 - 2016, Paul Beckingham, Federico Hernandez. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -// http://www.opensource.org/licenses/mit-license.php -// -//////////////////////////////////////////////////////////////////////////////// - -#include -#include -#include -#include - -//////////////////////////////////////////////////////////////////////////////// -RX::RX () -{ -} - -//////////////////////////////////////////////////////////////////////////////// -RX::RX ( - const std::string& pattern, - bool case_sensitive /* = true */) -: _compiled (false) -, _pattern (pattern) -, _case_sensitive (case_sensitive) -{ - compile (); -} - -//////////////////////////////////////////////////////////////////////////////// -RX::RX (const RX& other) -{ - _compiled = false; - _pattern = other._pattern; - _case_sensitive = other._case_sensitive; -} - -//////////////////////////////////////////////////////////////////////////////// -RX::~RX () -{ - if (_compiled) - regfree (&_regex); -} - -//////////////////////////////////////////////////////////////////////////////// -RX& RX::operator= (const RX& other) -{ - _compiled = false; - _pattern = other._pattern; - _case_sensitive = other._case_sensitive; - - return *this; -} - -//////////////////////////////////////////////////////////////////////////////// -void RX::compile () -{ - if (! _compiled) - { - memset (&_regex, 0, sizeof (regex_t)); - - int result; - if ((result = regcomp (&_regex, _pattern.c_str (), -#if defined REG_ENHANCED - REG_ENHANCED | REG_EXTENDED | REG_NEWLINE | -#else - REG_EXTENDED | REG_NEWLINE | -#endif - (_case_sensitive ? 0 : REG_ICASE))) != 0) - { - char message[256]; - regerror (result, &_regex, message, 256); - throw std::string (message); - } - - _compiled = true; - } -} - -//////////////////////////////////////////////////////////////////////////////// -bool RX::match (const std::string& in) -{ - if (! _compiled) - compile (); - - return regexec (&_regex, in.c_str (), 0, nullptr, 0) == 0 ? true : false; -} - -//////////////////////////////////////////////////////////////////////////////// -bool RX::match ( - std::vector& matches, - const std::string& in) -{ - if (! _compiled) - compile (); - - regmatch_t rm[2]; - int offset = 0; - int length = in.length (); - while (regexec (&_regex, in.c_str () + offset, 2, &rm[0], 0) == 0 && - offset < length) - { - matches.push_back (in.substr (rm[0].rm_so + offset, rm[0].rm_eo - rm[0].rm_so)); - offset += rm[0].rm_eo; - - // Protection against zero-width patterns causing infinite loops. - if (rm[0].rm_so == rm[0].rm_eo) - ++offset; - } - - return matches.size () ? true : false; -} - -//////////////////////////////////////////////////////////////////////////////// -bool RX::match ( - std::vector & start, - std::vector & end, - const std::string& in) -{ - if (! _compiled) - compile (); - - regmatch_t rm[2]; - int offset = 0; - int length = in.length (); - while (regexec (&_regex, in.c_str () + offset, 2, &rm[0], 0) == 0 && - offset < length) - { - start.push_back (rm[0].rm_so + offset); - end.push_back (rm[0].rm_eo + offset); - offset += rm[0].rm_eo; - - // Protection against zero-width patterns causing infinite loops. - if (rm[0].rm_so == rm[0].rm_eo) - ++offset; - } - - return start.size () ? true : false; -} - -//////////////////////////////////////////////////////////////////////////////// diff --git a/src/RX.h b/src/RX.h deleted file mode 100644 index b98371113..000000000 --- a/src/RX.h +++ /dev/null @@ -1,58 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// -// Copyright 2006 - 2016, Paul Beckingham, Federico Hernandez. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -// http://www.opensource.org/licenses/mit-license.php -// -//////////////////////////////////////////////////////////////////////////////// - -#ifndef INCLUDED_RX -#define INCLUDED_RX - -#include -#include -#include - -class RX -{ -public: - RX (); - RX (const std::string&, bool caseSensitive = true); - RX (const RX&); - ~RX (); - RX& operator= (const RX&); - - bool match (const std::string&); - bool match (std::vector&, const std::string&); - bool match (std::vector &, std::vector &, const std::string&); - -private: - void compile (); - -private: - bool _compiled {false}; - std::string _pattern {}; - bool _case_sensitive {false}; - regex_t _regex; -}; - -#endif - diff --git a/src/columns/CMakeLists.txt b/src/columns/CMakeLists.txt index 76ccdc0fc..0bfffc941 100644 --- a/src/columns/CMakeLists.txt +++ b/src/columns/CMakeLists.txt @@ -3,6 +3,7 @@ include_directories (${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/src/commands ${CMAKE_SOURCE_DIR}/src/columns + ${CMAKE_SOURCE_DIR}/src/libshared/src ${TASK_INCLUDE_DIRS}) set (columns_SRCS Column.cpp Column.h diff --git a/src/commands/CMakeLists.txt b/src/commands/CMakeLists.txt index 575e351e7..188a8ef81 100644 --- a/src/commands/CMakeLists.txt +++ b/src/commands/CMakeLists.txt @@ -3,6 +3,7 @@ include_directories (${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/src/commands ${CMAKE_SOURCE_DIR}/src/columns + ${CMAKE_SOURCE_DIR}/src/libshared/src ${TASK_INCLUDE_DIRS}) set (commands_SRCS Command.cpp Command.h diff --git a/test/rx.t.cpp b/test/rx.t.cpp deleted file mode 100644 index 134bacf97..000000000 --- a/test/rx.t.cpp +++ /dev/null @@ -1,142 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// -// Copyright 2006 - 2016, Paul Beckingham, Federico Hernandez. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -// http://www.opensource.org/licenses/mit-license.php -// -//////////////////////////////////////////////////////////////////////////////// - -#include -#include -#include -#include -#include - -Context context; - -int main (int, char**) -{ - UnitTest ut (26); - - // Ensure environment has no influence. - unsetenv ("TASKDATA"); - unsetenv ("TASKRC"); - - std::string text = "This is a test."; - - RX r1 ("i. ", true); - ut.ok (r1.match (text), text + " =~ /i. /"); - - std::vector matches; - ut.ok (r1.match (matches, text), text + " =~ /i. /"); - ut.ok (matches.size () == 2, "2 match"); - ut.is (matches[0], "is ", "$1 == is\\s"); - ut.is (matches[1], "is ", "$1 == is\\s"); - - text = "abcdefghijklmnopqrstuvwxyz"; - - RX r3 ("t..", true); - ut.ok (r3.match (text), "t.."); - - RX r4 ("T..", false); - ut.ok (r4.match (text), "T.."); - - RX r5 ("T..", true); - ut.ok (!r5.match (text), "! T.."); - - text = "this is a test of the regex engine."; - // |...:....|....:....|....:....|....: - - RX r6 ("^this"); - ut.ok (r6.match (text), "^this matches"); - - RX r7 ("engine\\.$"); - ut.ok (r7.match (text), "engine\\.$ matches"); - - std::vector results; - std::vector start; - std::vector end; - RX r8 ("e..", true); - ut.ok (r8.match (results, text), "e.. there are matches"); - ut.ok (r8.match (start, end, text), "e.. there are matches"); - ut.is (results.size (), (size_t) 4, "e.. == 4 matches"); - ut.is (results[0], "est", "e..[0] == 'est'"); - ut.is (start[0], 11, "e..[0] == 11->"); - ut.is (end[0], 14, "e..[0] == ->14"); - - results.clear (); - RX r9 ("e", true); - ut.ok (r9.match (results, text), "e there are matches"); - ut.is (results.size (), (size_t) 6, "e == 6 matches"); - - start.clear (); - end.clear (); - ut.ok (r9.match (start, end, text), "e there are matches"); - ut.is (start.size (), (size_t) 6, "e == 6 matches"); - -#if defined(DARWIN) || defined(CYGWIN) || defined(FREEBSD) || defined(OPENBSD) - text = "this is the end."; - ut.pass (text + " =~ /\\bthe/"); - ut.pass (text + " =~ /the\\b/"); - ut.pass (text + " =~ /\\bthe\\b/"); -#elif defined(SOLARIS) - RX r10 ("\\"); - ut.ok (r11.match (text), text + " =~ /the\\>/"); - - RX r12 ("\\"); - ut.ok (r12.match (text), text + " =~ /\\/"); -#else - RX r10 ("\\bthe"); - text = "this is the end."; - ut.ok (r10.match (text), text + " =~ /\\bthe/"); - - RX r11 ("the\\b"); - ut.ok (r11.match (text), text + " =~ /the\\b/"); - - RX r12 ("\\bthe\\b"); - ut.ok (r12.match (text), text + " =~ /\\bthe\\b/"); -#endif - -#if defined(DARWIN) - text = "D0"; - RX r13 ("D\\d"); - ut.ok (r13.match (text), text + " =~ /D\\d/"); -#else - ut.skip (" =~ /D\\d/"); -#endif - - text = "D0"; - RX r14 ("D[[:digit:]]"); - ut.ok (r14.match (text), text + " =~ /D[[:digit:]]/"); - - text = "D0"; - RX r15 ("D[0-9]"); - ut.ok (r15.match (text), text + " =~ /D[0-9]/"); - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// - From db182f4612f27d3c1f6fc63db8f81f1473009ba6 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sat, 25 Jun 2016 17:23:15 -0400 Subject: [PATCH 070/879] Tests: Removed RX tests --- test/.gitignore | 1 - test/CMakeLists.txt | 5 +++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/.gitignore b/test/.gitignore index 368a48a6e..aae3c5865 100644 --- a/test/.gitignore +++ b/test/.gitignore @@ -18,7 +18,6 @@ lexer.t list.t msg.t nibbler.t -rx.t t.t taskmod.t tdb2.t diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 411b61571..4bb26533e 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -10,11 +10,12 @@ include_directories (${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/src/commands ${CMAKE_SOURCE_DIR}/src/columns + ${CMAKE_SOURCE_DIR}/src/libshared/src ${CMAKE_SOURCE_DIR}/test ${TASK_INCLUDE_DIRS}) set (test_SRCS autocomplete.t col.t color.t config.t fs.t i18n.t json.t list.t - msg.t nibbler.t rx.t t.t tdb2.t text.t utf8.t util.t view.t + msg.t nibbler.t t.t tdb2.t text.t utf8.t util.t view.t json_test lexer.t iso8601d.t iso8601p.t eval.t dates.t variant_add.t variant_and.t variant_cast.t variant_divide.t variant_equal.t variant_exp.t variant_gt.t variant_gte.t @@ -32,7 +33,7 @@ add_custom_target (build_tests DEPENDS ${test_SRCS} foreach (src_FILE ${test_SRCS}) add_executable (${src_FILE} "${src_FILE}.cpp" test.cpp) - target_link_libraries (${src_FILE} task commands task columns ${TASK_LIBRARIES}) + target_link_libraries (${src_FILE} task commands task columns libshared ${TASK_LIBRARIES}) endforeach (src_FILE) configure_file(run_all run_all COPYONLY) From 22baaecd14af6f5e438cb05b3b44caedba409c06 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sat, 25 Jun 2016 17:27:57 -0400 Subject: [PATCH 071/879] libshared: Integrated JSON --- src/CMakeLists.txt | 6 +- src/JSON.cpp | 494 --------------------------------------------- src/JSON.h | 135 ------------- 3 files changed, 4 insertions(+), 631 deletions(-) delete mode 100644 src/JSON.cpp delete mode 100644 src/JSON.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d3d7880c5..231508ba1 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -17,7 +17,6 @@ add_library (task CLI2.cpp CLI2.h FS.cpp FS.h Hooks.cpp Hooks.h ISO8601.cpp ISO8601.h - JSON.cpp JSON.h Lexer.cpp Lexer.h Msg.cpp Msg.h Nibbler.cpp Nibbler.h @@ -40,7 +39,10 @@ add_library (task CLI2.cpp CLI2.h util.cpp util.h wcwidth6.cpp) -add_library (libshared libshared/src/RX.cpp libshared/src/RX.h) +add_library (libshared libshared/src/JSON.cpp libshared/src/JSON.h + libshared/src/Pig.cpp libshared/src/Pig.h + libshared/src/RX.cpp libshared/src/RX.h + libshared/src/unicode.cpp libshared/src/unicode.h) add_executable (task_executable main.cpp) add_executable (calc_executable calc.cpp) diff --git a/src/JSON.cpp b/src/JSON.cpp deleted file mode 100644 index a18256362..000000000 --- a/src/JSON.cpp +++ /dev/null @@ -1,494 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// -// Copyright 2006 - 2016, Paul Beckingham, Federico Hernandez. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -// http://www.opensource.org/licenses/mit-license.php -// -//////////////////////////////////////////////////////////////////////////////// - -#include -#include -#include -#include -#include - -const char *json_encode[] = { - "\x00", "\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", - "\\b", "\\t", "\\n", "\x0b", "\\f", "\\r", "\x0e", "\x0f", - "\x10", "\x11", "\x12", "\x13", "\x14", "\x15", "\x16", "\x17", - "\x18", "\x19", "\x1a", "\x1b", "\x1c", "\x1d", "\x1e", "\x1f", - "\x20", "\x21", "\\\"", "\x23", "\x24", "\x25", "\x26", "\x27", - "\x28", "\x29", "\x2a", "\x2b", "\x2c", "\x2d", "\x2e", "\\/", - "\x30", "\x31", "\x32", "\x33", "\x34", "\x35", "\x36", "\x37", - "\x38", "\x39", "\x3a", "\x3b", "\x3c", "\x3d", "\x3e", "\x3f", - "\x40", "\x41", "\x42", "\x43", "\x44", "\x45", "\x46", "\x47", - "\x48", "\x49", "\x4a", "\x4b", "\x4c", "\x4d", "\x4e", "\x4f", - "\x50", "\x51", "\x52", "\x53", "\x54", "\x55", "\x56", "\x57", - "\x58", "\x59", "\x5a", "\x5b", "\\\\", "\x5d", "\x5e", "\x5f", - "\x60", "\x61", "\x62", "\x63", "\x64", "\x65", "\x66", "\x67", - "\x68", "\x69", "\x6a", "\x6b", "\x6c", "\x6d", "\x6e", "\x6f", - "\x70", "\x71", "\x72", "\x73", "\x74", "\x75", "\x76", "\x77", - "\x78", "\x79", "\x7a", "\x7b", "\x7c", "\x7d", "\x7e", "\x7f", - "\x80", "\x81", "\x82", "\x83", "\x84", "\x85", "\x86", "\x87", - "\x88", "\x89", "\x8a", "\x8b", "\x8c", "\x8d", "\x8e", "\x8f", - "\x90", "\x91", "\x92", "\x93", "\x94", "\x95", "\x96", "\x97", - "\x98", "\x99", "\x9a", "\x9b", "\x9c", "\x9d", "\x9e", "\x9f", - "\xa0", "\xa1", "\xa2", "\xa3", "\xa4", "\xa5", "\xa6", "\xa7", - "\xa8", "\xa9", "\xaa", "\xab", "\xac", "\xad", "\xae", "\xaf", - "\xb0", "\xb1", "\xb2", "\xb3", "\xb4", "\xb5", "\xb6", "\xb7", - "\xb8", "\xb9", "\xba", "\xbb", "\xbc", "\xbd", "\xbe", "\xbf", - "\xc0", "\xc1", "\xc2", "\xc3", "\xc4", "\xc5", "\xc6", "\xc7", - "\xc8", "\xc9", "\xca", "\xcb", "\xcc", "\xcd", "\xce", "\xcf", - "\xd0", "\xd1", "\xd2", "\xd3", "\xd4", "\xd5", "\xd6", "\xd7", - "\xd8", "\xd9", "\xda", "\xdb", "\xdc", "\xdd", "\xde", "\xdf", - "\xe0", "\xe1", "\xe2", "\xe3", "\xe4", "\xe5", "\xe6", "\xe7", - "\xe8", "\xe9", "\xea", "\xeb", "\xec", "\xed", "\xee", "\xef", - "\xf0", "\xf1", "\xf2", "\xf3", "\xf4", "\xf5", "\xf6", "\xf7", - "\xf8", "\xf9", "\xfa", "\xfb", "\xfc", "\xfd", "\xfe", "\xff" -}; - -//////////////////////////////////////////////////////////////////////////////// -json::value* json::value::parse (Nibbler& nibbler) -{ - json::value* v; - if ((v = json::object::parse (nibbler)) || - (v = json::array::parse (nibbler)) || - (v = json::string::parse (nibbler)) || - (v = json::number::parse (nibbler)) || - (v = json::literal::parse (nibbler))) - return v; - - return NULL; -} - -//////////////////////////////////////////////////////////////////////////////// -json::jtype json::value::type () -{ - return json::j_value; -} - -//////////////////////////////////////////////////////////////////////////////// -std::string json::value::dump () const -{ - return ""; -} - -//////////////////////////////////////////////////////////////////////////////// -json::string::string (const std::string& other) -{ - _data = other; -} - -//////////////////////////////////////////////////////////////////////////////// -json::string* json::string::parse (Nibbler& nibbler) -{ - std::string value; - if (nibbler.getQuoted ('"', value)) - { - json::string* s = new json::string (); - s->_data = value; - return s; - } - - return NULL; -} - -//////////////////////////////////////////////////////////////////////////////// -json::jtype json::string::type () -{ - return json::j_string; -} - -//////////////////////////////////////////////////////////////////////////////// -std::string json::string::dump () const -{ - return std::string ("\"") + _data + "\""; -} - -//////////////////////////////////////////////////////////////////////////////// -json::number* json::number::parse (Nibbler& nibbler) -{ - double d; - if (nibbler.getNumber (d)) - { - json::number* s = new json::number (); - s->_dvalue = d; - return s; - } - - return NULL; -} - -//////////////////////////////////////////////////////////////////////////////// -json::jtype json::number::type () -{ - return json::j_number; -} - -//////////////////////////////////////////////////////////////////////////////// -std::string json::number::dump () const -{ - return format (_dvalue); -} - -//////////////////////////////////////////////////////////////////////////////// -json::number::operator double () const -{ - return _dvalue; -} - -//////////////////////////////////////////////////////////////////////////////// -json::literal* json::literal::parse (Nibbler& nibbler) -{ - if (nibbler.getLiteral ("null")) - { - json::literal* s = new json::literal (); - s->_lvalue = nullvalue; - return s; - } - else if (nibbler.getLiteral ("false")) - { - json::literal* s = new json::literal (); - s->_lvalue = falsevalue; - return s; - } - else if (nibbler.getLiteral ("true")) - { - json::literal* s = new json::literal (); - s->_lvalue = truevalue; - return s; - } - - return NULL; -} - -//////////////////////////////////////////////////////////////////////////////// -json::jtype json::literal::type () -{ - return json::j_literal; -} - -//////////////////////////////////////////////////////////////////////////////// -std::string json::literal::dump () const -{ - if (_lvalue == nullvalue) return "null"; - else if (_lvalue == falsevalue) return "false"; - else return "true"; -} - -//////////////////////////////////////////////////////////////////////////////// -json::array::~array () -{ - for (auto& i : _data) - delete i; -} - -//////////////////////////////////////////////////////////////////////////////// -json::array* json::array::parse (Nibbler& nibbler) -{ - Nibbler n (nibbler); - n.skipWS (); - if (n.skip ('[')) - { - n.skipWS (); - - json::array* arr = new json::array (); - - json::value* value; - if ((value = json::value::parse (n))) - { - arr->_data.push_back (value); - value = NULL; // Not a leak. Looks like a leak. - n.skipWS (); - while (n.skip (',')) - { - n.skipWS (); - - if ((value = json::value::parse (n))) - { - arr->_data.push_back (value); - n.skipWS (); - } - else - { - delete arr; - throw format (STRING_JSON_MISSING_VALUE, (int) n.cursor ()); - } - } - } - - if (n.skip (']')) - { - nibbler = n; - return arr; - } - else - throw format (STRING_JSON_MISSING_BRACKET, (int) n.cursor ()); - - delete arr; - } - - return NULL; -} - -//////////////////////////////////////////////////////////////////////////////// -json::jtype json::array::type () -{ - return json::j_array; -} - -//////////////////////////////////////////////////////////////////////////////// -std::string json::array::dump () const -{ - std::string output; - output += "["; - - for (auto i = _data.begin (); i != _data.end (); ++i) - { - if (i != _data.begin ()) - output += ","; - - output += (*i)->dump (); - } - - output += "]"; - return output; -} - -//////////////////////////////////////////////////////////////////////////////// -json::object::~object () -{ - for (auto& i : _data) - delete i.second; -} - -//////////////////////////////////////////////////////////////////////////////// -json::object* json::object::parse (Nibbler& nibbler) -{ - Nibbler n (nibbler); - n.skipWS (); - if (n.skip ('{')) - { - n.skipWS (); - - json::object* obj = new json::object (); - - std::string name; - json::value* value; - if (json::object::parse_pair (n, name, value)) - { - obj->_data.insert (std::pair (name, value)); - value = NULL; // Not a leak. Looks like a leak. - - n.skipWS (); - while (n.skip (',')) - { - n.skipWS (); - - if (json::object::parse_pair (n, name, value)) - { - obj->_data.insert (std::pair (name, value)); - n.skipWS (); - } - else - { - delete obj; - throw format (STRING_JSON_MISSING_VALUE, (int) n.cursor ()); - } - } - } - - if (n.skip ('}')) - { - nibbler = n; - return obj; - } - else - throw format (STRING_JSON_MISSING_BRACE, (int) n.cursor ()); - - delete obj; - } - - return NULL; -} - -//////////////////////////////////////////////////////////////////////////////// -bool json::object::parse_pair ( - Nibbler& nibbler, - std::string& name, - json::value*& val) -{ - Nibbler n (nibbler); - - if (n.getQuoted ('"', name)) - { - n.skipWS (); - if (n.skip (':')) - { - n.skipWS (); - if ((val = json::value::parse (n))) - { - nibbler = n; - return true; - } - else - throw format (STRING_JSON_MISSING_VALUE2, (int) n.cursor ()); - } - else - throw format (STRING_JSON_MISSING_COLON, (int) n.cursor ()); - } - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -json::jtype json::object::type () -{ - return json::j_object; -} - -//////////////////////////////////////////////////////////////////////////////// -std::string json::object::dump () const -{ - std::string output; - output += "{"; - - for (auto i = _data.begin (); i != _data.end (); ++i) - { - if (i != _data.begin ()) - output += ","; - - output += "\"" + i->first + "\":"; - output += i->second->dump (); - } - - output += "}"; - return output; -} - -//////////////////////////////////////////////////////////////////////////////// -json::value* json::parse (const std::string& input) -{ - json::value* root = NULL; - - Nibbler n (input); - n.skipWS (); - - if (n.next () == '{') root = json::object::parse (n); - else if (n.next () == '[') root = json::array::parse (n); - else - throw format (STRING_JSON_MISSING_OPEN, (int) n.cursor ()); - - // Check for end condition. - n.skipWS (); - if (!n.depleted ()) - { - delete root; - throw format (STRING_JSON_EXTRA_CHARACTERS, (int) n.cursor ()); - } - - return root; -} - -//////////////////////////////////////////////////////////////////////////////// -std::string json::encode (const std::string& input) -{ - std::string output; - output.reserve ((input.size () * 6) / 5); // 20% increase. - - auto last = input.begin (); - for (auto i = input.begin (); i != input.end (); ++i) - { - switch (*i) - { - // Simple translations. - case '"': - case '\\': - case '/': - case '\b': - case '\f': - case '\n': - case '\r': - case '\t': - output.append (last, i); - output += json_encode[(unsigned char)(*i)]; - last = i + 1; - - // Default NOP. - } - } - - output.append (last, input.end ()); - - return output; -} - -//////////////////////////////////////////////////////////////////////////////// -std::string json::decode (const std::string& input) -{ - std::string output; - output.reserve (input.size ()); // Same size. - - size_t pos = 0; - - while (pos < input.length ()) - { - if (input[pos] == '\\') - { - ++pos; - switch (input[pos]) - { - // Simple translations. - case '"': output += '"'; break; - case '\\': output += '\\'; break; - case '/': output += '/'; break; - case 'b': output += '\b'; break; - case 'f': output += '\f'; break; - case 'n': output += '\n'; break; - case 'r': output += '\r'; break; - case 't': output += '\t'; break; - - // Compose a UTF8 unicode character. - case 'u': - output += utf8_character (utf8_codepoint (input.substr (++pos))); - pos += 3; - break; - - // If it is an unrecognized sequence, do nothing. - default: - output += '\\'; - output += input[pos]; - break; - } - ++pos; - } - else - { - size_t next_backslash = input.find ('\\', pos); - output.append (input, pos, next_backslash - pos); - pos = next_backslash; - } - } - - return output; -} - -//////////////////////////////////////////////////////////////////////////////// diff --git a/src/JSON.h b/src/JSON.h deleted file mode 100644 index 3408b3a37..000000000 --- a/src/JSON.h +++ /dev/null @@ -1,135 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// -// Copyright 2006 - 2016, Paul Beckingham, Federico Hernandez. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -// http://www.opensource.org/licenses/mit-license.php -// -//////////////////////////////////////////////////////////////////////////////// - -#ifndef INCLUDED_JSON -#define INCLUDED_JSON - -#include -#include -#include -#include - -namespace json -{ - enum jtype - { - j_value, // 0 - j_object, // 1 - j_array, // 2 - j_string, // 3 - j_number, // 4 - j_literal // 5 - }; - - class value - { - public: - value () {} - virtual ~value () {} - static value* parse (Nibbler&); - virtual jtype type (); - virtual std::string dump () const; - }; - - class string : public value - { - public: - string () {} - string (const std::string&); - ~string () {} - static string* parse (Nibbler&); - jtype type (); - std::string dump () const; - - public: - std::string _data; - }; - - class number : public value - { - public: - number () : _dvalue (0.0) {} - ~number () {} - static number* parse (Nibbler&); - jtype type (); - std::string dump () const; - operator double () const; - - public: - double _dvalue; - }; - - class literal : public value - { - public: - literal () : _lvalue (none) {} - ~literal () {} - static literal* parse (Nibbler&); - jtype type (); - std::string dump () const; - - public: - enum literal_value {none, nullvalue, falsevalue, truevalue}; - literal_value _lvalue; - }; - - class array : public value - { - public: - array () {} - ~array (); - static array* parse (Nibbler&); - jtype type (); - std::string dump () const; - - public: - std::vector _data; - }; - - class object : public value - { - public: - object () {} - ~object (); - static object* parse (Nibbler&); - static bool parse_pair (Nibbler&, std::string&, value*&); - jtype type (); - std::string dump () const; - - public: - std::map _data; - }; - - // Parser entry point. - value* parse (const std::string&); - - // Encode/decode for JSON entities. - std::string encode (const std::string&); - std::string decode (const std::string&); -} - -#endif -//////////////////////////////////////////////////////////////////////////////// From 3cf4f337e751c155a0363280916412679dca8b2c Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sat, 25 Jun 2016 17:28:15 -0400 Subject: [PATCH 072/879] Git: Now ignores liblibshared.a --- src/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/src/.gitignore b/src/.gitignore index 6b6ab2aee..99a78c14e 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -3,3 +3,4 @@ Makefile.in debug calc lex +liblibshared.a From dbb22f506d34e7b7550767322e6174eaa292763e Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sat, 25 Jun 2016 17:42:59 -0400 Subject: [PATCH 073/879] Tests: Removed JSON tests --- test/.gitignore | 1 - test/CMakeLists.txt | 4 +- test/json.t.cpp | 189 ---------------------------------------- test/json/1.json | 23 ----- test/json/2.json | 11 --- test/json/3.json | 26 ------ test/json/4.json | 88 ------------------- test/json/5.json | 27 ------ test/json/6.json | 2 - test/json/e1.json | 1 - test/json/e2.json | 30 ------- test/json/e3.json | 4 - test/json/e4.json | 26 ------ test/json/e5.json | 70 --------------- test/json/e6.json | 17 ---- test/json/e7.json | 34 -------- test/json/e8.json | 36 -------- test/json/facebook.json | 44 ---------- test/json/flikr.json | 21 ----- test/json/interop.json | 41 --------- test/json/iphone.json | 77 ---------------- test/json/twitter.json | 50 ----------- test/json/youtube.json | 53 ----------- test/json_test.cpp | 87 ------------------ test/json_test.t | 83 ------------------ 25 files changed, 2 insertions(+), 1043 deletions(-) delete mode 100644 test/json.t.cpp delete mode 100644 test/json/1.json delete mode 100644 test/json/2.json delete mode 100644 test/json/3.json delete mode 100644 test/json/4.json delete mode 100644 test/json/5.json delete mode 100644 test/json/6.json delete mode 100644 test/json/e1.json delete mode 100644 test/json/e2.json delete mode 100644 test/json/e3.json delete mode 100644 test/json/e4.json delete mode 100644 test/json/e5.json delete mode 100644 test/json/e6.json delete mode 100644 test/json/e7.json delete mode 100644 test/json/e8.json delete mode 100644 test/json/facebook.json delete mode 100644 test/json/flikr.json delete mode 100644 test/json/interop.json delete mode 100644 test/json/iphone.json delete mode 100644 test/json/twitter.json delete mode 100644 test/json/youtube.json delete mode 100644 test/json_test.cpp delete mode 100755 test/json_test.t diff --git a/test/.gitignore b/test/.gitignore index aae3c5865..dd2709758 100644 --- a/test/.gitignore +++ b/test/.gitignore @@ -13,7 +13,6 @@ fs.t i18n.t iso8601d.t iso8601p.t -json.t lexer.t list.t msg.t diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 4bb26533e..6a4d15834 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -14,9 +14,9 @@ include_directories (${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/test ${TASK_INCLUDE_DIRS}) -set (test_SRCS autocomplete.t col.t color.t config.t fs.t i18n.t json.t list.t +set (test_SRCS autocomplete.t col.t color.t config.t fs.t i18n.t list.t msg.t nibbler.t t.t tdb2.t text.t utf8.t util.t view.t - json_test lexer.t iso8601d.t iso8601p.t eval.t dates.t + lexer.t iso8601d.t iso8601p.t eval.t dates.t variant_add.t variant_and.t variant_cast.t variant_divide.t variant_equal.t variant_exp.t variant_gt.t variant_gte.t variant_inequal.t variant_lt.t variant_lte.t variant_match.t diff --git a/test/json.t.cpp b/test/json.t.cpp deleted file mode 100644 index 9c3a948ad..000000000 --- a/test/json.t.cpp +++ /dev/null @@ -1,189 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// -// Copyright 2006 - 2016, Paul Beckingham, Federico Hernandez. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -// http://www.opensource.org/licenses/mit-license.php -// -//////////////////////////////////////////////////////////////////////////////// - -#include -#include -#include -#include -#include -#include - -Context context; - -const char *positive_tests[] = -{ - "{}", - - " { } ", - - "[]", - - "{\"one\":1}", - - "{\n\"one\"\n:\n1\n}\n", - - " { \"one\" : 1 } ", - - "{\"name\":123, \"array\":[1,2,3.4], \"object\":{\"m1\":\"v1\", \"m2\":\"v2\"}}", - - "{\"name\":\"value\",\"array\":[\"one\",\"two\"],\"object\":{\"name2\":123,\"literal\":false}}", - - "{\n" - "\"ticket\": { \"type\":\"add\", \"client\":\"taskwarrior 2.x\"},\n" - "\"auth\": { \"user\":\"paul\", \"org\":\"gbf\", \"key\":\".........\",\n" - " \"locale\":\"en-US\" },\n" - "\n" - "\"add\": { \"description\":\"Wash the dog\",\n" - " \"project\":\"home\",\n" - " \"due\":\"20101101T000000Z\" }\n" - "}", - - "{" - "\"ticket\":{" - "\"type\":\"synch\"," - "\"client\":\"taskd-test-suite 1.0\"" - "}," - "\"synch\":{" - "\"user\":{" - "\"data\":[" - "{" - "\"uuid\":\"11111111-1111-1111-1111-111111111111\"," - "\"status\":\"pending\"," - "\"description\":\"This is a test\"," - "\"entry\":\"20110111T124000Z\"" - "}" - "]," - "\"synch\":\"key\"" - "}" - "}," - "\"auth\":{" - "\"org\":\"gbf\"," - "\"user\":\"Paul Beckingham\"," - "\"key\":\"K\"," - "\"locale\":\"en-US\"" - "}" - "}" -}; - -#define NUM_POSITIVE_TESTS (sizeof (positive_tests) / sizeof (positive_tests[0])) - -const char *negative_tests[] = -{ - "", - "{", - "}", - "[", - "]", - "foo", - "[?]" -}; - -#define NUM_NEGATIVE_TESTS (sizeof (negative_tests) / sizeof (negative_tests[0])) - -//////////////////////////////////////////////////////////////////////////////// -int main (int, char**) -{ - UnitTest t (NUM_POSITIVE_TESTS + NUM_NEGATIVE_TESTS + 22); - - // Ensure environment has no influence. - unsetenv ("TASKDATA"); - unsetenv ("TASKRC"); - - // Positive tests. - for (unsigned int i = 0; i < NUM_POSITIVE_TESTS; ++i) - { - try - { - json::value* root = json::parse (positive_tests[i]); - t.ok (root, std::string ("positive: ") + positive_tests[i]); - if (root) - { - t.diag (root->dump ()); - delete root; - } - } - - catch (const std::string& e) { t.diag (e); } - catch (...) { t.diag ("Unknown error"); } - } - - // Negative tests. - for (unsigned int i = 0; i < NUM_NEGATIVE_TESTS; ++i) - { - try - { - json::value* root = json::parse (negative_tests[i]); - t.is ((const char*) root, (const char*) NULL, - std::string ("negative: ") + negative_tests[i]); - } - - catch (const std::string& e) { t.pass (e); } - catch (...) { t.fail ("Unknown error"); } - } - - // Other tests. - try - { - // Regular unit tests. - t.is (json::encode ("1\b2"), "1\\b2", "json::encode slashslashb -> slashslashslashslashb"); - t.is (json::decode ("1\\b2"), "1\b2", "json::decode slashslashslashslashb -> slashslashb"); - - t.is (json::encode ("1\n2"), "1\\n2", "json::encode slashslashn -> slashslashslashslashn"); - t.is (json::decode ("1\\n2"), "1\n2", "json::decode slashslashslashslashn -> slashslashn"); - - t.is (json::encode ("1\r2"), "1\\r2", "json::encode slashslashr -> slashslashslashslashr"); - t.is (json::decode ("1\\r2"), "1\r2", "json::decode slashslashslashslashr -> slashslashr"); - - t.is (json::encode ("1\t2"), "1\\t2", "json::encode slashslasht -> slashslashslashslasht"); - t.is (json::decode ("1\\t2"), "1\t2", "json::decode slashslashslashslasht -> slashslasht"); - - t.is (json::encode ("1\\2"), "1\\\\2", "json::encode slashslash -> slashslashslashslash"); - t.is (json::decode ("1\\\\2"), "1\\2", "json::decode slashslashslashslash -> slashslash"); - - t.is (json::encode ("1\x2"), "1\x2", "json::encode slashslashx -> slashslashx(NOP)"); - t.is (json::decode ("1\x2"), "1\x2", "json::decode slashslashx -> slashslashx(NOP)"); - - t.is (json::encode ("1€2"), "1€2", "json::encode € -> €"); - t.is (json::decode ("1\\u20ac2"), "1€2", "json::decode slashslashu20ac -> €"); - - std::string encoded = json::encode ("one\\"); - t.is (encoded, "one\\\\", "json::encode oneslashslashslashslash -> oneslashslashslashslashslashslashslashslash"); - t.is ((int)encoded.length (), 5, "json::encode oneslashslashslashslash -> length 5"); - t.is (encoded[0], 'o', "json::encode oneslashslashslashslash[0] -> o"); - t.is (encoded[1], 'n', "json::encode oneslashslashslashslash[1] -> n"); - t.is (encoded[2], 'e', "json::encode oneslashslashslashslash[2] -> e"); - t.is (encoded[3], '\\', "json::encode oneslashslashslashslash[3] -> slashslash"); - t.is (encoded[4], '\\', "json::encode oneslashslashslashslash[4] -> slashslash"); - - t.is (json::decode (encoded), "one\\", "json::decode oneslashslashslashslashslashslashslashslash -> oneslashslashslashslash"); - } - - catch (const std::string& e) {t.diag (e);} - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// diff --git a/test/json/1.json b/test/json/1.json deleted file mode 100644 index 81d48c0d1..000000000 --- a/test/json/1.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "glossary": { - "title": "example glossary", - "GlossDiv": { - "title": "S", - "GlossList": { - "GlossEntry": { - "ID": "SGML", - "SortAs": "SGML", - "GlossTerm": "Standard Generalized Markup Language", - "Acronym": "SGML", - "Abbrev": "ISO 8879:1986", - "GlossDef": { - "para": "A meta-markup language, used to create markup languages such as DocBook.", - "GlossSeeAlso": ["GML", "XML"] - }, - "GlossSee": "markup" - } - } - } - } -} - diff --git a/test/json/2.json b/test/json/2.json deleted file mode 100644 index 5600991a4..000000000 --- a/test/json/2.json +++ /dev/null @@ -1,11 +0,0 @@ -{"menu": { - "id": "file", - "value": "File", - "popup": { - "menuitem": [ - {"value": "New", "onclick": "CreateNewDoc()"}, - {"value": "Open", "onclick": "OpenDoc()"}, - {"value": "Close", "onclick": "CloseDoc()"} - ] - } -}} diff --git a/test/json/3.json b/test/json/3.json deleted file mode 100644 index 9b820d853..000000000 --- a/test/json/3.json +++ /dev/null @@ -1,26 +0,0 @@ -{"widget": { - "debug": "on", - "window": { - "title": "Sample Konfabulator Widget", - "name": "main_window", - "width": 500, - "height": 500 - }, - "image": { - "src": "Images/Sun.png", - "name": "sun1", - "hOffset": 250, - "vOffset": 250, - "alignment": "center" - }, - "text": { - "data": "Click Here", - "size": 36, - "style": "bold", - "name": "text1", - "hOffset": 250, - "vOffset": 100, - "alignment": "center", - "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;" - } -}} diff --git a/test/json/4.json b/test/json/4.json deleted file mode 100644 index 9eea6ad6e..000000000 --- a/test/json/4.json +++ /dev/null @@ -1,88 +0,0 @@ -{"web-app": { - "servlet": [ - { - "servlet-name": "cofaxCDS", - "servlet-class": "org.cofax.cds.CDSServlet", - "init-param": { - "configGlossary:installationAt": "Philadelphia, PA", - "configGlossary:adminEmail": "ksm@pobox.com", - "configGlossary:poweredBy": "Cofax", - "configGlossary:poweredByIcon": "/images/cofax.gif", - "configGlossary:staticPath": "/content/static", - "templateProcessorClass": "org.cofax.WysiwygTemplate", - "templateLoaderClass": "org.cofax.FilesTemplateLoader", - "templatePath": "templates", - "templateOverridePath": "", - "defaultListTemplate": "listTemplate.htm", - "defaultFileTemplate": "articleTemplate.htm", - "useJSP": false, - "jspListTemplate": "listTemplate.jsp", - "jspFileTemplate": "articleTemplate.jsp", - "cachePackageTagsTrack": 200, - "cachePackageTagsStore": 200, - "cachePackageTagsRefresh": 60, - "cacheTemplatesTrack": 100, - "cacheTemplatesStore": 50, - "cacheTemplatesRefresh": 15, - "cachePagesTrack": 200, - "cachePagesStore": 100, - "cachePagesRefresh": 10, - "cachePagesDirtyRead": 10, - "searchEngineListTemplate": "forSearchEnginesList.htm", - "searchEngineFileTemplate": "forSearchEngines.htm", - "searchEngineRobotsDb": "WEB-INF/robots.db", - "useDataStore": true, - "dataStoreClass": "org.cofax.SqlDataStore", - "redirectionClass": "org.cofax.SqlRedirection", - "dataStoreName": "cofax", - "dataStoreDriver": "com.microsoft.jdbc.sqlserver.SQLServerDriver", - "dataStoreUrl": "jdbc:microsoft:sqlserver://LOCALHOST:1433;DatabaseName=goon", - "dataStoreUser": "sa", - "dataStorePassword": "dataStoreTestQuery", - "dataStoreTestQuery": "SET NOCOUNT ON;select test='test';", - "dataStoreLogFile": "/usr/local/tomcat/logs/datastore.log", - "dataStoreInitConns": 10, - "dataStoreMaxConns": 100, - "dataStoreConnUsageLimit": 100, - "dataStoreLogLevel": "debug", - "maxUrlLength": 500}}, - { - "servlet-name": "cofaxEmail", - "servlet-class": "org.cofax.cds.EmailServlet", - "init-param": { - "mailHost": "mail1", - "mailHostOverride": "mail2"}}, - { - "servlet-name": "cofaxAdmin", - "servlet-class": "org.cofax.cds.AdminServlet"}, - - { - "servlet-name": "fileServlet", - "servlet-class": "org.cofax.cds.FileServlet"}, - { - "servlet-name": "cofaxTools", - "servlet-class": "org.cofax.cms.CofaxToolsServlet", - "init-param": { - "templatePath": "toolstemplates/", - "log": 1, - "logLocation": "/usr/local/tomcat/logs/CofaxTools.log", - "logMaxSize": "", - "dataLog": 1, - "dataLogLocation": "/usr/local/tomcat/logs/dataLog.log", - "dataLogMaxSize": "", - "removePageCache": "/content/admin/remove?cache=pages&id=", - "removeTemplateCache": "/content/admin/remove?cache=templates&id=", - "fileTransferFolder": "/usr/local/tomcat/webapps/content/fileTransferFolder", - "lookInContext": 1, - "adminGroupID": 4, - "betaServer": true}}], - "servlet-mapping": { - "cofaxCDS": "/", - "cofaxEmail": "/cofaxutil/aemail/*", - "cofaxAdmin": "/admin/*", - "fileServlet": "/static/*", - "cofaxTools": "/tools/*"}, - - "taglib": { - "taglib-uri": "cofax.tld", - "taglib-location": "/WEB-INF/tlds/cofax.tld"}}} diff --git a/test/json/5.json b/test/json/5.json deleted file mode 100644 index 49980ca25..000000000 --- a/test/json/5.json +++ /dev/null @@ -1,27 +0,0 @@ -{"menu": { - "header": "SVG Viewer", - "items": [ - {"id": "Open"}, - {"id": "OpenNew", "label": "Open New"}, - null, - {"id": "ZoomIn", "label": "Zoom In"}, - {"id": "ZoomOut", "label": "Zoom Out"}, - {"id": "OriginalView", "label": "Original View"}, - null, - {"id": "Quality"}, - {"id": "Pause"}, - {"id": "Mute"}, - null, - {"id": "Find", "label": "Find..."}, - {"id": "FindAgain", "label": "Find Again"}, - {"id": "Copy"}, - {"id": "CopyAgain", "label": "Copy Again"}, - {"id": "CopySVG", "label": "Copy SVG"}, - {"id": "ViewSVG", "label": "View SVG"}, - {"id": "ViewSource", "label": "View Source"}, - {"id": "SaveAs", "label": "Save As"}, - null, - {"id": "Help"}, - {"id": "About", "label": "About Adobe CVG Viewer..."} - ] -}} diff --git a/test/json/6.json b/test/json/6.json deleted file mode 100644 index 8711288cb..000000000 --- a/test/json/6.json +++ /dev/null @@ -1,2 +0,0 @@ -[{"styleFocus":"GROWTH","creationTime":"2008-01-21","preferences":{"kfe.elite-rankings":"hide","guitarPromoClosed":"1","kfe.last_viewed_feature":"1"},"nickName":"Pascal-Louis Perez","showFlag":true,"firstName":"Pascal-Louis","points":0,"id":8,"industryFocus":"TECHNOLOGY","externalIds":[{"platform":"FACEBOOK","id":219948}],"useRealName":true,"shard":8,"concentrationFocus":"LESS_THAN_10","passwordSalt":3567830610840546163,"validatedEmails":["pascal.louis.perez@gmail.com","pascal@kaching.com","pascal@cs.stanford.edu"],"city":"Geneve","rankLevel":"BASIC","experiences":["KACHING","DEVELOPMENT","LOGIN_SYSTEM","ADMIN","RESEARCH","RANKINGS"],"marketCapFocus":"LARGE","picture":"sqr8.jpg","interests":{"MY_WALL":["EMAIL"]},"nonValidatedEmails":["pascal.loui-s.perez@gmail.com"],"showPicture":true,"lastName":"Perez","tradingFrequencyFocus":"BUY_AND_HOLD","validatedPrimaryEmail":"pascal.louis.perez@gmail.com","country":"CH","sessions":[{"d":"p","parameters":{"facebookSessionKey":"a9f133eed207196a563b0ca7-219948","facebookUserId":"219948"},"k":"qOtXSepsfrc=","platform":"FACEBOOK"},{"d":"s","k":"O7p3i91IXa8="},{"d":"s","k":"fexhG/MSXr0="},{"d":"s","k":"YUkWZMK4ors="},{"d":"s","k":"ETfFsm0svdg="}],"primaryEmail":"pascal.louis.perez@gmail.com","investmentStrategy":"Hire people who can manage my assets for me. I'm lousy.","lastLogin":"2008-12-17 12:45:25.000","portfolioId":219948}] - diff --git a/test/json/e1.json b/test/json/e1.json deleted file mode 100644 index 0dd16dd01..000000000 --- a/test/json/e1.json +++ /dev/null @@ -1 +0,0 @@ -[ 100, 500, 300, 200, 400 ] diff --git a/test/json/e2.json b/test/json/e2.json deleted file mode 100644 index c3e38240b..000000000 --- a/test/json/e2.json +++ /dev/null @@ -1,30 +0,0 @@ -[ - { - "color": "red", - "value": "#f00" - }, - { - "color": "green", - "value": "#0f0" - }, - { - "color": "blue", - "value": "#00f" - }, - { - "color": "cyan", - "value": "#0ff" - }, - { - "color": "magenta", - "value": "#f0f" - }, - { - "color": "yellow", - "value": "#ff0" - }, - { - "color": "black", - "value": "#000" - } -] diff --git a/test/json/e3.json b/test/json/e3.json deleted file mode 100644 index 93fd18825..000000000 --- a/test/json/e3.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "color": "red", - "value": "#f00" -} diff --git a/test/json/e4.json b/test/json/e4.json deleted file mode 100644 index ef2b65474..000000000 --- a/test/json/e4.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "id": "0001", - "type": "donut", - "name": "Cake", - "ppu": 0.55, - "batters": - { - "batter": - [ - { "id": "1001", "type": "Regular" }, - { "id": "1002", "type": "Chocolate" }, - { "id": "1003", "type": "Blueberry" }, - { "id": "1004", "type": "Devil's Food" } - ] - }, - "topping": - [ - { "id": "5001", "type": "None" }, - { "id": "5002", "type": "Glazed" }, - { "id": "5005", "type": "Sugar" }, - { "id": "5007", "type": "Powdered Sugar" }, - { "id": "5006", "type": "Chocolate with Sprinkles" }, - { "id": "5003", "type": "Chocolate" }, - { "id": "5004", "type": "Maple" } - ] -} diff --git a/test/json/e5.json b/test/json/e5.json deleted file mode 100644 index 70ddac09a..000000000 --- a/test/json/e5.json +++ /dev/null @@ -1,70 +0,0 @@ -[ - { - "id": "0001", - "type": "donut", - "name": "Cake", - "ppu": 0.55, - "batters": - { - "batter": - [ - { "id": "1001", "type": "Regular" }, - { "id": "1002", "type": "Chocolate" }, - { "id": "1003", "type": "Blueberry" }, - { "id": "1004", "type": "Devil's Food" } - ] - }, - "topping": - [ - { "id": "5001", "type": "None" }, - { "id": "5002", "type": "Glazed" }, - { "id": "5005", "type": "Sugar" }, - { "id": "5007", "type": "Powdered Sugar" }, - { "id": "5006", "type": "Chocolate with Sprinkles" }, - { "id": "5003", "type": "Chocolate" }, - { "id": "5004", "type": "Maple" } - ] - }, - { - "id": "0002", - "type": "donut", - "name": "Raised", - "ppu": 0.55, - "batters": - { - "batter": - [ - { "id": "1001", "type": "Regular" } - ] - }, - "topping": - [ - { "id": "5001", "type": "None" }, - { "id": "5002", "type": "Glazed" }, - { "id": "5005", "type": "Sugar" }, - { "id": "5003", "type": "Chocolate" }, - { "id": "5004", "type": "Maple" } - ] - }, - { - "id": "0003", - "type": "donut", - "name": "Old Fashioned", - "ppu": 0.55, - "batters": - { - "batter": - [ - { "id": "1001", "type": "Regular" }, - { "id": "1002", "type": "Chocolate" } - ] - }, - "topping": - [ - { "id": "5001", "type": "None" }, - { "id": "5002", "type": "Glazed" }, - { "id": "5003", "type": "Chocolate" }, - { "id": "5004", "type": "Maple" } - ] - } -] diff --git a/test/json/e6.json b/test/json/e6.json deleted file mode 100644 index e55e960fa..000000000 --- a/test/json/e6.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "id": "0001", - "type": "donut", - "name": "Cake", - "image": - { - "url": "images/0001.jpg", - "width": 200, - "height": 200 - }, - "thumbnail": - { - "url": "images/thumbnails/0001.jpg", - "width": 32, - "height": 32 - } -} diff --git a/test/json/e7.json b/test/json/e7.json deleted file mode 100644 index adbd088e7..000000000 --- a/test/json/e7.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "items": - { - "item": - [ - { - "id": "0001", - "type": "donut", - "name": "Cake", - "ppu": 0.55, - "batters": - { - "batter": - [ - { "id": "1001", "type": "Regular" }, - { "id": "1002", "type": "Chocolate" }, - { "id": "1003", "type": "Blueberry" }, - { "id": "1004", "type": "Devil's Food" } - ] - }, - "topping": - [ - { "id": "5001", "type": "None" }, - { "id": "5002", "type": "Glazed" }, - { "id": "5005", "type": "Sugar" }, - { "id": "5007", "type": "Powdered Sugar" }, - { "id": "5006", "type": "Chocolate with Sprinkles" }, - { "id": "5003", "type": "Chocolate" }, - { "id": "5004", "type": "Maple" } - ] - } - ] - } -} diff --git a/test/json/e8.json b/test/json/e8.json deleted file mode 100644 index 468c919b4..000000000 --- a/test/json/e8.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "items": - { - "item": - [ - { - "id": "0001", - "type": "donut", - "name": "Cake", - "ppu": 0.55, - "batters": - { - "batter": - [ - { "id": "1001", "type": "Regular" }, - { "id": "1002", "type": "Chocolate" }, - { "id": "1003", "type": "Blueberry" }, - { "id": "1004", "type": "Devil's Food" } - ] - }, - "topping": - [ - { "id": "5001", "type": "None" }, - { "id": "5002", "type": "Glazed" }, - { "id": "5005", "type": "Sugar" }, - { "id": "5007", "type": "Powdered Sugar" }, - { "id": "5006", "type": "Chocolate with Sprinkles" }, - { "id": "5003", "type": "Chocolate" }, - { "id": "5004", "type": "Maple" } - ] - } - - - ] - } -} diff --git a/test/json/facebook.json b/test/json/facebook.json deleted file mode 100644 index 6627bf8df..000000000 --- a/test/json/facebook.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "data": [ - { - "id": "X999_Y999", - "from": { - "name": "Tom Brady", "id": "X12" - }, - "message": "Looking forward to 2010!", - "actions": [ - { - "name": "Comment", - "link": "http://www.facebook.com/X999/posts/Y999" - }, - { - "name": "Like", - "link": "http://www.facebook.com/X999/posts/Y999" - } - ], - "type": "status", - "created_time": "2010-08-02T21:27:44+0000", - "updated_time": "2010-08-02T21:27:44+0000" - }, - { - "id": "X998_Y998", - "from": { - "name": "Peyton Manning", "id": "X18" - }, - "message": "Where's my contract?", - "actions": [ - { - "name": "Comment", - "link": "http://www.facebook.com/X998/posts/Y998" - }, - { - "name": "Like", - "link": "http://www.facebook.com/X998/posts/Y998" - } - ], - "type": "status", - "created_time": "2010-08-02T21:27:44+0000", - "updated_time": "2010-08-02T21:27:44+0000" - } - ] -} diff --git a/test/json/flikr.json b/test/json/flikr.json deleted file mode 100644 index 710db0c71..000000000 --- a/test/json/flikr.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "title": "Talk On Travel Pool", - "link": "http://www.flickr.com/groups/talkontravel/pool/", - "description": "Travel and vacation photos from around the world.", - "modified": "2009-02-02T11:10:27Z", - "generator": "http://www.flickr.com/", - "items": [ - { - "title": "View from the hotel", - "link": "http://www.flickr.com/photos/33112458@N08/3081564649/in/pool-998875@N22", - "media": {"m":"http://farm4.static.flickr.com/3037/3081564649_4a6569750c_m.jpg"}, - "date_taken": "2008-12-04T04:43:03-08:00", - "description": "

Talk On Travel<\/a> has added a photo to the pool:<\/p>

\"View<\/a><\/p> ", - "published": "2008-12-04T12:43:03Z", - "author": "nobody@flickr.com (Talk On Travel)", - "author_id": "33112458@N08", - "tags": "spain dolphins tenerife canaries lagomera aqualand playadelasamericas junglepark losgigantos loscristines talkontravel" - } - ] -} - diff --git a/test/json/interop.json b/test/json/interop.json deleted file mode 100644 index 5d680f627..000000000 --- a/test/json/interop.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "ResultSet": { - "totalResultsAvailable": "1827221", - "totalResultsReturned": 2, - "firstResultPosition": 1, - "Result": [ - { - "Title": "potato jpg", - "Summary": "Kentang Si bungsu dari keluarga Solanum tuberosum L ini ternyata memiliki khasiat untuk mengurangi kerutan jerawat bintik hitam dan kemerahan pada kulit Gunakan seminggu sekali sebagai", - "Url": "http:\/\/www.mediaindonesia.com\/spaw\/uploads\/images\/potato.jpg", - "ClickUrl": "http:\/\/www.mediaindonesia.com\/spaw\/uploads\/images\/potato.jpg", - "RefererUrl": "http:\/\/www.mediaindonesia.com\/mediaperempuan\/index.php?ar_id=Nzkw", - "FileSize": 22630, - "FileFormat": "jpeg", - "Height": "362", - "Width": "532", - "Thumbnail": { - "Url": "http:\/\/thm-a01.yimg.com\/nimage\/557094559c18f16a", - "Height": "98", - "Width": "145" - } - }, - { - "Title": "potato jpg", - "Summary": "Introduction of puneri aloo This is a traditional potato preparation flavoured with curry leaves and peanuts and can be eaten on fasting day Preparation time 10 min", - "Url": "http:\/\/www.infovisual.info\/01\/photo\/potato.jpg", - "ClickUrl": "http:\/\/www.infovisual.info\/01\/photo\/potato.jpg", - "RefererUrl": "http:\/\/sundayfood.com\/puneri-aloo-indian-%20recipe", - "FileSize": 119398, - "FileFormat": "jpeg", - "Height": "685", - "Width": "1024", - "Thumbnail": { - "Url": "http:\/\/thm-a01.yimg.com\/nimage\/7fa23212efe84b64", - "Height": "107", - "Width": "160" - } - } - ] - } -} diff --git a/test/json/iphone.json b/test/json/iphone.json deleted file mode 100644 index 08dcdf40a..000000000 --- a/test/json/iphone.json +++ /dev/null @@ -1,77 +0,0 @@ -{ - "menu": { - "header": "xProgress SVG Viewer", - "items": [ - { - "id": "Open" - }, - { - "id": "OpenNew", - "label": "Open New" - }, - null, - { - "id": "ZoomIn", - "label": "Zoom In" - }, - { - "id": "ZoomOut", - "label": "Zoom Out" - }, - { - "id": "OriginalView", - "label": "Original View" - }, - null, - { - "id": "Quality" - }, - { - "id": "Pause" - }, - { - "id": "Mute" - }, - null, - { - "id": "Find", - "label": "Find..." - }, - { - "id": "FindAgain", - "label": "Find Again" - }, - { - "id": "Copy" - }, - { - "id": "CopyAgain", - "label": "Copy Again" - }, - { - "id": "CopySVG", - "label": "Copy SVG" - }, - { - "id": "ViewSVG", - "label": "View SVG" - }, - { - "id": "ViewSource", - "label": "View Source" - }, - { - "id": "SaveAs", - "label": "Save As" - }, - null, - { - "id": "Help" - }, - { - "id": "About", - "label": "About xProgress CVG Viewer..." - } - ] - } -} diff --git a/test/json/twitter.json b/test/json/twitter.json deleted file mode 100644 index bfbf99087..000000000 --- a/test/json/twitter.json +++ /dev/null @@ -1,50 +0,0 @@ -{"results":[ - - {"text":"@twitterapi http:\/\/tinyurl.com\/ctrefg", - - "to_user_id":396524, - - "to_user":"TwitterAPI", - - "from_user":"jkoum", - - "metadata": - - { - - "result_type":"popular", - - "recent_retweets": 109 - - }, - - "id":1478555574, - - "from_user_id":1833773, - - "iso_language_code":"nl", - - "source":"twitter<\/a>", - - "profile_image_url":"http:\/\/s3.amazonaws.com\/twitter_production\/profile_images\/118412707\/2522215727_a5f07da155_b_normal.jpg", - - "created_at":"Wed, 08 Apr 2009 19:22:10 +0000"} - - ], - - "since_id":0, - - "max_id":1480307926, - - "refresh_url":"?since_id=1480307926&q=%40twitterapi", - - "results_per_page":15, - - "next_page":"?page=2&max_id=1480307926&q=%40twitterapi", - - "completed_in":0.031704, - - "page":1, - - "query":"%40twitterapi" -} diff --git a/test/json/youtube.json b/test/json/youtube.json deleted file mode 100644 index 7e97ee6a8..000000000 --- a/test/json/youtube.json +++ /dev/null @@ -1,53 +0,0 @@ -{"apiVersion":"2.0", - "data":{ - "updated":"2010-01-07T19:58:42.949Z", - "totalItems":800, - "startIndex":1, - "itemsPerPage":1, - "items":[ - {"id":"hYB0mn5zh2c", - "uploaded":"2007-06-05T22:07:03.000Z", - "updated":"2010-01-07T13:26:50.000Z", - "uploader":"GoogleDeveloperDay", - "category":"News", - "title":"Google Developers Day US - Maps API Introduction", - "description":"Google Maps API Introduction ...", - "tags":[ - "GDD07","GDD07US","Maps" - ], - "thumbnail":{ - "default":"http://i.ytimg.com/vi/hYB0mn5zh2c/default.jpg", - "hqDefault":"http://i.ytimg.com/vi/hYB0mn5zh2c/hqdefault.jpg" - }, - "player":{ - "default":"http://www.youtube.com/watch?v\u003dhYB0mn5zh2c" - }, - "content":{ - "1":"rtsp://v5.cache3.c.youtube.com/CiILENy.../0/0/0/video.3gp", - "5":"http://www.youtube.com/v/hYB0mn5zh2c?f...", - "6":"rtsp://v1.cache1.c.youtube.com/CiILENy.../0/0/0/video.3gp" - }, - "duration":2840, - "aspectRatio":"widescreen", - "rating":4.63, - "ratingCount":68, - "viewCount":220101, - "favoriteCount":201, - "commentCount":22, - "status":{ - "value":"restricted", - "reason":"limitedSyndication" - }, - "accessControl":{ - "syndicate":"allowed", - "commentVote":"allowed", - "rate":"allowed", - "list":"allowed", - "comment":"allowed", - "embed":"allowed", - "videoRespond":"moderated" - } - } - ] - } -} diff --git a/test/json_test.cpp b/test/json_test.cpp deleted file mode 100644 index 0a1879b17..000000000 --- a/test/json_test.cpp +++ /dev/null @@ -1,87 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// -// Copyright 2006 - 2016, Paul Beckingham, Federico Hernandez. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -// http://www.opensource.org/licenses/mit-license.php -// -//////////////////////////////////////////////////////////////////////////////// - -#include -#include -#include -#include -#include -#include -#include - -Context context; - -//////////////////////////////////////////////////////////////////////////////// -int main (int argc, char** argv) -{ - if (argc == 1) - { - std::cout << "\nUsage: json_test [-q] ...\n" - << "\n" - << " -q quiet, no JSON dump\n" - << " file containing JSON\n" - << " JSON string, may need to be quoted\n" - << "\n"; - return 0; - } - - bool quiet = false; - for (int i = 1; i < argc; ++i) - if (!strcmp (argv[i], "-q")) - quiet = true; - - for (int i = 1; i < argc; ++i) - { - if (strcmp (argv[i], "-q")) - { - try - { - json::value* root; - File file (argv[i]); - if (file.exists ()) - { - std::string contents; - file.read (contents); - root = json::parse (contents); - } - else - root = json::parse (argv[i]); - - if (root && !quiet) - std::cout << root->dump () << "\n"; - - delete root; - } - - catch (const std::string& e) { std::cout << e << "\n"; } - catch (...) { std::cout << "Unknown error\n"; } - } - } - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// diff --git a/test/json_test.t b/test/json_test.t deleted file mode 100755 index a1f566b2f..000000000 --- a/test/json_test.t +++ /dev/null @@ -1,83 +0,0 @@ -#!/usr/bin/env python2.7 -# -*- coding: utf-8 -*- -############################################################################### -# -# Copyright 2006 - 2016, Paul Beckingham, Federico Hernandez. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. -# -# http://www.opensource.org/licenses/mit-license.php -# -############################################################################### - -import sys -import os -import unittest -from glob import glob -# Ensure python finds the local simpletap module -sys.path.append(os.path.dirname(os.path.abspath(__file__))) - -from basetest import TestCase -from basetest.utils import CURRENT_DIR, run_cmd_wait_nofail -from basetest.meta import MetaTest - - -class MetaTestJson(MetaTest): - """Helper metaclass to simplify test logic below (TestJson) - - Creates test_methods in the TestCase class dynamically named after the - arguments used. - """ - @staticmethod - def make_function(classname, *args, **kwargs): - filepath = args[0] - TEST_BIN = kwargs.get("TEST_BIN") - - def test(self): - # ### Body of the usual test_testcase ### # - cmd = (TEST_BIN, filepath) - code, out, err = run_cmd_wait_nofail(cmd) - - self.assertNotIn("Error", out) - - filename = os.path.basename(filepath) - - # Title of test in report - test.__doc__ = "{0} {1}".format(classname, filename) - - return test - - -class TestJsonParsing(TestCase): - __metaclass__ = MetaTestJson - - EXTRA = {} - EXTRA["TEST_DIR"] = os.path.abspath(os.path.join(CURRENT_DIR, "..")) - EXTRA["TEST_BIN"] = os.path.join(EXTRA["TEST_DIR"], "json_test") - - TESTS = ( - zip(glob(os.path.join(EXTRA["TEST_DIR"], "json/*.json"))) - ) - - -if __name__ == "__main__": - from simpletap import TAPTestRunner - unittest.main(testRunner=TAPTestRunner()) - -# vim: ai sts=4 et sw=4 ft=python From a7900205e5e3fb9a81f509e9116953228df06e83 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sat, 25 Jun 2016 17:48:21 -0400 Subject: [PATCH 074/879] Tests: Removed redundant format tests --- test/.gitignore | 1 - test/CMakeLists.txt | 2 +- test/i18n.t.cpp | 81 --------------------------------------------- 3 files changed, 1 insertion(+), 83 deletions(-) delete mode 100644 test/i18n.t.cpp diff --git a/test/.gitignore b/test/.gitignore index dd2709758..9aaaafcec 100644 --- a/test/.gitignore +++ b/test/.gitignore @@ -10,7 +10,6 @@ config.t dates.t eval.t fs.t -i18n.t iso8601d.t iso8601p.t lexer.t diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 6a4d15834..b68ab046b 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -14,7 +14,7 @@ include_directories (${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/test ${TASK_INCLUDE_DIRS}) -set (test_SRCS autocomplete.t col.t color.t config.t fs.t i18n.t list.t +set (test_SRCS autocomplete.t col.t color.t config.t fs.t list.t msg.t nibbler.t t.t tdb2.t text.t utf8.t util.t view.t lexer.t iso8601d.t iso8601p.t eval.t dates.t variant_add.t variant_and.t variant_cast.t variant_divide.t diff --git a/test/i18n.t.cpp b/test/i18n.t.cpp deleted file mode 100644 index 8127c9dc8..000000000 --- a/test/i18n.t.cpp +++ /dev/null @@ -1,81 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// -// Copyright 2006 - 2016, Paul Beckingham, Federico Hernandez. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -// http://www.opensource.org/licenses/mit-license.php -// -//////////////////////////////////////////////////////////////////////////////// - -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -Context context; - -//////////////////////////////////////////////////////////////////////////////// -int main (int, char**) -{ - UnitTest t (11); - - // Ensure environment has no influence. - unsetenv ("TASKDATA"); - unsetenv ("TASKRC"); - - try - { - t.is (format ("pre {1} post", "mid"), "pre mid post", "format 1a"); - t.is (format ("pre {1}{1} post", "mid"), "pre midmid post", "format 1b"); - t.is (format ("pre {1} post", 0), "pre 0 post", "format 1c"); - t.is (format ("pre {1}{1} post", 0), "pre 00 post", "format 1d"); - - t.is (format ("pre {1}{2} post", "one", "two"), "pre onetwo post", "format 2a"); - t.is (format ("pre {2}{1} post", "one", "two"), "pre twoone post", "format 2b"); - t.is (format ("pre {1}{2} post", "one", 2), "pre one2 post", "format 2c"); - t.is (format ("pre {1}{2} post", 1, "two"), "pre 1two post", "format 2d"); - t.is (format ("pre {1}{2} post", 1, 2), "pre 12 post", "format 2e"); - - t.is (format ("pre {1}{2}{3} post", "one", "two", "three"), "pre onetwothree post", "format 3a"); - t.is (format ("pre {3}{1}{2} post", "one", "two", "three"), "pre threeonetwo post", "format 3b"); - } - - catch (const std::string& error) - { - t.diag (error); - return -1; - } - - catch (...) - { - t.diag ("Unknown error."); - return -2; - } - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// From 9a63bd5d6fabe78b9e75c52a9c1bc2158ceda4d2 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sat, 25 Jun 2016 17:50:14 -0400 Subject: [PATCH 075/879] Tests: Removed redundant listt tests --- test/.gitignore | 1 - test/CMakeLists.txt | 2 +- test/list.t.cpp | 76 --------------------------------------------- 3 files changed, 1 insertion(+), 78 deletions(-) delete mode 100644 test/list.t.cpp diff --git a/test/.gitignore b/test/.gitignore index 9aaaafcec..4ea817725 100644 --- a/test/.gitignore +++ b/test/.gitignore @@ -13,7 +13,6 @@ fs.t iso8601d.t iso8601p.t lexer.t -list.t msg.t nibbler.t t.t diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index b68ab046b..d736af423 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -14,7 +14,7 @@ include_directories (${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/test ${TASK_INCLUDE_DIRS}) -set (test_SRCS autocomplete.t col.t color.t config.t fs.t list.t +set (test_SRCS autocomplete.t col.t color.t config.t fs.t msg.t nibbler.t t.t tdb2.t text.t utf8.t util.t view.t lexer.t iso8601d.t iso8601p.t eval.t dates.t variant_add.t variant_and.t variant_cast.t variant_divide.t diff --git a/test/list.t.cpp b/test/list.t.cpp deleted file mode 100644 index 92c71d10a..000000000 --- a/test/list.t.cpp +++ /dev/null @@ -1,76 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// -// Copyright 2006 - 2016, Paul Beckingham, Federico Hernandez. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -// http://www.opensource.org/licenses/mit-license.php -// -//////////////////////////////////////////////////////////////////////////////// - -#include -#include -#include -#include -#include - -//////////////////////////////////////////////////////////////////////////////// -int main (int, char**) -{ - UnitTest t (8); - - // 1,2,3 <=> 2,3,4 - std::vector string_one {"1", "2", "3"}; - std::vector string_two {"2", "3", "4"}; - std::vector string_three {"2", "3", "4"}; - std::vector string_four; - - // What are the differences? - std::vector string_leftOnly; - std::vector string_rightOnly; - listDiff (string_one, string_two, string_leftOnly, string_rightOnly); - t.is ((int) string_leftOnly.size (), 1, "std::string (1,2,3) <=> (2,3,4) = 1<-"); - t.is (string_leftOnly[0], "1", "std::string (1,2,3) <=> (2,3,4) = 1<-"); - - t.is ((int) string_rightOnly.size (), 1, "std::string (1,2,3) <=> (2,3,4) = ->4"); - t.is (string_rightOnly[0], "4", "std::string (1,2,3) <=> (2,3,4) = ->4"); - - // Now do it all again, with integers. - - // 1,2,3 <=> 2,3,4 - std::vector int_one {1, 2, 3}; - std::vector int_two {2, 3, 4}; - std::vector int_three {2, 3, 4}; - std::vector int_four; - - // What are the differences? - std::vector int_leftOnly; - std::vector int_rightOnly; - listDiff (int_one, int_two, int_leftOnly, int_rightOnly); - t.is ((int) int_leftOnly.size (), 1, "int (1,2,3) <=> (2,3,4) = 1<-"); - t.is (int_leftOnly[0], "1", "int (1,2,3) <=> (2,3,4) = 1<-"); - - t.is ((int) int_rightOnly.size (), 1, "int (1,2,3) <=> (2,3,4) = ->4"); - t.is (int_rightOnly[0], "4", "int (1,2,3) <=> (2,3,4) = ->4"); - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// - From 1ca91b9e0c443ffc61bae79c5859fa383866ce3b Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sat, 25 Jun 2016 17:52:20 -0400 Subject: [PATCH 076/879] libshared: Integrated utf8, wcwidth --- src/CMakeLists.txt | 8 +- src/utf8.cpp | 296 --------------------------------------------- src/utf8.h | 45 ------- src/wcwidth6.cpp | 211 -------------------------------- 4 files changed, 4 insertions(+), 556 deletions(-) delete mode 100644 src/utf8.cpp delete mode 100644 src/utf8.h delete mode 100644 src/wcwidth6.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 231508ba1..2638d2959 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -35,14 +35,14 @@ add_library (task CLI2.cpp CLI2.h rules.cpp sort.cpp text.cpp text.h - utf8.cpp utf8.h - util.cpp util.h - wcwidth6.cpp) + util.cpp util.h) add_library (libshared libshared/src/JSON.cpp libshared/src/JSON.h libshared/src/Pig.cpp libshared/src/Pig.h libshared/src/RX.cpp libshared/src/RX.h - libshared/src/unicode.cpp libshared/src/unicode.h) + libshared/src/unicode.cpp libshared/src/unicode.h + libshared/src/utf8.cpp libshared/src/utf8.h + libshared/src/wcwidth6.cpp) add_executable (task_executable main.cpp) add_executable (calc_executable calc.cpp) diff --git a/src/utf8.cpp b/src/utf8.cpp deleted file mode 100644 index 34b4fabf1..000000000 --- a/src/utf8.cpp +++ /dev/null @@ -1,296 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// -// Copyright 2013 - 2016, Paul Beckingham, Federico Hernandez. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -// http://www.opensource.org/licenses/mit-license.php -// -//////////////////////////////////////////////////////////////////////////////// - -#include -#include -#include - -//////////////////////////////////////////////////////////////////////////////// -// Converts '0' -> 0 -// '9' -> 9 -// 'a'/'A' -> 10 -// 'f'/'F' -> 15 -#define XDIGIT(x) ((x) >= '0' && (x) <= '9' ? ((x) - '0') : \ - (x) >= 'a' && (x) <= 'f' ? ((x) + 10 - 'a') : \ - (x) >= 'A' && (x) <= 'F' ? ((x) + 10 - 'A') : 0) - -//////////////////////////////////////////////////////////////////////////////// -// Note: Assumes 4-digit hex codepoints: -// xxxx -// \uxxxx -// U+xxxx -unsigned int utf8_codepoint (const std::string& input) -{ - unsigned int codepoint = 0; - int length = input.length (); - - // U+xxxx, \uxxxx - if (length >= 6 && - ((input[0] == 'U' && input[1] == '+') || - (input[0] == '\\' && input[1] == 'u'))) - { - codepoint = XDIGIT (input[2]) << 12 | - XDIGIT (input[3]) << 8 | - XDIGIT (input[4]) << 4 | - XDIGIT (input[5]); - } - else if (length >= 4) - { - codepoint = XDIGIT (input[0]) << 12 | - XDIGIT (input[1]) << 8 | - XDIGIT (input[2]) << 4 | - XDIGIT (input[3]); - } - - return codepoint; -} - -//////////////////////////////////////////////////////////////////////////////// -// Iterates along a UTF8 string. -// - argument i counts bytes advanced through the string -// - returns the next character -unsigned int utf8_next_char (const std::string& input, std::string::size_type& i) -{ - if (input[i] == '\0') - return 0; - - // How many bytes in the sequence? - int length = utf8_sequence (input[i]); - i += length; - - // 0xxxxxxx -> 0xxxxxxx - if (length == 1) - return input[i - 1]; - - // 110yyyyy 10xxxxxx -> 00000yyy yyxxxxxx - if (length == 2) - return ((input[i - 2] & 0x1F) << 6) + - (input[i - 1] & 0x3F); - - // 1110zzzz 10yyyyyy 10xxxxxx -> zzzzyyyy yyxxxxxx - if (length == 3) - return ((input[i - 3] & 0xF) << 12) + - ((input[i - 2] & 0x3F) << 6) + - (input[i - 1] & 0x3F); - - // 11110www 10zzzzzz 10yyyyyy 10xxxxxx -> 000wwwzz zzzzyyyy yyxxxxxx - if (length == 4) - return ((input[i - 4] & 0x7) << 18) + - ((input[i - 3] & 0x3F) << 12) + - ((input[i - 2] & 0x3F) << 6) + - (input[i - 1] & 0x3F); - - // Default: pretend as though it's a single character. - // TODO Or should this throw? - return input[i - 1]; -} - -//////////////////////////////////////////////////////////////////////////////// -// http://en.wikipedia.org/wiki/UTF-8 -std::string utf8_character (unsigned int codepoint) -{ - char sequence[5] {}; - - // 0xxxxxxx -> 0xxxxxxx - if (codepoint < 0x80) - { - sequence[0] = codepoint; - } - - // 00000yyy yyxxxxxx -> 110yyyyy 10xxxxxx - else if (codepoint < 0x800) - { - sequence[0] = 0xC0 | (codepoint & 0x7C0) >> 6; - sequence[1] = 0x80 | (codepoint & 0x3F); - } - - // zzzzyyyy yyxxxxxx -> 1110zzzz 10yyyyyy 10xxxxxx - else if (codepoint < 0x10000) - { - sequence[0] = 0xE0 | (codepoint & 0xF000) >> 12; - sequence[1] = 0x80 | (codepoint & 0xFC0) >> 6; - sequence[2] = 0x80 | (codepoint & 0x3F); - } - - // 000wwwzz zzzzyyyy yyxxxxxx -> 11110www 10zzzzzz 10yyyyyy 10xxxxxx - else if (codepoint < 0x110000) - { - sequence[0] = 0xF0 | (codepoint & 0x1C0000) >> 18; - sequence[1] = 0x80 | (codepoint & 0x03F000) >> 12; - sequence[2] = 0x80 | (codepoint & 0x0FC0) >> 6; - sequence[3] = 0x80 | (codepoint & 0x3F); - } - - return std::string (sequence); -} - -//////////////////////////////////////////////////////////////////////////////// -int utf8_sequence (unsigned int character) -{ - if ((character & 0xE0) == 0xC0) - return 2; - - if ((character & 0xF0) == 0xE0) - return 3; - - if ((character & 0xF8) == 0xF0) - return 4; - - return 1; -} - -//////////////////////////////////////////////////////////////////////////////// -// Length of a string in characters. -unsigned int utf8_length (const std::string& str) -{ - int byteLength = str.length (); - int charLength = byteLength; - const char* data = str.data (); - - // Decrement the number of bytes for each byte that matches 0b10?????? - // this way only the first byte of any utf8 sequence is counted. - for (int i = 0; i < byteLength; i++) - { - // Extract the first two bits and check whether they are 10 - if ((data[i] & 0xC0) == 0x80) - charLength--; - } - - return charLength; -} - -//////////////////////////////////////////////////////////////////////////////// -// Width of a string in character cells. -unsigned int utf8_width (const std::string& str) -{ - unsigned int length = 0; - std::string::size_type i = 0; - unsigned int c; - while ((c = utf8_next_char (str, i))) - { - // Control characters, and more especially newline characters, make - // mk_wcwidth() return -1. Ignore that, thereby "adding zero" to length. - // Since control characters are not displayed in reports, this is a valid - // choice. - int l = mk_wcwidth (c); - if (l != -1) - length += l; - } - - return length; -} - -//////////////////////////////////////////////////////////////////////////////// -unsigned int utf8_text_length (const std::string& str) -{ - int byteLength = str.length (); - int charLength = byteLength; - const char* data = str.data (); - bool in_color = false; - - // Decrement the number of bytes for each byte that matches 0b10?????? - // this way only the first byte of any utf8 sequence is counted. - for (int i = 0; i < byteLength; i++) - { - if (in_color) - { - if (data[i] == 'm') - in_color = false; - - --charLength; - } - else - { - if (data[i] == 033) - { - in_color = true; - --charLength; - } - else - { - // Extract the first two bits and check whether they are 10 - if ((data[i] & 0xC0) == 0x80) - --charLength; - } - } - } - - return charLength; -} - -//////////////////////////////////////////////////////////////////////////////// -unsigned int utf8_text_width (const std::string& str) -{ - bool in_color = false; - - unsigned int length = 0; - std::string::size_type i = 0; - unsigned int c; - while ((c = utf8_next_char (str, i))) - { - if (in_color) - { - if (c == 'm') - in_color = false; - } - else if (c == 033) - { - in_color = true; - } - else - length += mk_wcwidth (c); - } - - return length; -} - -//////////////////////////////////////////////////////////////////////////////// -const std::string utf8_substr ( - const std::string& input, - unsigned int start, - unsigned int length /* = 0 */) -{ - // Find the starting index. - std::string::size_type index_start = 0; - for (unsigned int i = 0; i < start; i++) - utf8_next_char (input, index_start); - - std::string result; - if (length) - { - std::string::size_type index_end = index_start; - for (unsigned int i = 0; i < length; i++) - utf8_next_char (input, index_end); - - result = input.substr (index_start, index_end - index_start); - } - else - result = input.substr (index_start); - - return result; -} - -//////////////////////////////////////////////////////////////////////////////// diff --git a/src/utf8.h b/src/utf8.h deleted file mode 100644 index bf0a9e3c8..000000000 --- a/src/utf8.h +++ /dev/null @@ -1,45 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// -// Copyright 2013 - 2016, Paul Beckingham, Federico Hernandez. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -// http://www.opensource.org/licenses/mit-license.php -// -//////////////////////////////////////////////////////////////////////////////// - -#ifndef INCLUDED_UTF8 -#define INCLUDED_UTF8 - -#include - -unsigned int utf8_codepoint (const std::string&); -unsigned int utf8_next_char (const std::string&, std::string::size_type&); -std::string utf8_character (unsigned int); -int utf8_sequence (unsigned int); -unsigned int utf8_length (const std::string&); -unsigned int utf8_text_length (const std::string&); -unsigned int utf8_width (const std::string& str); -unsigned int utf8_text_width (const std::string&); -const std::string utf8_substr (const std::string&, unsigned int, unsigned int length = 0); - -int mk_wcwidth (wchar_t); - -#endif -//////////////////////////////////////////////////////////////////////////////// diff --git a/src/wcwidth6.cpp b/src/wcwidth6.cpp deleted file mode 100644 index b26aa8f01..000000000 --- a/src/wcwidth6.cpp +++ /dev/null @@ -1,211 +0,0 @@ -/* - * This is an implementation of wcwidth() and wcswidth() (defined in - * IEEE Std 1002.1-2001) for Unicode. - * - * http://www.opengroup.org/onlinepubs/007904975/functions/wcwidth.html - * http://www.opengroup.org/onlinepubs/007904975/functions/wcswidth.html - * - * In fixed-width output devices, Latin characters all occupy a single - * "cell" position of equal width, whereas ideographic CJK characters - * occupy two such cells. Interoperability between terminal-line - * applications and (teletype-style) character terminals using the - * UTF-8 encoding requires agreement on which character should advance - * the cursor by how many cell positions. No established formal - * standards exist at present on which Unicode character shall occupy - * how many cell positions on character terminals. These routines are - * a first attempt of defining such behavior based on simple rules - * applied to data provided by the Unicode Consortium. - * - * For some graphical characters, the Unicode standard explicitly - * defines a character-cell width via the definition of the East Asian - * FullWidth (F), Wide (W), Half-width (H), and Narrow (Na) classes. - * In all these cases, there is no ambiguity about which width a - * terminal shall use. For characters in the East Asian Ambiguous (A) - * class, the width choice depends purely on a preference of backward - * compatibility with either historic CJK or Western practice. - * Choosing single-width for these characters is easy to justify as - * the appropriate long-term solution, as the CJK practice of - * displaying these characters as double-width comes from historic - * implementation simplicity (8-bit encoded characters were displayed - * single-width and 16-bit ones double-width, even for Greek, - * Cyrillic, etc.) and not any typographic considerations. - * - * Much less clear is the choice of width for the Not East Asian - * (Neutral) class. Existing practice does not dictate a width for any - * of these characters. It would nevertheless make sense - * typographically to allocate two character cells to characters such - * as for instance EM SPACE or VOLUME INTEGRAL, which cannot be - * represented adequately with a single-width glyph. The following - * routines at present merely assign a single-cell width to all - * neutral characters, in the interest of simplicity. This is not - * entirely satisfactory and should be reconsidered before - * establishing a formal standard in this area. At the moment, the - * decision which Not East Asian (Neutral) characters should be - * represented by double-width glyphs cannot yet be answered by - * applying a simple rule from the Unicode database content. Setting - * up a proper standard for the behavior of UTF-8 character terminals - * will require a careful analysis not only of each Unicode character, - * but also of each presentation form, something the author of these - * routines has avoided to do so far. - * - * http://www.unicode.org/unicode/reports/tr11/ - * - * Markus Kuhn -- 2007-05-26 (Unicode 5.0) - * - * Permission to use, copy, modify, and distribute this software - * for any purpose and without fee is hereby granted. The author - * disclaims all warranties with regard to this software. - * - * Latest version: http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c - */ - -#include -#include - -struct interval { - int first; - int last; -}; - -/* auxiliary function for binary search in interval table */ -static int bisearch(wchar_t ucs, const struct interval *table, int max) { - int min = 0; - int mid; - - if (ucs < table[0].first || ucs > table[max].last) - return 0; - while (max >= min) { - mid = (min + max) / 2; - if (ucs > table[mid].last) - min = mid + 1; - else if (ucs < table[mid].first) - max = mid - 1; - else - return 1; - } - - return 0; -} - - -/* The following two functions define the column width of an ISO 10646 - * character as follows: - * - * - The null character (U+0000) has a column width of 0. - * - * - Other C0/C1 control characters and DEL will lead to a return - * value of -1. - * - * - Non-spacing and enclosing combining characters (general - * category code Mn or Me in the Unicode database) have a - * column width of 0. - * - * - SOFT HYPHEN (U+00AD) has a column width of 1. - * - * - Other format characters (general category code Cf in the Unicode - * database) and ZERO WIDTH SPACE (U+200B) have a column width of 0. - * - * - Hangul Jamo medial vowels and final consonants (U+1160-U+11FF) - * have a column width of 0. - * - * - Spacing characters in the East Asian Wide (W) or East Asian - * Full-width (F) category as defined in Unicode Technical - * Report #11 have a column width of 2. - * - * - All remaining characters (including all printable - * ISO 8859-1 and WGL4 characters, Unicode control characters, - * etc.) have a column width of 1. - * - * This implementation assumes that wchar_t characters are encoded - * in ISO 10646. - */ - -int mk_wcwidth(wchar_t ucs) -{ - /* sorted list of non-overlapping intervals of non-spacing characters */ - /* generated by "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c" */ - static const struct interval combining[] = { - { 0x0300, 0x036F }, { 0x0483, 0x0486 }, { 0x0488, 0x0489 }, - { 0x0591, 0x05BD }, { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 }, - { 0x05C4, 0x05C5 }, { 0x05C7, 0x05C7 }, { 0x0600, 0x0603 }, - { 0x0610, 0x0615 }, { 0x064B, 0x065E }, { 0x0670, 0x0670 }, - { 0x06D6, 0x06E4 }, { 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED }, - { 0x070F, 0x070F }, { 0x0711, 0x0711 }, { 0x0730, 0x074A }, - { 0x07A6, 0x07B0 }, { 0x07EB, 0x07F3 }, { 0x0901, 0x0902 }, - { 0x093C, 0x093C }, { 0x0941, 0x0948 }, { 0x094D, 0x094D }, - { 0x0951, 0x0954 }, { 0x0962, 0x0963 }, { 0x0981, 0x0981 }, - { 0x09BC, 0x09BC }, { 0x09C1, 0x09C4 }, { 0x09CD, 0x09CD }, - { 0x09E2, 0x09E3 }, { 0x0A01, 0x0A02 }, { 0x0A3C, 0x0A3C }, - { 0x0A41, 0x0A42 }, { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D }, - { 0x0A70, 0x0A71 }, { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC }, - { 0x0AC1, 0x0AC5 }, { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD }, - { 0x0AE2, 0x0AE3 }, { 0x0B01, 0x0B01 }, { 0x0B3C, 0x0B3C }, - { 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B43 }, { 0x0B4D, 0x0B4D }, - { 0x0B56, 0x0B56 }, { 0x0B82, 0x0B82 }, { 0x0BC0, 0x0BC0 }, - { 0x0BCD, 0x0BCD }, { 0x0C3E, 0x0C40 }, { 0x0C46, 0x0C48 }, - { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 }, { 0x0CBC, 0x0CBC }, - { 0x0CBF, 0x0CBF }, { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD }, - { 0x0CE2, 0x0CE3 }, { 0x0D41, 0x0D43 }, { 0x0D4D, 0x0D4D }, - { 0x0DCA, 0x0DCA }, { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 }, - { 0x0E31, 0x0E31 }, { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E }, - { 0x0EB1, 0x0EB1 }, { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC }, - { 0x0EC8, 0x0ECD }, { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 }, - { 0x0F37, 0x0F37 }, { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E }, - { 0x0F80, 0x0F84 }, { 0x0F86, 0x0F87 }, { 0x0F90, 0x0F97 }, - { 0x0F99, 0x0FBC }, { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 }, - { 0x1032, 0x1032 }, { 0x1036, 0x1037 }, { 0x1039, 0x1039 }, - { 0x1058, 0x1059 }, { 0x1160, 0x11FF }, { 0x135F, 0x135F }, - { 0x1712, 0x1714 }, { 0x1732, 0x1734 }, { 0x1752, 0x1753 }, - { 0x1772, 0x1773 }, { 0x17B4, 0x17B5 }, { 0x17B7, 0x17BD }, - { 0x17C6, 0x17C6 }, { 0x17C9, 0x17D3 }, { 0x17DD, 0x17DD }, - { 0x180B, 0x180D }, { 0x18A9, 0x18A9 }, { 0x1920, 0x1922 }, - { 0x1927, 0x1928 }, { 0x1932, 0x1932 }, { 0x1939, 0x193B }, - { 0x1A17, 0x1A18 }, { 0x1B00, 0x1B03 }, { 0x1B34, 0x1B34 }, - { 0x1B36, 0x1B3A }, { 0x1B3C, 0x1B3C }, { 0x1B42, 0x1B42 }, - { 0x1B6B, 0x1B73 }, { 0x1DC0, 0x1DCA }, { 0x1DFE, 0x1DFF }, - { 0x200B, 0x200F }, { 0x202A, 0x202E }, { 0x2060, 0x2063 }, - { 0x206A, 0x206F }, { 0x20D0, 0x20EF }, { 0x302A, 0x302F }, - { 0x3099, 0x309A }, { 0xA806, 0xA806 }, { 0xA80B, 0xA80B }, - { 0xA825, 0xA826 }, { 0xFB1E, 0xFB1E }, { 0xFE00, 0xFE0F }, - { 0xFE20, 0xFE23 }, { 0xFEFF, 0xFEFF }, { 0xFFF9, 0xFFFB }, - { 0x10A01, 0x10A03 }, { 0x10A05, 0x10A06 }, { 0x10A0C, 0x10A0F }, - { 0x10A38, 0x10A3A }, { 0x10A3F, 0x10A3F }, { 0x1D167, 0x1D169 }, - { 0x1D173, 0x1D182 }, { 0x1D185, 0x1D18B }, { 0x1D1AA, 0x1D1AD }, - { 0x1D242, 0x1D244 }, { 0xE0001, 0xE0001 }, { 0xE0020, 0xE007F }, - { 0xE0100, 0xE01EF } - }; - - /* test for 8-bit control characters */ - if (ucs == 0) - return 0; - if (ucs < 32 || (ucs >= 0x7f && ucs < 0xa0)) - return -1; - - /* binary search in table of non-spacing characters */ - if (bisearch(ucs, combining, - sizeof(combining) / sizeof(struct interval) - 1)) - return 0; - - /* if we arrive here, ucs is not a combining or C0/C1 control character */ - - return 1 + - (ucs >= 0x1100 && - (ucs <= 0x115f || /* Hangul Jamo init. consonants */ - ucs == 0x2329 || ucs == 0x232a || - (ucs >= 0x2e80 && ucs <= 0xa4cf && - ucs != 0x303f) || /* CJK ... Yi */ - (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */ - (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility Ideographs */ - (ucs >= 0xfe10 && ucs <= 0xfe19) || /* Vertical forms */ - (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */ - (ucs >= 0xff00 && ucs <= 0xff60) || /* Fullwidth Forms */ - (ucs >= 0xffe0 && ucs <= 0xffe6) -#ifndef CYGWIN - || - (ucs >= 0x20000 && ucs <= 0x2fffd) || - (ucs >= 0x30000 && ucs <= 0x3fffd) -#endif - ) - ); -} - From d0251642bc45c693092588bd751d3bf1540e9254 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sat, 25 Jun 2016 17:54:18 -0400 Subject: [PATCH 077/879] Tests: Removed redundant utf8 tests --- test/.gitignore | 1 - test/CMakeLists.txt | 2 +- test/utf8.t.cpp | 98 --------------------------------------------- 3 files changed, 1 insertion(+), 100 deletions(-) delete mode 100644 test/utf8.t.cpp diff --git a/test/.gitignore b/test/.gitignore index 4ea817725..c01a7b026 100644 --- a/test/.gitignore +++ b/test/.gitignore @@ -20,7 +20,6 @@ taskmod.t tdb2.t text.t uri.t -utf8.t util.t variant_add.t variant_and.t diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index d736af423..6514cd447 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -15,7 +15,7 @@ include_directories (${CMAKE_SOURCE_DIR} ${TASK_INCLUDE_DIRS}) set (test_SRCS autocomplete.t col.t color.t config.t fs.t - msg.t nibbler.t t.t tdb2.t text.t utf8.t util.t view.t + msg.t nibbler.t t.t tdb2.t text.t util.t view.t lexer.t iso8601d.t iso8601p.t eval.t dates.t variant_add.t variant_and.t variant_cast.t variant_divide.t variant_equal.t variant_exp.t variant_gt.t variant_gte.t diff --git a/test/utf8.t.cpp b/test/utf8.t.cpp deleted file mode 100644 index 07bfdcb86..000000000 --- a/test/utf8.t.cpp +++ /dev/null @@ -1,98 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// -// Copyright 2006 - 2016, Paul Beckingham, Federico Hernandez. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -// http://www.opensource.org/licenses/mit-license.php -// -//////////////////////////////////////////////////////////////////////////////// - -#include -#include -#include - -//////////////////////////////////////////////////////////////////////////////// -int main (int, char**) -{ - UnitTest t (33); - - std::string ascii_text = "This is a test"; - std::string utf8_text = "más sábado miércoles"; - std::string utf8_wide_text = "改变各种颜色"; - - std::string ascii_text_color = "This is a test"; - std::string utf8_text_color = "más sábado miércoles"; - std::string utf8_wide_text_color = "改变各种颜色"; - - // unsigned int utf8_codepoint (const std::string&); - t.is ((int) utf8_codepoint ("\\u0020"), 32, "\\u0020 --> ' '"); - t.is ((int) utf8_codepoint ("U+0020"), 32, "U+0020 --> ' '"); - - // TODO unsigned int utf8_next_char (const std::string&, std::string::size_type&); - // TODO std::string utf8_character (unsigned int); - // TODO int utf8_sequence (unsigned int); - - // unsigned int utf8_length (const std::string&); - t.is ((int) utf8_length (ascii_text), 14, "ASCII utf8_length"); - t.is ((int) utf8_length (utf8_text), 20, "UTF8 utf8_length"); - t.is ((int) utf8_length (utf8_wide_text), 6, "UTF8 wide utf8_length"); - - // unsigned int utf8_width (const std::string&); - t.is ((int) utf8_width (ascii_text), 14, "ASCII utf8_width"); - t.is ((int) utf8_width (utf8_text), 20, "UTF8 utf8_width"); - t.is ((int) utf8_width (utf8_wide_text), 12, "UTF8 wide utf8_width"); - - // unsigned int utf8_text_length (const std::string&); - t.is ((int) utf8_text_length (ascii_text_color), 14, "ASCII utf8_text_length"); - t.is ((int) utf8_text_length (utf8_text_color), 20, "UTF8 utf8_text_length"); - t.is ((int) utf8_text_length (utf8_wide_text_color), 6, "UTF8 wide utf8_text_length"); - - // unsigned int utf8_text_width (const std::string&); - t.is ((int) utf8_text_width (ascii_text_color), 14, "ASCII utf8_text_width"); - t.is ((int) utf8_text_width (utf8_text_color), 20, "UTF8 utf8_text_width"); - t.is ((int) utf8_text_width (utf8_wide_text_color), 12, "UTF8 wide utf8_text_width"); - - // const std::string utf8_substr (const std::string&, unsigned int, unsigned int length = 0); - t.is (utf8_substr (ascii_text, 0, 2), "Th", "ASCII utf8_substr"); - t.is (utf8_substr (utf8_text, 0, 2), "má", "UTF8 utf8_substr"); - t.is (utf8_substr (utf8_wide_text, 0, 2), "改变", "UTF8 wide utf8_substr"); - - // int mk_wcwidth (wchar_t); - t.is (mk_wcwidth ('a'), 1, "mk_wcwidth U+0061 --> 1"); - t.is (mk_wcwidth (0x5149), 2, "mk_wcwidth U+5149 --> 2"); - t.is (mk_wcwidth (0x9a8c), 2, "mk_wcwidth U+9a8c --> 2"); - t.is (mk_wcwidth (0x4e70), 2, "mk_wcwidth U+4e70 --> 2"); - t.is (mk_wcwidth (0x94b1), 2, "mk_wcwidth U+94b1 --> 2"); - t.is (mk_wcwidth (0x5305), 2, "mk_wcwidth U+5305 --> 2"); - t.is (mk_wcwidth (0x91cd), 2, "mk_wcwidth U+91cd --> 2"); - t.is (mk_wcwidth (0x65b0), 2, "mk_wcwidth U+65b0 --> 2"); - t.is (mk_wcwidth (0x8bbe), 2, "mk_wcwidth U+8bbe --> 2"); - t.is (mk_wcwidth (0x8ba1), 2, "mk_wcwidth U+8ba1 --> 2"); - t.is (mk_wcwidth (0x5411), 2, "mk_wcwidth U+5411 --> 2"); - t.is (mk_wcwidth (0x4e0a), 2, "mk_wcwidth U+4e0a --> 2"); - t.is (mk_wcwidth (0x4e0b), 2, "mk_wcwidth U+4e0b --> 2"); - t.is (mk_wcwidth (0x7bad), 2, "mk_wcwidth U+7bad --> 2"); - t.is (mk_wcwidth (0x5934), 2, "mk_wcwidth U+5934 --> 2"); - t.is (mk_wcwidth (0xff0c), 2, "mk_wcwidth U+ff0c --> 2"); // comma - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// From 5de313272f5687342ada8267bdd92c88d25a4b92 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sat, 25 Jun 2016 18:09:36 -0400 Subject: [PATCH 078/879] libshared: Added Table --- src/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2638d2959..fbbd676aa 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -40,6 +40,7 @@ add_library (task CLI2.cpp CLI2.h add_library (libshared libshared/src/JSON.cpp libshared/src/JSON.h libshared/src/Pig.cpp libshared/src/Pig.h libshared/src/RX.cpp libshared/src/RX.h + libshared/src/Table.cpp libshared/src/Table.h libshared/src/unicode.cpp libshared/src/unicode.h libshared/src/utf8.cpp libshared/src/utf8.h libshared/src/wcwidth6.cpp) From b6ef01059510877381c128a664ca2cc5822f9280 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sat, 25 Jun 2016 18:16:34 -0400 Subject: [PATCH 079/879] DOM: Eiminated Nibbler --- src/DOM.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/DOM.cpp b/src/DOM.cpp index f938412c2..43fd96233 100644 --- a/src/DOM.cpp +++ b/src/DOM.cpp @@ -31,7 +31,6 @@ #include #include #include -#include #include #include #include @@ -60,7 +59,6 @@ bool getDOM (const std::string& name, Variant& value) return false; auto len = name.length (); - Nibbler n (name); // rc. --> context.config if (len > 3 && From 61763f278fb7496ee4b33889586a090ee8b61dfe Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 26 Jun 2016 09:15:08 -0400 Subject: [PATCH 080/879] libshared: Integrated FS --- src/CMakeLists.txt | 4 +- src/FS.cpp | 974 --------------------------------------------- src/FS.h | 145 ------- 3 files changed, 2 insertions(+), 1121 deletions(-) delete mode 100644 src/FS.cpp delete mode 100644 src/FS.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fbbd676aa..8170b9c17 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -14,7 +14,6 @@ add_library (task CLI2.cpp CLI2.h Dates.cpp Dates.h Eval.cpp Eval.h Filter.cpp Filter.h - FS.cpp FS.h Hooks.cpp Hooks.h ISO8601.cpp ISO8601.h Lexer.cpp Lexer.h @@ -37,7 +36,8 @@ add_library (task CLI2.cpp CLI2.h text.cpp text.h util.cpp util.h) -add_library (libshared libshared/src/JSON.cpp libshared/src/JSON.h +add_library (libshared libshared/src/FS.cpp libshared/src/FS.h + libshared/src/JSON.cpp libshared/src/JSON.h libshared/src/Pig.cpp libshared/src/Pig.h libshared/src/RX.cpp libshared/src/RX.h libshared/src/Table.cpp libshared/src/Table.h diff --git a/src/FS.cpp b/src/FS.cpp deleted file mode 100644 index 72bb9c72d..000000000 --- a/src/FS.cpp +++ /dev/null @@ -1,974 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// -// Copyright 2006 - 2016, Paul Beckingham, Federico Hernandez. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -// http://www.opensource.org/licenses/mit-license.php -// -//////////////////////////////////////////////////////////////////////////////// - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if defined SOLARIS || defined NETBSD || defined FREEBSD -#include -#endif - -#if defined __APPLE__ -#include -#endif - -// Fixes build with musl libc. -#ifndef GLOB_TILDE -#define GLOB_TILDE 0 -#endif - -#ifndef GLOB_BRACE -#define GLOB_BRACE 0 -#endif - -//////////////////////////////////////////////////////////////////////////////// -Path::Path () -{ -} - -//////////////////////////////////////////////////////////////////////////////// -Path::Path (const Path& other) -{ - if (this != &other) - { - _original = other._original; - _data = other._data; - } -} - -//////////////////////////////////////////////////////////////////////////////// -Path::Path (const std::string& in) -{ - _original = in; - _data = expand (in); -} - -//////////////////////////////////////////////////////////////////////////////// -Path& Path::operator= (const Path& other) -{ - if (this != &other) - { - this->_original = other._original; - this->_data = other._data; - } - - return *this; -} - -//////////////////////////////////////////////////////////////////////////////// -bool Path::operator== (const Path& other) -{ - return _data == other._data; -} - -//////////////////////////////////////////////////////////////////////////////// -Path& Path::operator+= (const std::string& dir) -{ - _data += "/" + dir; - return *this; -} - -//////////////////////////////////////////////////////////////////////////////// -Path::operator std::string () const -{ - return _data; -} - -//////////////////////////////////////////////////////////////////////////////// -std::string Path::name () const -{ - if (_data.length ()) - { - auto slash = _data.rfind ('/'); - if (slash != std::string::npos) - return _data.substr (slash + 1, std::string::npos); - } - - return _data; -} - -//////////////////////////////////////////////////////////////////////////////// -std::string Path::parent () const -{ - if (_data.length ()) - { - auto slash = _data.rfind ('/'); - if (slash != std::string::npos) - return _data.substr (0, slash); - } - - return ""; -} - -//////////////////////////////////////////////////////////////////////////////// -std::string Path::extension () const -{ - if (_data.length ()) - { - auto dot = _data.rfind ('.'); - if (dot != std::string::npos) - return _data.substr (dot + 1, std::string::npos); - } - - return ""; -} - -//////////////////////////////////////////////////////////////////////////////// -bool Path::exists () const -{ - return access (_data.c_str (), F_OK) ? false : true; -} - -//////////////////////////////////////////////////////////////////////////////// -bool Path::is_directory () const -{ - struct stat s {}; - if (! stat (_data.c_str (), &s) && - S_ISDIR (s.st_mode)) - return true; - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -bool Path::is_absolute () const -{ - if (_data.length () && _data[0] == '/') - return true; - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -bool Path::is_link () const -{ - struct stat s {}; - if (! lstat (_data.c_str (), &s) && - S_ISLNK (s.st_mode)) - return true; - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -bool Path::readable () const -{ - return access (_data.c_str (), R_OK) ? false : true; -} - -//////////////////////////////////////////////////////////////////////////////// -bool Path::writable () const -{ - return access (_data.c_str (), W_OK) ? false : true; -} - -//////////////////////////////////////////////////////////////////////////////// -bool Path::executable () const -{ - return access (_data.c_str (), X_OK) ? false : true; -} - -//////////////////////////////////////////////////////////////////////////////// -bool Path::rename (const std::string& new_name) -{ - auto expanded = expand (new_name); - if (_data != expanded) - { - if (std::rename (_data.c_str (), expanded.c_str ()) == 0) - { - _data = expanded; - return true; - } - } - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// ~ --> /home/user -// ~foo/x --> /home/foo/s -// ~/x --> /home/foo/x -// ./x --> $PWD/x -// x --> $PWD/x -std::string Path::expand (const std::string& in) -{ - std::string copy = in; - - auto tilde = copy.find ("~"); - std::string::size_type slash; - - if (tilde != std::string::npos) - { - const char *home = getenv("HOME"); - if (home == nullptr) - { - struct passwd* pw = getpwuid (getuid ()); - home = pw->pw_dir; - } - - // Convert: ~ --> /home/user - if (copy.length () == 1) - copy = home; - - // Convert: ~/x --> /home/user/x - else if (copy.length () > tilde + 1 && - copy[tilde + 1] == '/') - { - copy.replace (tilde, 1, home); - } - - // Convert: ~foo/x --> /home/foo/x - else if ((slash = copy.find ("/", tilde)) != std::string::npos) - { - std::string name = copy.substr (tilde + 1, slash - tilde - 1); - struct passwd* pw = getpwnam (name.c_str ()); - if (pw) - copy.replace (tilde, slash - tilde, pw->pw_dir); - } - } - - // Relative paths - else if (in.length () > 2 && - in.substr (0, 2) == "./") - { - copy = Directory::cwd () + in.substr (1); - } - else if (in.length () > 1 && - in[0] != '.' && - in[0] != '/') - { - copy = Directory::cwd () + "/" + in; - } - - return copy; -} - -//////////////////////////////////////////////////////////////////////////////// -std::vector Path::glob (const std::string& pattern) -{ - std::vector results; - - glob_t g; -#ifdef SOLARIS - if (!::glob (pattern.c_str (), GLOB_ERR, nullptr, &g)) -#else - if (!::glob (pattern.c_str (), GLOB_ERR | GLOB_BRACE | GLOB_TILDE, nullptr, &g)) -#endif - for (int i = 0; i < (int) g.gl_pathc; ++i) - results.push_back (g.gl_pathv[i]); - - globfree (&g); - return results; -} - -//////////////////////////////////////////////////////////////////////////////// -File::File () -: Path::Path () -, _fh (nullptr) -, _h (-1) -, _locked (false) -{ -} - -//////////////////////////////////////////////////////////////////////////////// -File::File (const Path& other) -: Path::Path (other) -, _fh (nullptr) -, _h (-1) -, _locked (false) -{ -} - -//////////////////////////////////////////////////////////////////////////////// -File::File (const File& other) -: Path::Path (other) -, _fh (nullptr) -, _h (-1) -, _locked (false) -{ -} - -//////////////////////////////////////////////////////////////////////////////// -File::File (const std::string& in) -: Path::Path (in) -, _fh (nullptr) -, _h (-1) -, _locked (false) -{ -} - -//////////////////////////////////////////////////////////////////////////////// -File::~File () -{ - if (_fh) - close (); -} - -//////////////////////////////////////////////////////////////////////////////// -File& File::operator= (const File& other) -{ - if (this != &other) - Path::operator= (other); - - _locked = false; - return *this; -} - -//////////////////////////////////////////////////////////////////////////////// -bool File::create (int mode /* = 0640 */) -{ - if (open ()) - { - fchmod (_h, mode); - close (); - return true; - } - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -bool File::remove () const -{ - return unlink (_data.c_str ()) == 0 ? true : false; -} - -//////////////////////////////////////////////////////////////////////////////// -std::string File::removeBOM (const std::string& input) -{ - if (input[0] && input[0] == '\xEF' && - input[1] && input[1] == '\xBB' && - input[2] && input[2] == '\xBF') - return input.substr (3); - - return input; -} - -//////////////////////////////////////////////////////////////////////////////// -bool File::open () -{ - if (_data != "") - { - if (! _fh) - { - bool already_exists = exists (); - if (already_exists) - if (!readable () || !writable ()) - throw std::string (format (STRING_FILE_PERMS, _data)); - - _fh = fopen (_data.c_str (), (already_exists ? "r+" : "w+")); - if (_fh) - { - _h = fileno (_fh); - _locked = false; - return true; - } - } - else - return true; - } - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -void File::close () -{ - if (_fh) - { - if (_locked) - unlock (); - - fclose (_fh); - _fh = nullptr; - _h = -1; - _locked = false; - } -} - -//////////////////////////////////////////////////////////////////////////////// -bool File::lock () -{ - _locked = false; - if (_fh && _h != -1) - { - // l_type l_whence l_start l_len l_pid - struct flock fl = {F_WRLCK, SEEK_SET, 0, 0, 0 }; - fl.l_pid = getpid (); - if (fcntl (_h, F_SETLKW, &fl) == 0) - _locked = true; - } - - return _locked; -} - -//////////////////////////////////////////////////////////////////////////////// -void File::unlock () -{ - if (_locked) - { - // l_type l_whence l_start l_len l_pid - struct flock fl = {F_UNLCK, SEEK_SET, 0, 0, 0 }; - fl.l_pid = getpid (); - - fcntl (_h, F_SETLK, &fl); - _locked = false; - } -} - -//////////////////////////////////////////////////////////////////////////////// -// Opens if necessary. -void File::read (std::string& contents) -{ - contents = ""; - contents.reserve (size ()); - - std::ifstream in (_data.c_str ()); - if (in.good ()) - { - bool first = true; - std::string line; - line.reserve (512 * 1024); - while (getline (in, line)) - { - // Detect forbidden BOM on first line. - if (first) - { - line = File::removeBOM (line); - first = false; - } - - contents += line + "\n"; - } - - in.close (); - } -} - -//////////////////////////////////////////////////////////////////////////////// -// Opens if necessary. -void File::read (std::vector & contents) -{ - contents.clear (); - - std::ifstream in (_data.c_str ()); - if (in.good ()) - { - bool first = true; - std::string line; - line.reserve (512 * 1024); - while (getline (in, line)) - { - // Detect forbidden BOM on first line. - if (first) - { - line = File::removeBOM (line); - first = false; - } - - contents.push_back (line); - } - - in.close (); - } -} - -//////////////////////////////////////////////////////////////////////////////// -// Opens if necessary. -void File::append (const std::string& line) -{ - if (!_fh) - open (); - - if (_fh) - { - fseek (_fh, 0, SEEK_END); - fputs (line.c_str (), _fh); - } -} - -//////////////////////////////////////////////////////////////////////////////// -// Opens if necessary. -void File::append (const std::vector & lines) -{ - if (!_fh) - open (); - - if (_fh) - { - fseek (_fh, 0, SEEK_END); - for (auto& line : lines) - fputs (line.c_str (), _fh); - } -} - -//////////////////////////////////////////////////////////////////////////////// -void File::write_raw (const std::string& line) -{ - if (!_fh) - open (); - - if (_fh) - fputs (line.c_str (), _fh); -} - -//////////////////////////////////////////////////////////////////////////////// -void File::truncate () -{ - if (!_fh) - open (); - - if (_fh) - if (ftruncate (_h, 0)) - throw format (STRING_FILE_TRUNCATE, errno, strerror (errno)); -} - -//////////////////////////////////////////////////////////////////////////////// -// S_IFMT 0170000 type of file -// S_IFIFO 0010000 named pipe (fifo) -// S_IFCHR 0020000 character special -// S_IFDIR 0040000 directory -// S_IFBLK 0060000 block special -// S_IFREG 0100000 regular -// S_IFLNK 0120000 symbolic link -// S_IFSOCK 0140000 socket -// S_IFWHT 0160000 whiteout -// S_ISUID 0004000 set user id on execution -// S_ISGID 0002000 set group id on execution -// S_ISVTX 0001000 save swapped text even after use -// S_IRUSR 0000400 read permission, owner -// S_IWUSR 0000200 write permission, owner -// S_IXUSR 0000100 execute/search permission, owner -mode_t File::mode () -{ - struct stat s; - if (!stat (_data.c_str (), &s)) - return s.st_mode; - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -size_t File::size () const -{ - struct stat s; - if (!stat (_data.c_str (), &s)) - return s.st_size; - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -time_t File::mtime () const -{ - struct stat s; - if (!stat (_data.c_str (), &s)) - return s.st_mtime; - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -time_t File::ctime () const -{ - struct stat s; - if (!stat (_data.c_str (), &s)) - return s.st_ctime; - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -time_t File::btime () const -{ - struct stat s; - if (!stat (_data.c_str (), &s)) -#ifdef HAVE_ST_BIRTHTIME - return s.st_birthtime; -#else - return s.st_ctime; -#endif - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -bool File::create (const std::string& name, int mode /* = 0640 */) -{ - std::string full_name = expand (name); - std::ofstream out (full_name.c_str ()); - if (out.good ()) - { - out.close (); - chmod (full_name.c_str (), mode); - return true; - } - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -bool File::read (const std::string& name, std::string& contents) -{ - contents = ""; - - std::ifstream in (name.c_str ()); - if (in.good ()) - { - bool first = true; - std::string line; - line.reserve (1024); - while (getline (in, line)) - { - // Detect forbidden BOM on first line. - if (first) - { - line = File::removeBOM (line); - first = false; - } - - contents += line + "\n"; - } - - in.close (); - return true; - } - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -bool File::read (const std::string& name, std::vector & contents) -{ - contents.clear (); - - std::ifstream in (name.c_str ()); - if (in.good ()) - { - bool first = true; - std::string line; - line.reserve (1024); - while (getline (in, line)) - { - // Detect forbidden BOM on first line. - if (first) - { - line = File::removeBOM (line); - first = false; - } - - contents.push_back (line); - } - - in.close (); - return true; - } - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -bool File::write (const std::string& name, const std::string& contents) -{ - std::ofstream out (expand (name).c_str (), - std::ios_base::out | std::ios_base::trunc); - if (out.good ()) - { - out << contents; - out.close (); - return true; - } - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -bool File::write ( - const std::string& name, - const std::vector & lines, - bool addNewlines /* = true */) -{ - std::ofstream out (expand (name).c_str (), - std::ios_base::out | std::ios_base::trunc); - if (out.good ()) - { - for (auto& line : lines) - { - out << line; - - if (addNewlines) - out << "\n"; - } - - out.close (); - return true; - } - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -bool File::remove (const std::string& name) -{ - return unlink (expand (name).c_str ()) == 0 ? true : false; -} - -//////////////////////////////////////////////////////////////////////////////// -bool File::copy (const std::string& from, const std::string& to) -{ - // 'from' must exist. - if (! access (from.c_str (), F_OK)) - { - std::ifstream src (from, std::ios::binary); - std::ofstream dst (to, std::ios::binary); - - dst << src.rdbuf (); - return true; - } - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -bool File::move (const std::string& from, const std::string& to) -{ - auto expanded = expand (to); - if (from != expanded) - if (std::rename (from.c_str (), to.c_str ()) == 0) - return true; - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -Directory::Directory () -{ -} - -//////////////////////////////////////////////////////////////////////////////// -Directory::Directory (const Directory& other) -: File::File (other) -{ -} - -//////////////////////////////////////////////////////////////////////////////// -Directory::Directory (const File& other) -: File::File (other) -{ -} - -//////////////////////////////////////////////////////////////////////////////// -Directory::Directory (const Path& other) -: File::File (other) -{ -} - -//////////////////////////////////////////////////////////////////////////////// -Directory::Directory (const std::string& in) -: File::File (in) -{ -} - -//////////////////////////////////////////////////////////////////////////////// -Directory& Directory::operator= (const Directory& other) -{ - if (this != &other) - File::operator= (other); - - return *this; -} - -//////////////////////////////////////////////////////////////////////////////// -bool Directory::create (int mode /* = 0755 */) -{ - return mkdir (_data.c_str (), mode) == 0 ? true : false; -} - -//////////////////////////////////////////////////////////////////////////////// -bool Directory::remove () const -{ - return remove_directory (_data); -} - -//////////////////////////////////////////////////////////////////////////////// -bool Directory::remove_directory (const std::string& dir) const -{ - DIR* dp = opendir (dir.c_str ()); - if (dp != nullptr) - { - struct dirent* de; - while ((de = readdir (dp)) != nullptr) - { - if (!strcmp (de->d_name, ".") || - !strcmp (de->d_name, "..")) - continue; - -#if defined (SOLARIS) || defined (HAIKU) - struct stat s; - lstat ((dir + "/" + de->d_name).c_str (), &s); - if (S_ISDIR (s.st_mode)) - remove_directory (dir + "/" + de->d_name); - else - unlink ((dir + "/" + de->d_name).c_str ()); -#else - if (de->d_type == DT_UNKNOWN) - { - struct stat s; - lstat ((dir + "/" + de->d_name).c_str (), &s); - if (S_ISDIR (s.st_mode)) - de->d_type = DT_DIR; - } - if (de->d_type == DT_DIR) - remove_directory (dir + "/" + de->d_name); - else - unlink ((dir + "/" + de->d_name).c_str ()); -#endif - } - - closedir (dp); - } - - return rmdir (dir.c_str ()) ? false : true; -} - -//////////////////////////////////////////////////////////////////////////////// -std::vector Directory::list () -{ - std::vector files; - list (_data, files, false); - return files; -} - -//////////////////////////////////////////////////////////////////////////////// -std::vector Directory::listRecursive () -{ - std::vector files; - list (_data, files, true); - return files; -} - -//////////////////////////////////////////////////////////////////////////////// -std::string Directory::cwd () -{ -#ifdef HAVE_GET_CURRENT_DIR_NAME - char *buf = get_current_dir_name (); - if (buf == nullptr) - throw std::bad_alloc (); - std::string result (buf); - free (buf); - return result; -#else - char buf[PATH_MAX]; - getcwd (buf, PATH_MAX - 1); - return std::string (buf); -#endif -} - -//////////////////////////////////////////////////////////////////////////////// -bool Directory::up () -{ - if (_data == "/") - return false; - - auto slash = _data.rfind ('/'); - if (slash == 0) - { - _data = "/"; // Root dir should retain the slash. - return true; - } - else if (slash != std::string::npos) - { - _data = _data.substr (0, slash); - return true; - } - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -bool Directory::cd () const -{ - return chdir (_data.c_str ()) == 0 ? true : false; -} - -//////////////////////////////////////////////////////////////////////////////// -void Directory::list ( - const std::string& base, - std::vector & results, - bool recursive) -{ - DIR* dp = opendir (base.c_str ()); - if (dp != nullptr) - { - struct dirent* de; - while ((de = readdir (dp)) != nullptr) - { - if (!strcmp (de->d_name, ".") || - !strcmp (de->d_name, "..")) - continue; - -#if defined (SOLARIS) || defined (HAIKU) - struct stat s; - stat ((base + "/" + de->d_name).c_str (), &s); - if (recursive && S_ISDIR (s.st_mode)) - list (base + "/" + de->d_name, results, recursive); - else - results.push_back (base + "/" + de->d_name); -#else - if (recursive && de->d_type == DT_UNKNOWN) - { - struct stat s; - lstat ((base + "/" + de->d_name).c_str (), &s); - if (S_ISDIR (s.st_mode)) - de->d_type = DT_DIR; - } - if (recursive && de->d_type == DT_DIR) - list (base + "/" + de->d_name, results, recursive); - else - results.push_back (base + "/" + de->d_name); -#endif - } - - closedir (dp); - } -} - -//////////////////////////////////////////////////////////////////////////////// diff --git a/src/FS.h b/src/FS.h deleted file mode 100644 index 3d14800e1..000000000 --- a/src/FS.h +++ /dev/null @@ -1,145 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// -// Copyright 2006 - 2016, Paul Beckingham, Federico Hernandez. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -// http://www.opensource.org/licenses/mit-license.php -// -//////////////////////////////////////////////////////////////////////////////// - -#ifndef INCLUDED_FS -#define INCLUDED_FS - -#include -#include -#include -#include - -class Path -{ -public: - Path (); - explicit Path (const Path&); - Path (const std::string&); - - Path& operator= (const Path&); - bool operator== (const Path&); - Path& operator+= (const std::string&); - operator std::string () const; - - std::string name () const; - std::string parent () const; - std::string extension () const; - bool exists () const; - bool is_directory () const; - bool is_absolute () const; - bool is_link () const; - bool readable () const; - bool writable () const; - bool executable () const; - bool rename (const std::string&); - - // Statics - static std::string expand (const std::string&); - static std::vector glob (const std::string&); - -public: - std::string _original; - std::string _data; -}; - -class File : public Path -{ -public: - File (); - explicit File (const Path&); - explicit File (const File&); - File (const std::string&); - virtual ~File (); - - File& operator= (const File&); - - virtual bool create (int mode = 0640); - virtual bool remove () const; - - bool open (); - void close (); - - bool lock (); - void unlock (); - - void read (std::string&); - void read (std::vector &); - - void append (const std::string&); - void append (const std::vector &); - void write_raw (const std::string&); - - void truncate (); - - virtual mode_t mode (); - virtual size_t size () const; - virtual time_t mtime () const; - virtual time_t ctime () const; - virtual time_t btime () const; - - static bool create (const std::string&, int mode = 0640); - static bool read (const std::string&, std::string&); - static bool read (const std::string&, std::vector &); - static bool write (const std::string&, const std::string&); - static bool write (const std::string&, const std::vector &, bool addNewlines = true); - static bool remove (const std::string&); - static bool copy (const std::string&, const std::string&); - static bool move (const std::string&, const std::string&); - static std::string removeBOM (const std::string&); - -private: - FILE* _fh; - int _h; - bool _locked; -}; - -class Directory : public File -{ -public: - Directory (); - explicit Directory (const Directory&); - explicit Directory (const File&); - explicit Directory (const Path&); - Directory (const std::string&); - - Directory& operator= (const Directory&); - - virtual bool create (int mode = 0755); - virtual bool remove () const; - - std::vector list (); - std::vector listRecursive (); - - static std::string cwd (); - bool up (); - bool cd () const; - -private: - void list (const std::string&, std::vector &, bool); - bool remove_directory (const std::string&) const; -}; - -#endif From 555dc98f5bc6c755247ed3b6588a2f3fb29b7c4d Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 26 Jun 2016 09:21:55 -0400 Subject: [PATCH 081/879] Tests: Removed redundant FS tests --- test/.gitignore | 1 - test/CMakeLists.txt | 2 +- test/fs.t.cpp | 311 -------------------------------------------- 3 files changed, 1 insertion(+), 313 deletions(-) delete mode 100644 test/fs.t.cpp diff --git a/test/.gitignore b/test/.gitignore index c01a7b026..b7c6be1a1 100644 --- a/test/.gitignore +++ b/test/.gitignore @@ -9,7 +9,6 @@ color.t config.t dates.t eval.t -fs.t iso8601d.t iso8601p.t lexer.t diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 6514cd447..daf1442c0 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -14,7 +14,7 @@ include_directories (${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/test ${TASK_INCLUDE_DIRS}) -set (test_SRCS autocomplete.t col.t color.t config.t fs.t +set (test_SRCS autocomplete.t col.t color.t config.t msg.t nibbler.t t.t tdb2.t text.t util.t view.t lexer.t iso8601d.t iso8601p.t eval.t dates.t variant_add.t variant_and.t variant_cast.t variant_divide.t diff --git a/test/fs.t.cpp b/test/fs.t.cpp deleted file mode 100644 index 2a573c545..000000000 --- a/test/fs.t.cpp +++ /dev/null @@ -1,311 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////// -// -// Copyright 2006 - 2016, Paul Beckingham, Federico Hernandez. -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -// SOFTWARE. -// -// http://www.opensource.org/licenses/mit-license.php -// -//////////////////////////////////////////////////////////////////////////////// - -#include -#include -#include -#include -#include -#include -#include - -Context context; - -int main (int, char**) -{ - UnitTest t (116); - - // Ensure environment has no influence. - unsetenv ("TASKDATA"); - unsetenv ("TASKRC"); - - // Path (); - Path p0; - t.is (p0._data, "", "Path::Path"); - - // Path (const Path&); - Path p1 = Path ("foo"); - t.is (p1._data, Directory::cwd () + "/foo", "Path::operator="); - - // Path (const std::string&); - Path p2 ("~"); - t.ok (p2._data != "~", "~ expanded to " + p2._data); - - Path p3 ("/tmp"); - t.ok (p3._data == "/tmp", "/tmp -> /tmp"); - - // operator== - t.notok (p2 == p3, "p2 != p3"); - - // Path& operator= (const Path&); - Path p3_copy (p3); - t.is (p3._data, p3_copy._data, "Path::Path (Path&)"); - - // operator (std::string) const; - t.is ((std::string) p3, "/tmp", "Path::operator (std::string) const"); - - // std::string name () const; - Path p4 ("/a/b/c/file.ext"); - t.is (p4.name (), "file.ext", "/a/b/c/file.ext name is file.ext"); - - // std::string parent () const; - t.is (p4.parent (), "/a/b/c", "/a/b/c/file.ext parent is /a/b/c"); - - // std::string extension () const; - t.is (p4.extension (), "ext", "/a/b/c/file.ext extension is ext"); - - // bool exists () const; - t.ok (p2.exists (), "~ exists"); - t.ok (p3.exists (), "/tmp exists"); - - // bool is_directory () const; - t.ok (p2.is_directory (), "~ is_directory"); - t.ok (p3.is_directory (), "/tmp is_directory"); - - // bool is_link () const; - t.notok (p2.is_link (), "~ !is_link"); - - // bool readable () const; - t.ok (p2.readable (), "~ readable"); - t.ok (p3.readable (), "/tmp readable"); - - // bool writable () const; - t.ok (p2.writable (), "~ writable"); - t.ok (p3.writable (), "/tmp writable"); - - // bool executable () const; - t.ok (p2.executable (), "~ executable"); - t.ok (p3.executable (), "/tmp executable"); - - // static std::string expand (const std::string&); - t.ok (Path::expand ("~") != "~", "Path::expand ~ != ~"); - t.ok (Path::expand ("~/") != "~/", "Path::expand ~/ != ~/"); - - // static std::vector glob (const std::string&); - std::vector out = Path::glob ("/tmp"); - t.ok (out.size () == 1, "/tmp -> 1 result"); - t.is (out[0], "/tmp", "/tmp -> /tmp"); - - out = Path::glob ("/t?p"); - t.ok (out.size () == 1, "/t?p -> 1 result"); - t.is (out[0], "/tmp", "/t?p -> /tmp"); - - out = Path::glob ("/[s-u]mp"); - t.ok (out.size () == 1, "/[s-u]mp -> 1 result"); - t.is (out[0], "/tmp", "/[s-u]mp -> /tmp"); - - // bool is_absolute () const; - t.notok (p0.is_absolute (), "'' !is_absolute"); - t.ok (p1.is_absolute (), "foo is_absolute"); - t.ok (p2.is_absolute (), "~ is_absolute (after expansion)"); - t.ok (p3.is_absolute (), "/tmp is_absolute"); - t.ok (p4.is_absolute (), "/a/b/c/file.ext is_absolute"); - - Path p5 ("~/file.ext"); - t.notok (p5.name () == "~/file.ext", "~/file.ext --> ! ~/file.ext"); - - Directory tmp ("tmp"); - tmp.create (); - t.ok (tmp.exists (), "tmp dir created."); - - File::write ("tmp/file.t.txt", "This is a test\n"); - File f6 ("tmp/file.t.txt"); - t.ok (f6.size () == 15, "File::size tmp/file.t.txt good"); - t.ok (f6.mode () & S_IRUSR, "File::mode tmp/file.t.txt good"); - t.ok (File::remove ("tmp/file.t.txt"), "File::remove tmp/file.t.txt good"); - - // operator (std::string) const; - t.is ((std::string) f6, Directory::cwd () + "/tmp/file.t.txt", "File::operator (std::string) const"); - - t.ok (File::create ("tmp/file.t.create"), "File::create tmp/file.t.create good"); - t.ok (File::remove ("tmp/file.t.create"), "File::remove tmp/file.t.create good"); - - // basename (std::string) const; - t.is (f6.name (), "file.t.txt", "File::basename tmp/file.t.txt --> file.t.txt"); - - // dirname (std::string) const; - t.is (f6.parent (), Directory::cwd () + "/tmp", "File::dirname tmp/file.t.txt --> tmp"); - - // bool rename (const std::string&); - File f7 ("tmp/file.t.2.txt"); - f7.append ("something\n"); - f7.close (); - - t.ok (f7.rename ("tmp/file.t.3.txt"), "File::rename did not fail"); - t.is (f7._data, Directory::cwd () + "/tmp/file.t.3.txt", "File::rename stored new name"); - t.ok (f7.exists (), "File::rename new file exists"); - t.ok (f7.remove (), "File::remove tmp/file.t.3.txt good"); - t.notok (f7.exists (), "File::remove new file no longer exists"); - - // Test permissions. - File f8 ("tmp/file.t.perm.txt"); - f8.create (0744); - t.ok (f8.exists (), "File::create perm file exists"); - mode_t m = f8.mode (); - t.ok (m & S_IFREG, "File::mode tmp/file.t.perm.txt S_IFREG good"); - t.ok (m & S_IRUSR, "File::mode tmp/file.t.perm.txt r-------- good"); - t.ok (m & S_IWUSR, "File::mode tmp/file.t.perm.txt -w------- good"); - t.ok (m & S_IXUSR, "File::mode tmp/file.t.perm.txt --x------ good"); - t.ok (m & S_IRGRP, "File::mode tmp/file.t.perm.txt ---r----- good"); - t.notok (m & S_IWGRP, "File::mode tmp/file.t.perm.txt ----w---- good"); - t.notok (m & S_IXGRP, "File::mode tmp/file.t.perm.txt -----x--- good"); - t.ok (m & S_IROTH, "File::mode tmp/file.t.perm.txt ------r-- good"); - t.notok (m & S_IWOTH, "File::mode tmp/file.t.perm.txt -------w- good"); - t.notok (m & S_IXOTH, "File::mode tmp/file.t.perm.txt --------x good"); - f8.remove (); - t.notok (f8.exists (), "File::remove perm file no longer exists"); - - tmp.remove (); - t.notok (tmp.exists (), "tmp dir removed."); - tmp.create (); - t.ok (tmp.exists (), "tmp dir created."); - - // Directory (const File&); - // Directory (const Path&); - Directory d0 (Path ("tmp")); - Directory d1 (File ("tmp")); - Directory d2 (File (Path ("tmp"))); - t.is (d0._data, d1._data, "Directory(std::string) == Directory (File&)"); - t.is (d0._data, d2._data, "Directory(std::string) == Directory (File (Path &))"); - t.is (d1._data, d2._data, "Directory(File&)) == Directory (File (Path &))"); - - // Directory (const Directory&); - Directory d3 (d2); - t.is (d3._data, Directory::cwd () + "/tmp", "Directory (Directory&)"); - - // Directory (const std::string&); - Directory d4 ("tmp/test_directory"); - - // Directory& operator= (const Directory&); - Directory d5 = d4; - t.is (d5._data, Directory::cwd () + "/tmp/test_directory", "Directory::operator="); - - // operator (std::string) const; - t.is ((std::string) d3, Directory::cwd () + "/tmp", "Directory::operator (std::string) const"); - - // virtual bool create (); - t.ok (d5.create (), "Directory::create tmp/test_directory"); - t.ok (d5.exists (), "Directory::exists tmp/test_directory"); - - Directory d6 (d5._data + "/dir"); - t.ok (d6.create (), "Directory::create tmp/test_directory/dir"); - - File::create (d5._data + "/f0"); - File::create (d6._data + "/f1"); - - // std::vector list (); - std::vector files = d5.list (); - std::sort (files.begin (), files.end ()); - t.is ((int)files.size (), 2, "Directory::list 1 file"); - t.is (files[0], Directory::cwd () + "/tmp/test_directory/dir", "file[0] is tmp/test_directory/dir"); - t.is (files[1], Directory::cwd () + "/tmp/test_directory/f0", "file[1] is tmp/test_directory/f0"); - - // std::vector listRecursive (); - files = d5.listRecursive (); - std::sort (files.begin (), files.end ()); - t.is ((int)files.size (), 2, "Directory::list 1 file"); - t.is (files[0], Directory::cwd () + "/tmp/test_directory/dir/f1", "file is tmp/test_directory/dir/f1"); - t.is (files[1], Directory::cwd () + "/tmp/test_directory/f0", "file is tmp/test_directory/f0"); - - // virtual bool remove (); - t.ok (File::remove (d5._data + "/f0"), "File::remove tmp/test_directory/f0"); - t.ok (File::remove (d6._data + "/f1"), "File::remove tmp/test_directory/dir/f1"); - - t.ok (d6.remove (), "Directory::remove tmp/test_directory/dir"); - t.notok (d6.exists (), "Directory::exists tmp/test_directory/dir - no"); - - t.ok (d5.remove (), "Directory::remove tmp/test_directory"); - t.notok (d5.exists (), "Directory::exists tmp/test_directory - no"); - - // bool remove (const std::string&); - Directory d7 ("tmp/to_be_removed"); - t.ok (d7.create (), "Directory::create tmp/to_be_removed"); - File::create (d7._data + "/f0"); - Directory d8 (d7._data + "/another"); - t.ok (d8.create (), "Directory::create tmp/to_be_removed/another"); - File::create (d8._data + "/f1"); - t.ok (d7.remove (), "Directory::remove tmp/to_be_removed"); - t.notok (d7.exists (), "Directory tmp/to_be_removed gone"); - - // static std::string cwd (); - std::string cwd = Directory::cwd (); - t.ok (cwd.length () > 0, "Directory::cwd returned a value"); - - // bool parent (std::string&) const; - Directory d9 ("/one/two/three/four.txt"); - t.ok (d9.up (), "parent /one/two/three/four.txt --> true"); - t.is (d9._data, "/one/two/three", "parent /one/two/three/four.txt --> /one/two/three"); - t.ok (d9.up (), "parent /one/two/three --> true"); - t.is (d9._data, "/one/two", "parent /one/two/three --> /one/two"); - t.ok (d9.up (), "parent /one/two --> true"); - t.is (d9._data, "/one", "parent /one/two --> /one"); - t.ok (d9.up (), "parent /one --> true"); - t.is (d9._data, "/", "parent /one --> /"); - t.notok (d9.up (), "parent / --> false"); - - // Test permissions. - umask (0022); - Directory d10 ("tmp/dir.perm"); - d10.create (0750); - t.ok (d10.exists (), "Directory::create perm file exists"); - m = d10.mode (); - t.ok (m & S_IFDIR, "Directory::mode tmp/dir.perm S_IFDIR good"); - t.ok (m & S_IRUSR, "Directory::mode tmp/dir.perm r-------- good"); - t.ok (m & S_IWUSR, "Directory::mode tmp/dir.perm -w------- good"); - t.ok (m & S_IXUSR, "Directory::mode tmp/dir.perm --x------ good"); - t.ok (m & S_IRGRP, "Directory::mode tmp/dir.perm ---r----- good"); - t.notok (m & S_IWGRP, "Directory::mode tmp/dir.perm ----w---- good"); - t.ok (m & S_IXGRP, "Directory::mode tmp/dir.perm -----x--- good"); - t.notok (m & S_IROTH, "Directory::mode tmp/dir.perm ------r-- good"); - t.notok (m & S_IWOTH, "Directory::mode tmp/dir.perm -------w- good"); - t.notok (m & S_IXOTH, "Directory::mode tmp/dir.perm --------x good"); - d10.remove (); - t.notok (d10.exists (), "Directory::remove temp/dir.perm file no longer exists"); - - // Directory::cd - Directory d11 ("/tmp"); - t.ok (d11.cd (), "Directory::cd /tmp good"); - - tmp.remove (); - t.notok (tmp.exists (), "tmp dir removed."); - - // File::removeBOM - std::string line = "Should not be modified."; - t.is (File::removeBOM (line), line, "File::removeBOM 'Should not be modified' --> 'Should not be modified'"); - - line = "no"; - t.is (File::removeBOM (line), line, "File::removeBOM 'no' --> 'no'"); - - line = ""; - t.is (File::removeBOM (line), line, "File::removeBOM '' --> ''"); - - line = {'\xEF', '\xBB', '\xBF', 'F', 'o', 'o'}; - t.is (File::removeBOM (line), "Foo", "File::removeBOM 'Foo' --> 'Foo'"); - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// From 04c068e5148e43fc3f2811f4e12e2dbff49c8dfb Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Fri, 8 Jul 2016 23:09:17 -0400 Subject: [PATCH 082/879] Docs: ChangeLog had wrong bug id --- ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index f36852b8b..bfec05ea8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16,7 +16,7 @@ pending tasks. - TW-1795 Calendar underline on Day padding (thanks to Renato Alves). -- TW-1806 project:ide is not allowed +- TW-1805 project:ide is not allowed (thanks to Slaven ʙanovic). - TW-1807 dateformat lacks a flag to display day of week (thanks to Ellington Santos). From 1f2c5bfed7cdda0127722305bcbf7adaa5082d0f Mon Sep 17 00:00:00 2001 From: Ran Benita Date: Tue, 2 Aug 2016 14:48:50 +0300 Subject: [PATCH 083/879] Scripts: Quoted regular expression to avoid bash glob expansion The quote is needed, otherwise it is treated as a bash glob first, which causes trouble if there actually happens to be matching files, and fails entirely if `shopt -s failglob` is set. --- scripts/bash/task.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/bash/task.sh b/scripts/bash/task.sh index e0c7fb039..ecb4fd528 100644 --- a/scripts/bash/task.sh +++ b/scripts/bash/task.sh @@ -72,7 +72,7 @@ _task_offer_contexts() { COMPREPLY=( $(compgen -W "$($taskcommand _context) define delete list none show" -- $cur) ) } -_task_context_alias=$($taskcommand show | grep alias.*context | cut -d' ' -f1 | cut -d. -f2) +_task_context_alias=$($taskcommand show | grep 'alias.*context' | cut -d' ' -f1 | cut -d. -f2) _task() { From e0aea4a5f53f6a40e4df576c86f4405496df3628 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Tue, 2 Aug 2016 08:25:02 -0400 Subject: [PATCH 084/879] Docs: Added Ran Benita --- AUTHORS | 1 + ChangeLog | 2 ++ 2 files changed, 3 insertions(+) diff --git a/AUTHORS b/AUTHORS index 93f150806..8681889f3 100644 --- a/AUTHORS +++ b/AUTHORS @@ -130,6 +130,7 @@ The following submitted code, packages or analysis, and deserve special thanks: Tom Sydney Kerckhove Lynoure Braakman Sebastien Badia + Ran Benita Thanks to the following, who submitted detailed bug reports and excellent suggestions: diff --git a/ChangeLog b/ChangeLog index bfec05ea8..e1b07e4db 100644 --- a/ChangeLog +++ b/ChangeLog @@ -36,6 +36,8 @@ - Correct a false-positive warning when a due date is removed and a wait is added. - Added 'QUARTER' virtual tag. +- Fixed unquoted glob in bash completion script + (thanks to Ran Benita). 2.5.1 (2016-02-24) 8b4ae3b54b44dfbd00b96cdd6dceb8dfe7cc1ea0 From 98611888affec104d54978681649001a4f11de4d Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Mon, 22 Aug 2016 09:19:18 -0400 Subject: [PATCH 085/879] L10N: Updated error message to not refer to only pending tasks --- src/l10n/eng-USA.h | 2 +- src/l10n/fra-FRA.h | 2 +- src/l10n/ita-ITA.h | 2 +- src/l10n/jpn-JPN.h | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/l10n/eng-USA.h b/src/l10n/eng-USA.h index 29575dad4..3a64918ba 100644 --- a/src/l10n/eng-USA.h +++ b/src/l10n/eng-USA.h @@ -480,7 +480,7 @@ #define STRING_CMD_SYNC_FAIL_CONNECT "Sync failed. Could not connect to the Taskserver." #define STRING_CMD_SYNC_BAD_SERVER "Sync failed. Malformed configuration setting '{1}'" #define STRING_CMD_SYNC_NO_TLS "Taskwarrior was built without GnuTLS support. Sync is not available." -#define STRING_CMD_SYNC_INIT "Please confirm that you wish to upload all your pending tasks to the Taskserver" +#define STRING_CMD_SYNC_INIT "Please confirm that you wish to upload all your tasks to the Taskserver" #define STRING_CMD_SYNC_NO_INIT "Taskwarrior will not proceed with first-time sync initialization." #define STRING_CMD_SYNC_RELOCATE0 "The server account has been relocated. Please update your configuration using:" #define STRING_CMD_SYNC_RELOCATE1 "task config taskd.server {1}" diff --git a/src/l10n/fra-FRA.h b/src/l10n/fra-FRA.h index 46847ffa1..05d7e82e9 100644 --- a/src/l10n/fra-FRA.h +++ b/src/l10n/fra-FRA.h @@ -482,7 +482,7 @@ #define STRING_CMD_SYNC_FAIL_CONNECT "Sync failed. Could not connect to the Taskserver." #define STRING_CMD_SYNC_BAD_SERVER "Sync failed. Malformed configuration setting '{1}'" #define STRING_CMD_SYNC_NO_TLS "Taskwarrior was built without GnuTLS support. Sync is not available." -#define STRING_CMD_SYNC_INIT "Please confirm that you wish to upload all your pending tasks to the Taskserver" +#define STRING_CMD_SYNC_INIT "Please confirm that you wish to upload all your tasks to the Taskserver" #define STRING_CMD_SYNC_NO_INIT "Taskwarrior will not proceed with first-time sync initialization." #define STRING_CMD_SYNC_RELOCATE0 "The server account has been relocated. Please update your configuration using:" #define STRING_CMD_SYNC_RELOCATE1 "task config taskd.server {1}" diff --git a/src/l10n/ita-ITA.h b/src/l10n/ita-ITA.h index 858b257da..d54af0588 100644 --- a/src/l10n/ita-ITA.h +++ b/src/l10n/ita-ITA.h @@ -481,7 +481,7 @@ #define STRING_CMD_SYNC_FAIL_CONNECT "Sincronizzazione fallita. Impossibile connettersi al Taskserver." #define STRING_CMD_SYNC_BAD_SERVER "Sincronizzazione fallita. Impostazione di configurazione '{1}' malformata" #define STRING_CMD_SYNC_NO_TLS "Taskwarrior was built without GnuTLS support. Sync is not available." -#define STRING_CMD_SYNC_INIT "Please confirm that you wish to upload all your pending tasks to the Taskserver" +#define STRING_CMD_SYNC_INIT "Please confirm that you wish to upload all your tasks to the Taskserver" #define STRING_CMD_SYNC_NO_INIT "Taskwarrior will not proceed with first-time sync initialization." #define STRING_CMD_SYNC_RELOCATE0 "The server account has been relocated. Please update your configuration using:" #define STRING_CMD_SYNC_RELOCATE1 "task config taskd.server {1}" diff --git a/src/l10n/jpn-JPN.h b/src/l10n/jpn-JPN.h index 4f53cba27..ff27b30f3 100644 --- a/src/l10n/jpn-JPN.h +++ b/src/l10n/jpn-JPN.h @@ -482,7 +482,7 @@ #define STRING_CMD_SYNC_FAIL_CONNECT "同期失敗。 Taskserverに接続できない。" #define STRING_CMD_SYNC_BAD_SERVER "同期失敗。 不正な形式の設定 '{1}'" #define STRING_CMD_SYNC_NO_TLS "Taskwarrior はGnuTLSサポートなしで構成されています。同期は無効です。" -#define STRING_CMD_SYNC_INIT "Please confirm that you wish to upload all your pending tasks to the Taskserver" +#define STRING_CMD_SYNC_INIT "Please confirm that you wish to upload all your tasks to the Taskserver" #define STRING_CMD_SYNC_NO_INIT "Taskwarrior will not proceed with first-time sync initialization." #define STRING_CMD_SYNC_RELOCATE0 "The server account has been relocated. Please update your configuration using:" #define STRING_CMD_SYNC_RELOCATE1 "task config taskd.server {1}" From c5d32c58f9ecec5a30c825aa9e0c9b89405e0786 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Wed, 31 Aug 2016 17:48:45 -0400 Subject: [PATCH 086/879] TW-1778: Unicode strings are truncated in task description - Thanks to Andrew, bjonnh, OKOMPer, Vladimir. --- AUTHORS | 4 ++++ ChangeLog | 2 ++ src/text.cpp | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/AUTHORS b/AUTHORS index 8681889f3..52d43edde 100644 --- a/AUTHORS +++ b/AUTHORS @@ -131,6 +131,7 @@ The following submitted code, packages or analysis, and deserve special thanks: Lynoure Braakman Sebastien Badia Ran Benita + Vladimir Thanks to the following, who submitted detailed bug reports and excellent suggestions: @@ -296,3 +297,6 @@ suggestions: Ellington Santos george js E. Manuel Cerr'on Angeles + Andrew + bjonnh + OKOMper diff --git a/ChangeLog b/ChangeLog index e1b07e4db..ddd27b085 100644 --- a/ChangeLog +++ b/ChangeLog @@ -8,6 +8,8 @@ (thanks to Paul Beckingham) - TW-1772 Implementation of circular dependency detection is inefficient (thanks to Michael Meier). +- TW-1778 Unicode strings are truncated in task description + (thanks to Andrew, bjonnh, OKOMPer, Vladimir). - TW-1788 Closing a reopened task does not update the end time (thanks to Ralph Bean). - TW-1791 taskrc(5) manpage: spurious "pri." in rule.precedence.color diff --git a/src/text.cpp b/src/text.cpp index f5e3496be..bc8353f73 100644 --- a/src/text.cpp +++ b/src/text.cpp @@ -248,7 +248,7 @@ bool extractLine ( // Premature EOL. if (character == '\n') { - line = text.substr (offset, line_length); + line = text.substr (offset, prior_cursor - offset); offset = cursor; return true; } From b7e71a1c3c5c91cdee4f3a03af29ca26aeed2ddf Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Fri, 2 Sep 2016 08:08:12 -0400 Subject: [PATCH 087/879] Docs: Updated dev build instructions --- DEVELOPER | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/DEVELOPER b/DEVELOPER index 10c24f159..545557b14 100644 --- a/DEVELOPER +++ b/DEVELOPER @@ -8,12 +8,13 @@ How to Build Taskwarrior - python 2.7 or 3 (optional, for running the test suite) Obtain and build code: - $ git clone https://git.tasktools.org/scm/tm/task.git task.git + $ git clone --recursive https://git.tasktools.org/scm/tm/task.git task.git $ cd task.git $ git checkout 2.6.0 # Latest dev branch - $ cmake -DCMAKE_BUILD_TYPE=debug . # debug or release. Default: neither. + $ git submodule update # Update the libhsared.git submodule + $ cmake -DCMAKE_BUILD_TYPE=debug . # debug or release. Default: neither $ make VERBOSE=1 -j8 # Shows details, builds using 8 jobs - # Alternately 'export MAKEFLAGS=-j 8'. + # Alternately 'export MAKEFLAGS=-j 8' Running Test Suite: $ cd tests From 2e11c3c104b35a83bf42fcf06b50487b543f226a Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 4 Sep 2016 16:11:04 -0400 Subject: [PATCH 088/879] Config: Changed to 0/1 boolean values for the defaults. - Deprecated use of alternate Boolean configuration settings. Use values "0" for off, and "1" for on. Avoid used of "on", "off", "true", "t", "false", "f", "yes", "y", "no", "n". --- ChangeLog | 3 + NEWS | 3 + doc/man/taskrc.5.in | 171 ++++++++++++++++++++++---------------------- src/Config.cpp | 88 +++++++++++------------ 4 files changed, 136 insertions(+), 129 deletions(-) diff --git a/ChangeLog b/ChangeLog index ddd27b085..fa863ac94 100644 --- a/ChangeLog +++ b/ChangeLog @@ -40,6 +40,9 @@ - Added 'QUARTER' virtual tag. - Fixed unquoted glob in bash completion script (thanks to Ran Benita). +- Deprecated use of alternate Boolean configuration settings. Use values "0" for + off, and "1" for on. Avoid used of "on", "off", "true", "t", "false", "f", + "yes", "y", "no", "n". 2.5.1 (2016-02-24) 8b4ae3b54b44dfbd00b96cdd6dceb8dfe7cc1ea0 diff --git a/NEWS b/NEWS index 3b35a1b08..1074aa75e 100644 --- a/NEWS +++ b/NEWS @@ -17,6 +17,9 @@ Newly Deprecated Features in Taskwarrior 2.5.2 not needed. - The 'new-uuid' verbosity option is to be removed due to being redundant, its functionality will be merged with 'new-id' option. + - The use of alternate Boolean configuration settings is deprecated. Use values + "0" for off, and "1" for on. Avoid used of "on", "off", "true", "t", + "false", "f", "yes", "y", "no", "n". Removed Features in 2.5.2 diff --git a/doc/man/taskrc.5.in b/doc/man/taskrc.5.in index 837e94858..28c149701 100644 --- a/doc/man/taskrc.5.in +++ b/doc/man/taskrc.5.in @@ -68,8 +68,8 @@ The entry must be on a single line, no continuations. Values support UTF8 as well as JSON encoding, such as \\uNNNN. Note that Taskwarrior is flexible about the values used to represent Boolean -items. You can use "on", "yes", "y", "1" and "true". -Anything else means "off". +items. You can use "1" to enable, anything else is interpreted as disabled. +The values "on", "yes", "y" and "true" are currently supported by deprecated. .RS include @@ -181,33 +181,33 @@ shell meta character, which will be properly expanded. Note that the TASKDATA environment variable overrides this setting. .TP -.B locking=on +.B locking=1 Determines whether to use file locking when accessing the pending.data and -completed.data files. Defaults to "on". Solaris users who store the data -files on an NFS mount may need to set locking to "off". Note that there is -danger in setting this value to "off" - another program (or another instance of +completed.data files. Defaults to "1". Solaris users who store the data +files on an NFS mount may need to set locking to "0". Note that there is +danger in setting this value to "0" - another program (or another instance of task) may write to the task.pending file at the same time. .TP -.B gc=on +.B gc=1 Can be used to temporarily suspend garbage collection (gc), so that task IDs don't change. Note that this should be used in the form of a command line -override (task rc.gc=off ...), and not permanently used in the .taskrc file, +override (task rc.gc=0 ...), and not permanently used in the .taskrc file, as this significantly affects performance in the long term. .TP -.B hooks=on +.B hooks=1 This master control switch enables hook script processing. The default value -is 'on', but certain extensions and environments may need to disable hooks. +is '1', but certain extensions and environments may need to disable hooks. .TP -.B exit.on.missing.db=no -When set to 'yes' causes the program to exit if the database (~/.task or -rc.data.location or TASKDATA override) is missing. Default value is 'no'. +.B exit.on.missing.db=0 +When set to '1' causes the program to exit if the database (~/.task or +rc.data.location or TASKDATA override) is missing. Default value is '0'. .SS TERMINAL .TP -.B detection=on +.B detection=1 Determines whether to use ioctl to establish the size of the window you are using, for text wrapping. @@ -225,14 +225,14 @@ to 24. If set to 0, it is interpreted as infinite height. This is useful when re charts to a file for subsequent handling. .TP -.B avoidlastcolumn=no +.B avoidlastcolumn=0 Causes the width of the terminal minus one to be used as the full width. This avoids placing color codes in the last column which can cause problems for -Cygwin users. Default value is 'no'. +Cygwin users. Default value is '0'. .TP -.B hyphenate=on -Hyphenates lines when wrapping breaks occur mid-word. Default value is 'on'. +.B hyphenate=1 +Hyphenates lines when wrapping breaks occur mid-word. Default value is '1'. .TP .B editor=vi @@ -250,9 +250,9 @@ prompt. This is only referenced when 'limit:page' is used. .SS MISCELLANEOUS .TP -.B verbose=on|off|nothing|list... -When set to "on" (the default), helpful explanatory comments are added to all -output from Taskwarrior. Setting this to "off" means that you would see regular +.B verbose=1|0|nothing|list... +When set to "1" (the default), helpful explanatory comments are added to all +output from Taskwarrior. Setting this to "0" means that you would see regular output. The special value "nothing" can be used to eliminate all optional output, which @@ -280,15 +280,15 @@ control specific occasions when output is generated. This list may contain: "affected", "new-id", "new-uuid" "project" and "unwait" imply "footnote". -Note that the "on" setting is equivalent to all the tokens being specified, +Note that the "1" setting is equivalent to all the tokens being specified, and the "nothing" setting is equivalent to none of the tokens being specified. Here are the shortcut equivalents: - verbose=on + verbose=1 verbose=blank,header,footnote,label,new-id,affected,edit,special,project,sync,filter,unwait - verbose=off + verbose=0 verbose=blank,label,new-id,edit verbose=nothing @@ -298,16 +298,16 @@ Those additional comments are sent to the standard error for header, footnote and project. The others are sent to standard output. .TP -.B confirmation=yes -May be "yes" or "no", and determines whether Taskwarrior will ask for +.B confirmation=1 +May be "1" or "0", and determines whether Taskwarrior will ask for confirmation before deleting a task or performing the undo command. The default -value is "yes". Consider leaving this setting as "yes", for safety. +value is "1". Consider leaving this enabled, for safety. .TP -.B allow.empty.filter=yes +.B allow.empty.filter=1 An empty filter combined with a write command is potentially a way to modify all tasks by mistake, and when this is detected, confirmation is required. -Setting this to 'no' means that it is an error to use a write command with no +Setting this to '0' means that it is an error to use a write command with no filter. .TP @@ -344,47 +344,47 @@ Default value is: 'You have more urgent tasks'. It is a gentle reminder that you are contradicting your own urgency settings. .TP -.B list.all.projects=no -May be yes or no, and determines whether the 'projects' command lists all the project +.B list.all.projects=0 +May be "1" or "0", and determines whether the 'projects' command lists all the project names you have used, or just the ones used in active tasks. The default value is -"no". +"0". .TP -.B summary.all.projects=no -If set to yes, shows all projects in the summary report, even if there are no -pending tasks. The default value is "no". +.B summary.all.projects=0 +If set to "1", shows all projects in the summary report, even if there are no +pending tasks. The default value is "0". .TP -.B complete.all.tags=yes -May be yes or no, and determines whether the tab completion scripts consider all +.B complete.all.tags=1 +May be "1" or "0", and determines whether the tab completion scripts consider all the tag names you have used, or just the ones used in active tasks. The default -value is "no". +value is "0". .TP -.B list.all.tags=yes -May be yes or no, and determines whether the 'tags' command lists all the tag +.B list.all.tags=1 +May be "1" or "0", and determines whether the 'tags' command lists all the tag names you have used, or just the ones used in active tasks. The default value is -"no". +"0". .TP -.B print.empty.columns=no -May be yes or no, and determines whether columns with no data for any task are -printed. Defaults to no. +.B print.empty.columns=1 +May be "1" or "0", and determines whether columns with no data for any task are +printed. Defaults to "0". .TP -.B search.case.sensitive=yes -May be yes or no, and determines whether keyword lookup and substitutions on the -description and annotations are done in a case sensitive way. Defaults to yes on -most platforms. Defaults to no on Cygwin due to older regex library problems with +.B search.case.sensitive=1 +May be "1" or "0", and determines whether keyword lookup and substitutions on the +description and annotations are done in a case sensitive way. Defaults to "1" on +most platforms. Defaults to "0" on Cygwin due to older regex library problems with case-insensitivity. .TP -.B regex=on -Controls whether regular expression support is enabled. The default value is on. +.B regex=1 +Controls whether regular expression support is enabled. The default value is "1". .TP -.B xterm.title=no -Sets the xterm window title when reports are run. Defaults to off. +.B xterm.title=1 +Sets the xterm window title when reports are run. Defaults to "0". .TP .B expressions=infix|postfix @@ -392,21 +392,21 @@ Sets a preference for infix expressions (1 + 2) or postfix expressions (1 2 +). Defaults to infix. .TP -.B json.array=on +.B json.array=1 Determines whether the export command encloses the JSON output in '[...]' and adds ',' after each exported task object to create a properly-formed JSON array. -With json.array=off, export writes raw JSON objects to STDOUT, one per line. -Defaults to on. +With json.array=0, export writes raw JSON objects to STDOUT, one per line. +Defaults to "1". .TP -.B json.depends.array=on +.B json.depends.array=1 Determines whether the export command encodes dependencies as an array of string UUIDs, or one comma-separated string. -Defaults to on. +Defaults to "1". .TP -.B _forcecolor=no +.B _forcecolor=1 Taskwarrior shuts off color automatically when the output is not sent directly to a TTY. For example, this command: @@ -422,6 +422,8 @@ $ task rc._forcecolor=yes list > file .RE .RE +Defaults to "0". + .TP .B active.indicator=* The character or string to show in the start.active column. Defaults to *. @@ -439,9 +441,9 @@ The character or string to show in the depends.indicator column. Defaults to +. The character or string to show in the .indicator column. Defaults to U. .TP -.B recurrence=yes +.B recurrence=1 Controls whether recurrence is enabled, and whether recurring tasks continue to -generate new task instances. Defaults to 'yes'. +generate new task instances. Defaults to "1". .TP .B recurrence.confirmation=prompt @@ -475,7 +477,7 @@ Minimum length of any abbreviated command/value. This means that "ve", "ver", Default is 2. .TP -.B debug=off +.B debug=0 Taskwarrior has a debug mode that causes diagnostic output to be displayed. Typically this is not something anyone would want, but when reporting a bug, debug output can be useful. It can also help explain how the command line is @@ -483,7 +485,7 @@ being parsed, but the information is displayed in a developer-friendly, not a user-friendly way. Turning debug on automatically sets debug.hooks=1, debug.parser=1 and debug.tls=2 -if they do not already have assigned values. +if they do not already have assigned values. Defaults to "0". .TP .B debug.hooks=0 @@ -647,8 +649,8 @@ field that is set. Otherwise, they are set to the corresponding values of .RE .TP -.B date.iso=yes -Enables ISO-8601 date support. The default value is "yes". +.B date.iso=1 +Enables ISO-8601 date support. The default value is "1". .TP .B weekstart=Sunday @@ -656,10 +658,10 @@ Determines the day a week starts. Valid values are Sunday or Monday only. The default value is "Sunday". .TP -.B displayweeknumber=yes +.B displayweeknumber=1 Determines if week numbers are displayed when using the "task calendar" command. The week number is dependent on the day a week starts. The default value is -"yes". +"1". .TP .B due=7 @@ -681,9 +683,9 @@ The report to run when displaying the details of tasks with due dates when running the "task calendar" command. The default value is "list". .TP -.B calendar.offset=off -If "on" the first month in the calendar report is effectively changed by the -offset value specified in calendar.offset.value. It defaults to "off". +.B calendar.offset=0 +If "1" the first month in the calendar report is effectively changed by the +offset value specified in calendar.offset.value. It defaults to "0". .TP .B calendar.offset.value=-1 @@ -699,15 +701,15 @@ and no details on the holidays will be displayed. The displaying of holidays is turned off by setting the variable to none. The default value is "none". .TP -.B calendar.legend=yes -Determines whether the calendar legend is displayed. The default value is "yes". +.B calendar.legend=1 +Determines whether the calendar legend is displayed. The default value is "1". .SS JOURNAL ENTRIES .TP -.B journal.time=no -May be yes or no, and determines whether the 'start' and 'stop' commands should -record an annotation when being executed. The default value is "no". The text of +.B journal.time=0 +May be "1" or "0", and determines whether the 'start' and 'stop' commands should +record an annotation when being executed. The default value is "0". The text of the corresponding annotations is controlled by: .TP @@ -721,9 +723,9 @@ The text of the annotation that is recorded when executing the stop command and having set journal.time. .TP -.B journal.info=on +.B journal.info=1 When enabled, this setting causes a change log of each task to be displayed by -the 'info' command. Default value is "on". +the 'info' command. Default value is "1". .SS HOLIDAYS Holidays are entered either directly in the .taskrc file or via an include file @@ -782,22 +784,22 @@ specified, Taskwarrior will only show as many that will fit. .SS DEPENDENCIES .TP -.B dependency.reminder=on +.B dependency.reminder=1 Determines whether dependency chain violations generate reminders. .TP -.B dependency.confirmation=yes +.B dependency.confirmation=1 Determines whether dependency chain repair requires confirmation. .SS COLOR CONTROLS .TP -.B color=on -May be "on" or "off". Determines whether Taskwarrior uses color. When "off", +.B color=1 +May be "1" or "0". Determines whether Taskwarrior uses color. When "0", will use dashes (-----) to underline column headings. .TP -.B fontunderline=on +.B fontunderline=1 Determines if font underlines or ASCII dashes should be used to underline headers, even when color is enabled. .RE @@ -880,12 +882,11 @@ desired. In such cases, use the following option to disable this behaviour: .RE .TP -.B rule.color.merge=yes -Can be "yes" or "no". When "no", disables merging of colors produced by +.B rule.color.merge=1 +Can be "1" or "0". When "0", disables merging of colors produced by different color rules. Use if your color scheme produces unpleasing foreground and background combinations. - See the task-color(5) man pages for color details. .RE @@ -1151,7 +1152,7 @@ The coefficients reflect the relative importance of the various terms in the urgency calculation. These are default values, and may be modified to suit your preferences, but it is important that you carefully consider any modifications. -.B urgency.inherit=off +.B urgency.inherit=0 .RS Not actually a coefficient. When enabled, blocking tasks inherit the highest urgency value found in the tasks they block. This is diff --git a/src/Config.cpp b/src/Config.cpp index 92e9ff146..c82e1b813 100644 --- a/src/Config.cpp +++ b/src/Config.cpp @@ -61,45 +61,45 @@ std::string Config::_defaults = "\n" "# Files\n" "data.location=~/.task\n" - "locking=on # Use file-level locking\n" - "gc=on # Garbage-collect data files - DO NOT CHANGE unless you are sure\n" - "exit.on.missing.db=no # Whether to exit if ~/.task is not found\n" - "hooks=on # Master control switch for hooks\n" + "locking=1 # Use file-level locking\n" + "gc=1 # Garbage-collect data files - DO NOT CHANGE unless you are sure\n" + "exit.on.missing.db=0 # Whether to exit if ~/.task is not found\n" + "hooks=1 # Master control switch for hooks\n" "\n" "# Terminal\n" - "detection=on # Detects terminal width\n" + "detection=1 # Detects terminal width\n" "defaultwidth=80 # Without detection, assumed width\n" "defaultheight=24 # Without detection, assumed height\n" - "avoidlastcolumn=no # Fixes Cygwin width problem\n" - "hyphenate=on # Hyphenates lines wrapped on non-word-breaks\n" + "avoidlastcolumn=0 # Fixes Cygwin width problem\n" + "hyphenate=1 # Hyphenates lines wrapped on non-word-breaks\n" "#editor=vi # Preferred text editor\n" "reserved.lines=1 # Assume a 1-line prompt\n" "\n" "# Miscellaneous\n" "# # Comma-separated list. May contain any subset of:\n" "verbose=blank,header,footnote,label,new-id,new-uuid,affected,edit,special,project,sync,unwait,recur\n" - "confirmation=yes # Confirmation on delete, big changes\n" - "recurrence=yes # Enable recurrence\n" + "confirmation=1 # Confirmation on delete, big changes\n" + "recurrence=1 # Enable recurrence\n" "recurrence.confirmation=prompt # Confirmation for propagating changes among recurring tasks (yes/no/prompt)\n" - "allow.empty.filter=yes # An empty filter gets a warning and requires confirmation\n" + "allow.empty.filter=1 # An empty filter gets a warning and requires confirmation\n" "indent.annotation=2 # Indent spaces for annotations\n" "indent.report=0 # Indent spaces for whole report\n" "row.padding=0 # Left and right padding for each row of report\n" "column.padding=1 # Spaces between each column in a report\n" "bulk=3 # 3 or more tasks considered a bulk change and is confirmed\n" "nag=You have more urgent tasks. # Nag message to keep you honest\n" // TODO - "search.case.sensitive=yes # Setting to no allows case insensitive searches\n" + "search.case.sensitive=1 # Setting to no allows case insensitive searches\n" "active.indicator=* # What to show as an active task indicator\n" "tag.indicator=+ # What to show as a tag indicator\n" "dependency.indicator=D # What to show as a dependency indicator\n" "recurrence.indicator=R # What to show as a task recurrence indicator\n" "recurrence.limit=1 # Number of future recurring pending tasks\n" "undo.style=side # Undo style - can be 'side', or 'diff'\n" - "regex=yes # Assume all search/filter strings are regexes\n" - "xterm.title=no # Sets xterm title for some commands\n" + "regex=1 # Assume all search/filter strings are regexes\n" + "xterm.title=0 # Sets xterm title for some commands\n" "expressions=infix # Prefer infix over postfix expressions\n" - "json.array=on # Enclose JSON output in [ ]\n" - "json.depends.array=off # Encode dependencies as a JSON array\n" + "json.array=1 # Enclose JSON output in [ ]\n" + "json.depends.array=0 # Encode dependencies as a JSON array\n" "abbreviation.minimum=2 # Shortest allowed abbreviation\n" "\n" "# Dates\n" @@ -109,31 +109,31 @@ std::string Config::_defaults = "dateformat.info=Y-M-D H:N:S # Preferred display date format for information\n" "dateformat.report= # Preferred display date format for reports\n" "dateformat.annotation= # Preferred display date format for annotations\n" - "date.iso=yes # Enable ISO date support\n" + "date.iso=1 # Enable ISO date support\n" "weekstart=" STRING_DATE_SUNDAY " # Sunday or Monday only\n" - "displayweeknumber=yes # Show week numbers on calendar\n" + "displayweeknumber=1 # Show week numbers on calendar\n" "due=7 # Task is considered due in 7 days\n" "\n" "# Calendar controls\n" - "calendar.legend=yes # Display the legend on calendar\n" + "calendar.legend=1 # Display the legend on calendar\n" "calendar.details=sparse # Calendar shows information for tasks w/due dates: full, sparse or none\n" "calendar.details.report=list # Report to use when showing task information in cal\n" - "calendar.offset=no # Apply an offset value to control the first month of the calendar\n" + "calendar.offset=0 # Apply an offset value to control the first month of the calendar\n" "calendar.offset.value=-1 # The number of months the first month of the calendar is moved\n" "calendar.holidays=none # Show public holidays on calendar:full, sparse or none\n" "#monthsperline=3 # Number of calendar months on a line\n" "\n" "# Journal controls\n" - "journal.time=no # Record start/stop commands as annotation\n" + "journal.time=0 # Record start/stop commands as annotation\n" "journal.time.start.annotation=Started task # Annotation description for the start journal entry\n" "journal.time.stop.annotation=Stopped task # Annotation description for the stop journal entry\n" - "journal.info=on # Display task journal with info command\n" + "journal.info=1 # Display task journal with info command\n" "\n" "# Dependency controls\n" - "dependency.reminder=on # Nags on dependency chain violations\n" - "dependency.confirmation=on # Should dependency chain repair be confirmed?\n" + "dependency.reminder=1 # Nags on dependency chain violations\n" + "dependency.confirmation=1 # Should dependency chain repair be confirmed?\n" "\n" "# Urgency Coefficients\n" "urgency.user.tag.next.coefficient=15.0 # Urgency coefficient for 'next' special tag\n" @@ -147,7 +147,7 @@ std::string Config::_defaults = "urgency.project.coefficient=1.0 # Urgency coefficient for projects\n" "urgency.blocked.coefficient=-5.0 # Urgency coefficient for blocked tasks\n" "urgency.waiting.coefficient=-3.0 # Urgency coefficient for waiting status\n" - "urgency.inherit=off # Recursively inherit highest urgency value from blocked tasks\n" + "urgency.inherit=0 # Recursively inherit highest urgency value from blocked tasks\n" "urgency.age.max=365 # Maximum age in days\n" "\n" "#urgency.user.project.foo.coefficient=5.0 # Urgency coefficients for 'foo' project\n" @@ -155,12 +155,12 @@ std::string Config::_defaults = "#urgency.uda.foo.coefficient=5.0 # Urgency coefficients for UDA 'foo'\n" "\n" "# Color controls.\n" - "color=on # Enable color\n" + "color=1 # Enable color\n" "\n" "rule.precedence.color=deleted,completed,active,keyword.,tag.,project.,overdue,scheduled,due.today,due,blocked,blocking,recurring,tagged,uda.\n" "\n" "# General decoration\n" - "rule.color.merge=yes\n" + "rule.color.merge=1\n" "color.label=\n" "color.label.sort=\n" "color.alternate=on gray2\n" @@ -249,23 +249,23 @@ std::string Config::_defaults = "#default.due=eom # Default due date for 'add' command\n" "default.command=next # When no arguments are specified\n" "\n" - "_forcecolor=no # Forces color to be on, even for non TTY output\n" - "complete.all.tags=no # Include old tag names in '_ags' command\n" - "list.all.projects=no # Include old project names in 'projects' command\n" - "summary.all.projects=no # Include old project names in 'summary' command\n" - "list.all.tags=no # Include old tag names in 'tags' command\n" - "print.empty.columns=no # Print columns which have no data for any task\n" - "debug=no # Display diagnostics\n" - "sugar=yes # Syntactic sugar\n" - "obfuscate=no # Obfuscate data for error reporting\n" - "fontunderline=yes # Uses underlines rather than -------\n" + "_forcecolor=0 # Forces color to be on, even for non TTY output\n" + "complete.all.tags=0 # Include old tag names in '_ags' command\n" + "list.all.projects=0 # Include old project names in 'projects' command\n" + "summary.all.projects=0 # Include old project names in 'summary' command\n" + "list.all.tags=0 # Include old tag names in 'tags' command\n" + "print.empty.columns=0 # Print columns which have no data for any task\n" + "debug=0 # Display diagnostics\n" + "sugar=1 # Syntactic sugar\n" + "obfuscate=0 # Obfuscate data for error reporting\n" + "fontunderline=1 # Uses underlines rather than -------\n" "\n" "# WARNING: Please read the documentation (man task-sync) before setting up\n" "# Taskwarrior for Taskserver synchronization.\n" - "#taskd.ca \n" - "#taskd.certificate \n" - "#taskd.credentials //\n" - "#taskd.server :\n" + "#taskd.ca=\n" + "#taskd.certificate=\n" + "#taskd.credentials=//\n" + "#taskd.server=:\n" "taskd.trust=strict\n" "#taskd.trust=ignore hostname\n" "#taskd.trust=allow all\n" @@ -594,12 +594,12 @@ bool Config::getBoolean (const std::string& key) { std::string value = Lexer::lowerCase ((*this)[key]); if (value == "t" || // TODO Deprecate - value == "true" || + value == "true" || // TODO Deprecate value == "1" || value == "+" || // TODO Deprecate - value == "y" || - value == "yes" || - value == "on" || + value == "y" || // TODO Deprecate + value == "yes" || // TODO Deprecate + value == "on" || // TODO Deprecate value == "enable" || // TODO Deprecate value == "enabled") // TODO Deprecate return true; From 43e1a2c991b71ebbe10677b65a4d74f8b51efef3 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 4 Sep 2016 16:13:23 -0400 Subject: [PATCH 089/879] Tests: Updated to non-deprecated Boolean values --- test/annotate.t | 4 ++-- test/basetest/task.py | 2 +- test/bulk.t | 34 +++++++++++++++++----------------- test/encoding.t | 2 +- test/enpassant.t | 4 ++-- test/exec.t | 2 +- test/feature.559.t | 2 +- test/feature.default.project.t | 2 +- test/gc.t | 6 +++--- test/hyphenate.t | 4 ++-- test/import.t | 6 +++--- test/project.t | 2 +- test/rc.override.t | 8 ++++---- test/recurrence.t | 6 +++--- test/show.t | 2 +- test/special.t | 2 +- test/start.t | 4 ++-- test/substitute.t | 4 ++-- test/sugar.t | 4 ++-- test/tdb2.t.cpp | 4 ++-- test/urgency.t | 2 +- test/urgency_inherit.t | 6 +++--- test/verbose.t | 2 +- 23 files changed, 57 insertions(+), 57 deletions(-) diff --git a/test/annotate.t b/test/annotate.t index 630397667..1424b8260 100755 --- a/test/annotate.t +++ b/test/annotate.t @@ -81,7 +81,7 @@ class TestAnnotate(TestCase): self.t.config("report.rrr.columns", "id,description") self.t.config("report.rrr.sort", "id+") self.t.config("dateformat", "m/d/Y") - self.t.config("color", "off") + self.t.config("color", "0") code, out, err = self.t("rrr") @@ -154,7 +154,7 @@ class TestAnnotation(TestCase): def setUp(self): """Executed before each test in the class""" self.t = Task() - self.t.config("confirmation", "yes") + self.t.config("confirmation", "1") def test_blank_annotation(self): """Verify blank annotations are prevented""" diff --git a/test/basetest/task.py b/test/basetest/task.py index 35d0af84f..f83bb0358 100644 --- a/test/basetest/task.py +++ b/test/basetest/task.py @@ -72,7 +72,7 @@ class Task(object): def activate_hooks(self): """Enable self.hooks functionality and activate hooks on config """ - self.config("hooks", "on") + self.config("hooks", "1") self.hooks = Hooks(self.datadir) def reset_env(self): diff --git a/test/bulk.t b/test/bulk.t index a6b88d707..38f276e96 100755 --- a/test/bulk.t +++ b/test/bulk.t @@ -47,50 +47,50 @@ class TestBulk(TestCase): self.t("add three") def test_bulk_confirmations_single_confirmation_off(self): - """not bulk delete 1 tasks with confirmation:off deletes it""" + """not bulk delete 1 tasks with confirmation:0 deletes it""" # Test with 1 task. 1 is a special case. - code, out, err = self.t("1 delete rc.confirmation:off") + code, out, err = self.t("1 delete rc.confirmation:0") self.assertNotIn("(yes/no)", out) self.assertNotIn("(yes/no/all/quit)", out) self.assertIn("Deleting task 1", out) def test_bulk_confirmations_single_confirmation_on(self): - """not bulk delete 1 task with confirmation:on and input >y deletes it""" + """not bulk delete 1 task with confirmation:1 and input >y deletes it""" # Test with 1 task. 1 is a special case. - code, out, err = self.t("2 delete rc.confirmation:on", input="y\n") + code, out, err = self.t("2 delete rc.confirmation:1", input="y\n") self.assertIn("(yes/no)", out) self.assertNotIn("(yes/no/all/quit)", out) self.assertIn("Deleting task 2", out) def test_bulk_confirmations_double_confirmation_off(self): - """not bulk delete 2 tasks with confirmation:off deletes them""" + """not bulk delete 2 tasks with confirmation:0 deletes them""" # Test with 2 tasks. 2 is greater than 1 and less than bulk. - code, out, err = self.t("1-2 delete rc.confirmation:off") + code, out, err = self.t("1-2 delete rc.confirmation:0") self.assertNotIn("(yes/no)", out) self.assertNotIn("(yes/no/all/quit)", out) self.assertIn("Deleting task 1", out) self.assertIn("Deleting task 2", out) def test_bulk_confirmations_double_confirmation_on(self): - """not bulk delete 2 tasks with confirmation:on and input >y >y deletes them""" + """not bulk delete 2 tasks with confirmation:1 and input >y >y deletes them""" # Test with 2 tasks. 2 is greater than 1 and less than bulk. - code, out, err = self.t("1-2 delete rc.confirmation:on", input="y\ny\n") + code, out, err = self.t("1-2 delete rc.confirmation:1", input="y\ny\n") self.assertNotIn("(yes/no)", out) self.assertIn("(yes/no/all/quit)", out) self.assertIn("Deleting task 1", out) self.assertIn("Deleting task 2", out) def test_bulk_confirmations_bulk_confirmation_off(self): - """bulk delete 3 tasks with confirmation:off always prompts""" + """bulk delete 3 tasks with confirmation:0 always prompts""" # Test with 3 tasks. 3 is considered bulk. rc.confirmation has no effect on bulk # Delete task 1 'one'? (yes/no/all/quit) --> timeout - code, out, err = self.t.runError("1-3 delete rc.confirmation:off") + code, out, err = self.t.runError("1-3 delete rc.confirmation:0") self.assertNotIn("(yes/no)", out) self.assertIn("(yes/no/all/quit)", out) self.assertNotIn("Deleting task", out) @@ -102,7 +102,7 @@ class TestBulk(TestCase): # Delete task 2 'two'? (yes/no/all/quit) Deleting task 2 'two'. # Delete task 3 'three'? (yes/no/all/quit) Deleting task 3 'three'. # Deleted 3 tasks. - code, out, err = self.t("1-3 delete rc.confirmation:off", input="y\ny\ny\n") + code, out, err = self.t("1-3 delete rc.confirmation:0", input="y\ny\ny\n") self.assertNotIn("(yes/no)", out) self.assertIn("(yes/no/all/quit)", out) self.assertIn("Deleting task 1", out) @@ -113,7 +113,7 @@ class TestBulk(TestCase): """bulk delete 3 tasks with confirmation:on and input >y >y >y deletes them""" # Test with 3 tasks. 3 is considered bulk. rc.confirmation has no effect on bulk - code, out, err = self.t("1-3 delete rc.confirmation:on", input="y\ny\ny\n") + code, out, err = self.t("1-3 delete rc.confirmation:1", input="y\ny\ny\n") self.assertNotIn("(yes/no)", out) self.assertIn("(yes/no/all/quit)", out) self.assertIn("Deleting task 1", out) @@ -124,14 +124,14 @@ class TestBulk(TestCase): """bulk delete >no deletes nothing""" # Test with 1 task, denying delete. - code, out, err = self.t.runError("1 delete rc.confirmation:on", input="n\n") + code, out, err = self.t.runError("1 delete rc.confirmation:1", input="n\n") self.assertIn("(yes/no)", out) self.assertNotIn("(yes/no/all/quit)", out) self.assertNotIn("Deleted task 1", out) self.assertNotIn("Deleting task", out) # Test with 2 tasks, denying delete. - code, out, err = self.t.runError("1-2 delete rc.confirmation:on", input="n\nn\n") + code, out, err = self.t.runError("1-2 delete rc.confirmation:1", input="n\nn\n") self.assertNotIn("(yes/no)", out) self.assertIn("(yes/no/all/quit)", out) self.assertNotIn("Deleted task 1", out) @@ -139,7 +139,7 @@ class TestBulk(TestCase): self.assertNotIn("Deleting task", out) # Test with 3 tasks, denying delete. - code, out, err = self.t.runError("1-3 delete rc.confirmation:on", input="n\nn\nn\n") + code, out, err = self.t.runError("1-3 delete rc.confirmation:1", input="n\nn\nn\n") self.assertNotIn("(yes/no)", out) self.assertIn("(yes/no/all/quit)", out) self.assertNotIn("Deleted task 1", out) @@ -150,7 +150,7 @@ class TestBulk(TestCase): def test_bulk_delete_all_tests(self): """bulk delete >all deletes everything""" - code, out, err = self.t("1-3 delete rc.confirmation:on", input="all\n") + code, out, err = self.t("1-3 delete rc.confirmation:1", input="all\n") self.assertNotIn("(yes/no)", out) self.assertIn("(yes/no/all/quit)", out) self.assertIn("Deleting task 1", out) @@ -161,7 +161,7 @@ class TestBulk(TestCase): def test_bulk_delete_quit_tests(self): """bulk delete >quit deletes nothing""" - code, out, err = self.t.runError("1-3 delete rc.confirmation:on", input="quit\n") + code, out, err = self.t.runError("1-3 delete rc.confirmation:1", input="quit\n") self.assertNotIn("(yes/no)", out) self.assertIn("(yes/no/all/quit)", out) self.assertIn("Deleted 0 tasks", out) diff --git a/test/encoding.t b/test/encoding.t index 94921dcfd..6fa8e84b1 100755 --- a/test/encoding.t +++ b/test/encoding.t @@ -63,7 +63,7 @@ class TestUtf8(TestCase): """Text alignment in reports with wide utf8 characters""" # Originally Bug #455 - Text alignment in reports is broken when text # contains wide utf8 characters - self.t.config("print.empty.columns", "no") + self.t.config("print.empty.columns", "0") self.t(("add", "abc", "pro:Bar\u263a")) self.t("add def pro:Foo") diff --git a/test/enpassant.t b/test/enpassant.t index 9b9923a93..493ef07df 100755 --- a/test/enpassant.t +++ b/test/enpassant.t @@ -40,7 +40,7 @@ class BaseTestEnpassant(TestCase): """Executed before each test in the class""" self.t = Task() # No journal log which may contain the words we are looking for - self.t.config("journal.info", "off") + self.t.config("journal.info", "0") class TestEnpassantMultiple(BaseTestEnpassant): @@ -84,7 +84,7 @@ class TestEnpassant(BaseTestEnpassant): def setUp(self): super(TestEnpassant, self).setUp() - self.t.config("confirmation", "off") + self.t.config("confirmation", "0") self.t("add one") self.t("add two") diff --git a/test/exec.t b/test/exec.t index 1a2772449..9eac88756 100755 --- a/test/exec.t +++ b/test/exec.t @@ -40,7 +40,7 @@ class TestBug1414(TestCase): def setUp(self): self.t = Task() self.t.config("default.command", "exec echo hello") - self.t.config("verbose", "no") + self.t.config("verbose", "0") def test_execute(self): """use execute""" diff --git a/test/feature.559.t b/test/feature.559.t index b248916d0..3b342a013 100755 --- a/test/feature.559.t +++ b/test/feature.559.t @@ -40,7 +40,7 @@ class TestFeature559(TestCase): def setUp(self): self.t = Task() - self.t.config("exit.on.missing.db", "yes") + self.t.config("exit.on.missing.db", "1") # NOTE the framework uses TASKDATA and TASKRC to tell taskwarrior where # data is stored. Since these env variables take precedence over diff --git a/test/feature.default.project.t b/test/feature.default.project.t index f997d1747..b0aca793b 100755 --- a/test/feature.default.project.t +++ b/test/feature.default.project.t @@ -131,7 +131,7 @@ class TestDefaultProject(TestCase): def test_time_default_project(self): """default.project is not applied when start/stop'ing a task""" # Allow keeping track of time spent on task - self.t.config("journal.time", "yes") + self.t.config("journal.time", "1") self.t("add foobar") code, out, err = self.t("1 info") diff --git a/test/gc.t b/test/gc.t index 49d7c2e84..436e174d1 100755 --- a/test/gc.t +++ b/test/gc.t @@ -47,14 +47,14 @@ class TestGC(TestCase): def test_gc_off_id(self): """ID retained when GC off""" - self.t.config("gc", "off") + self.t.config("gc", "0") self.t("1 done") code, out, err = self.t("gctest") self.assertRegexpMatches(out, "1\s+one", "should still have ID") def test_gc_off_mod(self): """mod by ID after done with gc off""" - self.t.config("gc", "off") + self.t.config("gc", "0") self.t("1 done") self.t("gctest") self.t("2 mod +TWO") @@ -63,7 +63,7 @@ class TestGC(TestCase): def test_gc_on_id(self): """IDs reshuffle after report when GC on""" - self.t.config("gc", "on") + self.t.config("gc", "1") self.t("1 done") self.t("2 mod +TWO") code, out, err = self.t("gctest") diff --git a/test/hyphenate.t b/test/hyphenate.t index a62482c98..15dfb4fae 100755 --- a/test/hyphenate.t +++ b/test/hyphenate.t @@ -40,7 +40,7 @@ class TestHyphenation(TestCase): """Executed before each test in the class""" self.t = Task() self.t.config("defaultwidth", "20") - self.t.config("detection", "off") + self.t.config("detection", "0") self.t.config("verbose", "nothing") def test_hyphenation_on_space(self): @@ -63,7 +63,7 @@ class TestBug804(TestCase): def test_hyphenation(self): """Verify hyphenation is controllable""" - self.t.config("print.empty.columns", "yes") + self.t.config("print.empty.columns", "1") self.t.config("report.unittest.labels", "ID,Project,Pri,Description") self.t.config("report.unittest.columns", "id,project,priority,description") self.t.config("report.unittest.filter", "status:pending") diff --git a/test/import.t b/test/import.t index 1318f72a2..311a126ff 100755 --- a/test/import.t +++ b/test/import.t @@ -192,7 +192,7 @@ class TestImport(TestCase): _data = """{"uuid":"a0000000-a000-a000-a000-a00000000000","depends":"a1111111-a111-a111-a111-a11111111111","description":"zero","project":"A","status":"pending","entry":"1234567889"}""" self.t("import", input=self.data1) self.t("import", input=_data) - self.t.config("json.depends.array", "off") + self.t.config("json.depends.array", "0") _t = self.t.export("a0000000-a000-a000-a000-a00000000000")[0] self.assertEqual(_t["depends"], "a1111111-a111-a111-a111-a11111111111") @@ -242,8 +242,8 @@ class TestImportExportRoundtrip(TestCase): self.t2 = Task() for client in (self.t1, self.t2): - client.config("dateformat", "m/d/Y") - client.config("verbose", "off") + client.config("dateformat", "m/d/Y") + client.config("verbose", "0") client.config("defaultwidth", "100") def _validate_data(self, client): diff --git a/test/project.t b/test/project.t index 6bdfcb7ad..12d6aca03 100755 --- a/test/project.t +++ b/test/project.t @@ -397,7 +397,7 @@ class TestBug899(TestCase): def setUp(self): """Executed before each test in the class""" self.t = Task() - self.t.config("verbose", "on") + self.t.config("verbose", "1") def test_log_project(self): """899: Verify task log behaves correctly when logging into a project""" diff --git a/test/rc.override.t b/test/rc.override.t index 38a208590..89d457451 100755 --- a/test/rc.override.t +++ b/test/rc.override.t @@ -40,16 +40,16 @@ class TestOverride(TestCase): def setUp(self): """Executed before each test in the class""" self.t = Task() - self.t.config("regex", "off") + self.t.config("regex", "0") self.t.config("verbose", "nothing") def test_override(self): """Verify override is displayed in 'show' command""" code, out, err = self.t("show regex") - self.assertRegexpMatches(out, r"regex +off") + self.assertRegexpMatches(out, r"regex +0") - code, out, err = self.t("rc.regex:on show regex") - self.assertRegexpMatches(out, r"regex +on") + code, out, err = self.t("rc.regex:1 show regex") + self.assertRegexpMatches(out, r"regex +1") class TestRCSegfault(TestCase): diff --git a/test/recurrence.t b/test/recurrence.t index 7e8fbfc5b..1895df312 100755 --- a/test/recurrence.t +++ b/test/recurrence.t @@ -77,7 +77,7 @@ class TestRecurrenceDisabled(TestCase): disabled. """ - self.t.config("recurrence", "no") + self.t.config("recurrence", "0") self.t("add due:today recur:daily Recurrent task.") # Trigger GC, expect no match and therefore non-zero code @@ -325,7 +325,7 @@ class TestBug955(TestCase): """ # With confirmation:off the first "n\n" has no effect. - self.t.config("confirmation", "off") + self.t.config("confirmation", "0") code, out, err = self.t("2 delete", input="n\ny\n") self.assertIn("Deleting task 2", out) self.assertIn("Deleted 1 task", out) @@ -351,7 +351,7 @@ class TestBug955(TestCase): """ # With confirmation:on the first "n\n" is obeyed. - self.t.config("confirmation", "on") + self.t.config("confirmation", "1") code, out, err = self.t.runError("2 delete", input="n\ny\n") self.assertIn("Deleted 0 tasks.", out) diff --git a/test/show.t b/test/show.t index 1631d3b55..75d831df4 100755 --- a/test/show.t +++ b/test/show.t @@ -80,7 +80,7 @@ class TestShowHelperCommand(TestCase): def test_show_helper_no_arg(self): """Verify _show command lists all with no arg provided""" code, out, err = self.t("_show") - self.assertIn("debug=no\n", out) + self.assertIn("debug=0\n", out) self.assertIn("verbose=", out) diff --git a/test/special.t b/test/special.t index bc5cd5f65..496bd4ce4 100755 --- a/test/special.t +++ b/test/special.t @@ -47,7 +47,7 @@ class TestSpecialTags(TestCase): cls.t.config("color.pri.H", "") cls.t.config("color.completed", "") cls.t.config("nag", "NAG") - cls.t.config("color", "on") + cls.t.config("color", "1") cls.t.config("_forcecolor", "1") def test_nocolor(self): diff --git a/test/start.t b/test/start.t index 63befe283..cb439d0aa 100755 --- a/test/start.t +++ b/test/start.t @@ -69,7 +69,7 @@ class TestStart(TestCase): def test_journal_time(self): """Verify journal.time tracks state""" - self.t.config("journal.time", "on") + self.t.config("journal.time", "1") self.t("add one") self.t("1 start") @@ -82,7 +82,7 @@ class TestStart(TestCase): def test_journal_annotations(self): """Verify journal start/stop annotations are used""" - self.t.config("journal.time", "on") + self.t.config("journal.time", "1") self.t.config("journal.time.start.annotation", "Nu kör vi") self.t.config("journal.time.stop.annotation", "Nu stannar vi") diff --git a/test/substitute.t b/test/substitute.t index 0836ac182..bc527508c 100755 --- a/test/substitute.t +++ b/test/substitute.t @@ -43,7 +43,7 @@ class TestSubstitutions(TestCase): def test_substitution(self): """Verify substitution for task description""" - self.t.config("regex", "off") + self.t.config("regex", "0") self.t("add foo foo foo") self.t("1 modify /foo/FOO/") @@ -78,7 +78,7 @@ class TestSubstitutions(TestCase): def test_substitution_regex(self): """Verify regex substitution for task description""" - self.t.config("regex", "on") + self.t.config("regex", "1") self.t("add aaa bbb") self.t("1 modify /b{3}/BbB/") code, out, err = self.t("_get 1.description") diff --git a/test/sugar.t b/test/sugar.t index 9154baf36..bb7b950ad 100755 --- a/test/sugar.t +++ b/test/sugar.t @@ -50,7 +50,7 @@ class TestSugar(TestCase): self.assertIn("two", out) self.assertNotIn("three", out) - self.t.config("sugar", "off") + self.t.config("sugar", "0") code, out, err = self.t("1 2 count") self.assertEqual(0, int(out)) @@ -64,7 +64,7 @@ class TestSugar(TestCase): self.assertIn("three", out) # sugar off: WYSIWYG parsing. - self.t.config("sugar", "off") + self.t.config("sugar", "0") code, out, err = self.t("3 and '( 2 three )' count") self.assertEqual(0, int(out)) diff --git a/test/tdb2.t.cpp b/test/tdb2.t.cpp index 933a6fe84..afcb6d2af 100644 --- a/test/tdb2.t.cpp +++ b/test/tdb2.t.cpp @@ -52,8 +52,8 @@ int main (int, char**) unlink ("./backlog.data"); // Set the context to allow GC. - context.config.set ("gc", "on"); - context.config.set ("debug", "on"); + context.config.set ("gc", 1); + context.config.set ("debug", 1); context.tdb2.set_location ("."); diff --git a/test/urgency.t b/test/urgency.t index e7e6f7b8d..ae7ab5cf3 100755 --- a/test/urgency.t +++ b/test/urgency.t @@ -54,7 +54,7 @@ class TestUrgency(TestCase): cls.t.config("urgency.user.tag.next.coefficient", "10") cls.t.config("urgency.user.project.PROJECT.coefficient", "10") cls.t.config("urgency.user.tag.TAG.coefficient", "10") - cls.t.config("confirmation", "off") + cls.t.config("confirmation", "0") cls.t("add control") # 1 diff --git a/test/urgency_inherit.t b/test/urgency_inherit.t index 66e3eee77..fe8058d4d 100755 --- a/test/urgency_inherit.t +++ b/test/urgency_inherit.t @@ -62,16 +62,16 @@ class TestUrgencyInherit(TestCase): def test_urgency_inherit_off(self): """No urgency inheritance when switched off""" - self.t.config("urgency.inherit", "off") + self.t.config("urgency.inherit", "0") tl = self.get_tasks() self.assertTrue(tl[1]["urgency"] <= tl[2]["urgency"] < tl[3]["urgency"]) def test_gc_off_mod(self): """Biggest urgency is inherited recursively""" - self.t.config("urgency.inherit", "off") + self.t.config("urgency.inherit", "0") tl = self.get_tasks() oldmax = max(tl[1]["urgency"], tl[2]["urgency"], tl[3]["urgency"]) - self.t.config("urgency.inherit", "on") + self.t.config("urgency.inherit", "1") tl = self.get_tasks() self.assertTrue(oldmax <= tl[3]["urgency"]) self.assertTrue(tl[1]["urgency"] >= tl[2]["urgency"] >= tl[3]["urgency"]) diff --git a/test/verbose.t b/test/verbose.t index eb3607500..27378528d 100755 --- a/test/verbose.t +++ b/test/verbose.t @@ -41,7 +41,7 @@ from basetest import Task, TestCase class TestVerbosity(TestCase): def setUp(self): self.t = Task() - self.t.config("print.empty.columns", "yes") + self.t.config("print.empty.columns", "1") self.t("add Sample") From 1fad357f267d10b56cc28ba89be6a36c87dfe7c0 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Mon, 5 Sep 2016 08:52:17 -0400 Subject: [PATCH 090/879] Docs: Removed old reference to support forums --- INSTALL | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/INSTALL b/INSTALL index 1c6a5e862..0c4ec138c 100644 --- a/INSTALL +++ b/INSTALL @@ -192,8 +192,7 @@ CMake with no reported problems, and the build will fail later. This is almost always because CMake is mistaken about some assumption. If a build does not succeed, please send the contents of the 'CMakeCache.txt' -and 'CMakeFiles/CMakeOutput.log' files to support@taskwarrior.org, or post a -message in the support forums at taskwarrior.org along with the information. +and 'CMakeFiles/CMakeOutput.log' files to support@taskwarrior.org. If CMake runs but Taskwarrior does not build, please send the contents of the above files as well as a transcript from the build, which is not written to a From f04cc0c9e6e185e51634f40b30ac79a16def8b15 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Fri, 9 Sep 2016 21:37:37 -0400 Subject: [PATCH 091/879] Build: Eliminated compiler warning --- src/ISO8601.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ISO8601.cpp b/src/ISO8601.cpp index 8a94621b5..0830c21fd 100644 --- a/src/ISO8601.cpp +++ b/src/ISO8601.cpp @@ -707,9 +707,12 @@ bool ISO8601d::parse_date_time_ext (Nibbler& n) parse_time_ext (n)) { if (n.skip ('Z')) + { _utc = true; + } else if (parse_off_ext (n)) - ; + { + } if (! Lexer::isDigit (n.next ())) return true; From 4f003cdb607b07339acaa1eb3aba61c6f04e0a94 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Fri, 14 Oct 2016 18:58:31 -0400 Subject: [PATCH 092/879] ColDescription: Don't use string literals when character literals are needed --- src/columns/ColDescription.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/columns/ColDescription.cpp b/src/columns/ColDescription.cpp index fdd1eba2e..82e6721fa 100644 --- a/src/columns/ColDescription.cpp +++ b/src/columns/ColDescription.cpp @@ -61,15 +61,15 @@ ColumnDescription::ColumnDescription () std::string a3 = STRING_COLUMN_EXAMPLES_ANNO3; std::string a4 = STRING_COLUMN_EXAMPLES_ANNO4; - _examples = {d + "\n " + t + " " + a1 - + "\n " + t + " " + a2 - + "\n " + t + " " + a3 - + "\n " + t + " " + a4, + _examples = {d + "\n " + t + ' ' + a1 + + "\n " + t + ' ' + a2 + + "\n " + t + ' ' + a3 + + "\n " + t + ' ' + a4, d, - d + " " + t + " " + a1 - + " " + t + " " + a2 - + " " + t + " " + a3 - + " " + t + " " + a4, + d + ' ' + t + ' ' + a1 + + ' ' + t + ' ' + a2 + + ' ' + t + ' ' + a3 + + ' ' + t + ' ' + a4, d.substr (0, 20) + "...", d + " [4]", d.substr (0, 20) + "... [4]"}; From d9b528351caed634ffd162b8d1048b8ff3a0c4d8 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Fri, 14 Oct 2016 19:01:46 -0400 Subject: [PATCH 093/879] ColDue: Removed unused includes --- src/columns/ColDue.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/columns/ColDue.cpp b/src/columns/ColDue.cpp index 1b9b04901..2cf64a79e 100644 --- a/src/columns/ColDue.cpp +++ b/src/columns/ColDue.cpp @@ -26,15 +26,13 @@ #include #include -#include -#include #include //////////////////////////////////////////////////////////////////////////////// ColumnDue::ColumnDue () { - _name = "due"; - _label = STRING_COLUMN_LABEL_DUE; + _name = "due"; + _label = STRING_COLUMN_LABEL_DUE; } //////////////////////////////////////////////////////////////////////////////// From 7ad546504c64e94d09ebef7ff45ab45a1bbe968b Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Fri, 14 Oct 2016 19:02:06 -0400 Subject: [PATCH 094/879] ColIMask: Removed unused includes --- src/columns/ColIMask.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/columns/ColIMask.cpp b/src/columns/ColIMask.cpp index eaf3871af..97ef05143 100644 --- a/src/columns/ColIMask.cpp +++ b/src/columns/ColIMask.cpp @@ -26,7 +26,6 @@ #include #include -#include #include #include From 67d4510e9b4536f6f69f91c23aeb57e939dcfe66 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Fri, 14 Oct 2016 19:02:17 -0400 Subject: [PATCH 095/879] ColMask: Removed unused includes --- src/columns/ColMask.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/columns/ColMask.cpp b/src/columns/ColMask.cpp index 3e8459ebe..a00d7b8a8 100644 --- a/src/columns/ColMask.cpp +++ b/src/columns/ColMask.cpp @@ -26,7 +26,6 @@ #include #include -#include #include #include From b3fe15dc413d77fafa70d30cd6ca12d3ec64ca52 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Fri, 14 Oct 2016 19:02:28 -0400 Subject: [PATCH 096/879] ColParent: Removed unused includes --- src/columns/ColParent.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/columns/ColParent.cpp b/src/columns/ColParent.cpp index ac7c0300b..3d1622c0b 100644 --- a/src/columns/ColParent.cpp +++ b/src/columns/ColParent.cpp @@ -26,7 +26,6 @@ #include #include -#include #include #include From 1ebf75e7d09dd14d1fb6b6665d77d3d35ee16245 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Fri, 14 Oct 2016 19:02:46 -0400 Subject: [PATCH 097/879] ColScheduled: Removed unused includes --- src/columns/ColScheduled.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/columns/ColScheduled.cpp b/src/columns/ColScheduled.cpp index 87cd7f223..bd3beeb13 100644 --- a/src/columns/ColScheduled.cpp +++ b/src/columns/ColScheduled.cpp @@ -26,8 +26,6 @@ #include #include -#include -#include #include //////////////////////////////////////////////////////////////////////////////// From 99a7cfceac7f89fe06d8d8077e090d4f4601bcf8 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Fri, 14 Oct 2016 20:51:19 -0400 Subject: [PATCH 098/879] libshared: Updated to d84d1bc70b14c85af771bb5cc7299c290d5372b5 --- src/libshared | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libshared b/src/libshared index 144d37263..d84d1bc70 160000 --- a/src/libshared +++ b/src/libshared @@ -1 +1 @@ -Subproject commit 144d37263c52aef3e0959e1b891785da3911ece5 +Subproject commit d84d1bc70b14c85af771bb5cc7299c290d5372b5 From 35e518cbc22e1947771f32094561ed7036f78169 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Fri, 14 Oct 2016 22:27:34 -0400 Subject: [PATCH 099/879] Cleanup: Don't use string literals when character literals are needed --- src/CLI2.cpp | 22 +++--- src/Color.cpp | 2 +- src/Config.cpp | 4 +- src/Context.cpp | 42 ++++++------ src/DOM.cpp | 2 +- src/TLSClient.cpp | 2 +- src/Task.cpp | 4 +- src/Timer.cpp | 2 +- src/calc.cpp | 28 ++++---- src/columns/ColDescription.cpp | 4 +- src/commands/CmdAdd.cpp | 8 +-- src/commands/CmdAliases.cpp | 2 +- src/commands/CmdAnnotate.cpp | 2 +- src/commands/CmdAppend.cpp | 2 +- src/commands/CmdAttributes.cpp | 2 +- src/commands/CmdBurndown.cpp | 10 +-- src/commands/CmdCalc.cpp | 4 +- src/commands/CmdCalendar.cpp | 12 ++-- src/commands/CmdColor.cpp | 100 +++++++++++++-------------- src/commands/CmdColumns.cpp | 6 +- src/commands/CmdCommands.cpp | 6 +- src/commands/CmdConfig.cpp | 10 +-- src/commands/CmdContext.cpp | 16 ++--- src/commands/CmdCount.cpp | 2 +- src/commands/CmdCustom.cpp | 2 +- src/commands/CmdDelete.cpp | 4 +- src/commands/CmdDenotate.cpp | 4 +- src/commands/CmdDiagnostics.cpp | 90 ++++++++++++------------- src/commands/CmdDone.cpp | 4 +- src/commands/CmdDuplicate.cpp | 10 +-- src/commands/CmdEdit.cpp | 116 ++++++++++++++++---------------- src/commands/CmdExport.cpp | 4 +- src/commands/CmdGet.cpp | 2 +- src/commands/CmdHelp.cpp | 9 ++- src/commands/CmdHistory.cpp | 30 ++++----- src/commands/CmdIDs.cpp | 18 ++--- src/commands/CmdImport.cpp | 10 +-- src/commands/CmdInfo.cpp | 14 ++-- src/commands/CmdLog.cpp | 2 +- src/commands/CmdLogo.cpp | 2 +- src/commands/CmdModify.cpp | 2 +- src/commands/CmdPrepend.cpp | 2 +- src/commands/CmdProjects.cpp | 8 +-- src/commands/CmdReports.cpp | 2 +- src/commands/CmdShow.cpp | 24 +++---- src/commands/CmdStart.cpp | 4 +- src/commands/CmdStop.cpp | 4 +- src/commands/CmdSummary.cpp | 4 +- src/commands/CmdSync.cpp | 16 ++--- src/commands/CmdTags.cpp | 4 +- src/commands/CmdTimesheet.cpp | 18 ++--- src/commands/CmdUDAs.cpp | 8 +-- src/commands/CmdUnique.cpp | 2 +- src/commands/CmdUrgency.cpp | 2 +- src/commands/CmdVersion.cpp | 20 +++--- src/commands/Command.cpp | 2 +- src/dependency.cpp | 7 +- src/feedback.cpp | 2 +- 58 files changed, 372 insertions(+), 374 deletions(-) diff --git a/src/CLI2.cpp b/src/CLI2.cpp index a6c1305b7..c8a2d06db 100644 --- a/src/CLI2.cpp +++ b/src/CLI2.cpp @@ -213,7 +213,7 @@ const std::string A2::dump () const else tags += "\033[32m" + tag + "\033[0m "; } - return output + " " + atts + tags; + return output + ' ' + atts + tags; } //////////////////////////////////////////////////////////////////////////////// @@ -632,7 +632,7 @@ void CLI2::prepareFilter () if (a.hasTag ("FILTER")) { if (combined != "") - combined += " "; + combined += ' '; combined += a.attribute ("raw"); } @@ -657,7 +657,7 @@ const std::vector CLI2::getWords () Color colorOrigArgs ("gray10 on gray4"); std::string message = " "; for (const auto& word : words) - message += colorOrigArgs.colorize (word) + " "; + message += colorOrigArgs.colorize (word) + ' '; context.debug ("CLI2::getWords" + message); } @@ -737,13 +737,13 @@ const std::string CLI2::dump (const std::string& title) const out << colorFilter.colorize (i->attribute ("raw")); } - out << "\n"; + out << '\n'; if (_args.size ()) { out << " _args\n"; for (const auto& a : _args) - out << " " << a.dump () << "\n"; + out << " " << a.dump () << '\n'; } if (_id_ranges.size ()) @@ -752,21 +752,21 @@ const std::string CLI2::dump (const std::string& title) const for (const auto& range : _id_ranges) { if (range.first != range.second) - out << colorArgs.colorize (range.first + "-" + range.second) << " "; + out << colorArgs.colorize (range.first + "-" + range.second) << ' '; else - out << colorArgs.colorize (range.first) << " "; + out << colorArgs.colorize (range.first) << ' '; } - out << "\n"; + out << '\n'; } if (_uuid_list.size ()) { out << " _uuid_list\n "; for (const auto& uuid : _uuid_list) - out << colorArgs.colorize (uuid) << " "; + out << colorArgs.colorize (uuid) << ' '; - out << "\n"; + out << '\n'; } return out.str (); @@ -1242,7 +1242,7 @@ void CLI2::desugarFilterAttributes () std::vector values = lexExpression (value); if (context.config.getInteger ("debug.parser") >= 2) { - context.debug ("CLI2::lexExpression " + name + ":" + value); + context.debug ("CLI2::lexExpression " + name + ':' + value); for (auto& v : values) context.debug (" " + v.dump ()); context.debug (" "); diff --git a/src/Color.cpp b/src/Color.cpp index 05be8acd0..557fdfea6 100644 --- a/src/Color.cpp +++ b/src/Color.cpp @@ -308,7 +308,7 @@ Color::operator std::string () const if (_value & _COLOR_BRIGHT) description += std::string (description.length () ? " " : "") + "bright"; - description += " " + bg (); + description += ' ' + bg (); } return description; diff --git a/src/Config.cpp b/src/Config.cpp index c82e1b813..3cbe612af 100644 --- a/src/Config.cpp +++ b/src/Config.cpp @@ -489,7 +489,7 @@ void Config::createDefaultRC (const std::string& rc, const std::string& data) std::stringstream contents; contents << "# [Created by " << PACKAGE_STRING - << " " + << ' ' << now.toString ("m/d/Y H:N:S") << "]\n" << _defaults.substr (0, loc + 14) @@ -509,7 +509,7 @@ void Config::createDefaultRC (const std::string& rc, const std::string& data) << "#include " << TASK_RCDIR << "/solarized-dark-256.theme\n" << "#include " << TASK_RCDIR << "/solarized-light-256.theme\n" << "#include " << TASK_RCDIR << "/no-color.theme\n" - << "\n"; + << '\n'; // Write out the new file. if (! File::write (rc, contents.str ())) diff --git a/src/Context.cpp b/src/Context.cpp index 98edcd635..3d8c3e34e 100644 --- a/src/Context.cpp +++ b/src/Context.cpp @@ -273,9 +273,9 @@ int Context::initialize (int argc, const char** argv) { for (auto& d : debugMessages) if (color ()) - std::cerr << colorizeDebug (d) << "\n"; + std::cerr << colorizeDebug (d) << '\n'; else - std::cerr << d << "\n"; + std::cerr << d << '\n'; } // Dump all headers, controlled by 'header' verbosity token. @@ -283,9 +283,9 @@ int Context::initialize (int argc, const char** argv) { for (auto& h : headers) if (color ()) - std::cerr << colorizeHeader (h) << "\n"; + std::cerr << colorizeHeader (h) << '\n'; else - std::cerr << h << "\n"; + std::cerr << h << '\n'; } // Dump all footnotes, controlled by 'footnote' verbosity token. @@ -293,18 +293,18 @@ int Context::initialize (int argc, const char** argv) { for (auto& f : footnotes) if (color ()) - std::cerr << colorizeFootnote (f) << "\n"; + std::cerr << colorizeFootnote (f) << '\n'; else - std::cerr << f << "\n"; + std::cerr << f << '\n'; } // Dump all errors, non-maskable. // Colorized as footnotes. for (auto& e : errors) if (color ()) - std::cerr << colorizeFootnote (e) << "\n"; + std::cerr << colorizeFootnote (e) << '\n'; else - std::cerr << e << "\n"; + std::cerr << e << '\n'; } timer_init.stop (); @@ -329,13 +329,13 @@ int Context::run () std::stringstream s; s << "Perf " << PACKAGE_STRING - << " " + << ' ' #ifdef HAVE_COMMIT << COMMIT #else - << "-" + << '-' #endif - << " " + << ' ' << ISO8601d ().toISO () << " init:" << timer_init.total () @@ -356,7 +356,7 @@ int Context::run () timer_render.total () - timer_hooks.total () << " total:" << timer_total.total () - << "\n"; + << '\n'; debug (s.str ()); } @@ -383,9 +383,9 @@ int Context::run () { for (auto& d : debugMessages) if (color ()) - std::cerr << colorizeDebug (d) << "\n"; + std::cerr << colorizeDebug (d) << '\n'; else - std::cerr << d << "\n"; + std::cerr << d << '\n'; } // Dump all headers, controlled by 'header' verbosity token. @@ -393,9 +393,9 @@ int Context::run () { for (auto& h : headers) if (color ()) - std::cerr << colorizeHeader (h) << "\n"; + std::cerr << colorizeHeader (h) << '\n'; else - std::cerr << h << "\n"; + std::cerr << h << '\n'; } // Dump the report output. @@ -406,18 +406,18 @@ int Context::run () { for (auto& f : footnotes) if (color ()) - std::cerr << colorizeFootnote (f) << "\n"; + std::cerr << colorizeFootnote (f) << '\n'; else - std::cerr << f << "\n"; + std::cerr << f << '\n'; } // Dump all errors, non-maskable. // Colorized as footnotes. for (auto& e : errors) if (color ()) - std::cerr << colorizeError (e) << "\n"; + std::cerr << colorizeError (e) << '\n'; else - std::cerr << e << "\n"; + std::cerr << e << '\n'; return rc; } @@ -819,7 +819,7 @@ void Context::updateXtermTitle () title += a->attribute ("raw"); } - std::cout << "]0;task " << command << " " << title << ""; + std::cout << "]0;task " << command << ' ' << title << ""; } } diff --git a/src/DOM.cpp b/src/DOM.cpp index 43fd96233..f1b06bbd9 100644 --- a/src/DOM.cpp +++ b/src/DOM.cpp @@ -90,7 +90,7 @@ bool getDOM (const std::string& name, Variant& value) for (auto& arg : context.cli2._original_args) { if (commandLine != "") - commandLine += " "; + commandLine += ' '; commandLine += arg.attribute("raw"); } diff --git a/src/TLSClient.cpp b/src/TLSClient.cpp index cb87d1d46..512de5bf1 100644 --- a/src/TLSClient.cpp +++ b/src/TLSClient.cpp @@ -56,7 +56,7 @@ static int verify_certificate_callback (gnutls_session_t); //////////////////////////////////////////////////////////////////////////////// static void gnutls_log_function (int level, const char* message) { - std::cout << "c: " << level << " " << message; + std::cout << "c: " << level << ' ' << message; } //////////////////////////////////////////////////////////////////////////////// diff --git a/src/Task.cpp b/src/Task.cpp index 6a9e10f13..f8a0165b7 100644 --- a/src/Task.cpp +++ b/src/Task.cpp @@ -2144,12 +2144,12 @@ void Task::modify (modType type, bool text_required /* = false */) case modPrepend: context.debug (label + "description <-- '" + text + "' + description"); - set ("description", text + " " + get ("description")); + set ("description", text + ' ' + get ("description")); break; case modAppend: context.debug (label + "description <-- description + '" + text + "'"); - set ("description", get ("description") + " " + text); + set ("description", get ("description") + ' ' + text); break; case modAnnotate: diff --git a/src/Timer.cpp b/src/Timer.cpp index 0455903a5..ed41c55c9 100644 --- a/src/Timer.cpp +++ b/src/Timer.cpp @@ -55,7 +55,7 @@ Timer::~Timer () std::stringstream s; s << "Timer " << _description - << " " + << ' ' << std::setprecision (6) << std::fixed << _total / 1000000.0 diff --git a/src/calc.cpp b/src/calc.cpp index 681f6af00..cf50b8695 100644 --- a/src/calc.cpp +++ b/src/calc.cpp @@ -57,7 +57,7 @@ int main (int argc, char** argv) try { - bool infix = true; + bool infix {true}; // Add a source for constants. Eval e; @@ -69,29 +69,29 @@ int main (int argc, char** argv) for (int i = 1; i < argc; i++) if (!strcmp (argv[i], "-h") || ! strcmp (argv[i], "--help")) { - std::cout << "\n" + std::cout << '\n' << "Usage: " << argv[0] << " [options] ''\n" - << "\n" + << '\n' << "Options:\n" << " -h|--help Display this usage\n" << " -d|--debug Debug mode\n" << " -i|--infix Infix expression (default)\n" << " -p|--postfix Postfix expression\n" - << "\n"; + << '\n'; exit (1); } else if (!strcmp (argv[i], "-v") || !strcmp (argv[i], "--version")) { - std::cout << "\n" + std::cout << '\n' << format (STRING_CMD_VERSION_BUILT, "calc", VERSION) << osName () - << "\n" + << '\n' << STRING_CMD_VERSION_COPY - << "\n" - << "\n" + << '\n' + << '\n' << STRING_CMD_VERSION_MIT - << "\n" - << "\n"; + << '\n' + << '\n'; exit (1); } @@ -102,7 +102,7 @@ int main (int argc, char** argv) else if (!strcmp (argv[i], "-p") || !strcmp (argv[i], "--postfix")) infix = false; else - expression += std::string (argv[i]) + " "; + expression += std::string (argv[i]) + ' '; Variant result; if (infix) @@ -112,16 +112,16 @@ int main (int argc, char** argv) // Show any debug output. for (auto& i : context.debugMessages) - std::cout << i << "\n"; + std::cout << i << '\n'; // Show the result in string form. std::cout << (std::string) result - << "\n"; + << '\n'; } catch (const std::string& error) { - std::cerr << error << "\n"; + std::cerr << error << '\n'; status = -1; } diff --git a/src/columns/ColDescription.cpp b/src/columns/ColDescription.cpp index 82e6721fa..700d71cf3 100644 --- a/src/columns/ColDescription.cpp +++ b/src/columns/ColDescription.cpp @@ -182,7 +182,7 @@ void ColumnDescription::render ( for (const auto& i : annos) { ISO8601d dt (strtol (i.first.substr (11).c_str (), NULL, 10)); - description += "\n" + std::string (_indent, ' ') + dt.toString (_dateformat) + " " + i.second; + description += '\n' + std::string (_indent, ' ') + dt.toString (_dateformat) + ' ' + i.second; } } @@ -213,7 +213,7 @@ void ColumnDescription::render ( for (const auto& i : annos) { ISO8601d dt (strtol (i.first.substr (11).c_str (), NULL, 10)); - description += " " + dt.toString (_dateformat) + " " + i.second; + description += ' ' + dt.toString (_dateformat) + ' ' + i.second; } } diff --git a/src/commands/CmdAdd.cpp b/src/commands/CmdAdd.cpp index bc85dbe03..efca8d798 100644 --- a/src/commands/CmdAdd.cpp +++ b/src/commands/CmdAdd.cpp @@ -63,19 +63,19 @@ int CmdAdd::execute (std::string& output) if (context.verbose ("new-id") && (status == Task::pending || status == Task::waiting)) - output += format (STRING_CMD_ADD_FEEDBACK, task.id) + "\n"; + output += format (STRING_CMD_ADD_FEEDBACK, task.id) + '\n'; else if (context.verbose ("new-id") && status == Task::recurring) - output += format (STRING_CMD_ADD_RECUR, task.id) + "\n"; + output += format (STRING_CMD_ADD_RECUR, task.id) + '\n'; else if (context.verbose ("new-uuid") && status != Task::recurring) - output += format (STRING_CMD_ADD_FEEDBACK, task.get ("uuid")) + "\n"; + output += format (STRING_CMD_ADD_FEEDBACK, task.get ("uuid")) + '\n'; else if (context.verbose ("new-uuid") && status == Task::recurring) - output += format (STRING_CMD_ADD_RECUR, task.get ("uuid")) + "\n"; + output += format (STRING_CMD_ADD_RECUR, task.get ("uuid")) + '\n'; if (context.verbose ("project")) context.footnote (onProjectChange (task)); diff --git a/src/commands/CmdAliases.cpp b/src/commands/CmdAliases.cpp index 75963044b..a46b01bde 100644 --- a/src/commands/CmdAliases.cpp +++ b/src/commands/CmdAliases.cpp @@ -53,7 +53,7 @@ int CmdCompletionAliases::execute (std::string& output) { for (auto& alias : context.config) if (alias.first.substr (0, 6) == "alias.") - output += alias.first.substr (6) + "\n"; + output += alias.first.substr (6) + '\n'; return 0; } diff --git a/src/commands/CmdAnnotate.cpp b/src/commands/CmdAnnotate.cpp index b7e632209..932ee027b 100644 --- a/src/commands/CmdAnnotate.cpp +++ b/src/commands/CmdAnnotate.cpp @@ -118,7 +118,7 @@ int CmdAnnotate::execute (std::string&) } else { - std::cout << STRING_CMD_ANNO_NO << "\n"; + std::cout << STRING_CMD_ANNO_NO << '\n'; rc = 1; if (_permission_quit) break; diff --git a/src/commands/CmdAppend.cpp b/src/commands/CmdAppend.cpp index dbc811e9d..5be95aee9 100644 --- a/src/commands/CmdAppend.cpp +++ b/src/commands/CmdAppend.cpp @@ -118,7 +118,7 @@ int CmdAppend::execute (std::string&) } else { - std::cout << STRING_CMD_APPEND_NO << "\n"; + std::cout << STRING_CMD_APPEND_NO << '\n'; rc = 1; if (_permission_quit) break; diff --git a/src/commands/CmdAttributes.cpp b/src/commands/CmdAttributes.cpp index dfd621090..f83743d31 100644 --- a/src/commands/CmdAttributes.cpp +++ b/src/commands/CmdAttributes.cpp @@ -60,7 +60,7 @@ int CmdZshAttributes::execute (std::string& output) std::stringstream out; for (auto& col : columns) - out << col << ":" << col << "\n"; + out << col << ":" << col << '\n'; output = out.str (); return 0; diff --git a/src/commands/CmdBurndown.cpp b/src/commands/CmdBurndown.cpp index 5151b3712..7fca5be75 100644 --- a/src/commands/CmdBurndown.cpp +++ b/src/commands/CmdBurndown.cpp @@ -405,13 +405,13 @@ std::string Chart::render () if (_graph_height < 5 || // a 4-line graph is essentially unreadable. _graph_width < 2) // A single-bar graph is useless. { - return std::string (STRING_CMD_BURN_TOO_SMALL) + "\n"; + return std::string (STRING_CMD_BURN_TOO_SMALL) + '\n'; } else if (_graph_height > 1000 || // each line is a string allloc _graph_width > 1000) { - return std::string (STRING_CMD_BURN_TOO_LARGE) + "\n"; + return std::string (STRING_CMD_BURN_TOO_LARGE) + '\n'; } if (_max_value == 0) @@ -420,7 +420,7 @@ std::string Chart::render () // Create a grid, folded into a string. _grid = ""; for (int i = 0; i < _height; ++i) - _grid += std::string (_width, ' ') + "\n"; + _grid += std::string (_width, ' ') + '\n'; // Title. std::string full_title; @@ -437,7 +437,7 @@ std::string Chart::render () { if (full_title.length () + 1 + _title.length () < (unsigned) _width) { - full_title += " " + _title; + full_title += ' ' + _title; _grid.replace (LOC (0, (_width - full_title.length ()) / 2), full_title.length (), full_title); } else @@ -494,7 +494,7 @@ std::string Chart::render () _grid.replace (LOC (_height - 5, _max_label + 3 + ((_actual_bars - bar._offset - 1) * 3)), bar._minor_label.length (), bar._minor_label); if (_major_label != bar._major_label) - _grid.replace (LOC (_height - 4, _max_label + 2 + ((_actual_bars - bar._offset - 1) * 3)), bar._major_label.length (), " " + bar._major_label); + _grid.replace (LOC (_height - 4, _max_label + 2 + ((_actual_bars - bar._offset - 1) * 3)), bar._major_label.length (), ' ' + bar._major_label); _major_label = bar._major_label; } diff --git a/src/commands/CmdCalc.cpp b/src/commands/CmdCalc.cpp index 20c50f79c..bd16c6daf 100644 --- a/src/commands/CmdCalc.cpp +++ b/src/commands/CmdCalc.cpp @@ -69,7 +69,7 @@ int CmdCalc::execute (std::string& output) // Compile all the args into one expression. std::string expression; for (auto& word : context.cli2.getWords ()) - expression += word + " "; + expression += word + ' '; // Evaluate according to preference. Variant result; @@ -78,7 +78,7 @@ int CmdCalc::execute (std::string& output) else e.evaluatePostfixExpression (expression, result); - output = (std::string) result + "\n"; + output = (std::string) result + '\n'; return 0; } diff --git a/src/commands/CmdCalendar.cpp b/src/commands/CmdCalendar.cpp index 36a9823ad..f71e6e8c2 100644 --- a/src/commands/CmdCalendar.cpp +++ b/src/commands/CmdCalendar.cpp @@ -225,7 +225,7 @@ int CmdCalendar::execute (std::string& output) int details_mFrom = mFrom; std::stringstream out; - out << "\n"; + out << '\n'; while (yFrom < yTo || (yFrom == yTo && mFrom <= mTo)) { @@ -269,10 +269,10 @@ int CmdCalendar::execute (std::string& output) } } - out << "\n" + out << '\n' << optionalBlankLine () << renderMonths (mFrom, yFrom, today, tasks, monthsPerLine) - << "\n"; + << '\n'; mFrom += monthsPerLine; if (mFrom > 12) @@ -306,9 +306,9 @@ int CmdCalendar::execute (std::string& output) << color_holiday.colorize ("holiday") << ", " << color_weeknumber.colorize ("weeknumber") - << "." + << '.' << optionalBlankLine () - << "\n"; + << '\n'; if (context.config.get ("calendar.details") == "full" || context.config.get ("calendar.holidays") == "full") { @@ -409,7 +409,7 @@ int CmdCalendar::execute (std::string& output) out << optionalBlankLine () << holTable.render () - << "\n"; + << '\n'; } } diff --git a/src/commands/CmdColor.cpp b/src/commands/CmdColor.cpp index 6fe0e3b2e..7262c614c 100644 --- a/src/commands/CmdColor.cpp +++ b/src/commands/CmdColor.cpp @@ -71,7 +71,7 @@ int CmdColor::execute (std::string& output) // use. if (legend) { - out << "\n" << STRING_CMD_COLOR_HERE << "\n"; + out << '\n' << STRING_CMD_COLOR_HERE << '\n'; ViewText view; view.width (context.getWidth ()); @@ -94,7 +94,7 @@ int CmdColor::execute (std::string& output) } out << view.render () - << "\n"; + << '\n'; } // If there is something in the description, then assume that is a color, @@ -112,26 +112,26 @@ int CmdColor::execute (std::string& output) for (auto word = words.begin (); word != words.end (); ++word) { if (word != words.begin ()) - swatch += " "; + swatch += ' '; swatch += *word; } Color sample (swatch); - out << "\n" - << STRING_CMD_COLOR_EXPLANATION << "\n" + out << '\n' + << STRING_CMD_COLOR_EXPLANATION << '\n' << "\n\n" - << STRING_CMD_COLOR_16 << "\n" - << " " << one.colorize ("task color black on bright yellow") << "\n" - << " " << two.colorize ("task color underline cyan on bright blue") << "\n" - << "\n" - << STRING_CMD_COLOR_256 << "\n" - << " " << three.colorize ("task color color214 on color202") << "\n" - << " " << four.colorize ("task color rgb150 on rgb020") << "\n" - << " " << five.colorize ("task color underline grey10 on grey3") << "\n" - << " " << six.colorize ("task color red on color173") << "\n" - << "\n" + << STRING_CMD_COLOR_16 << '\n' + << " " << one.colorize ("task color black on bright yellow") << '\n' + << " " << two.colorize ("task color underline cyan on bright blue") << '\n' + << '\n' + << STRING_CMD_COLOR_256 << '\n' + << " " << three.colorize ("task color color214 on color202") << '\n' + << " " << four.colorize ("task color rgb150 on rgb020") << '\n' + << " " << five.colorize ("task color underline grey10 on grey3") << '\n' + << " " << six.colorize ("task color red on color173") << '\n' + << '\n' << STRING_CMD_COLOR_YOURS << "\n\n" << " " << sample.colorize ("task color " + swatch) << "\n\n"; } @@ -139,41 +139,41 @@ int CmdColor::execute (std::string& output) // Show all supported colors. Possibly show some unsupported ones too. else { - out << "\n" + out << '\n' << STRING_CMD_COLOR_BASIC - << "\n" - << " " << Color::colorize (" black ", "black") - << " " << Color::colorize (" red ", "red") - << " " << Color::colorize (" blue ", "blue") - << " " << Color::colorize (" green ", "green") - << " " << Color::colorize (" magenta ", "magenta") - << " " << Color::colorize (" cyan ", "cyan") - << " " << Color::colorize (" yellow ", "yellow") - << " " << Color::colorize (" white ", "white") - << "\n" - << " " << Color::colorize (" black ", "white on black") - << " " << Color::colorize (" red ", "white on red") - << " " << Color::colorize (" blue ", "white on blue") - << " " << Color::colorize (" green ", "black on green") - << " " << Color::colorize (" magenta ", "black on magenta") - << " " << Color::colorize (" cyan ", "black on cyan") - << " " << Color::colorize (" yellow ", "black on yellow") - << " " << Color::colorize (" white ", "black on white") + << '\n' + << ' ' << Color::colorize (" black ", "black") + << ' ' << Color::colorize (" red ", "red") + << ' ' << Color::colorize (" blue ", "blue") + << ' ' << Color::colorize (" green ", "green") + << ' ' << Color::colorize (" magenta ", "magenta") + << ' ' << Color::colorize (" cyan ", "cyan") + << ' ' << Color::colorize (" yellow ", "yellow") + << ' ' << Color::colorize (" white ", "white") + << '\n' + << ' ' << Color::colorize (" black ", "white on black") + << ' ' << Color::colorize (" red ", "white on red") + << ' ' << Color::colorize (" blue ", "white on blue") + << ' ' << Color::colorize (" green ", "black on green") + << ' ' << Color::colorize (" magenta ", "black on magenta") + << ' ' << Color::colorize (" cyan ", "black on cyan") + << ' ' << Color::colorize (" yellow ", "black on yellow") + << ' ' << Color::colorize (" white ", "black on white") << "\n\n"; out << STRING_CMD_COLOR_EFFECTS - << "\n" - << " " << Color::colorize (" red ", "red") - << " " << Color::colorize (" bold red ", "bold red") - << " " << Color::colorize (" underline on blue ", "underline on blue") - << " " << Color::colorize (" on green ", "black on green") - << " " << Color::colorize (" on bright green ", "black on bright green") - << " " << Color::colorize (" inverse ", "inverse") + << '\n' + << ' ' << Color::colorize (" red ", "red") + << ' ' << Color::colorize (" bold red ", "bold red") + << ' ' << Color::colorize (" underline on blue ", "underline on blue") + << ' ' << Color::colorize (" on green ", "black on green") + << ' ' << Color::colorize (" on bright green ", "black on bright green") + << ' ' << Color::colorize (" inverse ", "inverse") << "\n\n"; // 16 system colors. out << "color0 - color15" - << "\n" + << '\n' << " 0 1 2 . . .\n"; for (int r = 0; r < 2; ++r) { @@ -185,7 +185,7 @@ int CmdColor::execute (std::string& output) out << Color::colorize (" ", s.str ()); } - out << "\n"; + out << '\n'; } out << " . . . 15\n\n"; @@ -200,21 +200,21 @@ int CmdColor::execute (std::string& output) << Color::colorize ("5", "bold green") << Color::colorize ("5", "bold blue") << " (also color16 - color231)" - << "\n" + << '\n' << " " << Color::colorize ("0 " "1 " "2 " "3 " "4 " "5", "bold red") - << "\n" + << '\n' << " " << Color::colorize ("0 1 2 3 4 5 " "0 1 2 3 4 5 " "0 1 2 3 4 5 " "0 1 2 3 4 5 " "0 1 2 3 4 5 " "0 1 2 3 4 5", "bold blue") - << "\n"; + << '\n'; char label [12]; for (int g = 0; g < 6; ++g) @@ -230,13 +230,13 @@ int CmdColor::execute (std::string& output) out << Color::colorize (" ", s.str ()); } - out << " "; + out << ' '; } - out << "\n"; + out << '\n'; } - out << "\n"; + out << '\n'; // Grey ramp. out << STRING_CMD_COLOR_RAMP @@ -257,7 +257,7 @@ int CmdColor::execute (std::string& output) } else { - out << STRING_CMD_COLOR_OFF << "\n"; + out << STRING_CMD_COLOR_OFF << '\n'; rc = 1; } diff --git a/src/commands/CmdColumns.cpp b/src/commands/CmdColumns.cpp index 759c4ed17..3696bb802 100644 --- a/src/commands/CmdColumns.cpp +++ b/src/commands/CmdColumns.cpp @@ -119,9 +119,9 @@ int CmdColumns::execute (std::string& output) output = optionalBlankLine () + formats.render () - + "\n" + + '\n' + STRING_CMD_COLUMNS_NOTE - + "\n"; + + '\n'; return 0; } @@ -154,7 +154,7 @@ int CmdCompletionColumns::execute (std::string& output) // Render only the column names. for (auto& name : names) - output += name + "\n"; + output += name + '\n'; return 0; } diff --git a/src/commands/CmdCommands.cpp b/src/commands/CmdCommands.cpp index 9875481a8..cb6a51dc7 100644 --- a/src/commands/CmdCommands.cpp +++ b/src/commands/CmdCommands.cpp @@ -119,7 +119,7 @@ int CmdCommands::execute (std::string& output) output = optionalBlankLine () + view.render () + optionalBlankLine () - + "\n"; + + '\n'; return 0; } @@ -154,7 +154,7 @@ int CmdCompletionCommands::execute (std::string& output) std::stringstream out; for (auto& c : commands) - out << c << "\n"; + out << c << '\n'; output = out.str (); return 0; @@ -226,7 +226,7 @@ int CmdZshCommands::execute (std::string& output) for (auto& zc : commands) out << zc._command << ":" << Command::categoryNames.at (zc._category) << ":" - << zc._description << "\n"; + << zc._description << '\n'; output = out.str (); return 0; diff --git a/src/commands/CmdConfig.cpp b/src/commands/CmdConfig.cpp index 8f9a6f8f4..932cc7136 100644 --- a/src/commands/CmdConfig.cpp +++ b/src/commands/CmdConfig.cpp @@ -77,7 +77,7 @@ bool CmdConfig::setConfigVariable (std::string name, std::string value, bool con confirm (format (STRING_CMD_CONFIG_CONFIRM, name, context.config.get (name), value))) { if (comment != std::string::npos) - line = name + "=" + json::encode (value) + " " + line.substr (comment); + line = name + "=" + json::encode (value) + ' ' + line.substr (comment); else line = name + "=" + json::encode (value); @@ -178,7 +178,7 @@ int CmdConfig::execute (std::string& output) for (unsigned int i = 1; i < words.size (); ++i) { if (i > 1) - value += " "; + value += ' '; value += words[i]; } @@ -214,10 +214,10 @@ int CmdConfig::execute (std::string& output) { out << format (STRING_CMD_CONFIG_FILE_MOD, context.config._original_file._data) - << "\n"; + << '\n'; } else - out << STRING_CMD_CONFIG_NO_CHANGE << "\n"; + out << STRING_CMD_CONFIG_NO_CHANGE << '\n'; } else throw std::string (STRING_CMD_CONFIG_NO_NAME); @@ -254,7 +254,7 @@ int CmdCompletionConfig::execute (std::string& output) std::sort (configs.begin (), configs.end ()); for (auto& config : configs) - output += config + "\n"; + output += config + '\n'; return 0; } diff --git a/src/commands/CmdContext.cpp b/src/commands/CmdContext.cpp index e507f4036..eae0dbdd1 100644 --- a/src/commands/CmdContext.cpp +++ b/src/commands/CmdContext.cpp @@ -94,7 +94,7 @@ std::string CmdContext::joinWords (const std::vector & words, unsig for (unsigned int i = from; i < to; ++i) { if (i > from) - value += " "; + value += ' '; value += words[i]; } @@ -163,7 +163,7 @@ void CmdContext::defineContext (const std::vector & words, std::str if (!success) throw format (STRING_CMD_CONTEXT_DEF_FAIL, words[1]); - out << format (STRING_CMD_CONTEXT_DEF_SUCC, words[1]) << "\n"; + out << format (STRING_CMD_CONTEXT_DEF_SUCC, words[1]) << '\n'; } else throw std::string (STRING_CMD_CONTEXT_DEF_USAG); @@ -197,7 +197,7 @@ void CmdContext::deleteContext (const std::vector & words, std::str if (rc != 0) throw format (STRING_CMD_CONTEXT_DEL_FAIL, words[1]); - out << format (STRING_CMD_CONTEXT_DEL_SUCC, words[1]) << "\n"; + out << format (STRING_CMD_CONTEXT_DEL_SUCC, words[1]) << '\n'; } else throw std::string(STRING_CMD_CONTEXT_DEL_USAG); @@ -279,7 +279,7 @@ void CmdContext::setContext (const std::vector & words, std::string if (! success) throw format (STRING_CMD_CONTEXT_SET_FAIL, value); - out << format (STRING_CMD_CONTEXT_SET_SUCC, value) << "\n"; + out << format (STRING_CMD_CONTEXT_SET_SUCC, value) << '\n'; } //////////////////////////////////////////////////////////////////////////////// @@ -295,11 +295,11 @@ void CmdContext::showContext (std::stringstream& out) auto currentContext = context.config.get ("context"); if (currentContext == "") - out << STRING_CMD_CONTEXT_SHOW_EMPT << "\n"; + out << STRING_CMD_CONTEXT_SHOW_EMPT << '\n'; else { std::string currentFilter = context.config.get ("context." + currentContext); - out << format (STRING_CMD_CONTEXT_SHOW, currentContext, currentFilter) << "\n"; + out << format (STRING_CMD_CONTEXT_SHOW, currentContext, currentFilter) << '\n'; } } @@ -318,7 +318,7 @@ void CmdContext::unsetContext (std::stringstream& out) if (CmdConfig::unsetConfigVariable ("context", false)) throw std::string(STRING_CMD_CONTEXT_NON_FAIL); - out << STRING_CMD_CONTEXT_NON_SUCC << "\n"; + out << STRING_CMD_CONTEXT_NON_SUCC << '\n'; } //////////////////////////////////////////////////////////////////////////////// @@ -341,7 +341,7 @@ CmdCompletionContext::CmdCompletionContext () int CmdCompletionContext::execute (std::string& output) { for (auto& contet : CmdContext::getContexts ()) - output += contet + "\n"; + output += contet + '\n'; return 0; } diff --git a/src/commands/CmdCount.cpp b/src/commands/CmdCount.cpp index 275c8230f..a9e5d2043 100644 --- a/src/commands/CmdCount.cpp +++ b/src/commands/CmdCount.cpp @@ -62,7 +62,7 @@ int CmdCount::execute (std::string& output) if (task.getStatus () != Task::recurring) ++count; - output = format (count) + "\n"; + output = format (count) + '\n'; return 0; } diff --git a/src/commands/CmdCustom.cpp b/src/commands/CmdCustom.cpp index 6e55fcf0b..1c78dd2ca 100644 --- a/src/commands/CmdCustom.cpp +++ b/src/commands/CmdCustom.cpp @@ -225,7 +225,7 @@ int CmdCustom::execute (std::string& output) out << ", " << format (STRING_CMD_CUSTOM_TRUNCATED, maxlines - table_header); - out << "\n"; + out << '\n'; } } else diff --git a/src/commands/CmdDelete.cpp b/src/commands/CmdDelete.cpp index a67ecbdde..1697483b8 100644 --- a/src/commands/CmdDelete.cpp +++ b/src/commands/CmdDelete.cpp @@ -159,7 +159,7 @@ int CmdDelete::execute (std::string&) } else { - std::cout << STRING_CMD_DELETE_NO << "\n"; + std::cout << STRING_CMD_DELETE_NO << '\n'; rc = 1; if (_permission_quit) break; @@ -170,7 +170,7 @@ int CmdDelete::execute (std::string&) std::cout << format (STRING_CMD_DELETE_NOT_DEL, task.identifier (true), task.get ("description")) - << "\n"; + << '\n'; rc = 1; } } diff --git a/src/commands/CmdDenotate.cpp b/src/commands/CmdDenotate.cpp index f84c01ce5..1f958f8fa 100644 --- a/src/commands/CmdDenotate.cpp +++ b/src/commands/CmdDenotate.cpp @@ -140,7 +140,7 @@ int CmdDenotate::execute (std::string&) } else { - std::cout << STRING_CMD_DENO_NO << "\n"; + std::cout << STRING_CMD_DENO_NO << '\n'; rc = 1; if (_permission_quit) break; @@ -148,7 +148,7 @@ int CmdDenotate::execute (std::string&) } else { - std::cout << format (STRING_CMD_DENO_NOMATCH, pattern) << "\n"; + std::cout << format (STRING_CMD_DENO_NOMATCH, pattern) << '\n'; rc = 1; } } diff --git a/src/commands/CmdDiagnostics.cpp b/src/commands/CmdDiagnostics.cpp index a71fa5190..80ce794d5 100644 --- a/src/commands/CmdDiagnostics.cpp +++ b/src/commands/CmdDiagnostics.cpp @@ -75,19 +75,19 @@ int CmdDiagnostics::execute (std::string& output) bold = Color ("bold"); std::stringstream out; - out << "\n" + out << '\n' << bold.colorize (PACKAGE_STRING) - << "\n"; + << '\n'; out << " " << STRING_CMD_DIAG_PLATFORM << ": " << osName () << "\n\n"; // Compiler. out << bold.colorize (STRING_CMD_DIAG_COMPILER) - << "\n" + << '\n' #ifdef __VERSION__ << " " << STRING_CMD_DIAG_VERSION << ": " - << __VERSION__ << "\n" + << __VERSION__ << '\n' #endif << " " << STRING_CMD_DIAG_CAPS << ":" #ifdef __STDC__ @@ -116,7 +116,7 @@ int CmdDiagnostics::execute (std::string& output) << " +l" << 8 * sizeof (long) << " +vp" << 8 * sizeof (void*) << " +time_t" << 8 * sizeof (time_t) - << "\n"; + << '\n'; // Compiler compliance level. std::string compliance = "non-compliant"; @@ -129,20 +129,20 @@ int CmdDiagnostics::execute (std::string& output) else compliance = format (level); #endif - out << " " << STRING_CMD_DIAG_COMPLIANCE + out << ' ' << STRING_CMD_DIAG_COMPLIANCE << ": " << compliance << "\n\n"; out << bold.colorize (STRING_CMD_DIAG_FEATURES) - << "\n" + << '\n' // Build date. - << " " << STRING_CMD_DIAG_BUILT << ": " << __DATE__ << " " << __TIME__ << "\n" + << " " << STRING_CMD_DIAG_BUILT << ": " << __DATE__ << ' ' << __TIME__ << '\n' #ifdef HAVE_COMMIT - << " " << STRING_CMD_DIAG_COMMIT << ": " << COMMIT << "\n" + << " " << STRING_CMD_DIAG_COMMIT << ": " << COMMIT << '\n' #endif - << " CMake: " << CMAKE_VERSION << "\n"; + << " CMake: " << CMAKE_VERSION << '\n'; out << " libuuid: " #ifdef HAVE_UUID_UNPARSE_LOWER @@ -150,7 +150,7 @@ int CmdDiagnostics::execute (std::string& output) #else << "libuuid, no uuid_unparse_lower" #endif - << "\n"; + << '\n'; out << " libgnutls: " #ifdef HAVE_LIBGNUTLS @@ -162,7 +162,7 @@ int CmdDiagnostics::execute (std::string& output) #else << "n/a" #endif - << "\n"; + << '\n'; out << " Build type: " #ifdef CMAKE_BUILD_TYPE @@ -174,20 +174,20 @@ int CmdDiagnostics::execute (std::string& output) // Config: .taskrc found, readable, writable out << bold.colorize (STRING_CMD_DIAG_CONFIG) - << "\n" - << " File: " << context.config._original_file._data << " " + << '\n' + << " File: " << context.config._original_file._data << ' ' << (context.config._original_file.exists () ? STRING_CMD_DIAG_FOUND : STRING_CMD_DIAG_MISSING) - << ", " << context.config._original_file.size () << " " << "bytes" + << ", " << context.config._original_file.size () << ' ' << "bytes" << ", mode " << std::setbase (8) << context.config._original_file.mode () - << "\n"; + << '\n'; // Config: data.location found, readable, writable File location (context.config.get ("data.location")); - out << " Data: " << location._data << " " + out << " Data: " << location._data << ' ' << (location.exists () ? STRING_CMD_DIAG_FOUND : STRING_CMD_DIAG_MISSING) @@ -195,44 +195,44 @@ int CmdDiagnostics::execute (std::string& output) << ", mode " << std::setbase (8) << location.mode () - << "\n"; + << '\n'; char* env = getenv ("TASKRC"); if (env) out << " TASKRC: " << env - << "\n"; + << '\n'; env = getenv ("TASKDATA"); if (env) out << " TASKDATA: " << env - << "\n"; + << '\n'; out << " Locking: " << (context.config.getBoolean ("locking") ? STRING_CMD_DIAG_ENABLED : STRING_CMD_DIAG_DISABLED) - << "\n"; + << '\n'; out << " GC: " << (context.config.getBoolean ("gc") ? STRING_CMD_DIAG_ENABLED : STRING_CMD_DIAG_DISABLED) - << "\n"; + << '\n'; // Determine rc.editor/$EDITOR/$VISUAL. char* peditor; if (context.config.get ("editor") != "") - out << " rc.editor: " << context.config.get ("editor") << "\n"; + out << " rc.editor: " << context.config.get ("editor") << '\n'; else if ((peditor = getenv ("VISUAL")) != NULL) - out << " $VISUAL: " << peditor << "\n"; + out << " $VISUAL: " << peditor << '\n'; else if ((peditor = getenv ("EDITOR")) != NULL) - out << " $EDITOR: " << peditor << "\n"; + out << " $EDITOR: " << peditor << '\n'; out << " Server: " << context.config.get ("taskd.server") - << "\n"; + << '\n'; if (context.config.get ("taskd.ca") != "") out << " CA: " @@ -246,7 +246,7 @@ int CmdDiagnostics::execute (std::string& output) if (trust_value == "strict" || trust_value == "ignore hostname" || trust_value == "allow all") - out << " Trust: " << trust_value << "\n"; + out << " Trust: " << trust_value << '\n'; else out << " Trust: Bad value - see 'man taskrc'\n"; @@ -266,7 +266,7 @@ int CmdDiagnostics::execute (std::string& output) out << " Ciphers: " << context.config.get ("taskd.ciphers") - << "\n"; + << '\n'; // Get credentials, but mask out the key. std::string credentials = context.config.get ("taskd.credentials"); @@ -285,13 +285,13 @@ int CmdDiagnostics::execute (std::string& output) hookLocation += "hooks"; out << bold.colorize (STRING_CMD_DIAG_HOOKS) - << "\n" + << '\n' << " System: " << (context.config.getBoolean ("hooks") ? STRING_CMD_DIAG_HOOK_ENABLE : STRING_CMD_DIAG_HOOK_DISABLE) - << "\n" + << '\n' << " Location: " << static_cast (hookLocation) - << "\n"; + << '\n'; auto hooks = context.hooks.list (); if (hooks.size ()) @@ -323,13 +323,13 @@ int CmdDiagnostics::execute (std::string& output) out << std::left << name << format (" ({1})", STRING_CMD_DIAG_HOOK_EXEC) << (p.is_link () ? format (" ({1})", STRING_CMD_DIAG_HOOK_SYMLINK) : "") - << "\n"; + << '\n'; } } } if (! count) - out << "\n"; + out << '\n'; out << " Inactive: "; count = 0; @@ -356,22 +356,22 @@ int CmdDiagnostics::execute (std::string& output) name.substr (0, 9) == "on-modify" || name.substr (0, 9) == "on-launch" || name.substr (0, 7) == "on-exit") ? "" : format (" ({1})", STRING_CMD_DIAG_HOOK_NAME)) - << "\n"; + << '\n'; } } } if (! count) - out << "\n"; + out << '\n'; } else out << format (" ({1})\n", STRING_CMD_DIAG_NONE); - out << "\n"; + out << '\n'; // Verify UUIDs are all unique. out << bold.colorize (STRING_CMD_DIAG_TESTS) - << "\n"; + << '\n'; // Determine terminal details. const char* term = getenv ("TERM"); @@ -399,17 +399,17 @@ int CmdDiagnostics::execute (std::string& output) out << " Dups: " << format (STRING_CMD_DIAG_UUID_SCAN, all.size ()) - << "\n"; + << '\n'; if (dups.size ()) { for (auto& d : dups) - out << " " << format (STRING_CMD_DIAG_UUID_DUP, d) << "\n"; + out << " " << format (STRING_CMD_DIAG_UUID_DUP, d) << '\n'; } else { out << " " << STRING_CMD_DIAG_UUID_NO_DUP - << "\n"; + << '\n'; } @@ -418,7 +418,7 @@ int CmdDiagnostics::execute (std::string& output) bool noBrokenRefs = true; out << " Broken ref: " << format (STRING_CMD_DIAG_REF_SCAN, all.size ()) - << "\n"; + << '\n'; for (auto& task : all) { @@ -432,7 +432,7 @@ int CmdDiagnostics::execute (std::string& output) { out << " " << format (STRING_CMD_DIAG_MISS_DEP, task.get ("uuid"), uuid) - << "\n"; + << '\n'; noBrokenRefs = false; } } @@ -444,16 +444,16 @@ int CmdDiagnostics::execute (std::string& output) { out << " " << format (STRING_CMD_DIAG_MISS_PAR, task.get ("uuid"), parentUUID) - << "\n"; + << '\n'; noBrokenRefs = false; } } if (noBrokenRefs) out << " " << STRING_CMD_DIAG_REF_OK - << "\n"; + << '\n'; - out << "\n"; + out << '\n'; output = out.str (); return 0; } diff --git a/src/commands/CmdDone.cpp b/src/commands/CmdDone.cpp index 657949239..253ffb4b4 100644 --- a/src/commands/CmdDone.cpp +++ b/src/commands/CmdDone.cpp @@ -112,7 +112,7 @@ int CmdDone::execute (std::string&) } else { - std::cout << STRING_CMD_DONE_NO << "\n"; + std::cout << STRING_CMD_DONE_NO << '\n'; rc = 1; if (_permission_quit) break; @@ -123,7 +123,7 @@ int CmdDone::execute (std::string&) std::cout << format (STRING_CMD_DONE_NOTPEND, task.identifier (true), task.get ("description")) - << "\n"; + << '\n'; rc = 1; } } diff --git a/src/commands/CmdDuplicate.cpp b/src/commands/CmdDuplicate.cpp index 9f0cc84f7..350dacabc 100644 --- a/src/commands/CmdDuplicate.cpp +++ b/src/commands/CmdDuplicate.cpp @@ -89,7 +89,7 @@ int CmdDuplicate::execute (std::string&) dup.remove ("until"); dup.remove ("imask"); std::cout << format (STRING_CMD_DUPLICATE_NON_REC, task.identifier ()) - << "\n"; + << '\n'; } // When duplicating a parent task, create a new parent task. @@ -97,7 +97,7 @@ int CmdDuplicate::execute (std::string&) { dup.remove ("mask"); std::cout << format (STRING_CMD_DUPLICATE_REC, task.identifier ()) - << "\n"; + << '\n'; } dup.setStatus (Task::pending); // Does not inherit status. @@ -118,18 +118,18 @@ int CmdDuplicate::execute (std::string&) if (context.verbose ("new-id") && (status == Task::pending || status == Task::waiting)) - std::cout << format (STRING_CMD_ADD_FEEDBACK, dup.id) + "\n"; + std::cout << format (STRING_CMD_ADD_FEEDBACK, dup.id) + '\n'; else if (context.verbose ("new-uuid") && status != Task::recurring) - std::cout << format (STRING_CMD_ADD_FEEDBACK, dup.get ("uuid")) + "\n"; + std::cout << format (STRING_CMD_ADD_FEEDBACK, dup.get ("uuid")) + '\n'; if (context.verbose ("project")) projectChanges[task.get ("project")] = onProjectChange (task); } else { - std::cout << STRING_CMD_DUPLICATE_NO << "\n"; + std::cout << STRING_CMD_DUPLICATE_NO << '\n'; rc = 1; if (_permission_quit) break; diff --git a/src/commands/CmdEdit.cpp b/src/commands/CmdEdit.cpp index 82265887a..36d1d8093 100644 --- a/src/commands/CmdEdit.cpp +++ b/src/commands/CmdEdit.cpp @@ -102,7 +102,7 @@ std::string CmdEdit::findValue ( auto found = text.find (name); if (found != std::string::npos) { - auto eol = text.find ("\n", found + 1); + auto eol = text.find ('\n', found + 1); if (eol != std::string::npos) { std::string value = text.substr ( @@ -149,7 +149,7 @@ std::vector CmdEdit::findValues ( found = text.find (name, found + 1); if (found != std::string::npos) { - auto eol = text.find ("\n", found + 1); + auto eol = text.find ('\n', found + 1); if (eol != std::string::npos) { std::string value = text.substr ( @@ -203,30 +203,30 @@ std::string CmdEdit::formatTask (Task task, const std::string& dateformat) bool verbose = context.verbose ("edit"); if (verbose) - before << "# " << STRING_EDIT_HEADER_1 << "\n" - << "# " << STRING_EDIT_HEADER_2 << "\n" - << "# " << STRING_EDIT_HEADER_3 << "\n" - << "# " << STRING_EDIT_HEADER_4 << "\n" - << "# " << STRING_EDIT_HEADER_5 << "\n" - << "# " << STRING_EDIT_HEADER_6 << "\n" + before << "# " << STRING_EDIT_HEADER_1 << '\n' + << "# " << STRING_EDIT_HEADER_2 << '\n' + << "# " << STRING_EDIT_HEADER_3 << '\n' + << "# " << STRING_EDIT_HEADER_4 << '\n' + << "# " << STRING_EDIT_HEADER_5 << '\n' + << "# " << STRING_EDIT_HEADER_6 << '\n' << "#\n" - << "# " << STRING_EDIT_HEADER_7 << "\n" - << "# " << STRING_EDIT_HEADER_8 << "\n" - << "# " << STRING_EDIT_HEADER_9 << "\n" + << "# " << STRING_EDIT_HEADER_7 << '\n' + << "# " << STRING_EDIT_HEADER_8 << '\n' + << "# " << STRING_EDIT_HEADER_9 << '\n' << "#\n" - << "# " << STRING_EDIT_HEADER_10 << "\n" - << "# " << STRING_EDIT_HEADER_11 << "\n" - << "# " << STRING_EDIT_HEADER_12 << "\n" + << "# " << STRING_EDIT_HEADER_10 << '\n' + << "# " << STRING_EDIT_HEADER_11 << '\n' + << "# " << STRING_EDIT_HEADER_12 << '\n' << "#\n"; - before << "# " << STRING_EDIT_TABLE_HEADER_1 << "\n" - << "# " << STRING_EDIT_TABLE_HEADER_2 << "\n" - << "# ID: " << task.id << "\n" - << "# UUID: " << task.get ("uuid") << "\n" - << "# Status: " << Lexer::ucFirst (Task::statusToText (task.getStatus ())) << "\n" - << "# Mask: " << task.get ("mask") << "\n" - << "# iMask: " << task.get ("imask") << "\n" - << " Project: " << task.get ("project") << "\n"; + before << "# " << STRING_EDIT_TABLE_HEADER_1 << '\n' + << "# " << STRING_EDIT_TABLE_HEADER_2 << '\n' + << "# ID: " << task.id << '\n' + << "# UUID: " << task.get ("uuid") << '\n' + << "# Status: " << Lexer::ucFirst (Task::statusToText (task.getStatus ())) << '\n' + << "# Mask: " << task.get ("mask") << '\n' + << "# iMask: " << task.get ("imask") << '\n' + << " Project: " << task.get ("project") << '\n'; std::vector tags; task.getTags (tags); @@ -234,25 +234,25 @@ std::string CmdEdit::formatTask (Task task, const std::string& dateformat) join (allTags, " ", tags); if (verbose) - before << "# " << STRING_EDIT_TAG_SEP << "\n"; + before << "# " << STRING_EDIT_TAG_SEP << '\n'; - before << " Tags: " << allTags << "\n" - << " Description: " << task.get ("description") << "\n" - << " Created: " << formatDate (task, "entry", dateformat) << "\n" - << " Started: " << formatDate (task, "start", dateformat) << "\n" - << " Ended: " << formatDate (task, "end", dateformat) << "\n" - << " Scheduled: " << formatDate (task, "scheduled", dateformat) << "\n" - << " Due: " << formatDate (task, "due", dateformat) << "\n" - << " Until: " << formatDate (task, "until", dateformat) << "\n" - << " Recur: " << task.get ("recur") << "\n" - << " Wait until: " << formatDate (task, "wait", dateformat) << "\n" - << "# Modified: " << formatDate (task, "modified", dateformat) << "\n" - << " Parent: " << task.get ("parent") << "\n"; + before << " Tags: " << allTags << '\n' + << " Description: " << task.get ("description") << '\n' + << " Created: " << formatDate (task, "entry", dateformat) << '\n' + << " Started: " << formatDate (task, "start", dateformat) << '\n' + << " Ended: " << formatDate (task, "end", dateformat) << '\n' + << " Scheduled: " << formatDate (task, "scheduled", dateformat) << '\n' + << " Due: " << formatDate (task, "due", dateformat) << '\n' + << " Until: " << formatDate (task, "until", dateformat) << '\n' + << " Recur: " << task.get ("recur") << '\n' + << " Wait until: " << formatDate (task, "wait", dateformat) << '\n' + << "# Modified: " << formatDate (task, "modified", dateformat) << '\n' + << " Parent: " << task.get ("parent") << '\n'; if (verbose) - before << "# " << STRING_EDIT_HEADER_13 << "\n" - << "# " << STRING_EDIT_HEADER_14 << "\n" - << "# " << STRING_EDIT_HEADER_15 << "\n"; + before << "# " << STRING_EDIT_HEADER_13 << '\n' + << "# " << STRING_EDIT_HEADER_14 << '\n' + << "# " << STRING_EDIT_HEADER_15 << '\n'; std::map annotations; task.getAnnotations (annotations); @@ -260,7 +260,7 @@ std::string CmdEdit::formatTask (Task task, const std::string& dateformat) { ISO8601d dt (strtol (anno.first.substr (11).c_str (), NULL, 10)); before << " Annotation: " << dt.toString (dateformat) - << " -- " << json::encode (anno.second) << "\n"; + << " -- " << json::encode (anno.second) << '\n'; } ISO8601d now; @@ -285,9 +285,9 @@ std::string CmdEdit::formatTask (Task task, const std::string& dateformat) } if (verbose) - before << "# " << STRING_EDIT_DEP_SEP << "\n"; + before << "# " << STRING_EDIT_DEP_SEP << '\n'; - before << " Dependencies: " << allDeps.str () << "\n"; + before << " Dependencies: " << allDeps.str () << '\n'; // UDAs std::vector udas; @@ -297,7 +297,7 @@ std::string CmdEdit::formatTask (Task task, const std::string& dateformat) if (udas.size ()) { - before << "# " << STRING_EDIT_UDA_SEP << "\n"; + before << "# " << STRING_EDIT_UDA_SEP << '\n'; std::sort (udas.begin (), udas.end ()); for (auto& uda : udas) { @@ -307,12 +307,12 @@ std::string CmdEdit::formatTask (Task task, const std::string& dateformat) padding = std::string (pad, ' '); std::string type = context.config.get ("uda." + uda + ".type"); - if (type == "string" || type == "numeric") - before << " UDA " << uda << ": " << padding << task.get (uda) << "\n"; + if (type == "string" || type == "numeric") + before << " UDA " << uda << ": " << padding << task.get (uda) << '\n'; else if (type == "date") - before << " UDA " << uda << ": " << padding << formatDate (task, uda, dateformat) << "\n"; + before << " UDA " << uda << ": " << padding << formatDate (task, uda, dateformat) << '\n'; else if (type == "duration") - before << " UDA " << uda << ": " << padding << formatDuration (task, uda) << "\n"; + before << " UDA " << uda << ": " << padding << formatDuration (task, uda) << '\n'; } } @@ -322,7 +322,7 @@ std::string CmdEdit::formatTask (Task task, const std::string& dateformat) if (orphans.size ()) { - before << "# " << STRING_EDIT_UDA_ORPHAN_SEP << "\n"; + before << "# " << STRING_EDIT_UDA_ORPHAN_SEP << '\n'; std::sort (orphans.begin (), orphans.end ()); for (auto& orphan : orphans) { @@ -331,11 +331,11 @@ std::string CmdEdit::formatTask (Task task, const std::string& dateformat) if (pad > 0) padding = std::string (pad, ' '); - before << " UDA Orphan " << orphan << ": " << padding << task.get (orphan) << "\n"; + before << " UDA Orphan " << orphan << ": " << padding << task.get (orphan) << '\n'; } } - before << "# " << STRING_EDIT_END << "\n"; + before << "# " << STRING_EDIT_END << '\n'; return before.str (); } @@ -633,7 +633,7 @@ void CmdEdit::parseTask (Task& task, const std::string& after, const std::string { found += 14; // Length of "\n Annotation:". - auto eol = after.find ("\n", found + 1); + auto eol = after.find ('\n', found + 1); if (eol != std::string::npos) { std::string value = Lexer::trim (after.substr ( @@ -797,22 +797,22 @@ CmdEdit::editResult CmdEdit::editFile (Task& task) if (editor == "") editor = "vi"; // Complete the command line. - editor += " "; + editor += ' '; editor += "\"" + file.str () + "\""; ARE_THESE_REALLY_HARMFUL: bool changes = false; // No changes made. // Launch the editor. - std::cout << format (STRING_EDIT_LAUNCHING, editor) << "\n"; + std::cout << format (STRING_EDIT_LAUNCHING, editor) << '\n'; int exitcode = system (editor.c_str ()); if (0 == exitcode) - std::cout << STRING_EDIT_COMPLETE << "\n"; + std::cout << STRING_EDIT_COMPLETE << '\n'; else { - std::cout << format (STRING_EDIT_FAILED, exitcode) << "\n"; + std::cout << format (STRING_EDIT_FAILED, exitcode) << '\n'; if (-1 == exitcode) - std::cout << std::strerror (errno) << "\n"; + std::cout << std::strerror (errno) << '\n'; return CmdEdit::editResult::error; } @@ -824,7 +824,7 @@ ARE_THESE_REALLY_HARMFUL: // if changes were made. if (before_orig != after) { - std::cout << STRING_EDIT_CHANGES << "\n"; + std::cout << STRING_EDIT_CHANGES << '\n'; std::string problem = ""; bool oops = false; @@ -841,7 +841,7 @@ ARE_THESE_REALLY_HARMFUL: if (oops) { - std::cerr << STRING_ERROR_PREFIX << problem << "\n"; + std::cerr << STRING_ERROR_PREFIX << problem << '\n'; // Preserve the edits. before = after; @@ -855,7 +855,7 @@ ARE_THESE_REALLY_HARMFUL: } else { - std::cout << STRING_EDIT_NO_CHANGES << "\n"; + std::cout << STRING_EDIT_NO_CHANGES << '\n'; changes = false; } diff --git a/src/commands/CmdExport.cpp b/src/commands/CmdExport.cpp index 2bffb7861..c406bf2b8 100644 --- a/src/commands/CmdExport.cpp +++ b/src/commands/CmdExport.cpp @@ -85,7 +85,7 @@ int CmdExport::execute (std::string& output) { if (json_array) output += ","; - output += "\n"; + output += '\n'; } output += task.composeJSON (true); @@ -96,7 +96,7 @@ int CmdExport::execute (std::string& output) } if (filtered.size ()) - output += "\n"; + output += '\n'; if (json_array) output += "]\n"; diff --git a/src/commands/CmdGet.cpp b/src/commands/CmdGet.cpp index 83e374f33..363574a66 100644 --- a/src/commands/CmdGet.cpp +++ b/src/commands/CmdGet.cpp @@ -91,7 +91,7 @@ int CmdGet::execute (std::string& output) throw std::string (STRING_CMD_GET_NO_DOM); join (output, " ", results); - output += "\n"; + output += '\n'; return 0; } diff --git a/src/commands/CmdHelp.cpp b/src/commands/CmdHelp.cpp index 371c0801a..de0d9af85 100644 --- a/src/commands/CmdHelp.cpp +++ b/src/commands/CmdHelp.cpp @@ -32,7 +32,6 @@ #include #include #include -#include // TODO Remove extern Context context; @@ -57,13 +56,13 @@ int CmdHelp::execute (std::string& output) { auto words = context.cli2.getWords (); if (words.size () == 1 && closeEnough ("usage", words[0])) - output = "\n" + output = '\n' + composeUsage () - + "\n"; + + '\n'; else - output = "\n" + output = '\n' + composeUsage () - + "\n" + + '\n' + STRING_CMD_HELP_TEXT; return 0; diff --git a/src/commands/CmdHistory.cpp b/src/commands/CmdHistory.cpp index bca8a7259..2cec28d86 100644 --- a/src/commands/CmdHistory.cpp +++ b/src/commands/CmdHistory.cpp @@ -174,7 +174,7 @@ int CmdHistoryMonthly::execute (std::string& output) if (view.rows ()) { row = view.addRow (); - view.set (row, 0, " "); + view.set (row, 0, ' '); row = view.addRow (); Color row_color; @@ -192,7 +192,7 @@ int CmdHistoryMonthly::execute (std::string& output) if (view.rows ()) out << optionalBlankLine () << view.render () - << "\n"; + << '\n'; else { context.footnote (STRING_FEEDBACK_NO_TASKS); @@ -354,7 +354,7 @@ int CmdHistoryAnnual::execute (std::string& output) if (view.rows ()) out << optionalBlankLine () << view.render () - << "\n"; + << '\n'; else { context.footnote (STRING_FEEDBACK_NO_TASKS); @@ -498,7 +498,7 @@ int CmdGHistoryMonthly::execute (std::string& output) { aBar = format (addedGroup[i.first]); while (aBar.length () < addedBar) - aBar = " " + aBar; + aBar = ' ' + aBar; } std::string cBar = ""; @@ -506,7 +506,7 @@ int CmdGHistoryMonthly::execute (std::string& output) { cBar = format (completedGroup[i.first]); while (cBar.length () < completedBar) - cBar = " " + cBar; + cBar = ' ' + cBar; } std::string dBar = ""; @@ -514,7 +514,7 @@ int CmdGHistoryMonthly::execute (std::string& output) { dBar = format (deletedGroup[i.first]); while (dBar.length () < deletedBar) - dBar = " " + dBar; + dBar = ' ' + dBar; } bar += std::string (leftOffset - aBar.length (), ' '); @@ -542,7 +542,7 @@ int CmdGHistoryMonthly::execute (std::string& output) { out << optionalBlankLine () << view.render () - << "\n"; + << '\n'; if (context.color ()) out << format (STRING_CMD_HISTORY_LEGEND, @@ -550,10 +550,10 @@ int CmdGHistoryMonthly::execute (std::string& output) color_done.colorize (STRING_CMD_HISTORY_COMP), color_delete.colorize (STRING_CMD_HISTORY_DEL)) << optionalBlankLine () - << "\n"; + << '\n'; else out << STRING_CMD_HISTORY_LEGEND_A - << "\n"; + << '\n'; } else { @@ -696,7 +696,7 @@ int CmdGHistoryAnnual::execute (std::string& output) { aBar = format (addedGroup[i.first]); while (aBar.length () < addedBar) - aBar = " " + aBar; + aBar = ' ' + aBar; } std::string cBar = ""; @@ -704,7 +704,7 @@ int CmdGHistoryAnnual::execute (std::string& output) { cBar = format (completedGroup[i.first]); while (cBar.length () < completedBar) - cBar = " " + cBar; + cBar = ' ' + cBar; } std::string dBar = ""; @@ -712,7 +712,7 @@ int CmdGHistoryAnnual::execute (std::string& output) { dBar = format (deletedGroup[i.first]); while (dBar.length () < deletedBar) - dBar = " " + dBar; + dBar = ' ' + dBar; } bar += std::string (leftOffset - aBar.length (), ' '); @@ -739,7 +739,7 @@ int CmdGHistoryAnnual::execute (std::string& output) { out << optionalBlankLine () << view.render () - << "\n"; + << '\n'; if (context.color ()) out << format (STRING_CMD_HISTORY_LEGEND, @@ -747,10 +747,10 @@ int CmdGHistoryAnnual::execute (std::string& output) color_done.colorize (STRING_CMD_HISTORY_COMP), color_delete.colorize (STRING_CMD_HISTORY_DEL)) << optionalBlankLine () - << "\n"; + << '\n'; else out << STRING_CMD_HISTORY_LEGEND_A - << "\n"; + << '\n'; } else { diff --git a/src/commands/CmdIDs.cpp b/src/commands/CmdIDs.cpp index b8cc6021a..abb84eecd 100644 --- a/src/commands/CmdIDs.cpp +++ b/src/commands/CmdIDs.cpp @@ -70,7 +70,7 @@ int CmdIDs::execute (std::string& output) ids.push_back (task.id); std::sort (ids.begin (), ids.end ()); - output = compressIds (ids) + "\n"; + output = compressIds (ids) + '\n'; context.headers.clear (); return 0; @@ -100,7 +100,7 @@ std::string CmdIDs::compressIds (const std::vector & ids) if (i + 1 == ids.size ()) { if (result.str ().length ()) - result << " "; + result << ' '; if (range_start < range_end) result << ids[range_start] << "-" << ids[range_end]; @@ -116,7 +116,7 @@ std::string CmdIDs::compressIds (const std::vector & ids) else { if (result.str ().length ()) - result << " "; + result << ' '; if (range_start < range_end) result << ids[range_start] << "-" << ids[range_end]; @@ -164,7 +164,7 @@ int CmdCompletionIds::execute (std::string& output) std::sort (ids.begin (), ids.end ()); join (output, "\n", ids); - output += "\n"; + output += '\n'; context.headers.clear (); return 0; @@ -200,9 +200,9 @@ int CmdZshCompletionIds::execute (std::string& output) if (task.getStatus () != Task::deleted && task.getStatus () != Task::completed) out << task.id - << ":" + << ':' << str_replace(task.get ("description"), ":", zshColonReplacement) - << "\n"; + << '\n'; output = out.str (); @@ -241,7 +241,7 @@ int CmdUUIDs::execute (std::string& output) std::sort (uuids.begin (), uuids.end ()); join (output, " ", uuids); - output += "\n"; + output += '\n'; context.headers.clear (); return 0; @@ -278,7 +278,7 @@ int CmdCompletionUuids::execute (std::string& output) std::sort (uuids.begin (), uuids.end ()); join (output, "\n", uuids); - output += "\n"; + output += '\n'; context.headers.clear (); return 0; @@ -314,7 +314,7 @@ int CmdZshCompletionUuids::execute (std::string& output) out << task.get ("uuid") << ":" << str_replace (task.get ("description"), ":", zshColonReplacement) - << "\n"; + << '\n'; output = out.str (); diff --git a/src/commands/CmdImport.cpp b/src/commands/CmdImport.cpp index b8687f3b4..ae893ac51 100644 --- a/src/commands/CmdImport.cpp +++ b/src/commands/CmdImport.cpp @@ -64,12 +64,12 @@ int CmdImport::execute (std::string&) std::vector words = context.cli2.getWords (); if (! words.size () || (words.size () == 1 && words[0] == "-")) { - std::cout << format (STRING_CMD_IMPORT_FILE, "STDIN") << "\n"; + std::cout << format (STRING_CMD_IMPORT_FILE, "STDIN") << '\n'; std::string json; std::string line; while (std::getline (std::cin, line)) - json += line + "\n"; + json += line + '\n'; if (nontrivial (json)) count = import (json); @@ -83,7 +83,7 @@ int CmdImport::execute (std::string&) if (! incoming.exists ()) throw format (STRING_CMD_IMPORT_MISSING, word); - std::cout << format (STRING_CMD_IMPORT_FILE, word) << "\n"; + std::cout << format (STRING_CMD_IMPORT_FILE, word) << '\n'; // Load the file. std::string json; @@ -224,9 +224,9 @@ void CmdImport::importSingleTask (json::object* obj) } std::cout << task.get ("uuid") - << " " + << ' ' << task.get ("description") - << "\n"; + << '\n'; } //////////////////////////////////////////////////////////////////////////////// diff --git a/src/commands/CmdInfo.cpp b/src/commands/CmdInfo.cpp index 92445a58f..13b603398 100644 --- a/src/commands/CmdInfo.cpp +++ b/src/commands/CmdInfo.cpp @@ -130,10 +130,10 @@ int CmdInfo::execute (std::string& output) std::map annotations; task.getAnnotations (annotations); for (auto& anno : annotations) - description += "\n" + description += '\n' + std::string (indent, ' ') + ISO8601d (anno.first.substr (11)).toString (dateformatanno) - + " " + + ' ' + anno.second; row = view.addRow (); @@ -161,7 +161,7 @@ int CmdInfo::execute (std::string& output) { std::stringstream message; for (auto& block : blocked) - message << block.id << " " << block.get ("description") << "\n"; + message << block.id << ' ' << block.get ("description") << '\n'; row = view.addRow (); view.set (row, 0, STRING_CMD_INFO_BLOCKED); @@ -177,7 +177,7 @@ int CmdInfo::execute (std::string& output) { std::stringstream message; for (auto& block : blocking) - message << block.id << " " << block.get ("description") << "\n"; + message << block.id << ' ' << block.get ("description") << '\n'; row = view.addRow (); view.set (row, 0, STRING_CMD_INFO_BLOCKING); @@ -558,15 +558,15 @@ int CmdInfo::execute (std::string& output) out << optionalBlankLine () << view.render () - << "\n"; + << '\n'; if (urgencyDetails.rows () > 0) out << urgencyDetails.render () - << "\n"; + << '\n'; if (journal.rows () > 0) out << journal.render () - << "\n"; + << '\n'; } output = out.str (); diff --git a/src/commands/CmdLog.cpp b/src/commands/CmdLog.cpp index 7e0816c22..886507578 100644 --- a/src/commands/CmdLog.cpp +++ b/src/commands/CmdLog.cpp @@ -72,7 +72,7 @@ int CmdLog::execute (std::string& output) context.footnote (onProjectChange (task)); if (context.verbose ("new-uuid")) - output = format (STRING_CMD_LOG_LOGGED, task.get ("uuid")) + "\n"; + output = format (STRING_CMD_LOG_LOGGED, task.get ("uuid")) + '\n'; return 0; } diff --git a/src/commands/CmdLogo.cpp b/src/commands/CmdLogo.cpp index 744c7e641..1c25fbc06 100644 --- a/src/commands/CmdLogo.cpp +++ b/src/commands/CmdLogo.cpp @@ -127,7 +127,7 @@ int CmdLogo::execute (std::string& output) } } - output += "\n"; + output += '\n'; } output += optionalBlankLine (); diff --git a/src/commands/CmdModify.cpp b/src/commands/CmdModify.cpp index d2a71d3ff..db203e180 100644 --- a/src/commands/CmdModify.cpp +++ b/src/commands/CmdModify.cpp @@ -92,7 +92,7 @@ int CmdModify::execute (std::string&) } else { - std::cout << STRING_CMD_MODIFY_NO << "\n"; + std::cout << STRING_CMD_MODIFY_NO << '\n'; rc = 1; if (_permission_quit) break; diff --git a/src/commands/CmdPrepend.cpp b/src/commands/CmdPrepend.cpp index 4e2b04ce2..c0ead57f1 100644 --- a/src/commands/CmdPrepend.cpp +++ b/src/commands/CmdPrepend.cpp @@ -118,7 +118,7 @@ int CmdPrepend::execute (std::string&) } else { - std::cout << STRING_CMD_PREPEND_NO << "\n"; + std::cout << STRING_CMD_PREPEND_NO << '\n'; rc = 1; if (_permission_quit) break; diff --git a/src/commands/CmdProjects.cpp b/src/commands/CmdProjects.cpp index 6b632a3ba..b1ecb8a25 100644 --- a/src/commands/CmdProjects.cpp +++ b/src/commands/CmdProjects.cpp @@ -147,15 +147,15 @@ int CmdProjects::execute (std::string& output) << (number_projects == 1 ? format (STRING_CMD_PROJECTS_SUMMARY, number_projects) : format (STRING_CMD_PROJECTS_SUMMARY2, number_projects)) - << " " + << ' ' << (quantity == 1 ? format (STRING_CMD_PROJECTS_TASK, quantity) : format (STRING_CMD_PROJECTS_TASKS, quantity)) - << "\n"; + << '\n'; } else { - out << STRING_CMD_PROJECTS_NO << "\n"; + out << STRING_CMD_PROJECTS_NO << '\n'; rc = 1; } @@ -203,7 +203,7 @@ int CmdCompletionProjects::execute (std::string& output) for (auto& project : unique) if (project.first.length ()) - output += project.first + "\n"; + output += project.first + '\n'; return 0; } diff --git a/src/commands/CmdReports.cpp b/src/commands/CmdReports.cpp index 6cb5ae1e5..4474f96bd 100644 --- a/src/commands/CmdReports.cpp +++ b/src/commands/CmdReports.cpp @@ -111,7 +111,7 @@ int CmdReports::execute (std::string& output) << view.render () << optionalBlankLine () << format (STRING_CMD_REPORTS_SUMMARY, reports.size ()) - << "\n"; + << '\n'; output = out.str (); return 0; diff --git a/src/commands/CmdShow.cpp b/src/commands/CmdShow.cpp index cfda33f4b..56d848ac5 100644 --- a/src/commands/CmdShow.cpp +++ b/src/commands/CmdShow.cpp @@ -222,7 +222,7 @@ int CmdShow::execute (std::string& output) { // Disallow partial matches by tacking a leading and trailing space on each // variable name. - std::string pattern = " " + i.first + " "; + std::string pattern = ' ' + i.first + ' '; if (recognized.find (pattern) == std::string::npos) { // These are special configuration variables, because their name is @@ -320,14 +320,14 @@ int CmdShow::execute (std::string& output) } } - out << "\n" + out << '\n' << view.render () << (view.rows () == 0 ? STRING_CMD_SHOW_NONE : "") << (view.rows () == 0 ? "\n\n" : "\n"); if (issue_warning) { - out << STRING_CMD_SHOW_DIFFER << "\n"; + out << STRING_CMD_SHOW_DIFFER << '\n'; if (context.color () && warning.nontrivial ()) out << " " @@ -338,13 +338,13 @@ int CmdShow::execute (std::string& output) // Display the unrecognized variables. if (issue_error) { - out << STRING_CMD_SHOW_UNREC << "\n"; + out << STRING_CMD_SHOW_UNREC << '\n'; for (auto& i : unrecognized) - out << " " << i << "\n"; + out << " " << i << '\n'; if (context.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"; } @@ -361,7 +361,7 @@ int CmdShow::execute (std::string& output) calendardetails != "sparse" && calendardetails != "none") out << format (STRING_CMD_SHOW_CONFIG_ERROR, "calendar.details", calendardetails) - << "\n"; + << '\n'; // Check for bad values in rc.calendar.holidays. std::string calendarholidays = context.config.get ("calendar.holidays"); @@ -369,14 +369,14 @@ int CmdShow::execute (std::string& output) calendarholidays != "sparse" && calendarholidays != "none") out << format (STRING_CMD_SHOW_CONFIG_ERROR, "calendar.holidays", calendarholidays) - << "\n"; + << '\n'; // Verify installation. This is mentioned in the documentation as the way // to ensure everything is properly installed. if (context.config.size () == 0) { - out << STRING_CMD_SHOW_EMPTY << "\n"; + out << STRING_CMD_SHOW_EMPTY << '\n'; rc = 1; } else @@ -384,10 +384,10 @@ int CmdShow::execute (std::string& output) Directory location (context.config.get ("data.location")); if (location._data == "") - out << STRING_CMD_SHOW_NO_LOCATION << "\n"; + out << STRING_CMD_SHOW_NO_LOCATION << '\n'; if (! location.exists ()) - out << STRING_CMD_SHOW_LOC_EXIST << "\n"; + out << STRING_CMD_SHOW_LOC_EXIST << '\n'; } output = out.str (); @@ -418,7 +418,7 @@ int CmdShowRaw::execute (std::string& output) // Display them all. std::stringstream out; for (auto& i : all) - out << i << '=' << context.config.get (i) << "\n"; + out << i << '=' << context.config.get (i) << '\n'; output = out.str (); return 0; diff --git a/src/commands/CmdStart.cpp b/src/commands/CmdStart.cpp index dbad4c2d0..34f2df484 100644 --- a/src/commands/CmdStart.cpp +++ b/src/commands/CmdStart.cpp @@ -109,7 +109,7 @@ int CmdStart::execute (std::string&) } else { - std::cout << STRING_CMD_START_NO << "\n"; + std::cout << STRING_CMD_START_NO << '\n'; rc = 1; if (_permission_quit) break; @@ -120,7 +120,7 @@ int CmdStart::execute (std::string&) std::cout << format (STRING_CMD_START_ALREADY, task.id, task.get ("description")) - << "\n"; + << '\n'; rc = 1; } } diff --git a/src/commands/CmdStop.cpp b/src/commands/CmdStop.cpp index 7ce117cd5..40dc5e33a 100644 --- a/src/commands/CmdStop.cpp +++ b/src/commands/CmdStop.cpp @@ -99,7 +99,7 @@ int CmdStop::execute (std::string&) } else { - std::cout << STRING_CMD_STOP_NO << "\n"; + std::cout << STRING_CMD_STOP_NO << '\n'; rc = 1; if (_permission_quit) break; @@ -110,7 +110,7 @@ int CmdStop::execute (std::string&) std::cout << format (STRING_CMD_STOP_ALREADY, task.identifier (true), task.get ("description")) - << "\n"; + << '\n'; rc = 1; } } diff --git a/src/commands/CmdSummary.cpp b/src/commands/CmdSummary.cpp index 04e06ce4b..99783e2c5 100644 --- a/src/commands/CmdSummary.cpp +++ b/src/commands/CmdSummary.cpp @@ -212,11 +212,11 @@ int CmdSummary::execute (std::string& output) << view.render () << optionalBlankLine (); - out << format (STRING_CMD_PROJECTS_SUMMARY2, view.rows ()) << "\n"; + out << format (STRING_CMD_PROJECTS_SUMMARY2, view.rows ()) << '\n'; } else { - out << STRING_CMD_PROJECTS_NO << "\n"; + out << STRING_CMD_PROJECTS_NO << '\n'; rc = 1; } diff --git a/src/commands/CmdSync.cpp b/src/commands/CmdSync.cpp index c791a6928..52d425761 100644 --- a/src/commands/CmdSync.cpp +++ b/src/commands/CmdSync.cpp @@ -138,7 +138,7 @@ int CmdSync::execute (std::string& output) auto all_tasks = context.tdb2.all_tasks (); for (auto& i : all_tasks) { - payload += i.composeJSON () + "\n"; + payload += i.composeJSON () + '\n'; ++upload_count; } } @@ -150,7 +150,7 @@ int CmdSync::execute (std::string& output) if (i[0] == '{') ++upload_count; - payload += i + "\n"; + payload += i + '\n'; } } @@ -172,7 +172,7 @@ int CmdSync::execute (std::string& output) if (context.verbose ("sync")) out << format (STRING_CMD_SYNC_PROGRESS, connection) - << "\n"; + << '\n'; // Ignore harmful signals. signal (SIGHUP, SIG_IGN); @@ -227,7 +227,7 @@ int CmdSync::execute (std::string& output) format (STRING_CMD_SYNC_MOD, uuid, from_server.get ("description"))) - << "\n"; + << '\n'; context.tdb2.modify (from_server, false); } else @@ -238,7 +238,7 @@ int CmdSync::execute (std::string& output) format (STRING_CMD_SYNC_ADD, uuid, from_server.get ("description"))) - << "\n"; + << '\n'; context.tdb2.add (from_server, false); } } @@ -259,7 +259,7 @@ int CmdSync::execute (std::string& output) context.tdb2.backlog._file.truncate (); context.tdb2.backlog.clear_tasks (); context.tdb2.backlog.clear_lines (); - context.tdb2.backlog.add_line (sync_key + "\n"); + context.tdb2.backlog.add_line (sync_key + '\n'); // Present a clear status message. if (upload_count == 0 && download_count == 0) @@ -326,7 +326,7 @@ int CmdSync::execute (std::string& output) } if (context.verbose ("sync")) - out << "\n"; + out << '\n'; output = out.str (); // Restore signal handling. @@ -373,7 +373,7 @@ bool CmdSync::send ( client.ciphers (context.config.get ("taskd.ciphers")); client.init (ca, certificate, key); client.connect (server, port); - client.send (request.serialize () + "\n"); + client.send (request.serialize () + '\n'); std::string incoming; client.recv (incoming); diff --git a/src/commands/CmdTags.cpp b/src/commands/CmdTags.cpp index 0f2fc82e6..95eedbb9a 100644 --- a/src/commands/CmdTags.cpp +++ b/src/commands/CmdTags.cpp @@ -134,7 +134,7 @@ int CmdTags::execute (std::string& output) else context.footnote (format (STRING_FEEDBACK_TASKS_PLURAL, quantity)); - out << "\n"; + out << '\n'; } else { @@ -224,7 +224,7 @@ int CmdCompletionTags::execute (std::string& output) std::stringstream out; for (auto& it : unique) - out << it.first << "\n"; + out << it.first << '\n'; output = out.str (); return 0; diff --git a/src/commands/CmdTimesheet.cpp b/src/commands/CmdTimesheet.cpp index f2e5ae752..15d25ba55 100644 --- a/src/commands/CmdTimesheet.cpp +++ b/src/commands/CmdTimesheet.cpp @@ -97,9 +97,9 @@ int CmdTimesheet::execute (std::string& output) if (context.color ()) bold = Color ("bold"); - out << "\n" + out << '\n' << bold.colorize (title) - << "\n"; + << '\n'; // Render the completed table. ViewText completed; @@ -145,10 +145,10 @@ int CmdTimesheet::execute (std::string& output) std::map annotations; task.getAnnotations (annotations); for (auto& ann : annotations) - description += "\n" + description += '\n' + std::string (indent, ' ') + ISO8601d (ann.first.substr (11)).toString (context.config.get ("dateformat")) - + " " + + ' ' + ann.second; completed.set (row, 3, description, c); @@ -156,11 +156,11 @@ int CmdTimesheet::execute (std::string& output) } } - out << " " << format (STRING_CMD_TIMESHEET_DONE, completed.rows ()) << "\n"; + out << " " << format (STRING_CMD_TIMESHEET_DONE, completed.rows ()) << '\n'; if (completed.rows ()) out << completed.render () - << "\n"; + << '\n'; // Now render the started table. ViewText started; @@ -201,10 +201,10 @@ int CmdTimesheet::execute (std::string& output) std::map annotations; task.getAnnotations (annotations); for (auto& ann : annotations) - description += "\n" + description += '\n' + std::string (indent, ' ') + ISO8601d (ann.first.substr (11)).toString (context.config.get ("dateformat")) - + " " + + ' ' + ann.second; started.set (row, 3, description, c); @@ -212,7 +212,7 @@ int CmdTimesheet::execute (std::string& output) } } - out << " " << format (STRING_CMD_TIMESHEET_STARTED, started.rows ()) << "\n"; + out << " " << format (STRING_CMD_TIMESHEET_STARTED, started.rows ()) << '\n'; if (started.rows ()) out << started.render () diff --git a/src/commands/CmdUDAs.cpp b/src/commands/CmdUDAs.cpp index bb057aacc..e3d8a0b0d 100644 --- a/src/commands/CmdUDAs.cpp +++ b/src/commands/CmdUDAs.cpp @@ -128,11 +128,11 @@ int CmdUDAs::execute (std::string& output) << (udas.size () == 1 ? format (STRING_CMD_UDAS_SUMMARY, udas.size ()) : format (STRING_CMD_UDAS_SUMMARY2, udas.size ())) - << "\n"; + << '\n'; } else { - out << STRING_CMD_UDAS_NO << "\n"; + out << STRING_CMD_UDAS_NO << '\n'; rc = 1; } @@ -173,7 +173,7 @@ int CmdUDAs::execute (std::string& output) << (udas.size () == 1 ? format (STRING_CMD_UDAS_ORPHAN, orphans.size ()) : format (STRING_CMD_UDAS_ORPHANS, orphans.size ())) - << "\n"; + << '\n'; } output = out.str (); @@ -215,7 +215,7 @@ int CmdCompletionUDAs::execute (std::string& output) { std::sort (udas.begin (), udas.end ()); join (output, "\n", udas); - output += "\n"; + output += '\n'; } return 0; diff --git a/src/commands/CmdUnique.cpp b/src/commands/CmdUnique.cpp index de364c3d0..8b28f9020 100644 --- a/src/commands/CmdUnique.cpp +++ b/src/commands/CmdUnique.cpp @@ -87,7 +87,7 @@ int CmdUnique::execute (std::string& output) // Generate list of unique values. for (auto& value : values) - output += value + "\n"; + output += value + '\n'; context.headers.clear (); return 0; diff --git a/src/commands/CmdUrgency.cpp b/src/commands/CmdUrgency.cpp index 31e6cd71a..4d45a65bf 100644 --- a/src/commands/CmdUrgency.cpp +++ b/src/commands/CmdUrgency.cpp @@ -74,7 +74,7 @@ int CmdUrgency::execute (std::string& output) out << format (STRING_CMD_URGENCY_RESULT, task.identifier (), Lexer::trim (format (task.urgency (), 6, 3))) - << "\n"; + << '\n'; } output = out.str (); diff --git a/src/commands/CmdVersion.cpp b/src/commands/CmdVersion.cpp index 30724c779..ce1432fb2 100644 --- a/src/commands/CmdVersion.cpp +++ b/src/commands/CmdVersion.cpp @@ -76,7 +76,7 @@ int CmdVersion::execute (std::string& output) if (context.color ()) bold = Color ("bold"); - out << "\n" + out << '\n' << format (STRING_CMD_VERSION_BUILT, bold.colorize (PACKAGE), bold.colorize (VERSION)) #if defined (DARWIN) @@ -104,23 +104,23 @@ int CmdVersion::execute (std::string& output) #endif #if PACKAGE_LANGUAGE != LANGUAGE_ENG_USA - << " " + << ' ' << STRING_LOCALIZATION_DESC #endif - << "\n" + << '\n' << STRING_CMD_VERSION_COPY - << "\n" - << "\n" + << '\n' + << '\n' << disclaimer.render () - << "\n" + << '\n' << link.render () - << "\n"; + << '\n'; #if PACKAGE_LANGUAGE != LANGUAGE_ENG_USA out << STRING_LOCALIZATION_AUTHOR - << "\n" - << "\n"; + << '\n' + << '\n'; #endif output = out.str (); @@ -154,7 +154,7 @@ int CmdCompletionVersion::execute (std::string& output) #else output = VERSION; #endif - output += "\n"; + output += '\n'; return 0; } diff --git a/src/commands/Command.cpp b/src/commands/Command.cpp index 4783afc68..86a276f83 100644 --- a/src/commands/Command.cpp +++ b/src/commands/Command.cpp @@ -350,7 +350,7 @@ bool Command::permission ( return true; if (context.verbose ("blank") && !_first_iteration) - std::cout << "\n"; + std::cout << '\n'; int answer = confirm4 (question); _first_iteration = false; switch (answer) diff --git a/src/dependency.cpp b/src/dependency.cpp index 124610d6f..a1cc51e6a 100644 --- a/src/dependency.cpp +++ b/src/dependency.cpp @@ -67,7 +67,6 @@ void dependencyGetBlocking (const Task& task, std::vector & blocking) // Returns true if the supplied task adds a cycle to the dependency chain. bool dependencyIsCircular (const Task& task) { - // A new task has no UUID assigned yet, and therefore cannot be part of any // dependency chain. if (task.has ("uuid")) @@ -163,7 +162,7 @@ void dependencyChainOnComplete (Task& task) << "\n"; for (auto& b : blocking) - std::cout << " " << b.id << " " << b.get ("description") << "\n"; + std::cout << " " << b.id << ' ' << b.get ("description") << "\n"; } // If there are both blocking and blocked tasks, the chain is broken. @@ -175,7 +174,7 @@ void dependencyChainOnComplete (Task& task) << "\n"; for (auto& b : blocked) - std::cout << " " << b.id << " " << b.get ("description") << "\n"; + std::cout << " " << b.id << ' ' << b.get ("description") << "\n"; } if (!context.config.getBoolean ("dependency.confirmation") || @@ -218,7 +217,7 @@ void dependencyChainOnStart (Task& task) << "\n"; for (auto& b : blocking) - std::cout << " " << b.id << " " << b.get ("description") << "\n"; + std::cout << " " << b.id << ' ' << b.get ("description") << "\n"; } } } diff --git a/src/feedback.cpp b/src/feedback.cpp index 49f5a4556..c5c88b86a 100644 --- a/src/feedback.cpp +++ b/src/feedback.cpp @@ -478,7 +478,7 @@ std::string onProjectChange (Task& task, bool scope /* = true */) percentage = (count_done * 100 / (count_done + count_pending)); msg << format (STRING_HELPER_PROJECT_COMPL, project, percentage) - << " "; + << ' '; if (count_pending == 1 && count_done == 0) msg << format (STRING_HELPER_PROJECT_REM1, count_pending); From 814d7d69fadaf6d5c2e50e2e7bce87f4601cbb04 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Fri, 14 Oct 2016 23:11:28 -0400 Subject: [PATCH 100/879] Cleanup: Don't use string literals when character literals are needed --- src/Msg.cpp | 6 ++-- src/TDB2.cpp | 60 ++++++++++++++++----------------- src/Task.cpp | 58 +++++++++++++++---------------- src/columns/ColDepends.cpp | 2 +- src/columns/ColDescription.cpp | 4 +-- src/columns/ColProject.cpp | 6 ++-- src/columns/ColRecur.cpp | 2 +- src/columns/ColTags.cpp | 6 ++-- src/columns/ColTypeDate.cpp | 10 +++--- src/columns/ColTypeDuration.cpp | 2 +- src/columns/ColTypeNumeric.cpp | 2 +- src/columns/ColTypeString.cpp | 4 +-- src/commands/CmdAttributes.cpp | 2 +- src/commands/CmdBurndown.cpp | 4 +-- src/commands/CmdCommands.cpp | 4 +-- src/commands/CmdConfig.cpp | 14 ++++---- src/commands/CmdDiagnostics.cpp | 8 ++--- src/commands/CmdEdit.cpp | 2 +- src/commands/CmdExport.cpp | 2 +- src/commands/CmdHistory.cpp | 12 +++---- src/commands/CmdIDs.cpp | 6 ++-- src/commands/CmdInfo.cpp | 8 ++--- src/commands/CmdStats.cpp | 2 +- src/rules.cpp | 2 +- src/text.cpp | 2 +- src/text.h | 2 +- src/util.cpp | 12 +++---- 27 files changed, 122 insertions(+), 122 deletions(-) diff --git a/src/Msg.cpp b/src/Msg.cpp index 7f73858c4..bed357e11 100644 --- a/src/Msg.cpp +++ b/src/Msg.cpp @@ -72,9 +72,9 @@ std::string Msg::serialize () const { std::string output; for (auto& i : _header) - output += i.first + ": " + i.second + "\n"; + output += i.first + ": " + i.second + '\n'; - output += "\n" + _payload + "\n"; + output += '\n' + _payload + '\n'; return output; } @@ -95,7 +95,7 @@ bool Msg::parse (const std::string& input) { auto delimiter = i.find (':'); if (delimiter == std::string::npos) - throw std::string ("ERROR: Malformed message header '") + i + "'"; + throw std::string ("ERROR: Malformed message header '") + i + '\''; _header[Lexer::trim (i.substr (0, delimiter))] = Lexer::trim (i.substr (delimiter + 1)); } diff --git a/src/TDB2.cpp b/src/TDB2.cpp index 0f3e696c3..f53332aed 100644 --- a/src/TDB2.cpp +++ b/src/TDB2.cpp @@ -61,7 +61,7 @@ TF2::~TF2 () { if (_dirty && TDB2::debug_mode) std::cout << format (STRING_TDB2_DIRTY_EXIT, std::string (_file)) - << "\n"; + << '\n'; } //////////////////////////////////////////////////////////////////////////////// @@ -301,7 +301,7 @@ void TF2::commit () for (auto& task : _tasks) // Skip over the tasks that are marked to be purged if (_purged_tasks.find (task.get ("uuid")) == _purged_tasks.end ()) - _file.write_raw (task.composeF4 () + "\n"); + _file.write_raw (task.composeF4 () + '\n'); // Write out all the added lines. _file.append (_added_lines); @@ -708,9 +708,9 @@ void TDB2::update ( // old // new // --- - undo.add_line ("time " + ISO8601d ().toEpochString () + "\n"); - undo.add_line ("old " + original.composeF4 () + "\n"); - undo.add_line ("new " + task.composeF4 () + "\n"); + undo.add_line ("time " + ISO8601d ().toEpochString () + '\n'); + undo.add_line ("old " + original.composeF4 () + '\n'); + undo.add_line ("new " + task.composeF4 () + '\n'); undo.add_line ("---\n"); } else @@ -727,14 +727,14 @@ void TDB2::update ( // time