diff --git a/src/Cmd.cpp b/src/Cmd.cpp index 1a711af7d..43332e16c 100644 --- a/src/Cmd.cpp +++ b/src/Cmd.cpp @@ -129,7 +129,6 @@ void Cmd::load () { if (commands.size () == 0) { - commands.push_back ("_query"); commands.push_back ("calendar"); commands.push_back ("delete"); commands.push_back ("done"); @@ -195,8 +194,7 @@ void Cmd::allCommands (std::vector & all) const // Commands that do not directly modify the data files. bool Cmd::isReadOnlyCommand () { - if (command == "_query" || - command == "calendar" || + if (command == "calendar" || command == "push" || command == "timesheet" || validCustom (command)) diff --git a/src/Context.cpp b/src/Context.cpp index 0e04296c1..28a404a4b 100644 --- a/src/Context.cpp +++ b/src/Context.cpp @@ -259,7 +259,6 @@ int Context::dispatch (std::string &out) handleMerge (out); } else if (cmd.command == "push") { handlePush (out); } else if (cmd.command == "pull") { handlePull (out); } - else if (cmd.command == "_query") { rc = handleQuery (out); } else if (cmd.command == "" && sequence.size ()) { rc = handleModify (out); } diff --git a/src/command.cpp b/src/command.cpp index 80ee1ed72..8948d3b5e 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -51,45 +51,6 @@ extern Context context; -//////////////////////////////////////////////////////////////////////////////// -int handleQuery (std::string& outs) -{ - int rc = 0; - - // Get all the tasks. - std::vector tasks; - context.tdb.lock (context.config.getBoolean ("locking")); - handleRecurrence (); - context.tdb.load (tasks, context.filter); - context.tdb.commit (); - context.tdb.unlock (); - - // Filter sequence. - if (context.sequence.size ()) - context.filter.applySequence (tasks, context.sequence); - - if (tasks.size () == 0) - { - std::cout << "No matches.\n"; - return 1; - } - - // Note: "limit:" feature not supported. - - // Compose output. - std::vector ::iterator t; - for (t = tasks.begin (); t != tasks.end (); ++t) - { - if (t != tasks.begin ()) - outs += ",\n"; - - outs += t->composeJSON (true); - } - - outs += "\n"; - return rc; -} - //////////////////////////////////////////////////////////////////////////////// void handleUndo () { diff --git a/src/commands/CMakeLists.txt b/src/commands/CMakeLists.txt index f270b55e4..ceb48f049 100644 --- a/src/commands/CMakeLists.txt +++ b/src/commands/CMakeLists.txt @@ -29,6 +29,7 @@ set (commands_SRCS Command.cpp Command.h CmdLogo.cpp CmdLogo.h CmdPrepend.cpp CmdPrepend.h CmdProjects.cpp CmdProjects.h + CmdQuery.cpp CmdQuery.h CmdReports.cpp CmdReports.h CmdShell.cpp CmdShell.h CmdShow.cpp CmdShow.h diff --git a/src/commands/CmdQuery.cpp b/src/commands/CmdQuery.cpp new file mode 100644 index 000000000..4241c11d9 --- /dev/null +++ b/src/commands/CmdQuery.cpp @@ -0,0 +1,83 @@ +//////////////////////////////////////////////////////////////////////////////// +// taskwarrior - a command line task list manager. +// +// Copyright 2006 - 2011, Paul Beckingham, Federico Hernandez. +// All rights reserved. +// +// This program is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation; either version 2 of the License, or (at your option) any later +// version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +// details. +// +// You should have received a copy of the GNU General Public License along with +// this program; if not, write to the +// +// Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, +// Boston, MA +// 02110-1301 +// USA +// +//////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include + +extern Context context; + +//////////////////////////////////////////////////////////////////////////////// +CmdQuery::CmdQuery () +{ + _keyword = "_query"; + _usage = "task _query "; + _description = "Executes external commands and scripts"; + _read_only = true; + _displays_id = true; +} + +//////////////////////////////////////////////////////////////////////////////// +int CmdQuery::execute (const std::string&, std::string& output) +{ + int rc = 0; + + // Get all the tasks. + std::vector tasks; + context.tdb.lock (context.config.getBoolean ("locking")); + handleRecurrence (); + context.tdb.load (tasks, context.filter); + context.tdb.commit (); + context.tdb.unlock (); + + // Filter sequence. + if (context.sequence.size ()) + context.filter.applySequence (tasks, context.sequence); + + if (tasks.size () == 0) + { + context.footnote ("No matches."); + return 1; + } + + // Note: "limit:" feature not supported. + + // Compose output. + std::vector ::iterator t; + for (t = tasks.begin (); t != tasks.end (); ++t) + { + if (t != tasks.begin ()) + output += ",\n"; + + output += t->composeJSON (true); + } + + output += "\n"; + return rc; +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/commands/CmdQuery.h b/src/commands/CmdQuery.h new file mode 100644 index 000000000..f94dc81de --- /dev/null +++ b/src/commands/CmdQuery.h @@ -0,0 +1,42 @@ +//////////////////////////////////////////////////////////////////////////////// +// taskwarrior - a command line task list manager. +// +// Copyright 2006 - 2011, Paul Beckingham, Federico Hernandez. +// All rights reserved. +// +// This program is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free Software +// Foundation; either version 2 of the License, or (at your option) any later +// version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +// details. +// +// You should have received a copy of the GNU General Public License along with +// this program; if not, write to the +// +// Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, +// Boston, MA +// 02110-1301 +// USA +// +//////////////////////////////////////////////////////////////////////////////// +#ifndef INCLUDED_CMDQUERY +#define INCLUDED_CMDQUERY +#define L10N // Localization complete. + +#include +#include + +class CmdQuery : public Command +{ +public: + CmdQuery (); + int execute (const std::string&, std::string&); +}; + +#endif +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/commands/Command.cpp b/src/commands/Command.cpp index 0715a183e..229ec1b8d 100644 --- a/src/commands/Command.cpp +++ b/src/commands/Command.cpp @@ -51,6 +51,7 @@ #include #include #include +#include #include #include #include @@ -103,6 +104,7 @@ void Command::factory (std::map & all) c = new CmdLogo (); all[c->keyword ()] = c; c = new CmdPrepend (); all[c->keyword ()] = c; c = new CmdProjects (); all[c->keyword ()] = c; + c = new CmdQuery (); all[c->keyword ()] = c; c = new CmdReports (); all[c->keyword ()] = c; c = new CmdShell (); all[c->keyword ()] = c; c = new CmdShow (); all[c->keyword ()] = c; diff --git a/src/main.h b/src/main.h index b08cde9b5..c0851a1c1 100644 --- a/src/main.h +++ b/src/main.h @@ -52,7 +52,6 @@ bool nag (Task&); // command.cpp int handleDone (std::string&); int handleModify (std::string&); -int handleQuery (std::string&); int handleDelete (std::string&); void handleUndo (); void handleMerge (std::string&);