From 1acce65b09d8e213af54aecb8d66870baa006f56 Mon Sep 17 00:00:00 2001 From: Petr Machata Date: Mon, 19 Nov 2007 18:25:53 +0000 Subject: [PATCH] - Apply/testsuite ambiguous option patch from James Philbin - Resolves: #369581 --- boost-opt.patch | 141 ++++++++++++++++++++++++++++++++++++++++++++++++ boost.spec | 8 ++- 2 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 boost-opt.patch diff --git a/boost-opt.patch b/boost-opt.patch new file mode 100644 index 0000000..4f79ff6 --- /dev/null +++ b/boost-opt.patch @@ -0,0 +1,141 @@ +--- libs/program_options/src/options_description.cpp ++++ libs/program_options/src/options_description.cpp +@@ -53,10 +53,10 @@ + { + } + +- bool ++ option_description::match_result + option_description::match(const std::string& option, bool approx) const + { +- bool result = false; ++ match_result result = no_match; + if (!m_long_name.empty()) { + + if (*m_long_name.rbegin() == '*') +@@ -65,23 +65,26 @@ + // prefix is OK. + if (option.find(m_long_name.substr(0, m_long_name.length()-1)) + == 0) +- result = true; ++ result = approximate_match; + } + + if (approx) + { + if (m_long_name.find(option) == 0) +- result = true; ++ if (m_long_name == option) ++ result = full_match; ++ else ++ result = approximate_match; + } + else + { + if (m_long_name == option) +- result = true; ++ result = full_match; + } + } + + if (m_short_name == option) +- result = true; ++ result = full_match; + + return result; + } +@@ -258,21 +261,38 @@ + // case sensitivity and trailing '*' and so we can't use simple map. + for(unsigned i = 0; i < m_options.size(); ++i) + { +- if (m_options[i]->match(name, approx)) ++ option_description::match_result r = ++ m_options[i]->match(name, approx); ++ ++ if (r == option_description::no_match) ++ continue; ++ ++ // If we have a full patch, and an approximate match, ++ // ignore approximate match instead of reporting error. ++ // Say, if we have options "all" and "all-chroots", then ++ // "--all" on the command line should select the first one, ++ // without ambiguity. ++ // ++ // For now, we don't check the situation when there are ++ // two full matches. ++ ++ if (r == option_description::full_match) + { +- if (found != -1) +- { +- vector alts; +- // FIXME: the use of 'key' here might not +- // be the best approach. +- alts.push_back(m_options[found]->key(name)); +- alts.push_back(m_options[i]->key(name)); +- boost::throw_exception(ambiguous_option(name, alts)); +- } +- else +- { +- found = i; +- } ++ return m_options[i].get(); ++ } ++ ++ if (found != -1) ++ { ++ vector alts; ++ // FIXME: the use of 'key' here might not ++ // be the best approach. ++ alts.push_back(m_options[found]->key(name)); ++ alts.push_back(m_options[i]->key(name)); ++ boost::throw_exception(ambiguous_option(name, alts)); ++ } ++ else ++ { ++ found = i; + } + } + if (found != -1) { +--- libs/program_options/test/options_description_test.cpp ++++ libs/program_options/test/options_description_test.cpp +@@ -20,11 +20,20 @@ + { + options_description desc; + desc.add_options() +- ("foo", new untyped_value()) +- ("fee", new untyped_value()) +- ("baz", new untyped_value()); ++ ("foo", new untyped_value()) ++ ("fee", new untyped_value()) ++ ("baz", new untyped_value()) ++ ("all", new untyped_value()) ++ ("all-chroots", new untyped_value()) ++ ("all-sessions", new untyped_value()) ++ ; + + BOOST_CHECK_EQUAL(desc.find("fo", true).long_name(), "foo"); ++ ++ BOOST_CHECK_EQUAL(desc.find("all", true).long_name(), "all"); ++ BOOST_CHECK_EQUAL(desc.find("all-ch", true).long_name(), "all-chroots"); ++ ++ + // BOOST_CHECK(desc.count_approx("foo") == 1); + // set a = desc.approximations("f"); + // BOOST_CHECK(a.size() == 2); +--- boost/program_options/options_description.hpp ++++ boost/program_options/options_description.hpp +@@ -78,10 +78,12 @@ + + virtual ~option_description(); + ++ enum match_result { no_match, full_match, approximate_match }; ++ + /** Given 'option', specified in the input source, + return 'true' is 'option' specifies *this. + */ +- bool match(const std::string& option, bool approx) const; ++ match_result match(const std::string& option, bool approx) const; + + /** Return the key that should identify the option, in + particular in the variables_map class. diff --git a/boost.spec b/boost.spec index ecdc736..d659a6b 100644 --- a/boost.spec +++ b/boost.spec @@ -1,7 +1,7 @@ Name: boost Summary: The Boost C++ Libraries Version: 1.33.1 -Release: 13%{?dist} +Release: 14%{?dist} License: Boost Software License (GPL-Compatible, Free Software License) URL: http://www.boost.org/ Group: System Environment/Libraries @@ -28,6 +28,7 @@ Patch6: boost-spirit-warnings.patch Patch7: boost-bind-gcc41.patch Patch8: boost-cxxflags-debug.patch Patch9: boost-python-vs-x86-64.patch +Patch10: boost-opt.patch %description Boost provides free peer-reviewed portable C++ source libraries. The @@ -78,6 +79,7 @@ rm -rf %{buildroot} %patch7 -p0 %patch8 -p0 %patch9 -p0 +%patch10 -p0 %build #build bjam @@ -183,6 +185,10 @@ rm -rf %{buildroot} %doc %{_docdir}/boost-%{version} %changelog +* Mon Nov 19 2007 Petr Machata - 1.33.1-14 +- Apply/testsuite ambiguous option patch from James Philbin +- Resolves: #369581 + * Mon Apr 02 2007 Benjamin Kosnik 1.33.1-13 - (#225622: Merge Review: boost) Change static to devel-static.