# # # delete "README.encapsulation" # # patch "app_state.hh" # from [9dace2dc2bb5282d087840c90abaed01ba5406cb] # to [da07809aa88d917503bef7dcec8747ea1be036fd] # # patch "asciik.cc" # from [2d6d29c25b745d4e6edf50b936260b578ba1cc25] # to [0682f911f2598d229d218fd28cc5964534bd3c65] # # patch "automate.cc" # from [0bfd6b201ac27f53c3d16c566e47dbe750ff7c53] # to [be3c9252738e13b5a931b2cb063c30e7565ef203] # # patch "cmd_db.cc" # from [3ee4683a5bf823e4bd6e2fa58d530bb8855945eb] # to [e8cc81b07b7ab99d465fa066f57ce5ae66ae45f1] # # patch "cmd_diff_log.cc" # from [5acec4dbefcd8cbf47ced5068d2cd6b7f4e5c01a] # to [18d1a1e5263e20c7abc5ef241c0009e916dcaf81] # # patch "cmd_files.cc" # from [8352fcfda0f5f42347c9bf384d8cd457cf06e4fe] # to [995a0c7735c523970bbea677754e6282b4e0dfcf] # # patch "cmd_key_cert.cc" # from [19fe85922f7562f0497f5e5acd6f313d2cfe77f1] # to [5a6f3c9805fbb468738e50c3f8ae6107557650f8] # # patch "cmd_list.cc" # from [4de1e461e891d6461f673b3708f21423ece0085b] # to [90a6016a47d5cf3133ccd94f1f7908f573ab0535] # # patch "cmd_merging.cc" # from [2c89f51225c02200a2ba3e861afb94403fa6478a] # to [b46b96d6a1955676c8f3f0e739fce33c05f3383d] # # patch "cmd_netsync.cc" # from [56cd0fe69f28349a46fcd1b19acc0df610c7f011] # to [b8ca190aad2224943377ec9a1371bfbada568d4b] # # patch "cmd_ws_commit.cc" # from [273085e0ae7815df69f24d0360421fe14eaef81b] # to [cd238773230ad4d1a10dcf4aeef0ab5b76115718] # # patch "selectors.cc" # from [224c177eb35a210e6ebfd827d236f8300f3cbba0] # to [42d6f2ba123ad9887a14ba28d9e6bc0a0bac5148] # # patch "selectors.hh" # from [3d84d9b5249cf2cc0ca120a38671f3a3fd7df54b] # to [19cc6377e9afbf63e494d7bcfde3eb4754d2b510] # ============================================================ --- app_state.hh 9dace2dc2bb5282d087840c90abaed01ba5406cb +++ app_state.hh da07809aa88d917503bef7dcec8747ea1be036fd @@ -16,6 +16,17 @@ // This class used to hold most of the state of the application (hence the // name) but now it's just a wrapper around the options and lua_hooks // objects, plus one bit of state needed by the Lua extension interfaces. +// +// It is not quite possible to eliminate this object altogether. The major +// remaining use is the Lua interface, which has a back-mapping from +// lua_state (not lua_hooks) objects to app_state objects. This is mainly +// needed for the mtn_automate() function, which allows lua-coded extension +// commands to call the automate commands. +// +// Since the options and lua_hooks objects are so frequently required +// together, it may make sense to merge them together and have that merged +// object replace the app_state. Or we could just go back to passing this +// around instead of separate options and lua_hooks objects. class app_state { ============================================================ --- asciik.cc 2d6d29c25b745d4e6edf50b936260b578ba1cc25 +++ asciik.cc 0682f911f2598d229d218fd28cc5964534bd3c65 @@ -380,7 +380,7 @@ CMD(asciik, "asciik", "", CMD_REF(debug) set revs; database db(app); project_t project(db); - complete(app, project, idx(args, 0)(), revs); + complete(app.opts, app.lua, project, idx(args, 0)(), revs); vector sorted; toposort(db, revs, sorted); ============================================================ --- automate.cc 0bfd6b201ac27f53c3d16c566e47dbe750ff7c53 +++ automate.cc be3c9252738e13b5a931b2cb063c30e7565ef203 @@ -509,7 +509,7 @@ CMD_AUTOMATE(select, N_("SELECTOR"), database db(app); project_t project(db); set completions; - expand_selector(app, project, idx(args, 0)(), completions); + expand_selector(app.opts, app.lua, project, idx(args, 0)(), completions); for (set::const_iterator i = completions.begin(); i != completions.end(); ++i) ============================================================ --- cmd_db.cc 3ee4683a5bf823e4bd6e2fa58d530bb8855945eb +++ cmd_db.cc e8cc81b07b7ab99d465fa066f57ce5ae66ae45f1 @@ -138,7 +138,7 @@ CMD(db_kill_rev_locally, "kill_rev_local database db(app); project_t project(db); - complete(app, project, idx(args, 0)(), revid); + complete(app.opts, app.lua, project, idx(args, 0)(), revid); // Check that the revision does not have any children std::set children; ============================================================ --- cmd_diff_log.cc 5acec4dbefcd8cbf47ced5068d2cd6b7f4e5c01a +++ cmd_diff_log.cc 18d1a1e5263e20c7abc5ef241c0009e916dcaf81 @@ -346,9 +346,10 @@ dump_diffs(lua_hooks & lua, // common functionality for diff and automate content_diff to determine // revisions and rosters which should be diffed -// FIXME needs app_state for require_workspace +// FIXME needs app_state in order to create workspace objects (sometimes) static void prepare_diff(app_state & app, + database & db, cset & included, args_vector args, bool & new_is_archived, @@ -359,8 +360,6 @@ prepare_diff(app_state & app, cset excluded; // initialize before transaction so we have a database to work with. - - database db(app); project_t project(db); N(app.opts.revision_selectors.size() <= 2, @@ -406,7 +405,7 @@ prepare_diff(app_state & app, revision_id r_old_id; workspace work(app); - complete(app, project, idx(app.opts.revision_selectors, 0)(), r_old_id); + complete(app.opts, app.lua, project, idx(app.opts.revision_selectors, 0)(), r_old_id); db.get_roster(r_old_id, old_roster); work.get_current_roster_shape(db, nis, new_roster); @@ -432,8 +431,8 @@ prepare_diff(app_state & app, roster_t old_roster, restricted_roster, new_roster; revision_id r_old_id, 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); + complete(app.opts, app.lua, project, idx(app.opts.revision_selectors, 0)(), r_old_id); + complete(app.opts, app.lua, project, idx(app.opts.revision_selectors, 1)(), r_new_id); db.get_roster(r_old_id, old_roster); db.get_roster(r_new_id, new_roster); @@ -502,7 +501,7 @@ CMD(diff, "diff", "di", CMD_REF(informat bool new_is_archived; database db(app); - prepare_diff(app, included, args, new_is_archived, revs); + prepare_diff(app, db, included, args, new_is_archived, revs); data summary; write_cset(included, summary); @@ -557,7 +556,7 @@ CMD_AUTOMATE(content_diff, N_("[FILE [.. bool new_is_archived; database db(app); - prepare_diff(app, included, args, new_is_archived, dummy_header); + prepare_diff(app, db, included, args, new_is_archived, dummy_header); dump_diffs(app.lua, db, included, output, app.opts.diff_format, new_is_archived, !app.opts.no_show_encloser); @@ -669,7 +668,7 @@ CMD(log, "log", "", CMD_REF(informative) i != app.opts.from.end(); i++) { set rids; - complete(app, project, (*i)(), rids); + complete(app.opts, app.lua, project, (*i)(), rids); for (set::const_iterator j = rids.begin(); j != rids.end(); ++j) { @@ -725,7 +724,7 @@ CMD(log, "log", "", CMD_REF(informative) { MM(*i); set rids; - complete(app, project, (*i)(), rids); + complete(app.opts, app.lua, project, (*i)(), rids); for (set::const_iterator j = rids.begin(); j != rids.end(); ++j) { ============================================================ --- cmd_files.cc 8352fcfda0f5f42347c9bf384d8cd457cf06e4fe +++ cmd_files.cc 995a0c7735c523970bbea677754e6282b4e0dfcf @@ -174,7 +174,7 @@ CMD(annotate, "annotate", "", CMD_REF(in } else { - complete(app, project, idx(app.opts.revision_selectors, 0)(), rid); + complete(app.opts, app.lua, project, idx(app.opts.revision_selectors, 0)(), rid); db.get_roster(rid, roster); } @@ -307,7 +307,7 @@ CMD(cat, "cat", "", CMD_REF(informative) else { project_t project(db); - complete(app, project, idx(app.opts.revision_selectors, 0)(), rid); + complete(app.opts, app.lua, project, idx(app.opts.revision_selectors, 0)(), rid); } dump_file(db, cout, rid, idx(args, 0)); @@ -374,7 +374,7 @@ CMD_AUTOMATE(get_file_of, N_("FILENAME") else { project_t project(db); - complete(app, project, idx(app.opts.revision_selectors, 0)(), rid); + complete(app.opts, app.lua, project, idx(app.opts.revision_selectors, 0)(), rid); } dump_file(db, output, rid, idx(args, 0)); ============================================================ --- cmd_key_cert.cc 19fe85922f7562f0497f5e5acd6f313d2cfe77f1 +++ cmd_key_cert.cc 5a6f3c9805fbb468738e50c3f8ae6107557650f8 @@ -163,7 +163,7 @@ CMD(cert, "cert", "", CMD_REF(key_and_ce transaction_guard guard(db); revision_id rid; - complete(app, project, idx(args, 0)(), rid); + complete(app.opts, app.lua, project, idx(args, 0)(), rid); cert_name cname; internalize_cert_name(idx(args, 1), cname); @@ -197,7 +197,7 @@ CMD(trusted, "trusted", "", CMD_REF(key_ throw usage(execid); set rids; - expand_selector(app, project, idx(args, 0)(), rids); + expand_selector(app.opts, app.lua, project, idx(args, 0)(), rids); diagnose_ambiguous_expansion(project, idx(args, 0)(), rids); hexenc ident; @@ -252,7 +252,7 @@ CMD(tag, "tag", "", CMD_REF(review), N_( throw usage(execid); revision_id r; - complete(app, project, idx(args, 0)(), r); + complete(app.opts, app.lua, project, idx(args, 0)(), r); cache_user_key(app.opts, app.lua, db, keys); project.put_tag(keys, r, idx(args, 1)()); @@ -273,7 +273,7 @@ CMD(testresult, "testresult", "", CMD_RE throw usage(execid); revision_id r; - complete(app, project, idx(args, 0)(), r); + complete(app.opts, app.lua, project, idx(args, 0)(), r); cache_user_key(app.opts, app.lua, db, keys); cert_revision_testresult(db, keys, r, idx(args, 1)()); @@ -293,7 +293,7 @@ CMD(approve, "approve", "", CMD_REF(revi throw usage(execid); revision_id r; - complete(app, project, idx(args, 0)(), r); + complete(app.opts, app.lua, project, idx(args, 0)(), r); guess_branch(app.opts, project, r); N(app.opts.branchname() != "", F("need --branch argument for approval")); @@ -314,7 +314,7 @@ CMD(suspend, "suspend", "", CMD_REF(revi throw usage(execid); revision_id r; - complete(app, project, idx(args, 0)(), r); + complete(app.opts, app.lua, project, idx(args, 0)(), r); guess_branch(app.opts, project, r); N(app.opts.branchname() != "", F("need --branch argument to suspend")); @@ -349,7 +349,7 @@ CMD(comment, "comment", "", CMD_REF(revi F("empty comment")); revision_id r; - complete(app, project, idx(args, 0)(), r); + complete(app.opts, app.lua, project, idx(args, 0)(), r); cache_user_key(app.opts, app.lua, db, keys); cert_revision_comment(db, keys, r, comment); ============================================================ --- cmd_list.cc 4de1e461e891d6461f673b3708f21423ece0085b +++ cmd_list.cc 90a6016a47d5cf3133ccd94f1f7908f573ab0535 @@ -68,7 +68,7 @@ CMD(certs, "certs", "", CMD_REF(list), " transaction_guard guard(db, false); revision_id ident; - complete(app, project, idx(args, 0)(), ident); + complete(app.opts, app.lua, project, idx(args, 0)(), ident); vector< revision > ts; project.get_revision_certs(ident, ts); ============================================================ --- cmd_merging.cc 2c89f51225c02200a2ba3e861afb94403fa6478a +++ cmd_merging.cc b46b96d6a1955676c8f3f0e739fce33c05f3383d @@ -199,7 +199,7 @@ CMD(update, "update", "", CMD_REF(worksp } else { - complete(app, project, app.opts.revision_selectors[0](), chosen_rid); + complete(app.opts, app.lua, project, app.opts.revision_selectors[0](), chosen_rid); } I(!null_id(chosen_rid)); @@ -715,7 +715,7 @@ CMD(merge_into_workspace, "merge_into_wo calculate_ident(working_rev, working_rid); } - complete(app, project, idx(args, 0)(), right_id); + complete(app.opts, app.lua, project, idx(args, 0)(), right_id); db.get_roster(right_id, right); N(!(left_id == right_id), F("workspace is already at revision %s") % left_id); @@ -790,8 +790,8 @@ CMD(explicit_merge, "explicit_merge", "" if (args.size() != 3) throw usage(execid); - complete(app, project, idx(args, 0)(), left); - complete(app, project, idx(args, 1)(), right); + complete(app.opts, app.lua, project, idx(args, 0)(), left); + complete(app.opts, app.lua, project, idx(args, 1)(), right); branch = branch_name(idx(args, 2)()); N(!(left == right), @@ -820,8 +820,8 @@ CMD(show_conflicts, "show_conflicts", "" if (args.size() != 2) throw usage(execid); revision_id l_id, r_id; - complete(app, project, idx(args,0)(), l_id); - complete(app, project, idx(args,1)(), r_id); + complete(app.opts, app.lua, project, idx(args,0)(), l_id); + complete(app.opts, app.lua, project, idx(args,1)(), r_id); N(!is_ancestor(db, l_id, r_id), F("%s is an ancestor of %s; no merge is needed.") % l_id % r_id); N(!is_ancestor(db, r_id, l_id), @@ -890,7 +890,7 @@ CMD(pluck, "pluck", "", CMD_REF(workspac revision_id from_rid, to_rid; if (app.opts.revision_selectors.size() == 1) { - complete(app, project, idx(app.opts.revision_selectors, 0)(), to_rid); + complete(app.opts, app.lua, project, idx(app.opts.revision_selectors, 0)(), to_rid); std::set parents; db.get_revision_parents(to_rid, parents); N(parents.size() == 1, @@ -903,8 +903,8 @@ CMD(pluck, "pluck", "", CMD_REF(workspac } else if (app.opts.revision_selectors.size() == 2) { - complete(app, project, idx(app.opts.revision_selectors, 0)(), from_rid); - complete(app, project, idx(app.opts.revision_selectors, 1)(), to_rid); + complete(app.opts, app.lua, project, idx(app.opts.revision_selectors, 0)(), from_rid); + complete(app.opts, app.lua, project, idx(app.opts.revision_selectors, 1)(), to_rid); } else throw usage(execid); @@ -1144,7 +1144,7 @@ CMD(get_roster, "get_roster", "", CMD_RE database db(app); project_t project(db); revision_id rid; - complete(app, project, idx(args, 0)(), rid); + complete(app.opts, app.lua, project, idx(args, 0)(), rid); I(!null_id(rid)); db.get_roster(rid, roster, mm); } ============================================================ --- cmd_netsync.cc 56cd0fe69f28349a46fcd1b19acc0df610c7f011 +++ cmd_netsync.cc b8ca190aad2224943377ec9a1371bfbada568d4b @@ -389,7 +389,7 @@ CMD(clone, "clone", "", CMD_REF(network) else if (app.opts.revision_selectors.size() == 1) { // use specified revision - complete(app, project, idx(app.opts.revision_selectors, 0)(), ident); + complete(app.opts, app.lua, project, idx(app.opts.revision_selectors, 0)(), ident); guess_branch(app.opts, project, ident); I(!app.opts.branchname().empty()); ============================================================ --- cmd_ws_commit.cc 273085e0ae7815df69f24d0360421fe14eaef81b +++ cmd_ws_commit.cc cd238773230ad4d1a10dcf4aeef0ab5b76115718 @@ -353,7 +353,7 @@ CMD(disapprove, "disapprove", "", CMD_RE revision_id r; revision_t rev, rev_inverse; shared_ptr cs_inverse(new cset()); - complete(app, project, idx(args, 0)(), r); + complete(app.opts, app.lua, project, idx(args, 0)(), r); db.get_revision(r, rev); N(rev.edges.size() == 1, @@ -633,7 +633,7 @@ CMD(checkout, "checkout", "co", CMD_REF( else if (app.opts.revision_selectors.size() == 1) { // use specified revision - complete(app, project, idx(app.opts.revision_selectors, 0)(), revid); + complete(app.opts, app.lua, project, idx(app.opts.revision_selectors, 0)(), revid); guess_branch(app.opts, project, revid); @@ -1365,7 +1365,7 @@ CMD_NO_WORKSPACE(import, "import", "", C if (app.opts.revision_selectors.size() == 1) { // use specified revision - complete(app, project, idx(app.opts.revision_selectors, 0)(), ident); + complete(app.opts, app.lua, project, idx(app.opts.revision_selectors, 0)(), ident); guess_branch(app.opts, project, ident); ============================================================ --- selectors.cc 224c177eb35a210e6ebfd827d236f8300f3cbba0 +++ selectors.cc 42d6f2ba123ad9887a14ba28d9e6bc0a0bac5148 @@ -48,7 +48,8 @@ static void typedef vector > selector_list; static void -decode_selector(app_state & app, +decode_selector(options const & opts, + lua_hooks & lua, string const & orig_sel, selector_type & type, string & sel) @@ -60,7 +61,7 @@ decode_selector(app_state & app, string tmp; if (sel.size() < 2 || sel[1] != ':') { - if (!app.lua.hook_expand_selector(sel, tmp)) + if (!lua.hook_expand_selector(sel, tmp)) { L(FL("expansion of selector '%s' failed") % sel); } @@ -82,7 +83,7 @@ decode_selector(app_state & app, type = sel_branch; break; case 'h': - type = app.opts.ignore_suspend_certs ? sel_any_head : sel_head; + type = opts.ignore_suspend_certs ? sel_any_head : sel_head; break; case 'd': type = sel_date; @@ -117,9 +118,9 @@ decode_selector(app_state & app, case sel_date: case sel_later: case sel_earlier: - if (app.lua.hook_exists("expand_date")) + if (lua.hook_exists("expand_date")) { - N(app.lua.hook_expand_date(sel, tmp), + N(lua.hook_expand_date(sel, tmp), F("selector '%s' is not a valid date\n") % sel); } else @@ -160,7 +161,7 @@ decode_selector(app_state & app, : F("the empty head selector h: refers to " "the head of the current branch"); workspace::require_workspace(msg); - sel = app.opts.branchname(); + sel = opts.branchname(); } break; @@ -175,7 +176,9 @@ static void } static void -parse_selector(app_state & app, string const & str, selector_list & sels) +parse_selector(options const & opts, + lua_hooks & lua, + string const & str, selector_list & sels) { sels.clear(); @@ -201,7 +204,7 @@ parse_selector(app_state & app, string c string sel; selector_type type = sel_unknown; - decode_selector(app, *i, type, sel); + decode_selector(opts, lua, *i, type, sel); sels.push_back(make_pair(type, sel)); } } @@ -329,13 +332,13 @@ void } void -complete(app_state & app, +complete(options const & opts, lua_hooks & lua, project_t & project, string const & str, set & completions) { selector_list sels; - parse_selector(app, str, sels); + parse_selector(opts, lua, str, sels); // avoid logging if there's no expansion to be done if (sels.size() == 1 @@ -367,14 +370,14 @@ void } void -complete(app_state & app, +complete(options const & opts, lua_hooks & lua, project_t & project, string const & str, revision_id & completion) { set completions; - complete(app, project, str, completions); + complete(opts, lua, project, str, completions); I(completions.size() > 0); diagnose_ambiguous_expansion(project, str, completions); @@ -384,13 +387,13 @@ void void -expand_selector(app_state & app, +expand_selector(options const & opts, lua_hooks & lua, project_t & project, string const & str, set & completions) { selector_list sels; - parse_selector(app, str, sels); + parse_selector(opts, lua, str, sels); // avoid logging if there's no expansion to be done if (sels.size() == 1 ============================================================ --- selectors.hh 3d84d9b5249cf2cc0ca120a38671f3a3fd7df54b +++ selectors.hh 19cc6377e9afbf63e494d7bcfde3eb4754d2b510 @@ -13,7 +13,8 @@ #include "vocab.hh" #include -class app_state; +class options; +class lua_hooks; class project_t; // In the normal case, to expand a selector on the command line, use one of @@ -22,10 +23,12 @@ class project_t; // 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, project_t & project, std::string const & str, +void complete(options const & opts, lua_hooks & lua, + project_t & project, std::string const & str, std::set & completions); -void complete(app_state & app, project_t & project, std::string const & str, +void complete(options const & opts, lua_hooks & lua, + project_t & project, std::string const & str, revision_id & completion); // For extra control, use these functions. expand_selector is just like the @@ -33,8 +36,8 @@ void complete(app_state & app, project_t // 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, project_t & project, - std::string const & str, +void expand_selector(options const & opts, lua_hooks & lua, + project_t & project, std::string const & str, std::set & completions); void diagnose_ambiguous_expansion(project_t & project, std::string const & str,