diff --git a/Scheduler/Console/Executor.test.cc b/Scheduler/Console/Executor.test.cc index 705622e1699a5e02933a08fe5aa8f52e3aaa1530..e2ff88a68b3b834d6791045972a862b1095524a3 100644 --- a/Scheduler/Console/Executor.test.cc +++ b/Scheduler/Console/Executor.test.cc @@ -271,7 +271,6 @@ BOOST_AUTO_UNIT_TEST(executorAuto) BOOST_CHECK_EQUAL( os.str(), "testCommand\n" ); } - commands.clear(); senf::console::root().remove("tdir1"); senf::console::root().remove("dir2"); diff --git a/Scheduler/Console/ProgramOptions.cc b/Scheduler/Console/ProgramOptions.cc index 63bcfb15f33ed196c6b9b050305582a590194e74..0efbd7e36b00ee07600ab5adfb759a802fddac10 100644 --- a/Scheduler/Console/ProgramOptions.cc +++ b/Scheduler/Console/ProgramOptions.cc @@ -60,7 +60,13 @@ prefix_ void senf::console::detail::ProgramOptionsSource::v_parse(RestrictedExec break; } else if (boost::algorithm::starts_with(arg, std::string("--")) && arg.size() > 2) - parseLongOption(arg.substr(2), executor); + try { + parseLongOption(arg.substr(2), executor); + } + catch (senf::ExceptionMixin & e) { + e << "\nwhile parsing command line option: " << arg; + throw; + } else if (boost::algorithm::starts_with(arg, std::string("-")) && arg.size() > 1) { for (std::string::size_type i (1); i<arg.size(); ++i) { char opt (arg[i]); @@ -87,7 +93,13 @@ prefix_ void senf::console::detail::ProgramOptionsSource::v_parse(RestrictedExec } if (boost::algorithm::starts_with(longOpt, std::string("--"))) longOpt = longOpt.substr(2); - parseLongOption(longOpt, executor); + try { + parseLongOption(longOpt, executor); + } + catch (senf::ExceptionMixin & e) { + e << "\nwhile parsing command line option: -" << opt << ' ' << param; + throw; + } } } else @@ -107,7 +119,7 @@ senf::console::detail::ProgramOptionsSource::parseLongOption(std::string const & ParseCommandInfo cmd; Path path; - + DirectoryNode::ptr cwd (executor.root().thisptr()); std::string::size_type b (0); while (b < name.size()) { @@ -118,8 +130,10 @@ senf::console::detail::ProgramOptionsSource::parseLongOption(std::string const & DirectoryNode::ChildrenRange completions (cwd->completions(key)); if (has_one_elt(completions)) key = completions.begin()->first; - else + else { + e -= 1; continue; + } } path.push_back(WordToken(key)); if (e < name.size()) @@ -135,7 +149,7 @@ senf::console::detail::ProgramOptionsSource::parseLongOption(std::string const & b = name.size(); } } - + cmd.command(path); parser_.parseArguments(value, cmd); executor(std::cerr, cmd);