From 0cc7bc337dac13b51f33b6d9f0e5e741e15f9685 Mon Sep 17 00:00:00 2001 From: Russell Steicke Date: Sun, 31 Mar 2013 00:04:28 +0800 Subject: [PATCH] Test for bug 1192 - brace expansion. Commit 968d1c3 (Portability) introduced a bug with some very POSIX compliant shells (eg dash), which don't do brace expansion. So add a test for that. The test runs by adding a new protocol in Uri, sh+cp://path/. This protocol is not intended to be used normally, but is only for testing the push and pull code. Signed-off-by: Russell Steicke --- src/CMakeLists.txt | 1 + src/Transport.cpp | 5 +++ src/TransportShell.cpp | 79 ++++++++++++++++++++++++++++++++++++++++++ src/TransportShell.h | 45 ++++++++++++++++++++++++ src/Uri.cpp | 11 ++++++ src/en-US.h | 2 ++ src/es-ES.h | 2 ++ test/bug.1192.t | 68 ++++++++++++++++++++++++++++++++++++ 8 files changed, 213 insertions(+) create mode 100644 src/TransportShell.cpp create mode 100644 src/TransportShell.h create mode 100755 test/bug.1192.t diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b6d4b35cd..979d77b04 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -30,6 +30,7 @@ set (task_SRCS A3.cpp A3.h TransportCurl.cpp TransportCurl.h TransportRSYNC.cpp TransportRSYNC.h TransportSSH.cpp TransportSSH.h + TransportShell.cpp TransportShell.h Uri.cpp Uri.h ViewTask.cpp ViewTask.h ViewText.cpp ViewText.h diff --git a/src/Transport.cpp b/src/Transport.cpp index 8f337e2e4..d01ba5b9c 100644 --- a/src/Transport.cpp +++ b/src/Transport.cpp @@ -38,6 +38,7 @@ #include #include #include +#include //////////////////////////////////////////////////////////////////////////////// Transport::Transport (const Uri& uri) @@ -68,6 +69,10 @@ Transport* Transport::getTransport(const Uri& uri) { return new TransportCurl(uri); } + else if ( uri._protocol == "sh+cp") + { + return new TransportShell(uri); + } return NULL; } diff --git a/src/TransportShell.cpp b/src/TransportShell.cpp new file mode 100644 index 000000000..1d5a18b8f --- /dev/null +++ b/src/TransportShell.cpp @@ -0,0 +1,79 @@ +//////////////////////////////////////////////////////////////////////////////// +// taskwarrior - a command line task list manager. +// +// Copyright 2010 - 2013, Johannes Schlatow. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +// http://www.opensource.org/licenses/mit-license.php +// +//////////////////////////////////////////////////////////////////////////////// + +#define L10N // Localization complete. + +#include +#include +#include +#include + +//////////////////////////////////////////////////////////////////////////////// +TransportShell::TransportShell(const Uri& uri) : Transport(uri) +{ + _executable = "cp"; +} + +//////////////////////////////////////////////////////////////////////////////// +void TransportShell::send(const std::string& source) +{ + if (_uri._path == "") + throw std::string (STRING_TRANSPORT_SHELL_NOPATH); + + // Is there more than one file to transfer? + // Then path has to end with a '/' + if (is_filelist(source) && !_uri.is_directory()) + throw format (STRING_TRANSPORT_URI_NODIR, _uri._path); + + _arguments.push_back (source); + + _arguments.push_back (_uri._path); + + if (execute ()) + throw std::string (STRING_TRANSPORT_SHELL_FAIL); +} + +//////////////////////////////////////////////////////////////////////////////// +void TransportShell::recv(std::string target) +{ + if (_uri._path == "") + throw std::string (STRING_TRANSPORT_SHELL_NOPATH); + + // Is there more than one file to transfer? + // Then target has to end with a '/' + if (is_filelist(_uri._path) && !is_directory(target)) + throw format (STRING_TRANSPORT_URI_NODIR, target); + + _arguments.push_back (_uri._path); + + _arguments.push_back (target); + + if (execute ()) + throw std::string (STRING_TRANSPORT_SHELL_FAIL); +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/TransportShell.h b/src/TransportShell.h new file mode 100644 index 000000000..3d152fea6 --- /dev/null +++ b/src/TransportShell.h @@ -0,0 +1,45 @@ +//////////////////////////////////////////////////////////////////////////////// +// taskwarrior - a command line task list manager. +// +// Copyright 2010 - 2013, Johannes Schlatow. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// +// http://www.opensource.org/licenses/mit-license.php +// +//////////////////////////////////////////////////////////////////////////////// + +#ifndef INCLUDED_TRANSPORTSHELL +#define INCLUDED_TRANSPORTSHELL +#define L10N // Localization complete. + +#include +#include + +class TransportShell : public Transport { +public: + TransportShell (const Uri&); + + virtual void send (const std::string&); + virtual void recv (std::string); + +}; + +#endif + diff --git a/src/Uri.cpp b/src/Uri.cpp index 1d088bbbb..56e5a09e5 100644 --- a/src/Uri.cpp +++ b/src/Uri.cpp @@ -197,6 +197,10 @@ std::string Uri::ToString () if (is_local ()) return _data; + // No password to obscure, return the original. + if (_protocol == "sh+cp") + return _data; + std::string result; result = _protocol + "://"; @@ -256,6 +260,13 @@ void Uri::parse () pathDelimiter = ":"; } + if (_protocol == "sh+cp") + { + _path = _data; + _parsed = true; + return; + } + // user delimited by single quotes? if ( _data[0] == '\'' && (pos = _data.find("'", 1)) != std::string::npos ) diff --git a/src/en-US.h b/src/en-US.h index f4655e769..b0fdde8a5 100644 --- a/src/en-US.h +++ b/src/en-US.h @@ -847,6 +847,8 @@ #define STRING_TRANSPORT_RSYNC_FAIL "rsync failed, see output above." #define STRING_TRANSPORT_SSH_URI "When using the 'ssh' protocol, the uri must contain a hostname." #define STRING_TRANSPORT_SSH_FAIL "ssh failed, see output above." +#define STRING_TRANSPORT_SHELL_NOPATH "When using the 'sh+cp' protocol to copy multiple files, a path must be specified." +#define STRING_TRANSPORT_SHELL_FAIL "shell command failed, see output above." // Uri #define STRING_URI_QUOTES "Could not parse uri '{1}', wrong usage of single quotes." diff --git a/src/es-ES.h b/src/es-ES.h index b5b4f7e3a..6f05a1852 100644 --- a/src/es-ES.h +++ b/src/es-ES.h @@ -864,6 +864,8 @@ #define STRING_TRANSPORT_RSYNC_FAIL "Rsync falló, consulte los mensajes precedentes." #define STRING_TRANSPORT_SSH_URI "Cuando se usa el protocolo 'ssh' el uri debe contener un nombre de máquina." #define STRING_TRANSPORT_SSH_FAIL "Ssh falló, consulte los mensajes precedentes." +#define STRING_TRANSPORT_SHELL_NOPATH "When using the 'sh+cp' protocol to copy multiple files, a path must be specified." +#define STRING_TRANSPORT_SHELL_FAIL "shell command failed, see output above." // Uri #define STRING_URI_QUOTES "No se pudo interpretar el uri '{1}', uso erróneo de comillas simples." diff --git a/test/bug.1192.t b/test/bug.1192.t new file mode 100755 index 000000000..50d958168 --- /dev/null +++ b/test/bug.1192.t @@ -0,0 +1,68 @@ +#! /usr/bin/env perl +################################################################################ +## taskwarrior - a command line task list manager. +## +## Copyright 2006-2013, Paul Beckingham, Federico Hernandez. +## +## Permission is hereby granted, free of charge, to any person obtaining a copy +## of this software and associated documentation files (the "Software"), to deal +## in the Software without restriction, including without limitation the rights +## to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +## copies of the Software, and to permit persons to whom the Software is +## furnished to do so, subject to the following conditions: +## +## The above copyright notice and this permission notice shall be included +## in all copies or substantial portions of the Software. +## +## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +## OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +## FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +## THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +## LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +## SOFTWARE. +## +## http://www.opensource.org/licenses/mit-license.php +## +################################################################################ + +use strict; +use warnings; +use Test::More tests => 4; + +# Create the rc file. +if (open my $fh, '>', 'bug.rc') +{ + print $fh "data.location=.\n", + "confirmation=off\n"; + close $fh; + mkdir("localcopy", 0755); + ok (-r 'bug.rc', 'Created bug.rc'); +} + +# Bug 1192 - Push fails with POSIX shell that does not do brace expansion. + +# Test push. +qx{../src/task rc:bug.rc add foo 2>&1}; +# completed.data doesn't get created until required. +qx{touch completed.data 2>&1}; +my $output = qx{../src/task rc:bug.rc push sh+cp://localcopy/ 2>&1}; +#unlike ($output, qr/_user/ms, '_user in there'); +unlike ($output, qr/No such file or directory/ms, 'Local push to sh+cp://path/'); + +# Test pull. +$output = qx{../src/task rc:bug.rc pull sh+cp://localcopy/ 2>&1}; +unlike ($output, qr/No such file or directory/ms, 'Local pull from sh+cp://path/'); + +## Cleanup. +unlink qw(pending.data completed.data undo.data backlog.data synch.key bug.rc); +qx(rm -rf localcopy/); +ok (! -d 'localcopy' && + ! -r 'pending.data' && + ! -r 'completed.data' && + ! -r 'undo.data' && + ! -r 'backlog.data' && + ! -r 'synch.key' && + ! -r 'bug.rc', 'Cleanup'); + +exit 0;