# # # patch "app_state.cc" # from [354e6301731ad03a7bc0a1ee2eead3de0bc75b7b] # to [1a3683fee7f41a225552d935d94bb3e44129c543] # # patch "app_state.hh" # from [6cf59f29bb9989cafbb6d86bf09f48622974ff20] # to [945451bb366a61c4c9d3c695f4f3e3a996673c8c] # # patch "asciik.cc" # from [ea0239139f8e1f52038e4c4d1930ac1e10807bad] # to [48e1e8f7b0fb36535ccf5b043b34d43c0f284bfc] # # patch "automate.cc" # from [e3e32861dd1d2b804f9c9e17b2493e5ff8687e88] # to [85d52e0308c064e80a40999c66e10face06cc0d0] # # patch "cmd_db.cc" # from [ccba678150255ac0223f11a3fb42dfaa33755237] # to [feeeb817918df5167cc2e6a25788c3f961614d24] # # patch "cmd_diff_log.cc" # from [6511423a5b72bdba00db61af9d49fcd42ea207db] # to [edadb0edb91f959484f2b26bf17f17dfa9625d52] # # patch "cmd_files.cc" # from [df0cd6d8b2545d93df4eb70832896212c94c97b0] # to [c8196d8cd2834fdb9d12b3d8af67c974ab8d9ca9] # # patch "cmd_key_cert.cc" # from [83c2290f2212fdc8f1f5bf7c3f7c09b76b074ff0] # to [042786ef1018496fd4dc12f5f6e296e0c0fde96c] # # patch "cmd_list.cc" # from [85768a54cbb3caa32349ca67376ad1461c168eec] # to [e2c6d588da292154964b9849c7c8574d795281c4] # # patch "cmd_merging.cc" # from [c277f88ea57eb330c669a6f76c1d2b6ec1963897] # to [5575758d81e847aa35ce6a9c43ac7d7f838684c6] # # patch "cmd_netsync.cc" # from [162ed994dc07aab810b1b05f1566e0ba1e4f5480] # to [7afe336c53764f6ea89c64a115d48731844c7417] # # patch "cmd_othervcs.cc" # from [9d12334414fe5ac8ce461b4473b0fc11965a76cb] # to [7137bb422db592314adc8f4763f8cbc030e2087b] # # patch "cmd_ws_commit.cc" # from [e6f7f5cd2a2267683dd6d22944deda3dc308b7da] # to [83ca6a8803315b4b45be54f47f1b69d88fcfe695] # # patch "commands.cc" # from [83b3cbd4dd7fc1fa242b3a7311797449fb88ff14] # to [dbbbf822e108aef1d4cd220bc5c1fb63bfadca59] # # patch "netsync.cc" # from [eecd6fec7789d51c10daf9b819380e99ea1a00b3] # to [43d0a7da662099a6f8912fe5615172343049975e] # # patch "selectors.cc" # from [a63cff13b6230113758688098d9be976db0ea60f] # to [9682d2ded09a6d978251d9e251d67e174297deb7] # # patch "selectors.hh" # from [d717061d1740519d27e3381fd91e46ce032dfbed] # to [3d84d9b5249cf2cc0ca120a38671f3a3fd7df54b] # ============================================================ --- app_state.cc 354e6301731ad03a7bc0a1ee2eead3de0bc75b7b +++ app_state.cc 1a3683fee7f41a225552d935d94bb3e44129c543 @@ -31,8 +31,7 @@ app_state::app_state() app_state::app_state() : lua(this), keys(*this), db(lua), work(lua), branch_is_sticky(false), - mtn_automate_allowed(false), - project(db) + mtn_automate_allowed(false) {} app_state::~app_state() @@ -198,12 +197,6 @@ app_state::make_branch_sticky() } } -project_t & -app_state::get_project() -{ - return project; -} - // rc files are loaded after we've changed to the workspace so that // _MTN/monotonerc can be loaded between ~/.monotone/monotonerc and other // rcfiles. ============================================================ --- app_state.hh 6cf59f29bb9989cafbb6d86bf09f48622974ff20 +++ app_state.hh 945451bb366a61c4c9d3c695f4f3e3a996673c8c @@ -10,13 +10,11 @@ // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // PURPOSE. -#include "database.hh" -#include "key_store.hh" -#include "lua_hooks.hh" +#include "paths.hh" #include "options.hh" -#include "paths.hh" -#include "project.hh" -#include "vocab.hh" +#include "lua_hooks.hh" +#include "key_store.hh" +#include "database.hh" #include "work.hh" // This class is supposed to hold all (or.. well, most) of the state @@ -52,12 +50,6 @@ public: void make_branch_sticky(); -private: - project_t project; -public: - //project_t & get_project(string const & name); - project_t & get_project(); // get_project(opts.project) or I() - void set_database(system_path const & filename); explicit app_state(); ============================================================ --- asciik.cc ea0239139f8e1f52038e4c4d1930ac1e10807bad +++ asciik.cc 48e1e8f7b0fb36535ccf5b043b34d43c0f284bfc @@ -115,6 +115,7 @@ Loop: #include "simplestring_xform.hh" #include "cmd.hh" #include "app_state.hh" +#include "project.hh" using std::insert_iterator; using std::max; @@ -374,8 +375,9 @@ CMD(asciik, "asciik", "", CMD_REF(debug) N(args.size() == 1, F("wrong argument count")); - set revs; - complete(app, idx(args, 0)(), revs); + set revs; + project_t project(app.db); + complete(app, project, idx(args, 0)(), revs); vector sorted; toposort(revs, sorted, app.db); ============================================================ --- automate.cc e3e32861dd1d2b804f9c9e17b2493e5ff8687e88 +++ automate.cc 85d52e0308c064e80a40999c66e10face06cc0d0 @@ -21,6 +21,7 @@ #include #include "app_state.hh" +#include "project.hh" #include "basic_io.hh" #include "cert.hh" #include "cmd.hh" @@ -74,21 +75,20 @@ CMD_AUTOMATE(heads, N_("[BRANCH]"), F("wrong argument count")); CMD_REQUIRES_DATABASE(app); - - system_path database_option; - branch_name branch_option; - rsa_keypair_id key_option; - system_path keydir_option; - app.work.get_ws_options(database_option, branch_option, - key_option, keydir_option); + project_t project(db); - if (args.size() == 1 ) { + branch_name branch; + if (args.size() == 1) // branchname was explicitly given, use that - branch_option = branch_name(idx(args, 0)()); - } + branch = branch_name(idx(args, 0)()); + else + { + app.require_workspace(); + branch = app.opts.branchname; + } + set heads; - app.get_project().get_branch_heads(branch_option, heads, - app.opts.ignore_suspend_certs); + project.get_branch_heads(branch, heads, app.opts.ignore_suspend_certs); for (set::const_iterator i = heads.begin(); i != heads.end(); ++i) output << (*i).inner()() << '\n'; @@ -502,8 +502,9 @@ CMD_AUTOMATE(select, N_("SELECTOR"), F("wrong argument count")); CMD_REQUIRES_DATABASE(app); + project_t project(app.db); set completions; - expand_selector(app, idx(args, 0)(), completions); + expand_selector(app, project, idx(args, 0)(), completions); for (set::const_iterator i = completions.begin(); i != completions.end(); ++i) @@ -1413,7 +1414,7 @@ CMD_AUTOMATE(packets_for_certs, N_("REVI F("wrong argument count")); CMD_REQUIRES_DATABASE(app); - + project_t project(db); packet_writer pw(output); revision_id r_id(idx(args, 0)()); @@ -1421,7 +1422,7 @@ CMD_AUTOMATE(packets_for_certs, N_("REVI N(db.revision_exists(r_id), F("no such revision '%s'") % r_id); - app.get_project().get_revision_certs(r_id, certs); + project.get_revision_certs(r_id, certs); for (size_t i = 0; i < certs.size(); ++i) pw.consume_revision_cert(idx(certs,i)); } @@ -1585,19 +1586,15 @@ CMD_AUTOMATE(branches, "", F("no arguments needed")); CMD_REQUIRES_DATABASE(app); - + project_t project(db); set names; - app.get_project().get_branch_list(names, - !app.opts.ignore_suspend_certs); + project.get_branch_list(names, !app.opts.ignore_suspend_certs); for (set::const_iterator i = names.begin(); i != names.end(); ++i) - { - // FIXME: should this lua hook be in the database context? - if (!app.lua.hook_ignore_branch(*i)) - output << (*i) << '\n'; - } + if (!app.lua.hook_ignore_branch(*i)) + output << (*i) << '\n'; } // Name: tags @@ -1641,7 +1638,7 @@ CMD_AUTOMATE(tags, N_("[BRANCH_PATTERN]" F("wrong argument count")); CMD_REQUIRES_DATABASE(app); - + project_t project(db); globish incl("*"); bool filtering(false); @@ -1656,13 +1653,13 @@ CMD_AUTOMATE(tags, N_("[BRANCH_PATTERN]" prt.print_stanza(stz); set tags; - app.get_project().get_tags(tags); + project.get_tags(tags); for (set::const_iterator tag = tags.begin(); tag != tags.end(); ++tag) { set branches; - app.get_project().get_revision_branches(tag->ident, branches); + project.get_revision_branches(tag->ident, branches); bool show(!filtering); vector branch_names; ============================================================ --- cmd_db.cc ccba678150255ac0223f11a3fb42dfaa33755237 +++ cmd_db.cc feeeb817918df5167cc2e6a25788c3f961614d24 @@ -16,6 +16,7 @@ #include "revision.hh" #include "constants.hh" #include "app_state.hh" +#include "project.hh" #include "keys.hh" using std::cin; @@ -122,7 +123,8 @@ CMD(db_kill_rev_locally, "kill_rev_local revision_id revid; - complete(app, idx(args, 0)(), revid); + project_t project(app.db); + complete(app, project, idx(args, 0)(), revid); // Check that the revision does not have any children std::set children; @@ -332,6 +334,8 @@ CMD(complete, "complete", "", CMD_REF(in if (args.size() != 2) throw usage(execid); + project_t project(app.db); + bool verbose = app.opts.verbose; N(idx(args, 1)().find_first_not_of("abcdef0123456789") == string::npos, @@ -345,7 +349,7 @@ CMD(complete, "complete", "", CMD_REF(in i != completions.end(); ++i) { if (!verbose) cout << i->inner()() << '\n'; - else cout << describe_revision(app.get_project(), *i) << '\n'; + else cout << describe_revision(project, *i) << '\n'; } } else if (idx(args, 0)() == "file") ============================================================ --- cmd_diff_log.cc 6511423a5b72bdba00db61af9d49fcd42ea207db +++ cmd_diff_log.cc edadb0edb91f959484f2b26bf17f17dfa9625d52 @@ -25,6 +25,7 @@ #include "simplestring_xform.hh" #include "transforms.hh" #include "app_state.hh" +#include "project.hh" using std::cout; using std::deque; @@ -355,6 +356,8 @@ prepare_diff(cset & included, else if (app.opts.revision_selectors.size() == 1) app.require_workspace(); + project_t project(app.db); + N(app.opts.revision_selectors.size() <= 2, F("more than two revisions given")); @@ -396,7 +399,7 @@ prepare_diff(cset & included, roster_t old_roster, restricted_roster, new_roster; revision_id r_old_id; - complete(app, idx(app.opts.revision_selectors, 0)(), r_old_id); + complete(app, project, idx(app.opts.revision_selectors, 0)(), r_old_id); app.db.get_roster(r_old_id, old_roster); app.work.get_current_roster_shape(new_roster, app.db, nis); @@ -422,8 +425,8 @@ prepare_diff(cset & included, roster_t old_roster, restricted_roster, new_roster; revision_id r_old_id, r_new_id; - complete(app, idx(app.opts.revision_selectors, 0)(), r_old_id); - complete(app, idx(app.opts.revision_selectors, 1)(), r_new_id); + complete(app, project, idx(app.opts.revision_selectors, 0)(), r_old_id); + complete(app, project, idx(app.opts.revision_selectors, 1)(), r_new_id); app.db.get_roster(r_old_id, old_roster); app.db.get_roster(r_new_id, new_roster); @@ -552,7 +555,7 @@ static void static void -log_certs(ostream & os, app_state & app, revision_id id, cert_name name, +log_certs(ostream & os, project_t & project, revision_id id, cert_name name, string label, string separator, bool multiline, bool newline) { vector< revision > certs; @@ -561,7 +564,7 @@ log_certs(ostream & os, app_state & app, if (multiline) newline = true; - app.get_project().get_revision_certs_by_name(id, name, certs); + project.get_revision_certs_by_name(id, name, certs); for (vector< revision >::const_iterator i = certs.begin(); i != certs.end(); ++i) { @@ -584,16 +587,16 @@ static void } static void -log_certs(ostream & os, app_state & app, revision_id id, cert_name name, +log_certs(ostream & os, project_t & project, revision_id id, cert_name name, string label, bool multiline) { - log_certs(os, app, id, name, label, label, multiline, true); + log_certs(os, project, id, name, label, label, multiline, true); } static void -log_certs(ostream & os, app_state & app, revision_id id, cert_name name) +log_certs(ostream & os, project_t & project, revision_id id, cert_name name) { - log_certs(os, app, id, name, " ", ",", false, false); + log_certs(os, project, id, name, " ", ",", false, false); } @@ -623,6 +626,8 @@ CMD(log, "log", "", CMD_REF(informative) | options::opts::no_merges | options::opts::no_files | options::opts::no_graph) { + project_t project(app.db); + if (app.opts.from.size() == 0) app.require_workspace("try passing a --from revision to start at"); @@ -653,7 +658,7 @@ CMD(log, "log", "", CMD_REF(informative) i != app.opts.from.end(); i++) { set rids; - complete(app, (*i)(), rids); + complete(app, project, (*i)(), rids); for (set::const_iterator j = rids.begin(); j != rids.end(); ++j) { @@ -709,7 +714,7 @@ CMD(log, "log", "", CMD_REF(informative) { MM(*i); set rids; - complete(app, (*i)(), rids); + complete(app, project, (*i)(), rids); for (set::const_iterator j = rids.begin(); j != rids.end(); ++j) { @@ -863,15 +868,16 @@ CMD(log, "log", "", CMD_REF(informative) if (app.opts.brief) { out << rid; - log_certs(out, app, rid, author_name); + log_certs(out, project, rid, author_name); if (app.opts.no_graph) - log_certs(out, app, rid, date_name); + log_certs(out, project, rid, date_name); else { out << '\n'; - log_certs(out, app, rid, date_name, string(), string(), false, false); + log_certs(out, project, rid, date_name, + string(), string(), false, false); } - log_certs(out, app, rid, branch_name); + log_certs(out, project, rid, branch_name); out << '\n'; } else @@ -894,10 +900,10 @@ CMD(log, "log", "", CMD_REF(informative) anc != ancestors.end(); ++anc) out << "Ancestor: " << *anc << '\n'; - log_certs(out, app, rid, author_name, "Author: ", false); - log_certs(out, app, rid, date_name, "Date: ", false); - log_certs(out, app, rid, branch_name, "Branch: ", false); - log_certs(out, app, rid, tag_name, "Tag: ", false); + log_certs(out, project, rid, author_name, "Author: ", false); + log_certs(out, project, rid, date_name, "Date: ", false); + log_certs(out, project, rid, branch_name, "Branch: ", false); + log_certs(out, project, rid, tag_name, "Tag: ", false); if (!app.opts.no_files && !csum.cs.empty()) { @@ -906,8 +912,8 @@ CMD(log, "log", "", CMD_REF(informative) out << '\n'; } - log_certs(out, app, rid, changelog_name, "ChangeLog: ", true); - log_certs(out, app, rid, comment_name, "Comments: ", true); + log_certs(out, project, rid, changelog_name, "ChangeLog: ", true); + log_certs(out, project, rid, comment_name, "Comments: ", true); } if (app.opts.diffs) ============================================================ --- cmd_files.cc df0cd6d8b2545d93df4eb70832896212c94c97b0 +++ cmd_files.cc c8196d8cd2834fdb9d12b3d8af67c974ab8d9ca9 @@ -19,6 +19,7 @@ #include "simplestring_xform.hh" #include "transforms.hh" #include "app_state.hh" +#include "project.hh" using std::cout; using std::ostream_iterator; @@ -128,6 +129,7 @@ CMD(annotate, "annotate", "", CMD_REF(in options::opts::revision | options::opts::revs_only) { revision_id rid; + project_t project(app.db); if (app.opts.revision_selectors.size() == 0) app.require_workspace(); @@ -168,7 +170,7 @@ CMD(annotate, "annotate", "", CMD_REF(in } else { - complete(app, idx(app.opts.revision_selectors, 0)(), rid); + complete(app, project, idx(app.opts.revision_selectors, 0)(), rid); app.db.get_roster(rid, roster); } @@ -181,7 +183,7 @@ CMD(annotate, "annotate", "", CMD_REF(in file_t file_node = downcast_to_file_t(node); L(FL("annotate for file_id %s") % file_node->self); - do_annotate(app.get_project(), file_node, rid, app.opts.revs_only); + do_annotate(project, file_node, rid, app.opts.revs_only); } CMD(identify, "identify", "", CMD_REF(debug), N_("[PATH]"), @@ -299,7 +301,10 @@ CMD(cat, "cat", "", CMD_REF(informative) rid = parent_id(parents.begin()); } else - complete(app, idx(app.opts.revision_selectors, 0)(), rid); + { + project_t project(app.db); + complete(app, project, idx(app.opts.revision_selectors, 0)(), rid); + } dump_file(cout, app.db, rid, idx(args, 0)); } @@ -362,7 +367,10 @@ CMD_AUTOMATE(get_file_of, N_("FILENAME") rid = parent_id(parents.begin()); } else - complete(app, idx(app.opts.revision_selectors, 0)(), rid); + { + project_t project(app.db); + complete(app, project, idx(app.opts.revision_selectors, 0)(), rid); + } dump_file(output, db, rid, idx(args, 0)); } ============================================================ --- cmd_key_cert.cc 83c2290f2212fdc8f1f5bf7c3f7c09b76b074ff0 +++ cmd_key_cert.cc 042786ef1018496fd4dc12f5f6e296e0c0fde96c @@ -16,6 +16,7 @@ #include "charset.hh" #include "cmd.hh" #include "app_state.hh" +#include "project.hh" #include "keys.hh" using std::cout; @@ -140,10 +141,11 @@ CMD(cert, "cert", "", CMD_REF(key_and_ce if ((args.size() != 3) && (args.size() != 2)) throw usage(execid); + project_t project(app.db); transaction_guard guard(app.db); revision_id rid; - complete(app, idx(args, 0)(), rid); + complete(app, project, idx(args, 0)(), rid); cert_name cname; internalize_cert_name(idx(args, 1), cname); @@ -160,7 +162,7 @@ CMD(cert, "cert", "", CMD_REF(key_and_ce val = cert_value(dat()); } - app.get_project().put_cert(app.keys, rid, cname, val); + project.put_cert(app.keys, rid, cname, val); guard.commit(); } @@ -173,9 +175,11 @@ CMD(trusted, "trusted", "", CMD_REF(key_ if (args.size() < 4) throw usage(execid); + project_t project(app.db); + set rids; - expand_selector(app, idx(args, 0)(), rids); - diagnose_ambiguous_expansion(app, idx(args, 0)(), rids); + expand_selector(app, project, idx(args, 0)(), rids); + diagnose_ambiguous_expansion(project, idx(args, 0)(), rids); hexenc ident; if (!rids.empty()) @@ -224,11 +228,12 @@ CMD(tag, "tag", "", CMD_REF(review), N_( if (args.size() != 2) throw usage(execid); + project_t project(app.db); revision_id r; - complete(app, idx(args, 0)(), r); + complete(app, project, idx(args, 0)(), r); cache_user_key(app.opts, app.lua, app.keys, app.db); - app.get_project().put_tag(app.keys, r, idx(args, 1)()); + project.put_tag(app.keys, r, idx(args, 1)()); } @@ -241,8 +246,9 @@ CMD(testresult, "testresult", "", CMD_RE if (args.size() != 2) throw usage(execid); + project_t project(app.db); revision_id r; - complete(app, idx(args, 0)(), r); + complete(app, project, idx(args, 0)(), r); cache_user_key(app.opts, app.lua, app.keys, app.db); cert_revision_testresult(r, idx(args, 1)(), app.db, app.keys); @@ -257,13 +263,14 @@ CMD(approve, "approve", "", CMD_REF(revi if (args.size() != 1) throw usage(execid); + project_t project(app.db); revision_id r; - complete(app, idx(args, 0)(), r); - guess_branch(r, app.opts, app.get_project()); + complete(app, project, idx(args, 0)(), r); + guess_branch(r, app.opts, project); N(app.opts.branchname() != "", F("need --branch argument for approval")); cache_user_key(app.opts, app.lua, app.keys, app.db); - app.get_project().put_revision_in_branch(app.keys, r, app.opts.branchname); + project.put_revision_in_branch(app.keys, r, app.opts.branchname); } CMD(suspend, "suspend", "", CMD_REF(review), N_("REVISION"), @@ -274,14 +281,14 @@ CMD(suspend, "suspend", "", CMD_REF(revi if (args.size() != 1) throw usage(execid); + project_t project(app.db); revision_id r; - complete(app, idx(args, 0)(), r); - guess_branch(r, app.opts, app.get_project()); + complete(app, project, idx(args, 0)(), r); + guess_branch(r, app.opts, project); N(app.opts.branchname() != "", F("need --branch argument to suspend")); cache_user_key(app.opts, app.lua, app.keys, app.db); - app.get_project().suspend_revision_in_branch(app.keys, r, - app.opts.branchname); + project.suspend_revision_in_branch(app.keys, r, app.opts.branchname); } CMD(comment, "comment", "", CMD_REF(review), N_("REVISION [COMMENT]"), @@ -289,6 +296,7 @@ CMD(comment, "comment", "", CMD_REF(revi "", options::opts::none) { + project_t project(app.db); if (args.size() != 1 && args.size() != 2) throw usage(execid); @@ -307,7 +315,7 @@ CMD(comment, "comment", "", CMD_REF(revi F("empty comment")); revision_id r; - complete(app, idx(args, 0)(), r); + complete(app, project, idx(args, 0)(), r); cache_user_key(app.opts, app.lua, app.keys, app.db); cert_revision_comment(r, comment, app.db, app.keys); ============================================================ --- cmd_list.cc 85768a54cbb3caa32349ca67376ad1461c168eec +++ cmd_list.cc e2c6d588da292154964b9849c7c8574d795281c4 @@ -30,6 +30,7 @@ #include "ui.hh" #include "vocab_cast.hh" #include "app_state.hh" +#include "project.hh" using std::cout; using std::make_pair; @@ -57,16 +58,15 @@ CMD(certs, "certs", "", CMD_REF(list), " if (args.size() != 1) throw usage(execid); + project_t project(app.db); vector certs; transaction_guard guard(app.db, false); revision_id ident; - complete(app, idx(args, 0)(), ident); + complete(app, project, idx(args, 0)(), ident); vector< revision > ts; - // FIXME_PROJECTS: after projects are implemented, - // use the app.db version instead if no project is specified. - app.get_project().get_revision_certs(ident, ts); + project.get_revision_certs(ident, ts); for (size_t i = 0; i < ts.size(); ++i) certs.push_back(idx(ts, i).inner()); @@ -279,10 +279,10 @@ CMD(branches, "branches", "", CMD_REF(li else if (args.size() > 1) throw usage(execid); + project_t project(app.db); globish exc(app.opts.exclude_patterns); set names; - app.get_project().get_branch_list(inc, names, - !app.opts.ignore_suspend_certs); + project.get_branch_list(inc, names, !app.opts.ignore_suspend_certs); for (set::const_iterator i = names.begin(); i != names.end(); ++i) @@ -326,7 +326,8 @@ CMD(tags, "tags", "", CMD_REF(list), "", options::opts::depth | options::opts::exclude) { set tags; - app.get_project().get_tags(tags); + project_t project(app.db); + project.get_tags(tags); for (set::const_iterator i = tags.begin(); i != tags.end(); ++i) { @@ -671,6 +672,7 @@ CMD_AUTOMATE(certs, N_("REV"), F("wrong argument count")); CMD_REQUIRES_DATABASE(app); + project_t project(db); vector certs; @@ -683,7 +685,7 @@ CMD_AUTOMATE(certs, N_("REV"), vector< revision > ts; // FIXME_PROJECTS: after projects are implemented, // use the db version instead if no project is specified. - app.get_project().get_revision_certs(rid, ts); + project.get_revision_certs(rid, ts); for (size_t i = 0; i < ts.size(); ++i) certs.push_back(idx(ts, i).inner()); ============================================================ --- cmd_merging.cc c277f88ea57eb330c669a6f76c1d2b6ec1963897 +++ cmd_merging.cc 5575758d81e847aa35ce6a9c43ac7d7f838684c6 @@ -24,6 +24,7 @@ #include "safe_map.hh" #include "ui.hh" #include "app_state.hh" +#include "project.hh" #include "simplestring_xform.hh" #include "keys.hh" @@ -151,6 +152,7 @@ CMD(update, "update", "", CMD_REF(worksp throw usage(execid); app.require_workspace(); + project_t project(app.db); // Figure out where we are parent_map parents; @@ -173,8 +175,7 @@ CMD(update, "update", "", CMD_REF(worksp P(F("updating along branch '%s'") % app.opts.branchname); set candidates; pick_update_candidates(candidates, old_rid, app.opts.branchname, - app.get_project(), - app.opts.ignore_suspend_certs, app.lua); + project, app.opts.ignore_suspend_certs, app.lua); N(!candidates.empty(), F("your request matches no descendents of the current revision\n" "in fact, it doesn't even match the current revision\n" @@ -186,7 +187,7 @@ CMD(update, "update", "", CMD_REF(worksp for (set::const_iterator i = candidates.begin(); i != candidates.end(); ++i) P(i18n_format(" %s") - % describe_revision(app.get_project(), *i)); + % describe_revision(project, *i)); P(F("choose one with '%s update -r'") % ui.prog_name); E(false, F("multiple update candidates remain after selection")); } @@ -194,14 +195,14 @@ CMD(update, "update", "", CMD_REF(worksp } else { - complete(app, app.opts.revision_selectors[0](), chosen_rid); + complete(app, project, app.opts.revision_selectors[0](), chosen_rid); } I(!null_id(chosen_rid)); // do this notification before checking to see if we can bail out early, // because when you are at one of several heads, and you hit update, you // want to know that merging would let you update further. - notify_if_multiple_heads(app.get_project(), + notify_if_multiple_heads(project, app.opts.branchname, app.opts.ignore_suspend_certs); if (old_rid == chosen_rid) @@ -312,8 +313,10 @@ merge_two(revision_id const & left, revi // bomb out, and therefore so may this. static void merge_two(revision_id const & left, revision_id const & right, - branch_name const & branch, string const & caller, app_state & app, - std::ostream & output, bool automate) + branch_name const & branch, string const & caller, + std::ostream & output, bool automate, + project_t & project, options & opts, lua_hooks & lua, + key_store & keys) { // The following mess constructs a neatly formatted log message that looks // like this: @@ -329,14 +332,14 @@ merge_two(revision_id const & left, revi ostringstream log; size_t fieldwidth = max(caller.size() + strlen(" of '"), strlen("and '")); - if (branch != app.opts.branchname) + if (branch != opts.branchname) fieldwidth = max(fieldwidth, strlen("to branch '")); log << setw(fieldwidth - strlen(" of '")) << caller << " of '" << left << "'\n" << setw(fieldwidth) << "and '" << right << "'\n"; - if (branch != app.opts.branchname) + if (branch != opts.branchname) log << setw(fieldwidth) << "to branch '" << branch << "'\n"; // Now it's time for the real work. @@ -351,13 +354,11 @@ merge_two(revision_id const & left, revi } revision_id merged; - transaction_guard guard(app.db); - interactive_merge_and_store(left, right, merged, app.db, app.lua); + transaction_guard guard(project.db); + interactive_merge_and_store(left, right, merged, project.db, lua); - app.get_project().put_standard_certs_from_options(app.opts, app.lua, - app.keys, - merged, branch, - utf8(log.str())); + project.put_standard_certs_from_options(opts, lua, keys, merged, branch, + utf8(log.str())); guard.commit(); if (automate) @@ -384,9 +385,10 @@ CMD(merge, "merge", "", CMD_REF(tree), " N(app.opts.branchname() != "", F("please specify a branch, with --branch=BRANCH")); + project_t project(app.db); set heads; - app.get_project().get_branch_heads(app.opts.branchname, heads, - app.opts.ignore_suspend_certs); + project.get_branch_heads(app.opts.branchname, heads, + app.opts.ignore_suspend_certs); N(heads.size() != 0, F("branch '%s' is empty") % app.opts.branchname); if (heads.size() == 1) @@ -454,12 +456,13 @@ CMD(merge, "merge", "", CMD_REF(tree), " revpair p = heads_for_ancestor[*ancestors.begin()]; merge_two(p.first, p.second, app.opts.branchname, string("merge"), - app, std::cout, false); + std::cout, false, + project, app.opts, app.lua, app.keys); ancestors.clear(); heads_for_ancestor.clear(); - app.get_project().get_branch_heads(app.opts.branchname, heads, - app.opts.ignore_suspend_certs); + project.get_branch_heads(app.opts.branchname, heads, + app.opts.ignore_suspend_certs); pass++; } @@ -474,7 +477,7 @@ CMD(merge, "merge", "", CMD_REF(tree), " I(i == heads.end()); merge_two(left, right, app.opts.branchname, string("merge"), - app, std::cout, false); + std::cout, false, project, app.opts, app.lua, app.keys); P(F("note: your workspaces have not been updated")); } @@ -524,15 +527,16 @@ CMD(merge_into_dir, "merge_into_dir", "" // 'dir' in the merged tree. (ie, it has name "basename(dir)", and its // parent node is "N2.get_node(dirname(dir))") + project_t project(app.db); set src_heads, dst_heads; if (args.size() != 3) throw usage(execid); - app.get_project().get_branch_heads(branch_name(idx(args, 0)()), src_heads, - app.opts.ignore_suspend_certs); - app.get_project().get_branch_heads(branch_name(idx(args, 1)()), dst_heads, - app.opts.ignore_suspend_certs); + project.get_branch_heads(branch_name(idx(args, 0)()), src_heads, + app.opts.ignore_suspend_certs); + project.get_branch_heads(branch_name(idx(args, 1)()), dst_heads, + app.opts.ignore_suspend_certs); N(src_heads.size() != 0, F("branch '%s' is empty") % idx(args, 0)()); N(src_heads.size() == 1, F("branch '%s' is not merged") % idx(args, 0)()); @@ -563,8 +567,8 @@ CMD(merge_into_dir, "merge_into_dir", "" P(F("no merge necessary; putting %s in branch '%s'") % (*src_i) % idx(args, 1)()); transaction_guard guard(app.db); - app.get_project().put_revision_in_branch(app.keys, *src_i, - branch_name(idx(args, 1)())); + project.put_revision_in_branch(app.keys, *src_i, + branch_name(idx(args, 1)())); guard.commit(); } else @@ -645,11 +649,11 @@ CMD(merge_into_dir, "merge_into_dir", "" % idx(args, 0) % (*src_i) % idx(args, 1) % (*dst_i)).str()); - app.get_project().put_standard_certs_from_options(app.opts, app.lua, - app.keys, - merged, - branch_name(idx(args, 1)()), - log_message); + project.put_standard_certs_from_options(app.opts, app.lua, + app.keys, + merged, + branch_name(idx(args, 1)()), + log_message); guard.commit(); P(F("[merged] %s") % merged); @@ -673,6 +677,7 @@ CMD(merge_into_workspace, "merge_into_wo if (args.size() != 1) throw usage(execid); + project_t project(app.db); app.require_workspace(); // Get the current state of the workspace. @@ -703,7 +708,7 @@ CMD(merge_into_workspace, "merge_into_wo calculate_ident(working_rev, working_rid); } - complete(app, idx(args, 0)(), right_id); + complete(app, project, idx(args, 0)(), right_id); app.db.get_roster(right_id, right); N(!(left_id == right_id), F("workspace is already at revision %s") % left_id); @@ -771,12 +776,13 @@ CMD(explicit_merge, "explicit_merge", "" { revision_id left, right; branch_name branch; + project_t project(app.db); if (args.size() != 3) throw usage(execid); - complete(app, idx(args, 0)(), left); - complete(app, idx(args, 1)(), right); + complete(app, project, idx(args, 0)(), left); + complete(app, project, idx(args, 1)(), right); branch = branch_name(idx(args, 2)()); N(!(left == right), @@ -788,9 +794,8 @@ CMD(explicit_merge, "explicit_merge", "" // avoid failure after lots of work cache_user_key(app.opts, app.lua, app.keys, app.db); - merge_two(left, right, branch, string("explicit merge"), - app, std::cout, false); + std::cout, false, project, app.opts, app.lua, app.keys); } CMD(show_conflicts, "show_conflicts", "", CMD_REF(informative), N_("REV REV"), @@ -799,11 +804,13 @@ CMD(show_conflicts, "show_conflicts", "" "the REV parameters."), options::opts::branch | options::opts::date | options::opts::author) { + project_t project(app.db); + if (args.size() != 2) throw usage(execid); revision_id l_id, r_id; - complete(app, idx(args,0)(), l_id); - complete(app, idx(args,1)(), r_id); + complete(app, project, idx(args,0)(), l_id); + complete(app, project, idx(args,1)(), r_id); N(!is_ancestor(l_id, r_id, app.db), F("%s is an ancestor of %s; no merge is needed.") % l_id % r_id); N(!is_ancestor(r_id, l_id, app.db), @@ -866,10 +873,11 @@ CMD(pluck, "pluck", "", CMD_REF(workspac { // Work out our arguments revision_id from_rid, to_rid; + project_t project(app.db); if (app.opts.revision_selectors.size() == 1) { - complete(app, idx(app.opts.revision_selectors, 0)(), to_rid); + complete(app, project, idx(app.opts.revision_selectors, 0)(), to_rid); std::set parents; app.db.get_revision_parents(to_rid, parents); N(parents.size() == 1, @@ -882,8 +890,8 @@ CMD(pluck, "pluck", "", CMD_REF(workspac } else if (app.opts.revision_selectors.size() == 2) { - complete(app, idx(app.opts.revision_selectors, 0)(), from_rid); - complete(app, idx(app.opts.revision_selectors, 1)(), to_rid); + complete(app, project, idx(app.opts.revision_selectors, 0)(), from_rid); + complete(app, project, idx(app.opts.revision_selectors, 1)(), to_rid); } else throw usage(execid); @@ -1046,9 +1054,11 @@ CMD(heads, "heads", "", CMD_REF(tree), " N(app.opts.branchname() != "", F("please specify a branch, with --branch=BRANCH")); - app.get_project().get_branch_heads(app.opts.branchname, heads, - app.opts.ignore_suspend_certs); + project_t project(app.db); + project.get_branch_heads(app.opts.branchname, heads, + app.opts.ignore_suspend_certs); + if (heads.size() == 0) P(F("branch '%s' is empty") % app.opts.branchname); else if (heads.size() == 1) @@ -1058,7 +1068,7 @@ CMD(heads, "heads", "", CMD_REF(tree), " for (set::const_iterator i = heads.begin(); i != heads.end(); ++i) - cout << describe_revision(app.get_project(), *i) << '\n'; + cout << describe_revision(project, *i) << '\n'; } CMD(get_roster, "get_roster", "", CMD_REF(debug), N_("[REVID]"), @@ -1118,8 +1128,9 @@ CMD(get_roster, "get_roster", "", CMD_RE } else if (args.size() == 1) { + project_t project(app.db); revision_id rid; - complete(app, idx(args, 0)(), rid); + complete(app, project, idx(args, 0)(), rid); I(!null_id(rid)); app.db.get_roster(rid, roster, mm); } ============================================================ --- cmd_netsync.cc 162ed994dc07aab810b1b05f1566e0ba1e4f5480 +++ cmd_netsync.cc 7afe336c53764f6ea89c64a115d48731844c7417 @@ -12,6 +12,7 @@ #include "vocab_cast.hh" #include "platform-wrapped.hh" #include "app_state.hh" +#include "project.hh" #include @@ -158,9 +159,10 @@ CMD(push, "push", "", CMD_REF(network), std::list uris; uris.push_back(addr); + project_t project(app.db); run_netsync_protocol(client_voice, source_role, uris, include_pattern, exclude_pattern, - app.get_project(), app.keys, app.lua, app.opts); + project, app.keys, app.lua, app.opts); } CMD(pull, "pull", "", CMD_REF(network), @@ -182,9 +184,10 @@ CMD(pull, "pull", "", CMD_REF(network), std::list uris; uris.push_back(addr); + project_t project(app.db); run_netsync_protocol(client_voice, sink_role, uris, include_pattern, exclude_pattern, - app.get_project(), app.keys, app.lua, app.opts); + project, app.keys, app.lua, app.opts); } CMD(sync, "sync", "", CMD_REF(network), @@ -204,9 +207,10 @@ CMD(sync, "sync", "", CMD_REF(network), std::list uris; uris.push_back(addr); + project_t project(app.db); run_netsync_protocol(client_voice, source_and_sink_role, uris, include_pattern, exclude_pattern, - app.get_project(), app.keys, app.lua, app.opts); + project, app.keys, app.lua, app.opts); } class dir_cleanup_helper @@ -324,9 +328,10 @@ CMD(clone, "clone", "", CMD_REF(network) std::list uris; uris.push_back(addr); + project_t project(app.db); run_netsync_protocol(client_voice, sink_role, uris, include_pattern, exclude_pattern, - app.get_project(), app.keys, app.lua, app.opts); + project, app.keys, app.lua, app.opts); change_current_working_dir(workspace_dir); @@ -339,8 +344,8 @@ CMD(clone, "clone", "", CMD_REF(network) F("use --revision or --branch to specify what to checkout")); set heads; - app.get_project().get_branch_heads(app.opts.branchname, heads, - app.opts.ignore_suspend_certs); + project.get_branch_heads(app.opts.branchname, heads, + app.opts.ignore_suspend_certs); N(heads.size() > 0, F("branch '%s' is empty") % app.opts.branchname); if (heads.size() > 1) @@ -348,7 +353,7 @@ CMD(clone, "clone", "", CMD_REF(network) P(F("branch %s has multiple heads:") % app.opts.branchname); for (set::const_iterator i = heads.begin(); i != heads.end(); ++i) P(i18n_format(" %s") - % describe_revision(app.get_project(), *i)); + % describe_revision(project, *i)); P(F("choose one with '%s checkout -r'") % ui.prog_name); E(false, F("branch %s has multiple heads") % app.opts.branchname); } @@ -357,12 +362,12 @@ CMD(clone, "clone", "", CMD_REF(network) else if (app.opts.revision_selectors.size() == 1) { // use specified revision - complete(app, idx(app.opts.revision_selectors, 0)(), ident); + complete(app, project, idx(app.opts.revision_selectors, 0)(), ident); - guess_branch(ident, app.opts, app.get_project()); + guess_branch(ident, app.opts, project); I(!app.opts.branchname().empty()); - N(app.get_project().revision_is_in_branch(ident, app.opts.branchname), + N(project.revision_is_in_branch(ident, app.opts.branchname), F("revision %s is not a member of branch %s") % ident % app.opts.branchname); } @@ -449,9 +454,10 @@ CMD_NO_WORKSPACE(serve, "serve", "", CMD W(F("The --no-transport-auth option is usually only used " "in combination with --stdio")); + project_t project(app.db); run_netsync_protocol(server_voice, source_and_sink_role, app.opts.bind_uris, globish("*"), globish(""), - app.get_project(), app.keys, app.lua, app.opts); + project, app.keys, app.lua, app.opts); } // Local Variables: ============================================================ --- cmd_othervcs.cc 9d12334414fe5ac8ce461b4473b0fc11965a76cb +++ cmd_othervcs.cc 7137bb422db592314adc8f4763f8cbc030e2087b @@ -10,6 +10,7 @@ #include "base.hh" #include "cmd.hh" #include "app_state.hh" +#include "project.hh" #include "rcs_import.hh" #include "keys.hh" @@ -48,12 +49,14 @@ CMD(cvs_import, "cvs_import", "", CMD_RE F("path %s does not exist") % cvsroot, F("'%s' is not a directory") % cvsroot); + project_t project(app.db); + // make sure we can sign certs using the selected key; also requests // the password (if necessary) up front rather than after some arbitrary // amount of work cache_user_key(app.opts, app.lua, app.keys, app.db); - import_cvs_repo(cvsroot, app.keys, app.get_project(), app.opts.branchname); + import_cvs_repo(cvsroot, app.keys, project, app.opts.branchname); } ============================================================ --- cmd_ws_commit.cc e6f7f5cd2a2267683dd6d22944deda3dc308b7da +++ cmd_ws_commit.cc 83ca6a8803315b4b45be54f47f1b69d88fcfe695 @@ -21,6 +21,7 @@ #include "charset.hh" #include "ui.hh" #include "app_state.hh" +#include "project.hh" #include "basic_io.hh" #include "keys.hh" @@ -337,18 +338,20 @@ CMD(disapprove, "disapprove", "", CMD_RE if (args.size() != 1) throw usage(execid); + project_t project(app.db); + utf8 log_message(""); bool log_message_given; revision_id r; revision_t rev, rev_inverse; shared_ptr cs_inverse(new cset()); - complete(app, idx(args, 0)(), r); + complete(app, project, idx(args, 0)(), r); app.db.get_revision(r, rev); N(rev.edges.size() == 1, F("revision %s has %d changesets, cannot invert") % r % rev.edges.size()); - guess_branch(r, app.opts, app.get_project()); + guess_branch(r, app.opts, project); N(app.opts.branchname() != "", F("need --branch argument for disapproval")); process_commit_message_args(log_message_given, log_message, app, @@ -377,11 +380,9 @@ CMD(disapprove, "disapprove", "", CMD_RE calculate_ident(rdat, inv_id); app.db.put_revision(inv_id, rdat); - app.get_project().put_standard_certs_from_options(app.opts, app.lua, - app.keys, - inv_id, - app.opts.branchname, - log_message); + project.put_standard_certs_from_options(app.opts, app.lua, app.keys, + inv_id, app.opts.branchname, + log_message); guard.commit(); } } @@ -585,6 +586,7 @@ CMD(checkout, "checkout", "co", CMD_REF( revision_id revid; system_path dir; + project_t project(app.db); transaction_guard guard(app.db, false); if (args.size() > 1 || app.opts.revision_selectors.size() > 1) @@ -597,8 +599,8 @@ CMD(checkout, "checkout", "co", CMD_REF( F("use --revision or --branch to specify what to checkout")); set heads; - app.get_project().get_branch_heads(app.opts.branchname, heads, - app.opts.ignore_suspend_certs); + project.get_branch_heads(app.opts.branchname, heads, + app.opts.ignore_suspend_certs); N(heads.size() > 0, F("branch '%s' is empty") % app.opts.branchname); if (heads.size() > 1) @@ -606,7 +608,7 @@ CMD(checkout, "checkout", "co", CMD_REF( P(F("branch %s has multiple heads:") % app.opts.branchname); for (set::const_iterator i = heads.begin(); i != heads.end(); ++i) P(i18n_format(" %s") - % describe_revision(app.get_project(), *i)); + % describe_revision(project, *i)); P(F("choose one with '%s checkout -r'") % ui.prog_name); E(false, F("branch %s has multiple heads") % app.opts.branchname); } @@ -615,13 +617,13 @@ CMD(checkout, "checkout", "co", CMD_REF( else if (app.opts.revision_selectors.size() == 1) { // use specified revision - complete(app, idx(app.opts.revision_selectors, 0)(), revid); + complete(app, project, idx(app.opts.revision_selectors, 0)(), revid); - guess_branch(revid, app.opts, app.get_project()); + guess_branch(revid, app.opts, project); I(!app.opts.branchname().empty()); - N(app.get_project().revision_is_in_branch(revid, app.opts.branchname), + N(project.revision_is_in_branch(revid, app.opts.branchname), F("revision %s is not a member of branch %s") % revid % app.opts.branchname); } @@ -1056,6 +1058,7 @@ CMD(commit, "commit", "ci", CMD_REF(work temp_node_id_source nis; cset excluded; + project_t project(app.db); app.require_workspace(); app.make_branch_sticky(); @@ -1086,7 +1089,7 @@ CMD(commit, "commit", "ci", CMD_REF(work i++) { // this will prefer --branch if it was set - guess_branch(edge_old_revision(i), app.opts, app.get_project(), + guess_branch(edge_old_revision(i), app.opts, project, bn_candidate); N(branchname() == "" || branchname == bn_candidate, F("parent revisions of this commit are in different branches:\n" @@ -1152,8 +1155,8 @@ CMD(commit, "commit", "ci", CMD_REF(work // for the divergence check, below set heads; - app.get_project().get_branch_heads(app.opts.branchname, heads, - app.opts.ignore_suspend_certs); + project.get_branch_heads(app.opts.branchname, heads, + app.opts.ignore_suspend_certs); unsigned int old_head_size = heads.size(); { @@ -1238,11 +1241,10 @@ CMD(commit, "commit", "ci", CMD_REF(work app.db.put_revision(restricted_rev_id, rdat); } - app.get_project().put_standard_certs_from_options(app.opts, app.lua, - app.keys, - restricted_rev_id, - app.opts.branchname, - log_message); + project.put_standard_certs_from_options(app.opts, app.lua, app.keys, + restricted_rev_id, + app.opts.branchname, + log_message); guard.commit(); } @@ -1257,8 +1259,8 @@ CMD(commit, "commit", "ci", CMD_REF(work app.work.blank_user_log(); - app.get_project().get_branch_heads(app.opts.branchname, heads, - app.opts.ignore_suspend_certs); + project.get_branch_heads(app.opts.branchname, heads, + app.opts.ignore_suspend_certs); if (heads.size() > old_head_size && old_head_size > 0) { P(F("note: this revision creates divergence\n" "note: you may (or may not) wish to run '%s merge'") @@ -1276,7 +1278,7 @@ CMD(commit, "commit", "ci", CMD_REF(work // later. map certs; vector< revision > ctmp; - app.get_project().get_revision_certs(restricted_rev_id, ctmp); + project.get_revision_certs(restricted_rev_id, ctmp); for (vector< revision >::const_iterator i = ctmp.begin(); i != ctmp.end(); ++i) { @@ -1325,6 +1327,7 @@ CMD_NO_WORKSPACE(import, "import", "", C { revision_id ident; system_path dir; + project_t project(app.db); N(args.size() == 1, F("you must specify a directory to import")); @@ -1332,13 +1335,13 @@ CMD_NO_WORKSPACE(import, "import", "", C if (app.opts.revision_selectors.size() == 1) { // use specified revision - complete(app, idx(app.opts.revision_selectors, 0)(), ident); + complete(app, project, idx(app.opts.revision_selectors, 0)(), ident); - guess_branch(ident, app.opts, app.get_project()); + guess_branch(ident, app.opts, project); I(!app.opts.branchname().empty()); - N(app.get_project().revision_is_in_branch(ident, app.opts.branchname), + N(project.revision_is_in_branch(ident, app.opts.branchname), F("revision %s is not a member of branch %s") % ident % app.opts.branchname); } @@ -1349,14 +1352,14 @@ CMD_NO_WORKSPACE(import, "import", "", C F("use --revision or --branch to specify what to checkout")); set heads; - app.get_project().get_branch_heads(app.opts.branchname, heads, - app.opts.ignore_suspend_certs); + project.get_branch_heads(app.opts.branchname, heads, + app.opts.ignore_suspend_certs); if (heads.size() > 1) { P(F("branch %s has multiple heads:") % app.opts.branchname); for (set::const_iterator i = heads.begin(); i != heads.end(); ++i) P(i18n_format(" %s") - % describe_revision(app.get_project(), *i)); + % describe_revision(project, *i)); P(F("choose one with '%s checkout -r'") % ui.prog_name); E(false, F("branch %s has multiple heads") % app.opts.branchname); } ============================================================ --- commands.cc 83b3cbd4dd7fc1fa242b3a7311797449fb88ff14 +++ commands.cc dbbbf822e108aef1d4cd220bc5c1fb63bfadca59 @@ -24,6 +24,7 @@ #include "cmd.hh" #include "constants.hh" #include "app_state.hh" +#include "project.hh" #ifndef _WIN32 #include "lexical_cast.hh" ============================================================ --- netsync.cc eecd6fec7789d51c10daf9b819380e99ea1a00b3 +++ netsync.cc 43d0a7da662099a6f8912fe5615172343049975e @@ -3184,9 +3184,6 @@ session::rebuild_merkle_trees(set > certs; - // FIXME_PROJECTS: probably something like - // get_project(i->project).get_branch_certs(i->branch) - // or so. project.get_branch_certs(*i, certs); for (vector< revision >::const_iterator j = certs.begin(); j != certs.end(); j++) ============================================================ --- selectors.cc a63cff13b6230113758688098d9be976db0ea60f +++ selectors.cc 9682d2ded09a6d978251d9e251d67e174297deb7 @@ -13,6 +13,7 @@ #include "constants.hh" #include "database.hh" #include "app_state.hh" +#include "project.hh" #include "globish.hh" #include "cmd.hh" @@ -330,6 +331,7 @@ complete(app_state & app, void complete(app_state & app, + project_t & project, string const & str, set & completions) { @@ -342,13 +344,13 @@ complete(app_state & app, && sels[0].second.size() == constants::idlen) { completions.insert(revision_id(sels[0].second)); - N(app.db.revision_exists(*completions.begin()), + N(project.db.revision_exists(*completions.begin()), F("no such revision '%s'") % *completions.begin()); return; } P(F("expanding selection '%s'") % str); - complete_selector(sels, completions, app.get_project()); + complete_selector(sels, completions, project); N(completions.size() != 0, F("no match for selection '%s'") % str); @@ -360,22 +362,23 @@ complete(app_state & app, // This may be impossible, but let's make sure. // All the callers used to do it. - N(app.db.revision_exists(*i), + N(project.db.revision_exists(*i), F("no such revision '%s'") % *i); } } void complete(app_state & app, + project_t & project, string const & str, revision_id & completion) { set completions; - complete(app, str, completions); + complete(app, project, str, completions); I(completions.size() > 0); - diagnose_ambiguous_expansion(app, str, completions); + diagnose_ambiguous_expansion(project, str, completions); completion = *completions.begin(); } @@ -383,6 +386,7 @@ expand_selector(app_state & app, void expand_selector(app_state & app, + project_t & project, string const & str, set & completions) { @@ -398,11 +402,11 @@ expand_selector(app_state & app, return; } - complete_selector(sels, completions, app.get_project()); + complete_selector(sels, completions, project); } void -diagnose_ambiguous_expansion(app_state & app, +diagnose_ambiguous_expansion(project_t & project, string const & str, set const & completions) { @@ -413,7 +417,7 @@ diagnose_ambiguous_expansion(app_state & % str).str(); for (set::const_iterator i = completions.begin(); i != completions.end(); ++i) - err += ("\n" + describe_revision(app.get_project(), *i)); + err += ("\n" + describe_revision(project, *i)); N(false, i18n_format(err)); } ============================================================ --- selectors.hh d717061d1740519d27e3381fd91e46ce032dfbed +++ selectors.hh 3d84d9b5249cf2cc0ca120a38671f3a3fd7df54b @@ -14,6 +14,7 @@ class app_state; #include class app_state; +class project_t; // In the normal case, to expand a selector on the command line, use one of // these functions: the former if the selector can legitimately expand to @@ -21,10 +22,10 @@ class app_state; // selector that expands to zero revisions, or a nonexistent revision, as an // usage error, and generate progress messages when expanding selectors. -void complete(app_state & app, std::string const & str, +void complete(app_state & app, project_t & project, std::string const & str, std::set & completions); -void complete(app_state & app, std::string const & str, +void complete(app_state & app, project_t & project, std::string const & str, revision_id & completion); // For extra control, use these functions. expand_selector is just like the @@ -32,10 +33,11 @@ void complete(app_state & app, std::stri // or usage errors. diagnose_ambiguous_expansion generates the canonical // usage error if the set it is handed has more than one element. -void expand_selector(app_state & app, std::string const & str, +void expand_selector(app_state & app, project_t & project, + std::string const & str, std::set & completions); -void diagnose_ambiguous_expansion(app_state & app, std::string const & str, +void diagnose_ambiguous_expansion(project_t & project, std::string const & str, std::set const & completions);