diff --git a/src/Context.cpp b/src/Context.cpp index 6898c7aec..6d9929000 100644 --- a/src/Context.cpp +++ b/src/Context.cpp @@ -175,45 +175,44 @@ std::string Context::dispatch () std::string out; // TODO Just look at this thing. It cries out for a dispatch table. - if (cmd.command == "projects") { out = handleProjects (); } - else if (cmd.command == "tags") { out = handleTags (); } - else if (cmd.command == "colors") { out = handleColor (); } - else if (cmd.command == "version") { out = handleVersion (); } - else if (cmd.command == "help") { out = longUsage (); } - else if (cmd.command == "stats") { out = handleReportStats (); } - else if (cmd.command == "info") { out = handleInfo (); } - else if (cmd.command == "history") { out = handleReportHistory (); } - else if (cmd.command == "ghistory") { out = handleReportGHistory (); } - else if (cmd.command == "summary") { out = handleReportSummary (); } - else if (cmd.command == "calendar") { out = handleReportCalendar (); } - else if (cmd.command == "timesheet") { out = handleReportTimesheet (); } - else if (cmd.command == "add") { out = handleAdd (); } + if (cmd.command == "projects") { out = handleProjects (); } + else if (cmd.command == "tags") { out = handleTags (); } + else if (cmd.command == "colors") { out = handleColor (); } + else if (cmd.command == "version") { out = handleVersion (); } + else if (cmd.command == "help") { out = longUsage (); } + else if (cmd.command == "stats") { out = handleReportStats (); } + else if (cmd.command == "info") { out = handleInfo (); } + else if (cmd.command == "history") { out = handleReportHistory (); } + else if (cmd.command == "ghistory") { out = handleReportGHistory (); } + else if (cmd.command == "summary") { out = handleReportSummary (); } + else if (cmd.command == "calendar") { out = handleReportCalendar (); } + else if (cmd.command == "timesheet") { out = handleReportTimesheet (); } + else if (cmd.command == "add") { out = handleAdd (); } + else if (cmd.command == "append") { out = handleAppend (); } + else if (cmd.command == "annotate") { out = handleAnnotate (); } + else if (cmd.command == "done") { out = handleDone (); } + else if (cmd.command == "undo") { out = handleUndo (); } + else if (cmd.command == "delete") { out = handleDelete (); } + else if (cmd.command == "undelete") { out = handleUndelete (); } + else if (cmd.command == "start") { out = handleStart (); } + else if (cmd.command == "stop") { out = handleStop (); } + else if (cmd.command == "export") { out = handleExport (); } /* - else if (cmd.command == "" && task.getId ()) { out = handleModify (); } + else if (cmd.command == "import") { out = handleImport (); } */ - else if (cmd.command == "append") { out = handleAppend (); } - else if (cmd.command == "annotate") { out = handleAnnotate (); } - else if (cmd.command == "done") { out = handleDone (); } - else if (cmd.command == "undo") { out = handleUndo (); } - else if (cmd.command == "delete") { out = handleDelete (); } - else if (cmd.command == "undelete") { out = handleUndelete (); } - else if (cmd.command == "start") { out = handleStart (); } - else if (cmd.command == "stop") { out = handleStop (); } - else if (cmd.command == "export") { out = handleExport (); } + else if (cmd.command == "duplicate") { out = handleDuplicate (); } /* - else if (cmd.command == "import") { out = handleImport (); } -*/ - else if (cmd.command == "duplicate") { out = handleDuplicate (); } -/* - else if (cmd.command == "edit") { out = handleEdit (); } + else if (cmd.command == "edit") { out = handleEdit (); } */ + else if (cmd.command == "" && + sequence.size ()) { out = handleModify (); } // Command that display IDs and therefore need TDB::gc first. - else if (cmd.command == "next") { if (!inShadow) gcMod = tdb.gc (); out = handleReportNext (); } - else if (cmd.validCustom (cmd.command)) { if (!inShadow) gcMod = tdb.gc (); out = handleCustomReport (cmd.command); } + else if (cmd.command == "next") { if (!inShadow) gcMod = tdb.gc (); out = handleReportNext (); } + else if (cmd.validCustom (cmd.command)) { if (!inShadow) gcMod = tdb.gc (); out = handleCustomReport (cmd.command); } // If the command is not recognized, display usage. - else { out = shortUsage (); } + else { out = shortUsage (); } // Only update the shadow file if such an update was not suppressed (shadow), // TODO diff --git a/src/command.cpp b/src/command.cpp index 2f1a47672..e6601fa30 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -761,57 +761,66 @@ std::string handleExport () //////////////////////////////////////////////////////////////////////////////// std::string handleModify () { -/* int count = 0; -*/ std::stringstream out; -/* - std::vector all; - tdb.allPendingT (all); - std::vector filtered = all; - filterSequence (filtered, task); - foreach (seq, filtered) + std::vector tasks; + context.tdb.lock (context.config.get ("locking", true)); + context.tdb.loadPending (tasks, context.filter); + handleRecurrence (tasks); + + // Filter sequence. + std::vector all = tasks; + context.filter.applySequence (tasks, context.sequence); + + foreach (task, tasks) { // Perform some logical consistency checks. - if (task.has ("recur") && - !task.has ("due") && - !seq->has ("due")) + if (context.task.has ("recur") && + !context.task.has ("due") && + !task->has ("due")) throw std::string ("You cannot specify a recurring task without a due date."); - if (task.has ("until") && - !task.has ("recur") && - !seq->has ("recur")) + if (context.task.has ("until") && + !context.task.has ("recur") && + !task->has ("recur")) throw std::string ("You cannot specify an until date for a non-recurring task."); // Make all changes. foreach (other, all) { - if (other->getId () == seq->getId () || // Self - (seq->has ("parent") && - seq->getAttribute ("parent") == other->getAttribute ("parent")) || // Sibling - other->getUUID () == seq->getAttribute ("parent")) // Parent + if (other->id == task->id || // Self + (task->has ("parent") && + task->get ("parent") == other->get ("parent")) || // Sibling + other->get ("uuid") == task->get ("parent")) // Parent { // A non-zero value forces a file write. int changes = 0; // Apply other deltas. - changes += deltaDescription (*other, task); - changes += deltaTags (*other, task); - changes += deltaAttributes (*other, task); - changes += deltaSubstitutions (*other, task); + changes += deltaDescription (*other); + context.task.remove ("description"); + + changes += deltaTags (*other); + context.task.remove ("tags"); + + changes += deltaAttributes (*other); + changes += deltaSubstitutions (*other); if (changes) - tdb.modifyT (*other); + context.tdb.update (*other); ++count; } } } + context.tdb.commit (); + context.tdb.unlock (); + if (context.config.get ("echo.command", true)) out << "Modified " << count << " task" << (count == 1 ? "" : "s") << std::endl; -*/ + return out.str (); }