From 19aa8b7ac4f98d07ff7f54ad4687a0aaeda7ccc6 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 5 Jun 2016 13:12:19 -0400 Subject: [PATCH] CmdUntag: Added 'untag' command --- src/commands/CMakeLists.txt | 3 +- src/commands/CmdUntag.cpp | 80 +++++++++++++++++++++++++++++++++++++ src/commands/commands.h | 1 + src/init.cpp | 2 + 4 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 src/commands/CmdUntag.cpp diff --git a/src/commands/CMakeLists.txt b/src/commands/CMakeLists.txt index 4ee32211..9c8136b6 100644 --- a/src/commands/CMakeLists.txt +++ b/src/commands/CMakeLists.txt @@ -25,7 +25,8 @@ set (commands_SRCS CmdCancel.cpp CmdTag.cpp CmdTags.cpp CmdTrack.cpp - CmdUndo.cpp) + CmdUndo.cpp + CmdUntag.cpp) add_library (commands STATIC ${commands_SRCS}) diff --git a/src/commands/CmdUntag.cpp b/src/commands/CmdUntag.cpp new file mode 100644 index 00000000..24db0132 --- /dev/null +++ b/src/commands/CmdUntag.cpp @@ -0,0 +1,80 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright 2015 - 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 CmdUntag ( + const CLI& cli, + Rules& rules, + Database& database) +{ + // Gather IDs and TAGs. + std::vector ids; + std::vector tags; + for (auto& arg : cli._args) + { + if (arg.hasTag ("ID")) + ids.push_back (strtol (arg.attribute ("value").c_str (), NULL, 10)); + + if (arg.hasTag ("TAG")) + tags.push_back (arg.attribute ("raw")); + } + + // Load the data. + // Note: There is no filter. + Interval filter; + auto tracked = getTracked (database, rules, filter); + + // Apply tags to ids. + for (auto& id : ids) + { + if (id <= static_cast (tracked.size ())) + { + // Note: It's okay to subtract a one-based number from a zero-based index. + Interval i = tracked[tracked.size () - id]; + + for (auto& tag : tags) + i.untag (tag); + + database.modifyInterval (tracked[tracked.size () - id], i); + + // Feedback. + std::cout << "Removed:"; + for (auto& tag : tags) + std::cout << ' ' << quoteIfNeeded (tag); + std::cout << '\n'; + } + } + + return 0; +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/commands/commands.h b/src/commands/commands.h index a77ca5b3..4146e2ea 100644 --- a/src/commands/commands.h +++ b/src/commands/commands.h @@ -52,6 +52,7 @@ int CmdTag (const CLI&, Rules&, Database& ); int CmdTags ( Rules&, Database& ); int CmdTrack (const CLI&, Rules&, Database& ); int CmdUndo ( ); +int CmdUntag (const CLI&, Rules&, Database& ); int CmdChartDay (const CLI&, Rules&, Database& ); int CmdChartWeek (const CLI&, Rules&, Database& ); diff --git a/src/init.cpp b/src/init.cpp index 0089c02e..1248fcdf 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -75,6 +75,7 @@ void initializeEntities (CLI& cli) cli.entity ("command", "tags"); cli.entity ("command", "track"); cli.entity ("command", "undo"); + cli.entity ("command", "untag"); // Some command list themselves as extensions, to integrate with the real // extensions. @@ -262,6 +263,7 @@ int dispatchCommand ( else if (command == "tags") status = CmdTags ( rules, database ); else if (command == "track") status = CmdTrack (cli, rules, database ); else if (command == "undo") status = CmdUndo ( ); + else if (command == "untag") status = CmdUntag (cli, rules, database ); else if (command == "week") status = CmdChartWeek (cli, rules, database ); else status = CmdReport (cli, rules, database, extensions); }