- fixed issue with user names containing @ characters
- updated ChangeLog
- updated task-sync.5
This commit is contained in:
Johannes Schlatow 2010-12-24 01:00:03 +01:00
parent d44e592635
commit ee77debfce
4 changed files with 103 additions and 40 deletions

View file

@ -35,12 +35,17 @@
+ Fixed bug #538, where some color legend items were not readable. + Fixed bug #538, where some color legend items were not readable.
+ Fixed bug #539, where the man page task-color(5) contained a line that + Fixed bug #539, where the man page task-color(5) contained a line that
began with a ' and was not displayed. began with a ' and was not displayed.
+ Fixed bug #540, where user names containing @s could not be parsed
+ Fixed bug #542, which sorted the countdown columns incorrectly (thanks to + Fixed bug #542, which sorted the countdown columns incorrectly (thanks to
Michelle Crane). Michelle Crane).
+ Fixed bug #555, which caused a segfault when logging a task with a project + Fixed bug #555, which caused a segfault when logging a task with a project
(thanks to Itay Perl). (thanks to Itay Perl).
+ Fixed bug #570, which used unsupported brace expansion with dash (default
/bin/sh in Ubuntu)
+ Fixed bug #579, which displayed incorrect counts when using the 'limit:N' + Fixed bug #579, which displayed incorrect counts when using the 'limit:N'
filter (thanks to Thomas Sattler). filter (thanks to Thomas Sattler).
+ Fixed bug #580, where reusing the merge uri for autopush failed when the
uri was taken from taskrc
------ old releases ------------------------------ ------ old releases ------------------------------

View file

@ -134,6 +134,21 @@ https://host[:port]/path/to/undo.data
ftp://[user@]host[:port]/path/to/undo.data ftp://[user@]host[:port]/path/to/undo.data
.RE .RE
You can use single quotes to encapsulate user names that contain delimiting
characters like '@', '/' or ':', e.g.:
.br
.RS
ssh://'user@name'@host/
.RE
Remember to escape the quotes on your shell:
.br
.RS
$ task push ftp://\'user@name\':host/
.RE
.SH CONFLICTS .SH CONFLICTS
When modifications on the local and remote machine conflict, for example if When modifications on the local and remote machine conflict, for example if
both machines change the project name of the same task to different values, both machines change the project name of the same task to different values,

View file

@ -198,54 +198,74 @@ void Uri::parse ()
} }
std::string::size_type pos; std::string::size_type pos;
std::string uripart; std::string uripart;
std::string pathDelimiter = "/"; std::string pathDelimiter = "/";
user = ""; user = "";
port = ""; port = "";
// skip ^.*:// // skip ^.*://
if ((pos = data.find ("://")) != std::string::npos) if ((pos = data.find ("://")) != std::string::npos)
{ {
protocol = data.substr(0, pos); protocol = data.substr(0, pos);
data = data.substr (pos+3); data = data.substr (pos+3);
// standard syntax: protocol://[user@]host.xz[:port]/path/to/undo.data // standard syntax: protocol://[user@]host.xz[:port]/path/to/undo.data
pathDelimiter = "/"; pathDelimiter = "/";
} }
else else
{ {
protocol = "ssh"; protocol = "ssh";
// scp-like syntax: [user@]host.xz:path/to/undo.data // scp-like syntax: [user@]host.xz:path/to/undo.data
pathDelimiter = ":"; pathDelimiter = ":";
} }
// get host part // user delimited by single quotes?
if ((pos = data.find (pathDelimiter)) != std::string::npos) if ( data[0] == '\''
{ && (pos = data.find("'", 1)) != std::string::npos )
host = data.substr (0, pos); {
path = data.substr (pos+1); if (data[pos+1] == '@')
} {
else // end of user name
{ user = data.substr (1, pos-1);
data = data.substr (pos+2);
}
else
{
throw std::string ("Could not parse uri '") + data + "', wrong usage of single quotes.";
}
}
else
{
// find user name
if ((pos = data.find ("@")) != std::string::npos)
{
user = data.substr (0, pos);
data = data.substr (pos+1);
}
}
// get host, port and path
if ((pos = data.find (pathDelimiter)) != std::string::npos)
{
host = data.substr (0, pos);
path = data.substr (pos+1);
}
else
{
throw std::string ("The uri '") + data + "' is not in the expected format."; throw std::string ("The uri '") + data + "' is not in the expected format.";
} }
// parse host // port specified?
if ((pos = host.find ("@")) != std::string::npos) // remark: this find() will never be != npos for scp-like syntax
{ // because we found pathDelimiter, which is ":", before
user = host.substr (0, pos); if ((pos = host.find (":")) != std::string::npos)
host = host.substr (pos+1); {
} port = host.substr (pos+1);
host = host.substr (0,pos);
// remark: this find() will never be != npos for scp-like syntax }
// because we found pathDelimiter, which is ":", before
if ((pos = host.find (":")) != std::string::npos)
{
port = host.substr (pos+1);
host = host.substr (0,pos);
}
parsed = true; parsed = true;
} }
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// vim: et ts=2 sw=2

View file

@ -35,7 +35,7 @@ Context context;
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
int main (int argc, char** argv) int main (int argc, char** argv)
{ {
UnitTest t (30); UnitTest t (44);
Uri uri1 ("asfd://user@host/folder/"); Uri uri1 ("asfd://user@host/folder/");
uri1.parse (); uri1.parse ();
@ -88,6 +88,29 @@ int main (int argc, char** argv)
uri6.parse (); uri6.parse ();
t.is (uri6.path, "/home/user/.task/", "Uri::expand() test"); t.is (uri6.path, "/home/user/.task/", "Uri::expand() test");
Uri uri7 ("ftp://'user@name'@host:321/path/to/x");
uri7.parse ();
t.is (uri7.user, "user@name", "Uri::parse() : ftp://'user@name'@host:321/path/to/x");
t.is (uri7.host, "host", "Uri::parse() : ftp://'user@name'@host:321/path/to/x");
t.is (uri7.port, "321", "Uri::parse() : ftp://'user@name'@host:321/path/to/x");
t.is (uri7.path, "path/to/x", "Uri::parse() : ftp://'user@name'@host:321/path/to/x");
t.is (uri7.protocol, "ftp", "Uri::parse() : ftp://'user@name'@host:321/path/to/x");
Uri uri8 ("http://'us/er@n:ame'@host/path/to/x");
uri8.parse ();
t.is (uri8.user, "us/er@n:ame", "Uri::parse() : http://'us/er@n:ame'@host/path/to/x");
t.is (uri8.host, "host", "Uri::parse() : http://'us/er@n:ame'@host/path/to/x");
t.is (uri8.port, "", "Uri::parse() : http://'us/er@n:ame'@host/path/to/x");
t.is (uri8.path, "path/to/x", "Uri::parse() : http://'us/er@n:ame'@host/path/to/x");
t.is (uri8.protocol, "http", "Uri::parse() : http://'us/er@n:ame'@host/path/to/x");
Uri uri9 ("'user@name'@host:path/to/x");
uri9.parse ();
t.is (uri9.user, "user@name", "Uri::parse() : 'user@name'@host:path/to/x");
t.is (uri9.host, "host", "Uri::parse() : 'user@name'@host:path/to/x");
t.is (uri9.port, "", "Uri::parse() : 'user@name'@host:path/to/x");
t.is (uri9.path, "path/to/x", "Uri::parse() : 'user@name'@host:path/to/x");
return 0; return 0;
} }