[TS-30] re-enable limit as optional last argument

* With this commit the limit argument to the review command is re-enabled.
  If it is pass with an filter argument it needs to be the last
  argument. Otherwise it might be hard to distinguish between limit and
  filter.
* An additional is_number function is introduced to check if the last
  argument is numeric and can be treated as a limit.
This commit is contained in:
Sebastian Oeste 2018-04-03 21:10:42 +02:00
parent b7c16ae23b
commit 7e0cfbbf7d

View file

@ -300,28 +300,41 @@ static void configureReport()
} }
} }
////////////////////////////////////////////////////////////////////////////////
static bool is_number (const std::string& s)
{
return !s.empty () && std::find_if(s.begin (),
s.end (), [] (char c) { return !std::isdigit (c); }) == s.end ();
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int cmdReview (const std::vector <std::string>& args, bool autoClear) int cmdReview (const std::vector <std::string>& args, bool autoClear)
{ {
// Is there a specified limit? // Is there a specified limit?
//unsigned int limit = 0; unsigned int limit = std::numeric_limits<unsigned int>::max ();
unsigned int limit = std::numeric_limits<unsigned int>::max();
int status = 0;
bool with_filter = false; bool with_filter = false;
std::string input; std::string input;
std::string output; std::string output;
std::vector<std::string> filter; // here we store our filter arguments std::vector<std::string> filter; // here we store our filter arguments
//if (args.size () == 2)
//limit = strtol (args[1].c_str (), NULL, 10);
if (args.size () > 1) if (args.size () > 1)
{
auto begin = args.begin ();
auto end = args.end ();
if (is_number (args.back ())) // if last argument is numeric, treat it as limit.
{
limit = strtol (args.back ().c_str (), NULL, 10);
std::advance(end, -1);
}
std::advance (begin, 1);
if (begin != end)
{ {
with_filter = true; with_filter = true;
auto begin = args.begin(); std::copy (begin, end, std::back_inserter (filter));
std::advance(begin, 1);
std::copy(begin, args.end(), std::back_inserter(filter));
//TODO: maybe also add "status:pending" ? //TODO: maybe also add "status:pending" ?
filter.push_back("uuids"); filter.emplace_back ("uuids");
}
} }
configureReport (); configureReport ();
@ -329,9 +342,7 @@ int cmdReview (const std::vector <std::string>& args, bool autoClear)
if (with_filter) if (with_filter)
{ {
// Obtain list of UUIDs to review, when a filter is given // Obtain list of UUIDs to review, when a filter is given
status = execute ("task", execute ("task", filter, input, output);
filter,
input, output);
// Review the set of UUIDs. // Review the set of UUIDs.
auto uuids = split (Lexer::trimRight (output, "\n"), ' '); auto uuids = split (Lexer::trimRight (output, "\n"), ' ');
reviewLoop (uuids, limit, autoClear); reviewLoop (uuids, limit, autoClear);
@ -339,7 +350,7 @@ int cmdReview (const std::vector <std::string>& args, bool autoClear)
else else
{ {
// Obtain a list of UUIDs to review. // Obtain a list of UUIDs to review.
status = execute ("task", execute ("task",
{ {
"rc.color=off", "rc.color=off",
"rc.detection=off", "rc.detection=off",