diff options
author | 2010-12-19 18:55:31 +0000 | |
---|---|---|
committer | 2010-12-19 18:55:31 +0000 | |
commit | c1f12a3490d56eb57902ccc9615c29ea03925383 (patch) | |
tree | 6468eaa51a1f4d016484289e22f950d84f813d8d | |
parent | d83965fef9cb945a2dd42fc17d709fbfac1ce0fe (diff) | |
download | paludis-c1f12a3490d56eb57902ccc9615c29ea03925383.tar.gz paludis-c1f12a3490d56eb57902ccc9615c29ea03925383.tar.xz |
Support groups in suggestions.conf
-rw-r--r-- | doc/configuration/suggestions.html.part.in | 8 | ||||
-rw-r--r-- | paludis/environments/paludis/suggestions_conf.cc | 93 | ||||
-rw-r--r-- | vim/syntax/paludis-suggestions-conf.vim | 21 |
3 files changed, 90 insertions, 32 deletions
diff --git a/doc/configuration/suggestions.html.part.in b/doc/configuration/suggestions.html.part.in index cf174b755..dba72b0d7 100644 --- a/doc/configuration/suggestions.html.part.in +++ b/doc/configuration/suggestions.html.part.in @@ -22,9 +22,10 @@ standard configuration file which may be a bash file (<code>suggestions.bash</co <p>A token may be one of the following:</p> <ul> - <li><code>*/*</code>, which says to take all suggestions from the package.</li> <li>A simple <code>cat/pkg</code>, which says to take any suggestions related to the named package. Note that - complex dependency specifications may <em>not</em> be used here.</li> + complex dependency specifications may <em>not</em> be used here; however, either or both of the <code>cat</code> + and <code>pkg</code> tokens may be <code>*</code>.</li> + <li>A suggestions group name, to take all suggestions with that group.</li> <li>A minus sign, followed by either of the above, to discard rather than take the suggestion in question.</li> </ul> @@ -42,5 +43,8 @@ dev-util/kdevelop -dev-util/cvs # Otherwise, we're interested in all kde-base suggestions: kde-base/* */* + +# We want the send-email suggestions from git: +dev-scm/git send-email </pre> diff --git a/paludis/environments/paludis/suggestions_conf.cc b/paludis/environments/paludis/suggestions_conf.cc index e277dcebc..91b6dde97 100644 --- a/paludis/environments/paludis/suggestions_conf.cc +++ b/paludis/environments/paludis/suggestions_conf.cc @@ -21,14 +21,7 @@ #include <paludis/environments/paludis/paludis_environment.hh> #include <paludis/environments/paludis/paludis_config.hh> #include <paludis/environments/paludis/bashable_conf.hh> -#include <paludis/environment.hh> -#include <paludis/name.hh> -#include <paludis/dep_spec.hh> -#include <paludis/spec_tree.hh> -#include <paludis/user_dep_spec.hh> -#include <paludis/match_package.hh> #include <paludis/util/config_file.hh> -#include <paludis/package_id.hh> #include <paludis/util/options.hh> #include <paludis/util/log.hh> #include <paludis/util/tokeniser.hh> @@ -38,6 +31,14 @@ #include <paludis/util/iterator_funcs.hh> #include <paludis/util/hashes.hh> #include <paludis/util/make_null_shared_ptr.hh> +#include <paludis/environment.hh> +#include <paludis/name.hh> +#include <paludis/dep_spec.hh> +#include <paludis/spec_tree.hh> +#include <paludis/user_dep_spec.hh> +#include <paludis/match_package.hh> +#include <paludis/package_id.hh> +#include <paludis/dep_spec_annotations.hh> #include <unordered_map> #include <list> #include <vector> @@ -51,7 +52,9 @@ namespace struct ValueFlag { bool negated; - std::shared_ptr<const QualifiedPackageName> name; + std::string cat_requirement; + std::string pkg_requirement; + std::string group_requirement; ValueFlag(const std::string & s) : negated(false) @@ -67,8 +70,19 @@ namespace if (s_fixed.empty()) throw PaludisConfigError("Empty value flag '" + s + "'"); - if (s_fixed != "*/*") - name = std::make_shared<QualifiedPackageName>(s_fixed); + std::string::size_type slash_p(s_fixed.find('/')); + if (std::string::npos == slash_p) + group_requirement = s_fixed; + else + { + std::string c(s_fixed.substr(0, slash_p)); + if (c != "*") + cat_requirement = c; + + std::string p(s_fixed.substr(slash_p + 1)); + if (p != "*") + pkg_requirement = p; + } } }; } @@ -164,6 +178,14 @@ SuggestionsConf::interest_in_suggestion( const std::shared_ptr<const PackageID> & from_id, const PackageDepSpec & spec) const { + std::string spec_group; + if (spec.maybe_annotations()) + { + auto a(spec.maybe_annotations()->find(dsar_suggestions_group_name)); + if (a != spec.maybe_annotations()->end()) + spec_group = a->value(); + } + /* highest priority: specific */ { SpecificMap::const_iterator i(_imp->qualified.find(from_id->name())); @@ -178,11 +200,22 @@ SuggestionsConf::interest_in_suggestion( for (ValuesList::const_iterator l(j->second.begin()), l_end(j->second.end()) ; l != l_end ; ++l) { - if (! l->name) - return l->negated ? false : true; + if (! l->group_requirement.empty()) + { + if (spec_group == l->group_requirement) + return l->negated ? false : true; + } + else + { + if (! l->pkg_requirement.empty()) + if (stringify(spec.package_ptr()->package()) != l->pkg_requirement) + continue; + if (! l->cat_requirement.empty()) + if (stringify(spec.package_ptr()->category()) != l->cat_requirement) + continue; - if (*l->name == *spec.package_ptr()) return l->negated ? false : true; + } } } } @@ -211,11 +244,22 @@ SuggestionsConf::interest_in_suggestion( for (ValuesList::const_iterator l(i->second.second.begin()), l_end(i->second.second.end()) ; l != l_end ; ++l) { - if (! l->name) - return l->negated ? false : true; + if (! l->group_requirement.empty()) + { + if (spec_group == l->group_requirement) + return l->negated ? false : true; + } + else + { + if (! l->pkg_requirement.empty()) + if (stringify(spec.package_ptr()->package()) != l->pkg_requirement) + continue; + if (! l->cat_requirement.empty()) + if (stringify(spec.package_ptr()->category()) != l->cat_requirement) + continue; - if (*l->name == *spec.package_ptr()) return l->negated ? false : true; + } } } } @@ -231,11 +275,22 @@ SuggestionsConf::interest_in_suggestion( for (ValuesList::const_iterator l(j->second.begin()), l_end(j->second.end()) ; l != l_end ; ++l) { - if (! l->name) - return l->negated ? false : true; + if (! l->group_requirement.empty()) + { + if (spec_group == l->group_requirement) + return l->negated ? false : true; + } + else + { + if (! l->pkg_requirement.empty()) + if (stringify(spec.package_ptr()->package()) != l->pkg_requirement) + continue; + if (! l->cat_requirement.empty()) + if (stringify(spec.package_ptr()->category()) != l->cat_requirement) + continue; - if (*l->name == *spec.package_ptr()) return l->negated ? false : true; + } } } diff --git a/vim/syntax/paludis-suggestions-conf.vim b/vim/syntax/paludis-suggestions-conf.vim index e76716058..11d62d93f 100644 --- a/vim/syntax/paludis-suggestions-conf.vim +++ b/vim/syntax/paludis-suggestions-conf.vim @@ -18,24 +18,23 @@ endif syn region PaludisSuggestionsConfComment start=/^\s*#/ end=/$/ syn match PaludisSuggestionsConfPDS /^[^ \t#\/]\+\/[^ \t#\/]\+\s*/ - \ nextgroup=PaludisSuggestionsConfName,PaludisSuggestionsConfStars,PaludisSuggestionsConfContinuation - \ contains=PaludisSuggestionsConfWildcard + \ nextgroup=PaludisSuggestionsConfName,PaludisSuggestionsConfGroup,PaludisSuggestionsConfContinuation + \ contains=PaludisSuggestionsConfWildcard syn match PaludisSuggestionsConfWildcard contained /\(\*\/\@=\|\/\@<=\*\)/ -syn match PaludisSuggestionsConfSet /^[^ \t#\/]\+\S\@!/ - \ nextgroup=PaludisSuggestionsConfName,PaludisSuggestionsConfStars,PaludisSuggestionsConfContinuation skipwhite -syn match PaludisSuggestionsConfName contained /-\?[a-zA-Z0-9\-_]\+\/[a-zA-Z0-9\-_+]\+/ - \ nextgroup=PaludisSuggestionsConfName,PaludisSuggestionsConfStars,PaludisSuggestionsConfContinuation skipwhite -syn match PaludisSuggestionsConfStars contained /-\?\*\/\*/ - \ nextgroup=PaludisSuggestionsConfName,PaludisSuggestionsConfStars,PaludisSuggestionsConfContinuation skipwhite +syn match PaludisSuggestionsConfGroup contained /-\?[a-zA-Z0-9\-_]\+\S\@!/ + \ nextgroup=PaludisSuggestionsConfName,PaludisSuggestionsConfGroup,PaludisSuggestionsConfContinuation skipwhite + \ contains=PaludisSuggestionsConfWildcard +syn match PaludisSuggestionsConfName contained /-\?\(\*\|[a-zA-Z0-9\-_]\+\)\/\(\*\|[a-zA-Z0-9\-_+]\)\+/ + \ nextgroup=PaludisSuggestionsConfName,PaludisSuggestionsConfGroup,PaludisSuggestionsConfContinuation skipwhite + \ contains=PaludisSuggestionsConfWildcard syn match PaludisSuggestionsConfContinuation contained /\\$/ - \ nextgroup=PaludisSuggestionsConfName,PaludisSuggestionsConfStars,PaludisSuggestionsConfContinuation skipwhite skipnl + \ nextgroup=PaludisSuggestionsConfName,PaludisSuggestionsConfGroup,PaludisSuggestionsConfContinuation skipwhite skipnl hi def link PaludisSuggestionsConfComment Comment hi def link PaludisSuggestionsConfPDS Identifier hi def link PaludisSuggestionsConfWildcard Special -hi def link PaludisSuggestionsConfSet Special +hi def link PaludisSuggestionsConfGroup Macro hi def link PaludisSuggestionsConfName Keyword -hi def link PaludisSuggestionsConfStars Keyword hi def link PaludisSuggestionsConfContinuation Preproc let b:current_syntax = "paludis-suggestions-conf" |