Diagnostics

- Added new 'diagnostics' command to assist with bug reporting,
  testing.  It answers questions such as "did you compile it yourself?",
  and more.
- Specifically, it runs a UUID generation test to prove that the UUIDs
  are really unique.
This commit is contained in:
Paul Beckingham 2010-10-20 00:22:20 -04:00
parent 314f64f775
commit 1e37d7a784
16 changed files with 333 additions and 96 deletions

View file

@ -51,6 +51,7 @@
+ Two new color themes (thanks to Kathryn Andersen). + Two new color themes (thanks to Kathryn Andersen).
+ More localized holiday files for US, CA, SE, DE, FR, UK, ES and NL + More localized holiday files for US, CA, SE, DE, FR, UK, ES and NL
(thanks to T. Charles Yun). (thanks to T. Charles Yun).
+ Added new 'diagnostics' command to help with bug submission, testing.
+ Fixed bug #427, preventing the task edit command to parse annotation + Fixed bug #427, preventing the task edit command to parse annotation
dates with spaces. dates with spaces.
+ Fixed bug #433, making task command output more consistent. + Fixed bug #433, making task command output more consistent.

4
NEWS
View file

@ -40,6 +40,7 @@ New commands in taskwarrior 1.9.3
file from another taskwarrior user, to sync across machines, for example. file from another taskwarrior user, to sync across machines, for example.
- New 'task push <url>' command to distribute merged changes. - New 'task push <url>' command to distribute merged changes.
- New 'task pull <url>' command to copy data files from a remote location. - New 'task pull <url>' command to copy data files from a remote location.
- New 'diagnostics' command to aid bug reporting.
New configuration options in taskwarrior 1.9.3 New configuration options in taskwarrior 1.9.3
@ -65,14 +66,13 @@ Newly deprecated features in taskwarrior 1.9.3
obsolete. The 'task show' command warns of the use of these deprecated obsolete. The 'task show' command warns of the use of these deprecated
fields. The synonyms will be removed in a future version of taskwarrior. fields. The synonyms will be removed in a future version of taskwarrior.
--- ---
Taskwarrior has been built and tested on the following configurations: Taskwarrior has been built and tested on the following configurations:
* OS X 10.6 Snow Leopard and 10.5 Leopard * OS X 10.6 Snow Leopard and 10.5 Leopard
* Fedora 13 Goddard, 12 Constantine * Fedora 13 Goddard, 12 Constantine
* Ubuntu 10.04 Lucid Lynx, 9.10 Karmic Koala * Ubuntu 10.10 Maverick Meerkat, 10.04 Lucid Lynx
* Debian Sid * Debian Sid
* Slackware 12.2 * Slackware 12.2
* Arch Linux * Arch Linux

View file

@ -61,6 +61,8 @@
230 config 230 config
231 show 231 show
235 diagnostics
# 3xx Attributes - must be sequential # 3xx Attributes - must be sequential
300 project 300 project
301 priority 301 priority

View file

@ -1,7 +1,7 @@
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// taskwarrior - a command line task list manager. // taskwarrior - a command line task list manager.
// //
// Copyright 2006 - 2010, Paul Beckingham. // Copyright 2006 - 2010, Paul Beckingham, Federico Hernandez.
// All rights reserved. // All rights reserved.
// //
// This program is free software; you can redistribute it and/or modify it under // This program is free software; you can redistribute it and/or modify it under
@ -75,7 +75,8 @@ bool Cmd::valid (const std::string& input)
// //
// To be a valid custom command: // To be a valid custom command:
// 1. 'input' should autocomplete to one of 'commands'. // 1. 'input' should autocomplete to one of 'commands'.
// 2. the result, canonicalized, should autocomplete to one of 'customreports'. // 2. the result, canonicalized, should autocomplete to one of
// 'customreports'.
bool Cmd::validCustom (const std::string& input) bool Cmd::validCustom (const std::string& input)
{ {
load (); load ();
@ -152,6 +153,7 @@ void Cmd::load ()
commands.push_back (context.stringtable.get (CMD_CONFIG, "config")); commands.push_back (context.stringtable.get (CMD_CONFIG, "config"));
commands.push_back (context.stringtable.get (CMD_SHOW, "show")); commands.push_back (context.stringtable.get (CMD_SHOW, "show"));
commands.push_back (context.stringtable.get (CMD_DELETE, "delete")); commands.push_back (context.stringtable.get (CMD_DELETE, "delete"));
commands.push_back (context.stringtable.get (CMD_DIAGNOSTICS, "diagnostics"));
commands.push_back (context.stringtable.get (CMD_DONE, "done")); commands.push_back (context.stringtable.get (CMD_DONE, "done"));
commands.push_back (context.stringtable.get (CMD_DUPLICATE, "duplicate")); commands.push_back (context.stringtable.get (CMD_DUPLICATE, "duplicate"));
commands.push_back (context.stringtable.get (CMD_EDIT, "edit")); commands.push_back (context.stringtable.get (CMD_EDIT, "edit"));
@ -244,6 +246,7 @@ bool Cmd::isReadOnlyCommand ()
command == "ghistory.annual" || command == "ghistory.annual" ||
command == context.stringtable.get (CMD_CALENDAR, "calendar") || command == context.stringtable.get (CMD_CALENDAR, "calendar") ||
command == context.stringtable.get (CMD_COLORS, "colors") || command == context.stringtable.get (CMD_COLORS, "colors") ||
command == context.stringtable.get (CMD_DIAGNOSTICS, "diagnostics") ||
command == context.stringtable.get (CMD_CONFIG, "config") || command == context.stringtable.get (CMD_CONFIG, "config") ||
command == context.stringtable.get (CMD_SHOW, "show") || command == context.stringtable.get (CMD_SHOW, "show") ||
command == context.stringtable.get (CMD_HELP, "help") || command == context.stringtable.get (CMD_HELP, "help") ||

View file

@ -1,7 +1,7 @@
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// taskwarrior - a command line task list manager. // taskwarrior - a command line task list manager.
// //
// Copyright 2006 - 2010, Paul Beckingham. // Copyright 2006 - 2010, Paul Beckingham, Federico Hernandez.
// All rights reserved. // All rights reserved.
// //
// This program is free software; you can redistribute it and/or modify it under // This program is free software; you can redistribute it and/or modify it under

View file

@ -245,6 +245,7 @@ int Context::dispatch (std::string &out)
handleMerge (out); } handleMerge (out); }
else if (cmd.command == "push") { handlePush (out); } else if (cmd.command == "push") { handlePush (out); }
else if (cmd.command == "pull") { handlePull (out); } else if (cmd.command == "pull") { handlePull (out); }
else if (cmd.command == "diagnostics") { handleDiagnostics (out); }
else if (cmd.command == "_projects") { rc = handleCompletionProjects (out); } else if (cmd.command == "_projects") { rc = handleCompletionProjects (out); }
else if (cmd.command == "_tags") { rc = handleCompletionTags (out); } else if (cmd.command == "_tags") { rc = handleCompletionTags (out); }
else if (cmd.command == "_commands") { rc = handleCompletionCommands (out); } else if (cmd.command == "_commands") { rc = handleCompletionCommands (out); }

View file

@ -13,9 +13,10 @@ task_SOURCES = API.cpp API.h Att.cpp Att.h Cmd.cpp Cmd.h Color.cpp Color.h \
Timer.cpp Timer.h Transport.cpp Transport.h TransportSSH.cpp \ Timer.cpp Timer.h Transport.cpp Transport.h TransportSSH.cpp \
TransportSSH.h TransportRSYNC.cpp TransportRSYNC.h \ TransportSSH.h TransportRSYNC.cpp TransportRSYNC.h \
TransportCurl.cpp TransportCurl.h Tree.cpp Tree.h command.cpp \ TransportCurl.cpp TransportCurl.h Tree.cpp Tree.h command.cpp \
custom.cpp dependency.cpp edit.cpp export.cpp i18n.h import.cpp \ custom.cpp dependency.cpp diag.cpp edit.cpp export.cpp i18n.h \
interactive.cpp main.cpp main.h recur.cpp report.cpp rules.cpp \ import.cpp interactive.cpp main.cpp main.h recur.cpp report.cpp \
rx.cpp rx.h text.cpp text.h util.cpp util.h Uri.cpp Uri.h rules.cpp rx.cpp rx.h text.cpp text.h util.cpp util.h Uri.cpp \
Uri.h
task_CPPFLAGS=$(LUA_CFLAGS) task_CPPFLAGS=$(LUA_CFLAGS)
task_LDFLAGS=$(LUA_LFLAGS) task_LDFLAGS=$(LUA_LFLAGS)

View file

@ -52,7 +52,7 @@
extern Context context; extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleAdd (std::string &outs) int handleAdd (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -145,7 +145,7 @@ int handleAdd (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleLog (std::string &outs) int handleLog (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -210,7 +210,7 @@ int handleLog (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleProjects (std::string &outs) int handleProjects (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -313,7 +313,7 @@ int handleProjects (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleCompletionProjects (std::string &outs) int handleCompletionProjects (std::string& outs)
{ {
std::vector <Task> tasks; std::vector <Task> tasks;
context.tdb.lock (context.config.getBoolean ("locking")); context.tdb.lock (context.config.getBoolean ("locking"));
@ -343,7 +343,7 @@ int handleCompletionProjects (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleTags (std::string &outs) int handleTags (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -431,7 +431,7 @@ int handleTags (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleCompletionTags (std::string &outs) int handleCompletionTags (std::string& outs)
{ {
std::vector <Task> tasks; std::vector <Task> tasks;
context.tdb.lock (context.config.getBoolean ("locking")); context.tdb.lock (context.config.getBoolean ("locking"));
@ -466,7 +466,7 @@ int handleCompletionTags (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleCompletionCommands (std::string &outs) int handleCompletionCommands (std::string& outs)
{ {
// Get a list of all commands. // Get a list of all commands.
std::vector <std::string> commands; std::vector <std::string> commands;
@ -484,7 +484,7 @@ int handleCompletionCommands (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleCompletionConfig (std::string &outs) int handleCompletionConfig (std::string& outs)
{ {
std::vector <std::string> configs; std::vector <std::string> configs;
context.config.all (configs); context.config.all (configs);
@ -501,7 +501,7 @@ int handleCompletionConfig (std::string &outs)
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// A simple version display for use by completion scripts and the task-update // A simple version display for use by completion scripts and the task-update
// script. // script.
int handleCompletionVersion (std::string &outs) int handleCompletionVersion (std::string& outs)
{ {
outs = VERSION; outs = VERSION;
outs += "\n"; outs += "\n";
@ -510,7 +510,7 @@ int handleCompletionVersion (std::string &outs)
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Temporary command to display urgency for a task. // Temporary command to display urgency for a task.
int handleUrgency (std::string &outs) int handleUrgency (std::string& outs)
{ {
// Get all the tasks. // Get all the tasks.
std::vector <Task> tasks; std::vector <Task> tasks;
@ -539,7 +539,7 @@ int handleUrgency (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleCompletionIDs (std::string &outs) int handleCompletionIDs (std::string& outs)
{ {
std::vector <Task> tasks; std::vector <Task> tasks;
context.tdb.lock (context.config.getBoolean ("locking")); context.tdb.lock (context.config.getBoolean ("locking"));
@ -777,7 +777,7 @@ void handlePull (std::string& outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleVersion (std::string &outs) int handleVersion (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -866,7 +866,7 @@ int handleVersion (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleShow (std::string &outs) int handleShow (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -1135,7 +1135,7 @@ int handleShow (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleConfig (std::string &outs) int handleConfig (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -1259,7 +1259,7 @@ int handleConfig (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleDelete (std::string &outs) int handleDelete (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -1392,7 +1392,7 @@ int handleDelete (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleStart (std::string &outs) int handleStart (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -1458,7 +1458,7 @@ int handleStart (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleStop (std::string &outs) int handleStop (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -1516,7 +1516,7 @@ int handleStop (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleDone (std::string &outs) int handleDone (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -1624,7 +1624,7 @@ int handleDone (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleModify (std::string &outs) int handleModify (std::string& outs)
{ {
context.hooks.trigger ("pre-modify-command"); context.hooks.trigger ("pre-modify-command");
@ -1755,7 +1755,7 @@ int handleModify (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleAppend (std::string &outs) int handleAppend (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -1837,7 +1837,7 @@ int handleAppend (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handlePrepend (std::string &outs) int handlePrepend (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -1919,7 +1919,7 @@ int handlePrepend (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleDuplicate (std::string &outs) int handleDuplicate (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -2088,7 +2088,7 @@ void handleShell ()
#endif #endif
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleColor (std::string &outs) int handleColor (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -2301,7 +2301,7 @@ int handleColor (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleAnnotate (std::string &outs) int handleAnnotate (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -2362,7 +2362,7 @@ int handleAnnotate (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleDenotate (std::string &outs) int handleDenotate (std::string& outs)
{ {
int rc = 0; int rc = 0;

View file

@ -53,7 +53,7 @@ static std::vector <std::string> customReports;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// This report will eventually become the one report that many others morph into // This report will eventually become the one report that many others morph into
// via the .taskrc file. // via the .taskrc file.
int handleCustomReport (const std::string& report, std::string &outs) int handleCustomReport (const std::string& report, std::string& outs)
{ {
int rc = 0; int rc = 0;

221
src/diag.cpp Normal file
View file

@ -0,0 +1,221 @@
////////////////////////////////////////////////////////////////////////////////
// taskwarrior - a command line task list manager.
//
// Copyright 2006 - 2010, 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 <iostream>
#include <iomanip>
#include <sstream>
#include <algorithm>
#include <string>
#include <unistd.h>
#include <stdlib.h>
#include <File.h>
#include <main.h>
#include <util.h>
#include "../auto.h"
#ifdef HAVE_LIBLUA
extern "C"
{
#include <lua.h>
}
#endif
#ifdef HAVE_LIBNCURSES
#include <ncurses.h>
#endif
extern Context context;
////////////////////////////////////////////////////////////////////////////////
// This command will generate output that is intended to help diagnose problems.
//
// Although this will change over time, initially this command will answer the
// kind of questions we always have to ask whenever something is wrong.
void handleDiagnostics (std::string& outs)
{
std::cout << "\n" << PACKAGE_STRING << "\n";
std::cout << " Platform: "
<<
#if defined (DARWIN)
"Darwin"
#elif defined (SOLARIS)
"Solaris"
#elif defined (CYGWIN)
"Cygwin"
#elif defined (OPENBSD)
"OpenBSD"
#elif defined (HAIKU)
"Haiku"
#elif defined (FREEBSD)
"FreeBSD"
#elif defined (LINUX)
"Linux"
#else
"<unknown>"
#endif
<< "\n\n";
// Compiler.
std::cout << "Compiler\n"
#ifdef __VERSION__
<< " Version: " << __VERSION__ << "\n"
#endif
<< " Caps:"
#ifdef __STDC__
<< " +stdc"
#endif
#ifdef __STDC_HOSTED__
<< " +stdc_hosted"
#endif
#ifdef __STDC_VERSION__
<< " +" << __STDC_VERSION__
#endif
#ifdef _POSIX_VERSION
<< " +" << _POSIX_VERSION
#endif
#ifdef _POSIX2_C_VERSION
<< " +" << _POSIX2_C_VERSION
#endif
#ifdef _ILP32
<< " +ILP32"
#endif
#ifdef _LP64
<< " +LP64"
#endif
<< " +c" << sizeof (char)
<< " +i" << sizeof (int)
<< " +l" << sizeof (long)
<< " +vp" << sizeof (void*)
<< "\n\n";
std::cout << "Libraries\n";
// NCurses.
std::cout << " NCurses: "
#ifdef HAVE_LIBNCURSES
<< NCURSES_VERSION
<< " ("
<< NCURSES_VERSION_PATCH
<< ")"
#else
<< "n/a"
#endif
<< "\n";
std::cout << " Readline: "
#ifdef HAVE_LIBREADLINE
<< std::setbase (16) << RL_READLINE_VERSION
#else
<< "n/a"
#endif
<< "\n";
std::cout << " Lua: "
#ifdef HAVE_LIBLUA
<< LUA_RELEASE
#else
<< "n/a"
#endif
<< "\n\n";
std::cout << "Build Features\n"
// Build date.
<< " Built: " << __DATE__ << " " << __TIME__ << "\n"
<< " Caps:"
#ifdef HAVE_LIBPTHREAD
<< " +pthreads"
#else
<< " -pthreads"
#endif
#ifdef HAVE_SRANDOM
<< " +srandom"
#else
<< " -srandom"
#endif
#ifdef HAVE_RANDOM
<< " +random"
#else
<< " -random"
#endif
#ifdef HAVE_UUID
<< " +uuid"
#else
<< " -uuid"
#endif
<< "\n\n";
// Config: .taskrc found, readable, writable
std::cout << "Configuration\n"
<< " File: " << context.config.original_file.data
<< (context.config.original_file.exists () ? " (found)" : " (missing)")
<< ", " << context.config.original_file.size () << " bytes"
<< ", mode "
<< std::setbase (8)
<< context.config.original_file.mode ()
<< "\n";
// Config: data.location found, readable, writable
File location (context.config.get ("data.location"));
std::cout << " Data: " << location.data
<< (location.exists () ? " (found)" : " (missing)")
<< ", " << (location.is_directory () ? "dir" : "?")
<< ", mode "
<< std::setbase (8)
<< location.mode ()
<< "\n\n";
// Generate 1000 UUIDs and verify they are all unique.
std::cout << "Tests\n";
{
std::cout << " UUID gen: ";
std::vector <std::string> uuids;
std::string id;
for (int i = 0; i < 1000; i++)
{
id = uuid ();
if (std::find (uuids.begin (), uuids.end (), id) != uuids.end ())
{
std::cout << "Failed - duplicate UUID at iteration " << i << "\n";
break;
}
else
uuids.push_back (id);
}
if (uuids.size () >= 1000)
std::cout << "1000 unique UUIDs generated.\n";
}
std::cout << "\n";
}
////////////////////////////////////////////////////////////////////////////////

View file

@ -626,7 +626,7 @@ ARE_THESE_REALLY_HARMFUL:
// Introducing the Silver Bullet. This feature is the catch-all fixative for // Introducing the Silver Bullet. This feature is the catch-all fixative for
// various other ills. This is like opening up the hood and going in with a // various other ills. This is like opening up the hood and going in with a
// wrench. To be used sparingly. // wrench. To be used sparingly.
int handleEdit (std::string &outs) int handleEdit (std::string& outs)
{ {
int rc = 0; int rc = 0;

View file

@ -38,7 +38,7 @@
extern Context context; extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleExportCSV (std::string &outs) int handleExportCSV (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -92,7 +92,7 @@ int handleExportCSV (std::string &outs)
// http://tools.ietf.org/html/rfc5545 // http://tools.ietf.org/html/rfc5545
// //
// Note: Recurring tasks could be included in more detail. // Note: Recurring tasks could be included in more detail.
int handleExportiCal (std::string &outs) int handleExportiCal (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -226,7 +226,7 @@ int handleExportiCal (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleExportYAML (std::string &outs) int handleExportYAML (std::string& outs)
{ {
int rc = 0; int rc = 0;

View file

@ -1,7 +1,7 @@
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// taskwarrior - a command line task list manager. // taskwarrior - a command line task list manager.
// //
// Copyright 2006 - 2010, Paul Beckingham. // Copyright 2006 - 2010, Paul Beckingham, Federico Hernandez.
// All rights reserved. // All rights reserved.
// //
// This program is free software; you can redistribute it and/or modify it under // This program is free software; you can redistribute it and/or modify it under
@ -101,6 +101,7 @@
#define CMD_MERGE 232 #define CMD_MERGE 232
#define CMD_PUSH 233 #define CMD_PUSH 233
#define CMD_PULL 234 #define CMD_PULL 234
#define CMD_DIAGNOSTICS 235
// 3xx Attributes // 3xx Attributes
#define ATT_PROJECT 300 #define ATT_PROJECT 300

View file

@ -1254,7 +1254,7 @@ static std::string importYAML (const std::vector <std::string>& lines)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleImport (std::string &outs) int handleImport (std::string& outs)
{ {
int rc = 0; int rc = 0;

View file

@ -92,6 +92,9 @@ int deltaTags (Task&);
int deltaAttributes (Task&); int deltaAttributes (Task&);
int deltaSubstitutions (Task&); int deltaSubstitutions (Task&);
// diag.cpp
void handleDiagnostics (std::string&);
// edit.cpp // edit.cpp
int handleEdit (std::string&); int handleEdit (std::string&);

View file

@ -56,7 +56,7 @@ static void countTasks (const std::vector <Task>&, const std::string&, const std
extern Context context; extern Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int shortUsage (std::string &outs) int shortUsage (std::string& outs)
{ {
Table table; Table table;
@ -236,6 +236,10 @@ int shortUsage (std::string &outs)
table.addCell (row, 1, "task config [name [value | '']]"); table.addCell (row, 1, "task config [name [value | '']]");
table.addCell (row, 2, "Add, modify and remove settings in the task configuration."); table.addCell (row, 2, "Add, modify and remove settings in the task configuration.");
row = table.addRow ();
table.addCell (row, 1, "task diagnostics");
table.addCell (row, 2, "Information needed when reporting a problem.");
row = table.addRow (); row = table.addRow ();
table.addCell (row, 1, "task help"); table.addCell (row, 1, "task help");
table.addCell (row, 2, "Shows the long usage text."); table.addCell (row, 2, "Shows the long usage text.");
@ -269,7 +273,7 @@ int shortUsage (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int longUsage (std::string &outs) int longUsage (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -351,7 +355,7 @@ int longUsage (std::string &outs)
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// Display all information for the given task. // Display all information for the given task.
int handleInfo (std::string &outs) int handleInfo (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -660,7 +664,7 @@ int handleInfo (std::string &outs)
// Project Remaining Avg Age Complete 0% 100% // Project Remaining Avg Age Complete 0% 100%
// A 12 13d 55% XXXXXXXXXXXXX----------- // A 12 13d 55% XXXXXXXXXXXXX-----------
// B 109 3d 12h 10% XXX--------------------- // B 109 3d 12h 10% XXX---------------------
int handleReportSummary (std::string &outs) int handleReportSummary (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -848,7 +852,7 @@ time_t yearlyEpoch (const std::string& date)
return 0; return 0;
} }
int handleReportHistoryMonthly (std::string &outs) int handleReportHistoryMonthly (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -1015,7 +1019,7 @@ int handleReportHistoryMonthly (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleReportHistoryAnnual (std::string &outs) int handleReportHistoryAnnual (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -1179,7 +1183,7 @@ int handleReportHistoryAnnual (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleReportGHistoryMonthly (std::string &outs) int handleReportGHistoryMonthly (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -1386,7 +1390,7 @@ int handleReportGHistoryMonthly (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleReportGHistoryAnnual (std::string &outs) int handleReportGHistoryAnnual (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -1589,7 +1593,7 @@ int handleReportGHistoryAnnual (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleReportTimesheet (std::string &outs) int handleReportTimesheet (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -2004,7 +2008,7 @@ std::string renderMonths (
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleReportCalendar (std::string &outs) int handleReportCalendar (std::string& outs)
{ {
int rc = 0; int rc = 0;
@ -2360,7 +2364,7 @@ int handleReportCalendar (std::string &outs)
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int handleReportStats (std::string &outs) int handleReportStats (std::string& outs)
{ {
int rc = 0; int rc = 0;