# # # patch "selectors.cc" # from [65025bae41df1dddea0f44253edfd78fedc16a0c] # to [08874bf759e4cf0085ce30fb0f128a67bd253d8b] # ============================================================ --- selectors.cc 65025bae41df1dddea0f44253edfd78fedc16a0c +++ selectors.cc 08874bf759e4cf0085ce30fb0f128a67bd253d8b @@ -57,7 +57,7 @@ typedef struct typedef vector > selector_list; typedef struct { - meta_selector_type meta_type; + vector meta_types; selector_list selections; } selector_data; @@ -65,15 +65,15 @@ decode_meta_selector(project_t & project decode_meta_selector(project_t & project, options const & opts, lua_hooks & lua, - meta_selector_type & meta_type, + vector & meta_types, string & sel) { L(FL("decoding possible meta selector '%s'") % sel); - meta_selector_type tmp = meta_sel_unknown; - - if (sel.size() >= 2 && sel[1] == ':') + while (sel.size() >= 2 && sel[1] == ':') { + meta_selector_type tmp = meta_sel_unknown; + switch (sel[0]) { case 'H': @@ -83,15 +83,17 @@ decode_meta_selector(project_t & project tmp = meta_sel_lca_of; break; default: - W(F("unknown meta selector type: %c") % sel[0]); break; } - } - if (tmp != meta_sel_unknown) - sel.erase(0,2); - - meta_type = tmp; + if (tmp != meta_sel_unknown) + { + sel.erase(0,2); + meta_types.push_back(tmp); + } + else + break; + } } static void @@ -249,7 +251,7 @@ parse_selector(project_t & project, lua_hooks & lua, string const & str, selector_data & seldata) { - seldata.meta_type = meta_sel_unknown; + seldata.meta_types = vector(); seldata.selections.clear(); // this rule should always be enabled, even if the user specifies @@ -262,7 +264,7 @@ parse_selector(project_t & project, else { string tmp = str; - decode_meta_selector(project, opts, lua, seldata.meta_type, tmp); + decode_meta_selector(project, opts, lua, seldata.meta_types, tmp); typedef boost::tokenizer > tokenizer; boost::escaped_list_separator slash("\\", "/", ""); @@ -404,21 +406,27 @@ complete_selector(project_t & project, i++; } - switch(limit.meta_type) + for(vector::const_iterator m = limit.meta_types.end(); + m != limit.meta_types.begin();) { - case meta_sel_heads_of: - erase_ancestors(project.db, completions); - break; - case meta_sel_lca_of: - { - set common_ancestors; - project.db.get_common_ancestors(completions, common_ancestors); - completions = common_ancestors; - erase_ancestors(project.db, completions); - } - break; - default: - break; + m--; + + switch(*m) + { + case meta_sel_heads_of: + erase_ancestors(project.db, completions); + break; + case meta_sel_lca_of: + { + set common_ancestors; + project.db.get_common_ancestors(completions, common_ancestors); + completions = common_ancestors; + erase_ancestors(project.db, completions); + } + break; + default: + break; + } } }