diff --git a/AUTHORS b/AUTHORS index 4fdb2ecd0..72134939a 100644 --- a/AUTHORS +++ b/AUTHORS @@ -10,6 +10,7 @@ contributions of the following people: Dirk Deimeke (Technical Advisor & Marketing) Wim Schuermann (Contributing Author) Owen Clarke (Contributing Author) + Louis-Claude Canon (Contributing Author) The following submitted code, packages or analysis, and deserve special thanks: @@ -71,7 +72,6 @@ The following submitted code, packages or analysis, and deserve special thanks: Sam Stuck Christoph Robbert Oleksii Tsai - Louis-Claude Canon Jörg Plate Thanks to the following, who submitted detailed bug reports and excellent @@ -143,4 +143,5 @@ suggestions: Nicholas Rabenau Bruno Bigras Hyde Stevenson + Martin U diff --git a/ChangeLog b/ChangeLog index c123a4dfb..da626a0d4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -82,6 +82,9 @@ Bugs + Fixed bug #990, which prevents color precedence to be applied correctly for tagged tasks. + Fixed bug #1001, which caused a segv (thanks to Bryce Harrington). + + Fixed bug #1006, #1024, which caused words like the German 'im' and 'des' in + a description to be expanded into 'imask' and 'description' (thanks to + Louis-Claude Canon and Martin U). + Fixed bug #1008, which failed to remove tasks with the special tag '+nocal' from the calendar report output with 'calendar.details=full' set (thanks to Bryan Kam). diff --git a/NEWS b/NEWS index 93dec3196..bda4f3796 100644 --- a/NEWS +++ b/NEWS @@ -7,6 +7,7 @@ New Features in taskwarrior 2.0.1 opportunity to work on a task. - All tasks may now be given an 'until' date, after which they will expire and are deleted. + - User defined attributes. Please refer to the ChangeLog file for full details. There are too many to list here. diff --git a/src/A3.cpp b/src/A3.cpp index c0b056974..6a2ee5ebe 100644 --- a/src/A3.cpp +++ b/src/A3.cpp @@ -1301,12 +1301,13 @@ bool A3::is_attr (Nibbler& n, Arg& arg) { n.save (); std::string name; + std::string canonical; std::string value; // If there is a valid attribute name. if (n.getName (name) && name.length () && - is_attribute (name, name)) + is_attribute (name, canonical)) { if (n.skip (':')) { @@ -1326,13 +1327,13 @@ bool A3::is_attr (Nibbler& n, Arg& arg) return false; */ - arg._raw = name + ':' + value; + arg._raw = canonical + ':' + value; arg._category = Arg::cat_attr; // Most attributes are standard, some are pseudo-attributes, such as // 'limit:page', which is not represented by a column object, and // therefore not stored. - std::map::iterator i = context.columns.find (name); + std::map::iterator i = context.columns.find (canonical); if (i != context.columns.end ()) arg._type = Arg::type_id (i->second->type ()); else @@ -1353,6 +1354,7 @@ bool A3::is_attmod (Nibbler& n, Arg& arg) { n.save (); std::string name; + std::string canonical; std::string modifier; std::string value; // time_t date; @@ -1360,7 +1362,7 @@ bool A3::is_attmod (Nibbler& n, Arg& arg) // If there is a valid attribute name. if (n.getName (name) && name.length () && - is_attribute (name, name)) + is_attribute (name, canonical)) { if (n.skip ('.')) { @@ -1395,8 +1397,8 @@ bool A3::is_attmod (Nibbler& n, Arg& arg) return false; */ - arg._raw = name + '.' + modifier + ':' + value; - Column* col = context.columns[name]; + arg._raw = canonical + '.' + modifier + ':' + value; + Column* col = context.columns[canonical]; arg._type = col ? Arg::type_id (col->type ()) : Arg::type_pseudo; arg._category = Arg::cat_attmod; return true; @@ -1472,6 +1474,7 @@ bool A3::is_dom (Nibbler& n, Arg& arg) { n.save (); std::string name; + std::string canonical; int id; std::string uuid; @@ -1505,11 +1508,12 @@ bool A3::is_dom (Nibbler& n, Arg& arg) n.skip ('.') && n.getName (name) && name.length () && - is_attribute (name, name)) + is_attribute (name, canonical)) { - result = format (id) + '.' + name; + name = canonical; + result = format (id) + '.' + name; arg._raw = result; - Column* col = context.columns[name]; + Column* col = context.columns[name]; arg._type = col ? Arg::type_id (col->type ()) : Arg::type_pseudo; arg._category = Arg::cat_dom; return true; @@ -1522,10 +1526,11 @@ bool A3::is_dom (Nibbler& n, Arg& arg) n.skip ('.') && n.getName (name) && name.length () && - is_attribute (name, name)) + is_attribute (name, canonical)) { + name = canonical; arg._raw = uuid + '.' + name; - Column* col = context.columns[name]; + Column* col = context.columns[name]; arg._type = col ? Arg::type_id (col->type ()) : Arg::type_pseudo; arg._category = Arg::cat_dom; return true; @@ -1536,12 +1541,13 @@ bool A3::is_dom (Nibbler& n, Arg& arg) // Attribute. if (n.getName (name) && name.length () && - is_attribute (name, name)) + is_attribute (name, canonical)) { if (name != "limit") { arg._raw = name; - Column* col = context.columns[name]; + arg._value = canonical; + Column* col = context.columns[canonical]; arg._type = col ? Arg::type_id (col->type ()) : Arg::type_pseudo; arg._category = Arg::cat_dom; return true;