# # # patch "database.cc" # from [952142c0f95ce957b3d4b55f26c1d035794b60eb] # to [14fab409a534777ad31ade53f96a050218171839] # # patch "database.hh" # from [137101a2c4ac6255f11286362dbc1a64507c8719] # to [62ca0ac4e28df39f316de9117fc10a171c73f1a5] # # patch "selectors.cc" # from [614c27516fee8169f7135ad330f1bc7185594d8d] # to [a8470d1bec571facb22f9244a0e2e37cd83a7b59] # ============================================================ --- database.cc 952142c0f95ce957b3d4b55f26c1d035794b60eb +++ database.cc 14fab409a534777ad31ade53f96a050218171839 @@ -4209,6 +4209,21 @@ database::select_date(string const & dat completions.insert(revision_id(res[i][0], origin::database)); } +void +database::select_key(key_id const & id, set & completions) +{ + results res; + completions.clear(); + + imp->fetch(res, 1, any_rows, + query("SELECT DISTINCT revision_id FROM revision_certs" + " WHERE keypair_id = ?") + % blob(id.inner()())); + + for (size_t i = 0; i < res.size(); ++i) + completions.insert(revision_id(res[i][0], origin::database)); +} + // epochs void ============================================================ --- database.hh 137101a2c4ac6255f11286362dbc1a64507c8719 +++ database.hh 62ca0ac4e28df39f316de9117fc10a171c73f1a5 @@ -416,6 +416,7 @@ public: std::set & completions); void select_date(std::string const & date, std::string const & comparison, std::set & completions); + void select_key(key_id const & id, std::set & completions); // // --== The 'db' family of top-level commands ==-- ============================================================ --- selectors.cc 614c27516fee8169f7135ad330f1bc7185594d8d +++ selectors.cc a8470d1bec571facb22f9244a0e2e37cd83a7b59 @@ -22,6 +22,7 @@ #include "transforms.hh" #include "roster.hh" #include "vector.hh" +#include "vocab_cast.hh" #include #include @@ -83,6 +84,23 @@ public: return ret; } }; +class key_selector : public selector +{ + key_identity_info identity; +public: + key_selector(string const & arg, lua_hooks & lua, project_t & project) + { + project.get_key_identity(lua, + external_key_name(arg, origin::user), + identity); + } + virtual set complete(project_t & project) + { + set ret; + project.db.select_key(identity.id, ret); + return ret; + } +}; class branch_selector : public selector { string value; @@ -145,7 +163,7 @@ string preprocess_date_for_selector(stri tmp += "T00:00:00"; E(tmp.size()==19 || equals, origin::user, F("selector '%s' is not a valid date (%s)") % sel % tmp); - + if (sel != tmp) { P (F ("expanded date '%s' -> '%s'\n") % sel % tmp); @@ -650,6 +668,8 @@ selector::create_simple_selector(options return shared_ptr(new head_selector(sel, opts)); case 'i': return shared_ptr(new ident_selector(sel)); + case 'k': + return shared_ptr(new key_selector(sel, lua, project)); case 'l': return shared_ptr(new later_than_selector(sel, lua)); case 'm':