Bug #480 - @ Symbol in context not returning

- Fixed bug #480, which didn't properly support @ characters in tags.
  The problem was that the ctype.h ispunct() function considers @,
  # and $ to be punctuation, which I don't.  An override now allows
  these characters in tags, and specificallt '+@context' style tags.
- Added unit tests.
This commit is contained in:
Paul Beckingham 2010-08-24 19:08:08 -04:00
parent 3cfcc9fb6b
commit 58d678f927
5 changed files with 100 additions and 6 deletions

View file

@ -60,6 +60,8 @@
+ Fixed bug #466, which gave the wrong error message when a custom report + Fixed bug #466, which gave the wrong error message when a custom report
was missing a direction indicator for the sort order. was missing a direction indicator for the sort order.
+ Fixed bug #470, which caused task to not support the color 'none'. + Fixed bug #470, which caused task to not support the color 'none'.
+ Fixed bug #480, which didn't properly support @ characters in tags. This
also now supports $ and #.
+ Fixed problem with command line configuration overrides that had no + Fixed problem with command line configuration overrides that had no
values. values.
+ Fixed problem with the 'undo' command not observing the rc.color or the + Fixed problem with the 'undo' command not observing the rc.color or the

1
NEWS
View file

@ -14,6 +14,7 @@ New Features in taskwarrior 1.9.3
- New merge capability for syncing task data files. - New merge capability for syncing task data files.
- When completing or modifying a task, the project status is displayed. - When completing or modifying a task, the project status is displayed.
- The 'info' report is now colorized. - The 'info' report is now colorized.
- Certain characters (#, $, @) are now supported for use in tags.
Please refer to the ChangeLog file for full details. There are too many to Please refer to the ChangeLog file for full details. There are too many to
list here. list here.

75
src/tests/bug.480.t Executable file
View file

@ -0,0 +1,75 @@
#! /usr/bin/perl
################################################################################
## taskwarrior - a command line task list manager.
##
## Copyright 2006 - 2010, Paul Beckingham.
## 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
##
################################################################################
use strict;
use warnings;
use Test::More tests => 13;
# Create the rc file.
if (open my $fh, '>', 'bug.rc')
{
print $fh "data.location=.\n";
close $fh;
ok (-r 'bug.rc', 'Created bug.rc');
}
# Bug #480 - putting a '@' character in tags breaks filters.
qx{../task rc:bug.rc add one +ordinary};
qx{../task rc:bug.rc add two +\@strange};
my $output = qx{../task rc:bug.rc long +ordinary};
like ($output, qr/one/, '+ordinary explicitly included');
unlike ($output, qr/two/, '@strange implicitly excluded');
$output = qx{../task rc:bug.rc long -ordinary};
unlike ($output, qr/one/, '-ordinary explicitly excluded');
like ($output, qr/two/, '@strange implicitly included');
$output = qx{../task rc:bug.rc long +\@strange};
unlike ($output, qr/one/, '-ordinary implicitly excluded');
like ($output, qr/two/, '@strange explicitly included');
$output = qx{../task rc:bug.rc long -\@strange};
like ($output, qr/one/, '+ordinary implicitly included');
unlike ($output, qr/two/, '@strange explicitly excluded');
# Cleanup.
unlink 'pending.data';
ok (!-r 'pending.data', 'Removed pending.data');
unlink 'completed.data';
ok (!-r 'completed.data', 'Removed completed.data');
unlink 'undo.data';
ok (!-r 'undo.data', 'Removed undo.data');
unlink 'bug.rc';
ok (!-r 'bug.rc', 'Removed bug.rc');
exit 0;

View file

@ -455,13 +455,13 @@ bool isWordStart (const std::string& input, std::string::size_type pos)
return false; return false;
// If pos is the first non space/punct character of the string. // If pos is the first non space/punct character of the string.
if (pos == 0 && !isspace (input[pos]) && !ispunct (input[pos])) if (pos == 0 && !isspace (input[pos]) && !isPunctuation (input[pos]))
return true; return true;
// If pos is not the first alphanumeric character, but there is a preceding // If pos is not the first alphanumeric character, but there is a preceding
// space/punct character. // space/punct character.
if (pos > 0 && !isspace (input[pos]) && !ispunct (input[pos]) if (pos > 0 && !isspace (input[pos]) && !isPunctuation (input[pos])
&& (isspace (input[pos - 1]) || ispunct (input[pos - 1]))) && (isspace (input[pos - 1]) || isPunctuation (input[pos - 1])))
return true; return true;
return false; return false;
@ -477,18 +477,33 @@ bool isWordEnd (const std::string& input, std::string::size_type pos)
return false; return false;
// If pos is the last alphanumeric character of the string. // If pos is the last alphanumeric character of the string.
if (pos == input.length () - 1 && !isspace (input[pos]) && !ispunct (input[pos])) if (pos == input.length () - 1 && !isspace (input[pos]) && !isPunctuation (input[pos]))
return true; return true;
// If pos is not the last alphanumeric character, but there is a following // If pos is not the last alphanumeric character, but there is a following
// non-alphanumeric character. // non-alphanumeric character.
if (pos < input.length () - 1 && !isspace (input[pos]) && !ispunct (input[pos]) if (pos < input.length () - 1 && !isspace (input[pos]) && !isPunctuation (input[pos])
&& (isspace (input[pos + 1]) || ispunct (input[pos + 1]))) && (isspace (input[pos + 1]) || isPunctuation (input[pos + 1])))
return true; return true;
return false; return false;
} }
////////////////////////////////////////////////////////////////////////////////
// Override of ispunct, that considers #, $ and @ not to be punctuation.
//
// ispunct: ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~
// Punctuation: ! " % & ' ( ) * + , - . / : ; < = > ? [ \ ] ^ _ ` { | } ~
// delta: # $ @
//
bool isPunctuation (char c)
{
if (c == '@' || c == '#' || c == '$')
return false;
return ispunct (c);
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
bool compare ( bool compare (
const std::string& left, const std::string& left,

View file

@ -55,6 +55,7 @@ bool noSpaces (const std::string&);
bool noVerticalSpace (const std::string&); bool noVerticalSpace (const std::string&);
bool isWordStart (const std::string&, std::string::size_type); bool isWordStart (const std::string&, std::string::size_type);
bool isWordEnd (const std::string&, std::string::size_type); bool isWordEnd (const std::string&, std::string::size_type);
bool isPunctuation (char);
bool compare (const std::string&, const std::string&, bool sensitive = true); bool compare (const std::string&, const std::string&, bool sensitive = true);
std::string::size_type find (const std::string&, const std::string&, bool sensitive = true); std::string::size_type find (const std::string&, const std::string&, bool sensitive = true);
std::string::size_type find (const std::string&, const std::string&, std::string::size_type, bool sensitive = true); std::string::size_type find (const std::string&, const std::string&, std::string::size_type, bool sensitive = true);