# # # patch "app_state.cc" # from [a61299308bb07a57c8b5678640ff940ee2db0d5a] # to [cbb847daf2800d068a0f5f3897b2fb15d4bbeada] # # patch "app_state.hh" # from [bd36f6ee540b63ccef2ecee1cdd0353c7ad36e6e] # to [d3043a4c8bd079e3cb6e61226cc814d7ad0599d6] # # patch "asciik.cc" # from [3da3edbd264cbf8932a700816e7228d93781d629] # to [c1b62f0e8a2347a961476756cb88d502494cfd32] # # patch "automate.cc" # from [f391cb466a1a2e64c65b10a6d92a4a7ecf3c2dec] # to [7e4511251379539cef80d5d9016cf025f42f3cb2] # # patch "cmd.hh" # from [bd53821a5daaf2e2b6731ffa18c0f64d5388568e] # to [443f9905c80e439caf335463cc06061aac0dc641] # # patch "cmd_automate.cc" # from [80402564622e7c6db7e25bdbae95c70d9215fe65] # to [f49fdacfa01ecb31ad27165784649a34cf343a7b] # # patch "cmd_db.cc" # from [d27033cf306a7fff9098b06061a13699914f4032] # to [081f12f18b9bb58d080d07b69e71cd33b8ed7428] # # patch "cmd_diff_log.cc" # from [5202385ce32ba2e2e41ae2c99c7cff579ce9e491] # to [2d7990de11718287188fda97e47402b3dd0c36f5] # # patch "cmd_files.cc" # from [68eafab3955008cebf7ad4f22e2f1d4dd6bad55a] # to [ab72144d225898f3837bf6dc5db576d33639836c] # # patch "cmd_key_cert.cc" # from [e9e4fa74701942d70c5ac1ca5d5139e6decc3ee2] # to [9608b26014c45b411d49fc018033d63704d50e18] # # patch "cmd_list.cc" # from [079dd89658dd5b56622e60256d797e0d02b02f22] # to [27e6cda2c9abd8d4756a8604e3026fedda5bf3b3] # # patch "cmd_merging.cc" # from [d9ab554e280d2364e2faf8e5ba6db5376dbeb0e3] # to [4d403e14031d2efa2e447ee2a533cfe941730394] # # patch "cmd_netsync.cc" # from [68b7aa1513248fa388336d5def0d12e6d515453f] # to [9904866a3fd2d2b4811d405c57d6c2c0e39cc35a] # # patch "cmd_othervcs.cc" # from [9d46c385ed7557d720aa71c99da22e40b6549304] # to [86e381599532f41a2069cf8d6c6a24cfeab0d79b] # # patch "cmd_packet.cc" # from [c11efd7185369ad0de570b5bf9039af982bdfebe] # to [31f9ca76ee6a74da76f3691f64e346ac0d232550] # # patch "cmd_ws_commit.cc" # from [ac359c1689f1151900da5dd130319956a658b6f1] # to [bc75003a35d2e994c039c38f3bbb8d2d90bf3f7c] # # patch "database.cc" # from [74c819293bca360a8df5a82776edfc5f12c22bdd] # to [dc4ea850465d2c7825192cd8732b70311a75cd4c] # # patch "database.hh" # from [eb927e49718ef1e00b7b6130b01b4abfaaae387e] # to [03747a6095f46b36c98ad383fe85b26dc2bf92c4] # # patch "key_store.hh" # from [2e71dfcb623cb876f908cd8c3c095aba2bccd393] # to [86c48762abf384ec608d0235b4173ffb72aab178] # # patch "monotone.cc" # from [3602b1d8a957547153408a9a13c44d3a33803ecb] # to [c73711529cf72e60813e162d9f80225a1ac2c400] # ============================================================ --- app_state.cc a61299308bb07a57c8b5678640ff940ee2db0d5a +++ app_state.cc cbb847daf2800d068a0f5f3897b2fb15d4bbeada @@ -29,7 +29,7 @@ app_state::app_state() using std::vector; app_state::app_state() - : lua(this), db(lua), work(lua), + : lua(this), work(lua), branch_is_sticky(false), mtn_automate_allowed(false) {} @@ -71,15 +71,16 @@ app_state::process_options() key_option, keydir_option); // Workspace options are not to override the command line. - if (db.get_filename().as_internal().empty() - && !database_option.as_internal().empty()) - db.set_filename(database_option); + if (!opts.dbname_given) + { + I(opts.dbname.empty()); + opts.dbname = database_option; + } if (!opts.key_dir_given && !opts.conf_dir_given) { I(opts.key_dir.empty()); - if (!keydir_option.empty()) - opts.key_dir = keydir_option; + opts.key_dir = keydir_option; } if (opts.branchname().empty() && !branch_option().empty()) @@ -102,7 +103,7 @@ app_state::write_options() rsa_keypair_id key_option; system_path keydir_option; - database_option = db.get_filename(); + database_option = opts.dbname; keydir_option = opts.key_dir; if (branch_is_sticky) @@ -167,26 +168,6 @@ void } void -app_state::set_database(system_path const & filename) -{ - if (!filename.empty()) - { - db.set_filename(filename); - - if (found_workspace) - { - system_path database_option(filename); - branch_name branch_option; - rsa_keypair_id key_option; - system_path keydir_option; - - work.set_ws_options(database_option, branch_option, - key_option, keydir_option); - } - } -} - -void app_state::make_branch_sticky() { branch_is_sticky = true; ============================================================ --- app_state.hh bd36f6ee540b63ccef2ecee1cdd0353c7ad36e6e +++ app_state.hh d3043a4c8bd079e3cb6e61226cc814d7ad0599d6 @@ -13,7 +13,6 @@ #include "paths.hh" #include "options.hh" #include "lua_hooks.hh" -#include "database.hh" #include "work.hh" // This class is supposed to hold all (or.. well, most) of the state @@ -25,17 +24,19 @@ public: class app_state { public: + explicit app_state(); + ~app_state(); + options opts; lua_hooks lua; - database db; workspace work; bool found_workspace; bool branch_is_sticky; bool mtn_automate_allowed; - void allow_workspace(); void process_options(); + void allow_workspace(); void require_workspace(std::string const & explanation = ""); void create_workspace(system_path const & dir); @@ -45,14 +46,8 @@ public: // switch the working to a different branch should invoke // make_branch_sticky (before require_workspace because this // function updates the workspace). - void make_branch_sticky(); - void set_database(system_path const & filename); - - explicit app_state(); - ~app_state(); - private: void write_options(); }; ============================================================ --- asciik.cc 3da3edbd264cbf8932a700816e7228d93781d629 +++ asciik.cc c1b62f0e8a2347a961476756cb88d502494cfd32 @@ -375,12 +375,13 @@ CMD(asciik, "asciik", "", CMD_REF(debug) N(args.size() == 1, F("wrong argument count")); - set revs; - project_t project(app.db); + set revs; + database db(app); + project_t project(db); complete(app, project, idx(args, 0)(), revs); vector sorted; - toposort(app.db, revs, sorted); + toposort(db, revs, sorted); reverse(sorted.begin(), sorted.end()); asciik graph(std::cout, 10); @@ -389,7 +390,7 @@ CMD(asciik, "asciik", "", CMD_REF(debug) rev != sorted.end(); ++rev) { set parents; - app.db.get_revision_parents(*rev, parents); + db.get_revision_parents(*rev, parents); parents.erase(ghost); // remove the fake parent that root nodes have graph.print(*rev, parents, rev->inner()()); } ============================================================ --- automate.cc f391cb466a1a2e64c65b10a6d92a4a7ecf3c2dec +++ automate.cc 7e4511251379539cef80d5d9016cf025f42f3cb2 @@ -75,7 +75,7 @@ CMD_AUTOMATE(heads, N_("[BRANCH]"), N(args.size() < 2, F("wrong argument count")); - CMD_REQUIRES_DATABASE(app); + database db(app); project_t project(db); branch_name branch; @@ -112,7 +112,7 @@ CMD_AUTOMATE(ancestors, N_("REV1 [REV2 [ N(args.size() > 0, F("wrong argument count")); - CMD_REQUIRES_DATABASE(app); + database db(app); set ancestors; vector frontier; @@ -164,7 +164,7 @@ CMD_AUTOMATE(descendents, N_("REV1 [REV2 N(args.size() > 0, F("wrong argument count")); - CMD_REQUIRES_DATABASE(app); + database db(app); set descendents; vector frontier; @@ -214,7 +214,7 @@ CMD_AUTOMATE(erase_ancestors, N_("[REV1 "", options::opts::none) { - CMD_REQUIRES_DATABASE(app); + database db(app); set revs; for (args_vector::const_iterator i = args.begin(); i != args.end(); ++i) @@ -243,7 +243,7 @@ CMD_AUTOMATE(toposort, N_("[REV1 [REV2 [ "", options::opts::none) { - CMD_REQUIRES_DATABASE(app); + database db(app); set revs; for (args_vector::const_iterator i = args.begin(); i != args.end(); ++i) @@ -284,7 +284,7 @@ CMD_AUTOMATE(ancestry_difference, N_("NE N(args.size() > 0, F("wrong argument count")); - CMD_REQUIRES_DATABASE(app); + database db(app); revision_id a; set bs; @@ -328,7 +328,7 @@ CMD_AUTOMATE(leaves, "", N(args.size() == 0, F("no arguments needed")); - CMD_REQUIRES_DATABASE(app); + database db(app); set leaves; db.get_leaves(leaves); @@ -354,7 +354,7 @@ CMD_AUTOMATE(roots, "", N(args.size() == 0, F("no arguments needed")); - CMD_REQUIRES_DATABASE(app); + database db(app); // the real root revisions are the children of one single imaginary root // with an empty revision id @@ -384,7 +384,7 @@ CMD_AUTOMATE(parents, N_("REV"), N(args.size() == 1, F("wrong argument count")); - CMD_REQUIRES_DATABASE(app); + database db(app); revision_id rid(idx(args, 0)()); N(db.revision_exists(rid), F("no such revision '%s'") % rid); @@ -414,7 +414,7 @@ CMD_AUTOMATE(children, N_("REV"), N(args.size() == 1, F("wrong argument count")); - CMD_REQUIRES_DATABASE(app); + database db(app); revision_id rid(idx(args, 0)()); N(db.revision_exists(rid), F("no such revision '%s'") % rid); @@ -454,7 +454,7 @@ CMD_AUTOMATE(graph, "", N(args.size() == 0, F("no arguments needed")); - CMD_REQUIRES_DATABASE(app); + database db(app); multimap edges_mmap; map > child_to_parents; @@ -502,8 +502,8 @@ CMD_AUTOMATE(select, N_("SELECTOR"), N(args.size() == 1, F("wrong argument count")); - CMD_REQUIRES_DATABASE(app); - project_t project(app.db); + database db(app); + project_t project(db); set completions; expand_selector(app, project, idx(args, 0)(), completions); @@ -978,11 +978,11 @@ CMD_AUTOMATE(inventory, N_("[PATH]...") options::opts::no_unchanged | options::opts::no_corresponding_renames) { - CMD_REQUIRES_DATABASE(app); + database db(app); CMD_REQUIRES_WORKSPACE(app); parent_map parents; - work.get_parent_rosters(app.db, parents); + work.get_parent_rosters(db, parents); // for now, until we've figured out what the format could look like // and what conceptional model we can implement // see: http://www.venge.net/mtn-wiki/MultiParentWorkspaceFallout @@ -992,7 +992,7 @@ CMD_AUTOMATE(inventory, N_("[PATH]...") roster_t new_roster, old_roster = parent_roster(parents.begin()); temp_node_id_source nis; - work.get_current_roster_shape(app.db, nis, new_roster); + work.get_current_roster_shape(db, nis, new_roster); inventory_map inventory; vector includes = args_to_paths(args); @@ -1190,7 +1190,7 @@ CMD_AUTOMATE(get_revision, N_("[REVID]") N(args.size() < 2, F("wrong argument count")); - CMD_REQUIRES_DATABASE(app); + database db(app); temp_node_id_source nis; revision_data dat; @@ -1239,10 +1239,11 @@ CMD_AUTOMATE(get_base_revision_id, "", N(args.size() == 0, F("no arguments needed")); + database db(app); CMD_REQUIRES_WORKSPACE(app); parent_map parents; - work.get_parent_rosters(app.db, parents); + work.get_parent_rosters(db, parents); N(parents.size() == 1, F("this command can only be used in a single-parent workspace")); @@ -1267,7 +1268,7 @@ CMD_AUTOMATE(get_current_revision_id, "" F("no arguments needed")); CMD_REQUIRES_WORKSPACE(app); - CMD_REQUIRES_DATABASE(app); + database db(app); parent_map parents; roster_t new_roster; @@ -1332,7 +1333,7 @@ CMD_AUTOMATE(get_manifest_of, N_("[REVID "", options::opts::none) { - CMD_REQUIRES_DATABASE(app); + database db(app); N(args.size() < 2, F("wrong argument count")); @@ -1384,7 +1385,7 @@ CMD_AUTOMATE(packet_for_rdata, N_("REVID N(args.size() == 1, F("wrong argument count")); - CMD_REQUIRES_DATABASE(app); + database db(app); packet_writer pw(output); @@ -1416,7 +1417,7 @@ CMD_AUTOMATE(packets_for_certs, N_("REVI N(args.size() == 1, F("wrong argument count")); - CMD_REQUIRES_DATABASE(app); + database db(app); project_t project(db); packet_writer pw(output); @@ -1448,7 +1449,7 @@ CMD_AUTOMATE(packet_for_fdata, N_("FILEI N(args.size() == 1, F("wrong argument count")); - CMD_REQUIRES_DATABASE(app); + database db(app); packet_writer pw(output); @@ -1480,7 +1481,7 @@ CMD_AUTOMATE(packet_for_fdelta, N_("OLD_ N(args.size() == 2, F("wrong argument count")); - CMD_REQUIRES_DATABASE(app); + database db(app); packet_writer pw(output); @@ -1520,7 +1521,7 @@ CMD_AUTOMATE(common_ancestors, N_("REV1 N(args.size() > 0, F("wrong argument count")); - CMD_REQUIRES_DATABASE(app); + database db(app); set ancestors, common_ancestors; vector frontier; @@ -1588,7 +1589,7 @@ CMD_AUTOMATE(branches, "", N(args.size() == 0, F("no arguments needed")); - CMD_REQUIRES_DATABASE(app); + database db(app); project_t project(db); set names; @@ -1640,7 +1641,7 @@ CMD_AUTOMATE(tags, N_("[BRANCH_PATTERN]" N(args.size() < 2, F("wrong argument count")); - CMD_REQUIRES_DATABASE(app); + database db(app); project_t project(db); globish incl("*"); bool filtering(false); @@ -1739,7 +1740,7 @@ CMD_AUTOMATE(genkey, N_("KEYID PASSPHRAS N(args.size() == 2, F("wrong argument count")); - CMD_REQUIRES_DATABASE(app); + database db(app); key_store keys(app); rsa_keypair_id ident; @@ -1748,12 +1749,12 @@ CMD_AUTOMATE(genkey, N_("KEYID PASSPHRAS utf8 passphrase = idx(args, 1); hexenc pubhash, privhash; - keys.create_key_pair(app.db, ident, &passphrase, &pubhash, &privhash); + keys.create_key_pair(db, ident, &passphrase, &pubhash, &privhash); basic_io::printer prt; basic_io::stanza stz; vector publocs, privlocs; - if (app.db.database_specified()) + if (db.database_specified()) publocs.push_back("database"); publocs.push_back("keystore"); privlocs.push_back("keystore"); @@ -1840,7 +1841,7 @@ CMD_AUTOMATE(get_content_changed, N_("RE N(args.size() == 2, F("wrong argument count")); - CMD_REQUIRES_DATABASE(app); + database db(app); roster_t new_roster; revision_id ident; @@ -1904,7 +1905,7 @@ CMD_AUTOMATE(get_corresponding_path, N_( N(args.size() == 3, F("wrong argument count")); - CMD_REQUIRES_DATABASE(app); + database db(app); roster_t new_roster, old_roster; revision_id ident, old_ident; @@ -1956,7 +1957,7 @@ CMD_AUTOMATE(put_file, N_("[FILEID] CONT N(args.size() == 1 || args.size() == 2, F("wrong argument count")); - CMD_REQUIRES_DATABASE(app); + database db(app); file_id sha1sum; transaction_guard tr(db); @@ -2011,7 +2012,7 @@ CMD_AUTOMATE(put_revision, N_("REVISION- N(args.size() == 1, F("wrong argument count")); - CMD_REQUIRES_DATABASE(app); + database db(app); revision_t rev; read_revision(revision_data(idx(args, 0)()), rev); @@ -2070,7 +2071,7 @@ CMD_AUTOMATE(cert, N_("REVISION-ID NAME N(args.size() == 3, F("wrong argument count")); - CMD_REQUIRES_DATABASE(app); + database db(app); key_store keys(app); revision_id rid(idx(args, 0)()); @@ -2102,6 +2103,7 @@ CMD_AUTOMATE(get_db_variables, N_("[DOMA N(args.size() < 2, F("wrong argument count")); + database db(app); bool filter_by_domain = false; var_domain filter; if (args.size() == 1) @@ -2111,7 +2113,7 @@ CMD_AUTOMATE(get_db_variables, N_("[DOMA } map vars; - app.db.get_vars(vars); + db.get_vars(vars); var_domain cur_domain; basic_io::stanza st; @@ -2171,7 +2173,7 @@ CMD_AUTOMATE(set_db_variable, N_("DOMAIN N(args.size() == 3, F("wrong argument count")); - CMD_REQUIRES_DATABASE(app); + database db(app); var_domain domain = var_domain(idx(args, 0)()); utf8 name = idx(args, 1); @@ -2201,7 +2203,7 @@ CMD_AUTOMATE(drop_db_variables, N_("DOMA N(args.size() == 1 || args.size() == 2, F("wrong argument count")); - CMD_REQUIRES_DATABASE(app); + database db(app); var_domain domain(idx(args, 0)()); ============================================================ --- cmd.hh bd53821a5daaf2e2b6731ffa18c0f64d5388568e +++ cmd.hh 443f9905c80e439caf335463cc06061aac0dc641 @@ -277,9 +277,6 @@ void commands::automate_ ## C :: exec_fr args_vector const & args, \ std::ostream & output) const -#define CMD_REQUIRES_DATABASE(app) \ -database & db = app.db - #define CMD_REQUIRES_WORKSPACE(app) \ workspace & work = app.work; \ app.require_workspace() ============================================================ --- cmd_automate.cc 80402564622e7c6db7e25bdbae95c70d9215fe65 +++ cmd_automate.cc f49fdacfa01ecb31ad27165784649a34cf343a7b @@ -340,11 +340,10 @@ CMD_AUTOMATE(stdio, "", N(args.size() == 0, F("no arguments needed")); - CMD_REQUIRES_DATABASE(app); - // FIXME: additionally requires some app.opts... + database db(app); - // initialize the database early so any calling process is notified - // immediately if a version discrepancy exists + // initialize the database early so any calling process is notified + // immediately if a version discrepancy exists db.ensure_open(); automate_ostream os(output, app.opts.automate_stdio_size); @@ -441,8 +440,6 @@ LUAEXT(mtn_automate, ) E(n > 0, F("Bad input to mtn_automate() lua extension: command name is missing")); - app_p->db.ensure_open(); - L(FL("Starting call to mtn_automate lua hook")); for (int i=1; i<=n; i++) ============================================================ --- cmd_db.cc d27033cf306a7fff9098b06061a13699914f4032 +++ cmd_db.cc 081f12f18b9bb58d080d07b69e71cd33b8ed7428 @@ -39,7 +39,8 @@ CMD(db_init, "init", "", CMD_REF(db), "" N(args.size() == 0, F("no arguments needed")); - app.db.initialize(); + database db(app); + db.initialize(); } CMD(db_info, "info", "", CMD_REF(db), "", @@ -50,7 +51,8 @@ CMD(db_info, "info", "", CMD_REF(db), "" N(args.size() == 0, F("no arguments needed")); - app.db.info(cout); + database db(app); + db.info(cout); } CMD(db_version, "version", "", CMD_REF(db), "", @@ -61,7 +63,8 @@ CMD(db_version, "version", "", CMD_REF(d N(args.size() == 0, F("no arguments needed")); - app.db.version(cout); + database db(app); + db.version(cout); } CMD(db_dump, "dump", "", CMD_REF(db), "", @@ -74,7 +77,8 @@ CMD(db_dump, "dump", "", CMD_REF(db), "" N(args.size() == 0, F("no arguments needed")); - app.db.dump(cout); + database db(app); + db.dump(cout); } CMD(db_load, "load", "", CMD_REF(db), "", @@ -87,7 +91,8 @@ CMD(db_load, "load", "", CMD_REF(db), "" N(args.size() == 0, F("no arguments needed")); - app.db.load(cin); + database db(app); + db.load(cin); } CMD(db_migrate, "migrate", "", CMD_REF(db), "", @@ -102,7 +107,8 @@ CMD(db_migrate, "migrate", "", CMD_REF(d N(args.size() == 0, F("no arguments needed")); - app.db.migrate(keys); + database db(app); + db.migrate(keys); } CMD(db_execute, "execute", "", CMD_REF(db), "", @@ -113,7 +119,8 @@ CMD(db_execute, "execute", "", CMD_REF(d if (args.size() != 1) throw usage(execid); - app.db.debug(idx(args, 0)(), cout); + database db(app); + db.debug(idx(args, 0)(), cout); } CMD(db_kill_rev_locally, "kill_rev_locally", "", CMD_REF(db), "ID", @@ -126,12 +133,13 @@ CMD(db_kill_rev_locally, "kill_rev_local revision_id revid; - project_t project(app.db); + database db(app); + project_t project(db); complete(app, project, idx(args, 0)(), revid); // Check that the revision does not have any children std::set children; - app.db.get_revision_children(revid, children); + db.get_revision_children(revid, children); N(!children.size(), F("revision %s already has children. We cannot kill it.") % revid); @@ -159,7 +167,7 @@ CMD(db_kill_rev_locally, "kill_rev_local if (edge_old_revision(i) != revid) continue; - N(!app.work.has_changes(app.db), + N(!app.work.has_changes(db), F("Cannot kill revision %s,\n" "because it would leave the current workspace in an invalid\n" "state, from which monotone cannot recover automatically since\n" @@ -171,7 +179,7 @@ CMD(db_kill_rev_locally, "kill_rev_local % revid); revision_t new_work_rev; - app.db.get_revision(revid, new_work_rev); + db.get_revision(revid, new_work_rev); new_work_rev.made_for = made_for_workspace; app.work.put_work_rev(new_work_rev); @@ -181,7 +189,7 @@ CMD(db_kill_rev_locally, "kill_rev_local } } - app.db.delete_existing_rev_and_certs(revid); + db.delete_existing_rev_and_certs(revid); } CMD(db_kill_branch_certs_locally, "kill_branch_certs_locally", "", CMD_REF(db), @@ -193,7 +201,8 @@ CMD(db_kill_branch_certs_locally, "kill_ if (args.size() != 1) throw usage(execid); - app.db.delete_branch_named(cert_value(idx(args, 0)())); + database db(app); + db.delete_branch_named(cert_value(idx(args, 0)())); } CMD(db_kill_tag_locally, "kill_tag_locally", "", CMD_REF(db), "TAG", @@ -204,7 +213,8 @@ CMD(db_kill_tag_locally, "kill_tag_local if (args.size() != 1) throw usage(execid); - app.db.delete_tag_named(cert_value(idx(args, 0)())); + database db(app); + db.delete_tag_named(cert_value(idx(args, 0)())); } CMD(db_check, "check", "", CMD_REF(db), "", @@ -216,7 +226,8 @@ CMD(db_check, "check", "", CMD_REF(db), N(args.size() == 0, F("no arguments needed")); - check_db(app.db); + database db(app); + check_db(db); } CMD(db_changesetify, "changesetify", "", CMD_REF(db), "", @@ -224,18 +235,19 @@ CMD(db_changesetify, "changesetify", "", "", options::opts::none) { + database db(app); key_store keys(app); N(args.size() == 0, F("no arguments needed")); - app.db.ensure_open_for_format_changes(); - app.db.check_is_not_rosterified(); + db.ensure_open_for_format_changes(); + db.check_is_not_rosterified(); // early short-circuit to avoid failure after lots of work - cache_user_key(app.opts, app.lua, app.db, keys); + cache_user_key(app.opts, app.lua, db, keys); - build_changesets_from_manifest_ancestry(app.db, keys, set()); + build_changesets_from_manifest_ancestry(db, keys, set()); } CMD(db_rosterify, "rosterify", "", CMD_REF(db), "", @@ -243,18 +255,19 @@ CMD(db_rosterify, "rosterify", "", CMD_R "", options::opts::drop_attr) { + database db(app); key_store keys(app); N(args.size() == 0, F("no arguments needed")); - app.db.ensure_open_for_format_changes(); - app.db.check_is_not_rosterified(); + db.ensure_open_for_format_changes(); + db.check_is_not_rosterified(); // early short-circuit to avoid failure after lots of work - cache_user_key(app.opts, app.lua, app.db, keys); + cache_user_key(app.opts, app.lua, db, keys); - build_roster_style_revs_from_manifest_style_revs(app.db, keys, + build_roster_style_revs_from_manifest_style_revs(db, keys, app.opts.attrs_to_drop); } @@ -266,7 +279,8 @@ CMD(db_regenerate_caches, "regenerate_ca N(args.size() == 0, F("no arguments needed")); - regenerate_caches(app.db); + database db(app); + regenerate_caches(db); } CMD_HIDDEN(clear_epoch, "clear_epoch", "", CMD_REF(db), "BRANCH", @@ -277,7 +291,8 @@ CMD_HIDDEN(clear_epoch, "clear_epoch", " if (args.size() != 1) throw usage(execid); - app.db.clear_epoch(branch_name(idx(args, 0)())); + database db(app); + db.clear_epoch(branch_name(idx(args, 0)())); } CMD(db_set_epoch, "set_epoch", "", CMD_REF(db), "BRANCH EPOCH", @@ -291,7 +306,9 @@ CMD(db_set_epoch, "set_epoch", "", CMD_R epoch_data ed(idx(args, 1)()); N(ed.inner()().size() == constants::epochlen, F("The epoch must be %s characters") % constants::epochlen); - app.db.set_epoch(branch_name(idx(args, 0)()), ed); + + database db(app); + db.set_epoch(branch_name(idx(args, 0)()), ed); } CMD(set, "set", "", CMD_REF(variables), N_("DOMAIN NAME VALUE"), @@ -310,7 +327,9 @@ CMD(set, "set", "", CMD_REF(variables), internalize_var_domain(idx(args, 0), d); n = var_name(idx(args, 1)()); v = var_value(idx(args, 2)()); - app.db.set_var(make_pair(d, n), v); + + database db(app); + db.set_var(make_pair(d, n), v); } CMD(unset, "unset", "", CMD_REF(variables), N_("DOMAIN NAME"), @@ -327,9 +346,11 @@ CMD(unset, "unset", "", CMD_REF(variable internalize_var_domain(idx(args, 0), d); n = var_name(idx(args, 1)()); var_key k(d, n); - N(app.db.var_exists(k), + + database db(app); + N(db.var_exists(k), F("no var with name %s in domain %s") % n % d); - app.db.clear_var(k); + db.clear_var(k); } CMD(complete, "complete", "", CMD_REF(informative), @@ -341,7 +362,8 @@ CMD(complete, "complete", "", CMD_REF(in if (args.size() != 2) throw usage(execid); - project_t project(app.db); + database db(app); + project_t project(db); bool verbose = app.opts.verbose; @@ -351,7 +373,7 @@ CMD(complete, "complete", "", CMD_REF(in if (idx(args, 0)() == "revision") { set completions; - app.db.complete(idx(args, 1)(), completions); + db.complete(idx(args, 1)(), completions); for (set::const_iterator i = completions.begin(); i != completions.end(); ++i) { @@ -362,7 +384,7 @@ CMD(complete, "complete", "", CMD_REF(in else if (idx(args, 0)() == "file") { set completions; - app.db.complete(idx(args, 1)(), completions); + db.complete(idx(args, 1)(), completions); for (set::const_iterator i = completions.begin(); i != completions.end(); ++i) cout << i->inner()() << '\n'; @@ -371,7 +393,7 @@ CMD(complete, "complete", "", CMD_REF(in { typedef set< pair > completions_t; completions_t completions; - app.db.complete(idx(args, 1)(), completions); + db.complete(idx(args, 1)(), completions); for (completions_t::const_iterator i = completions.begin(); i != completions.end(); ++i) { @@ -391,11 +413,12 @@ CMD_HIDDEN(test_migration_step, "test_mi "schema in SCHEMA to its successor."), options::opts::none) { + database db(app); key_store keys(app); if (args.size() != 1) throw usage(execid); - app.db.test_migration_step(keys, idx(args,0)()); + db.test_migration_step(keys, idx(args,0)()); } CMD_HIDDEN(rev_height, "rev_height", "", CMD_REF(informative), N_("REV"), @@ -406,9 +429,10 @@ CMD_HIDDEN(rev_height, "rev_height", "", if (args.size() != 1) throw usage(execid); revision_id rid(idx(args, 0)()); - N(app.db.revision_exists(rid), F("no such revision '%s'") % rid); + database db(app); + N(db.revision_exists(rid), F("no such revision '%s'") % rid); rev_height height; - app.db.get_rev_height(rid, height); + db.get_rev_height(rid, height); P(F("cached height: %s") % height); } ============================================================ --- cmd_diff_log.cc 5202385ce32ba2e2e41ae2c99c7cff579ce9e491 +++ cmd_diff_log.cc 2d7990de11718287188fda97e47402b3dd0c36f5 @@ -362,7 +362,8 @@ prepare_diff(app_state & app, else if (app.opts.revision_selectors.size() == 1) app.require_workspace(); - project_t project(app.db); + database db(app); + project_t project(db); N(app.opts.revision_selectors.size() <= 2, F("more than two revisions given")); @@ -373,7 +374,7 @@ prepare_diff(app_state & app, revision_id old_rid; parent_map parents; - app.work.get_parent_rosters(app.db, parents); + app.work.get_parent_rosters(db, parents); // With no arguments, which parent should we diff against? N(parents.size() == 1, @@ -382,7 +383,7 @@ prepare_diff(app_state & app, old_rid = parent_id(parents.begin()); old_roster = parent_roster(parents.begin()); - app.work.get_current_roster_shape(app.db, nis, new_roster); + app.work.get_current_roster_shape(db, nis, new_roster); node_restriction mask(app.work, args_to_paths(args), args_to_paths(app.opts.exclude_patterns), @@ -407,8 +408,8 @@ prepare_diff(app_state & app, 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(app.db, nis, new_roster); + db.get_roster(r_old_id, old_roster); + app.work.get_current_roster_shape(db, nis, new_roster); node_restriction mask(app.work, args_to_paths(args), args_to_paths(app.opts.exclude_patterns), @@ -434,8 +435,8 @@ prepare_diff(app_state & app, 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); + db.get_roster(r_old_id, old_roster); + db.get_roster(r_new_id, new_roster); node_restriction mask(app.work, args_to_paths(args), args_to_paths(app.opts.exclude_patterns), @@ -499,6 +500,7 @@ CMD(diff, "diff", "di", CMD_REF(informat cset included; std::string revs; bool new_is_archived; + database db(app); prepare_diff(app, included, args, new_is_archived, revs); @@ -523,11 +525,11 @@ CMD(diff, "diff", "di", CMD_REF(informat if (app.opts.diff_format == external_diff) { - do_external_diff(app.opts, app.lua, app.db, included, new_is_archived); + do_external_diff(app.opts, app.lua, db, included, new_is_archived); } else { - dump_diffs(app.lua, app.db, included, cout, + dump_diffs(app.lua, db, included, cout, app.opts.diff_format, new_is_archived, !app.opts.no_show_encloser); } @@ -553,10 +555,11 @@ CMD_AUTOMATE(content_diff, N_("[FILE [.. cset included; std::string dummy_header; bool new_is_archived; + database db(app); prepare_diff(app, included, args, new_is_archived, dummy_header); - dump_diffs(app.lua, app.db, included, output, + dump_diffs(app.lua, db, included, output, app.opts.diff_format, new_is_archived, !app.opts.no_show_encloser); } @@ -633,7 +636,8 @@ CMD(log, "log", "", CMD_REF(informative) | options::opts::no_merges | options::opts::no_files | options::opts::no_graph) { - project_t project(app.db); + database db(app); + project_t project(db); if (app.opts.from.size() == 0) app.require_workspace("try passing a --from revision to start at"); @@ -655,7 +659,7 @@ CMD(log, "log", "", CMD_REF(informative) i != rev.edges.end(); i++) { rev_height height; - app.db.get_rev_height(edge_old_revision(i), height); + db.get_rev_height(edge_old_revision(i), height); frontier.push(make_pair(height, edge_old_revision(i))); } } @@ -670,7 +674,7 @@ CMD(log, "log", "", CMD_REF(informative) j != rids.end(); ++j) { rev_height height; - app.db.get_rev_height(*j, height); + db.get_rev_height(*j, height); frontier.push(make_pair(height, *j)); } if (i == app.opts.from.begin()) @@ -689,8 +693,8 @@ CMD(log, "log", "", CMD_REF(informative) parent_map parents; temp_node_id_source nis; - app.work.get_parent_rosters(app.db, parents); - app.work.get_current_roster_shape(app.db, nis, new_roster); + app.work.get_parent_rosters(db, parents); + app.work.get_current_roster_shape(db, nis, new_roster); mask = node_restriction(app.work, args_to_paths(args), args_to_paths(app.opts.exclude_patterns), @@ -701,7 +705,7 @@ CMD(log, "log", "", CMD_REF(informative) // FIXME_RESTRICTIONS: should this add paths from the rosters of // all selected revs? roster_t roster; - app.db.get_roster(first_rid, roster); + db.get_roster(first_rid, roster); mask = node_restriction(app.work, args_to_paths(args), args_to_paths(app.opts.exclude_patterns), @@ -742,11 +746,11 @@ CMD(log, "log", "", CMD_REF(informative) MM(relatives); if (next > 0) { - app.db.get_revision_children(rid, relatives); + db.get_revision_children(rid, relatives); } else { - app.db.get_revision_parents(rid, relatives); + db.get_revision_parents(rid, relatives); } for (set::const_iterator i = relatives.begin(); @@ -794,7 +798,7 @@ CMD(log, "log", "", CMD_REF(informative) } seen.insert(rid); - app.db.get_revision(rid, rev); + db.get_revision(rid, rev); set marked_revs; @@ -802,7 +806,7 @@ CMD(log, "log", "", CMD_REF(informative) { roster_t roster; marking_map markings; - app.db.get_roster(rid, roster, markings); + db.get_roster(rid, roster, markings); // get all revision ids mentioned in one of the markings for (marking_map::const_iterator m = markings.begin(); @@ -826,7 +830,7 @@ CMD(log, "log", "", CMD_REF(informative) if (!use_markings || marked_revs.find(rid) != marked_revs.end()) { set nodes_modified; - select_nodes_modified_by_rev(app.db, rev, roster, + select_nodes_modified_by_rev(db, rev, roster, nodes_modified); for (set::const_iterator n = nodes_modified.begin(); @@ -862,9 +866,9 @@ CMD(log, "log", "", CMD_REF(informative) else { if (next > 0) - app.db.get_revision_children(rid, interesting); + db.get_revision_children(rid, interesting); else // walk backwards by default - app.db.get_revision_parents(rid, interesting); + db.get_revision_parents(rid, interesting); } if (print_this) @@ -925,7 +929,7 @@ CMD(log, "log", "", CMD_REF(informative) { for (edge_map::const_iterator e = rev.edges.begin(); e != rev.edges.end(); ++e) - dump_diffs(app.lua, app.db, edge_changes(e), diff_paths, out, + dump_diffs(app.lua, db, edge_changes(e), diff_paths, out, app.opts.diff_format, true, !app.opts.no_show_encloser, !mask.empty()); } @@ -955,7 +959,7 @@ CMD(log, "log", "", CMD_REF(informative) continue; } rev_height height; - app.db.get_rev_height(*i, height); + db.get_rev_height(*i, height); frontier.push(make_pair(height, *i)); } } ============================================================ --- cmd_files.cc 68eafab3955008cebf7ad4f22e2f1d4dd6bad55a +++ cmd_files.cc ab72144d225898f3837bf6dc5db576d33639836c @@ -42,8 +42,9 @@ CMD(fload, "fload", "", CMD_REF(debug), calculate_ident (f_data, f_id); - transaction_guard guard(app.db); - app.db.put_file(f_id, f_data); + database db(app); + transaction_guard guard(db); + db.put_file(f_id, f_data); guard.commit(); } @@ -62,18 +63,19 @@ CMD(fmerge, "fmerge", "", CMD_REF(debug) file_data anc, left, right; - N(app.db.file_version_exists (anc_id), + database db(app); + N(db.file_version_exists (anc_id), F("ancestor file id does not exist")); - N(app.db.file_version_exists (left_id), + N(db.file_version_exists (left_id), F("left file id does not exist")); - N(app.db.file_version_exists (right_id), + N(db.file_version_exists (right_id), F("right file id does not exist")); - app.db.get_file_version(anc_id, anc); - app.db.get_file_version(left_id, left); - app.db.get_file_version(right_id, right); + db.get_file_version(anc_id, anc); + db.get_file_version(left_id, left); + db.get_file_version(right_id, right); vector anc_lines, left_lines, right_lines, merged_lines; @@ -103,14 +105,15 @@ CMD(fdiff, "fdiff", "", CMD_REF(debug), file_data src, dst; - N(app.db.file_version_exists (src_id), + database db(app); + N(db.file_version_exists (src_id), F("source file id does not exist")); - N(app.db.file_version_exists (dst_id), + N(db.file_version_exists (dst_id), F("destination file id does not exist")); - app.db.get_file_version(src_id, src); - app.db.get_file_version(dst_id, dst); + db.get_file_version(src_id, src); + db.get_file_version(dst_id, dst); string pattern(""); if (!app.opts.no_show_encloser) @@ -129,7 +132,8 @@ CMD(annotate, "annotate", "", CMD_REF(in options::opts::revision | options::opts::revs_only) { revision_id rid; - project_t project(app.db); + database db(app); + project_t project(db); if (app.opts.revision_selectors.size() == 0) app.require_workspace(); @@ -166,12 +170,12 @@ CMD(annotate, "annotate", "", CMD_REF(in // this call will change to something else when the above bug is // fixed, and so should not be merged with the identical call in // the else branch. - app.db.get_roster(rid, roster); + db.get_roster(rid, roster); } else { complete(app, project, idx(app.opts.revision_selectors, 0)(), rid); - app.db.get_roster(rid, roster); + db.get_roster(rid, roster); } // find the version of the file requested @@ -289,24 +293,25 @@ CMD(cat, "cat", "", CMD_REF(informative) if (args.size() != 1) throw usage(execid); + database db(app); revision_id rid; if (app.opts.revision_selectors.size() == 0) { app.require_workspace(); parent_map parents; - app.work.get_parent_rosters(app.db, parents); + app.work.get_parent_rosters(db, parents); N(parents.size() == 1, F("this command can only be used in a single-parent workspace")); rid = parent_id(parents.begin()); } else { - project_t project(app.db); + project_t project(db); complete(app, project, idx(app.opts.revision_selectors, 0)(), rid); } - dump_file(app.db, cout, rid, idx(args, 0)); + dump_file(db, cout, rid, idx(args, 0)); } // Name: get_file @@ -327,8 +332,9 @@ CMD_AUTOMATE(get_file, N_("FILEID"), N(args.size() == 1, F("wrong argument count")); + database db(app); file_id ident(idx(args, 0)()); - dump_file(app.db, output, ident); + dump_file(db, output, ident); } // Name: get_file_of @@ -353,7 +359,7 @@ CMD_AUTOMATE(get_file_of, N_("FILENAME") N(args.size() == 1, F("wrong argument count")); - CMD_REQUIRES_DATABASE(app); + database db(app); revision_id rid; if (app.opts.revision_selectors.size() == 0) @@ -368,7 +374,7 @@ CMD_AUTOMATE(get_file_of, N_("FILENAME") } else { - project_t project(app.db); + project_t project(db); complete(app, project, idx(app.opts.revision_selectors, 0)(), rid); } ============================================================ --- cmd_key_cert.cc e9e4fa74701942d70c5ac1ca5d5139e6decc3ee2 +++ cmd_key_cert.cc 9608b26014c45b411d49fc018033d63704d50e18 @@ -32,6 +32,7 @@ CMD(genkey, "genkey", "", CMD_REF(key_an "", options::opts::none) { + database db(app); key_store keys(app); if (args.size() != 1) @@ -40,7 +41,7 @@ CMD(genkey, "genkey", "", CMD_REF(key_an rsa_keypair_id ident; internalize_rsa_keypair_id(idx(args, 0), ident); - keys.create_key_pair(app.db, ident); + keys.create_key_pair(db, ident); } CMD(dropkey, "dropkey", "", CMD_REF(key_and_cert), N_("KEYID"), @@ -48,6 +49,7 @@ CMD(dropkey, "dropkey", "", CMD_REF(key_ "", options::opts::none) { + database db(app); key_store keys(app); bool key_deleted = false; bool checked_db = false; @@ -56,13 +58,13 @@ CMD(dropkey, "dropkey", "", CMD_REF(key_ throw usage(execid); rsa_keypair_id ident(idx(args, 0)()); - if (app.db.database_specified()) + if (db.database_specified()) { - transaction_guard guard(app.db); - if (app.db.public_key_exists(ident)) + transaction_guard guard(db); + if (db.public_key_exists(ident)) { P(F("dropping public key '%s' from database") % ident); - app.db.delete_public_key(ident); + db.delete_public_key(ident); key_deleted = true; } guard.commit(); @@ -109,13 +111,14 @@ CMD(ssh_agent_export, "ssh_agent_export" "", options::opts::none) { + database db(app); key_store keys(app); if (args.size() > 1) throw usage(execid); rsa_keypair_id id; - get_user_key(app.opts, app.lua, app.db, keys, id); + get_user_key(app.opts, app.lua, db, keys, id); if (args.size() == 0) keys.export_key_for_agent(id, cout); @@ -132,13 +135,14 @@ CMD(ssh_agent_add, "ssh_agent_add", "", "", options::opts::none) { + database db(app); key_store keys(app); if (args.size() > 1) throw usage(execid); rsa_keypair_id id; - get_user_key(app.opts, app.lua, app.db, keys, id); + get_user_key(app.opts, app.lua, db, keys, id); keys.add_key_to_agent(id); } @@ -148,13 +152,14 @@ CMD(cert, "cert", "", CMD_REF(key_and_ce "", options::opts::none) { + database db(app); key_store keys(app); - project_t project(app.db); + project_t project(db); if ((args.size() != 3) && (args.size() != 2)) throw usage(execid); - transaction_guard guard(app.db); + transaction_guard guard(db); revision_id rid; complete(app, project, idx(args, 0)(), rid); @@ -162,7 +167,7 @@ CMD(cert, "cert", "", CMD_REF(key_and_ce cert_name cname; internalize_cert_name(idx(args, 1), cname); - cache_user_key(app.opts, app.lua, app.db, keys); + cache_user_key(app.opts, app.lua, db, keys); cert_value val; if (args.size() == 3) @@ -184,7 +189,8 @@ CMD(trusted, "trusted", "", CMD_REF(key_ N_("The current settings are used to run the test."), options::opts::none) { - project_t project(app.db); + database db(app); + project_t project(db); if (args.size() < 4) throw usage(execid); @@ -237,8 +243,9 @@ CMD(tag, "tag", "", CMD_REF(review), N_( "", options::opts::none) { + database db(app); key_store keys(app); - project_t project(app.db); + project_t project(db); if (args.size() != 2) throw usage(execid); @@ -246,7 +253,7 @@ CMD(tag, "tag", "", CMD_REF(review), N_( revision_id r; complete(app, project, idx(args, 0)(), r); - cache_user_key(app.opts, app.lua, app.db, keys); + cache_user_key(app.opts, app.lua, db, keys); project.put_tag(keys, r, idx(args, 1)()); } @@ -257,8 +264,9 @@ CMD(testresult, "testresult", "", CMD_RE "", options::opts::none) { + database db(app); key_store keys(app); - project_t project(app.db); + project_t project(db); if (args.size() != 2) throw usage(execid); @@ -266,8 +274,8 @@ CMD(testresult, "testresult", "", CMD_RE revision_id r; complete(app, project, idx(args, 0)(), r); - cache_user_key(app.opts, app.lua, app.db, keys); - cert_revision_testresult(app.db, keys, r, idx(args, 1)()); + cache_user_key(app.opts, app.lua, db, keys); + cert_revision_testresult(db, keys, r, idx(args, 1)()); } @@ -276,8 +284,9 @@ CMD(approve, "approve", "", CMD_REF(revi "", options::opts::branch) { + database db(app); key_store keys(app); - project_t project(app.db); + project_t project(db); if (args.size() != 1) throw usage(execid); @@ -287,7 +296,7 @@ CMD(approve, "approve", "", CMD_REF(revi guess_branch(app.opts, project, r); N(app.opts.branchname() != "", F("need --branch argument for approval")); - cache_user_key(app.opts, app.lua, app.db, keys); + cache_user_key(app.opts, app.lua, db, keys); project.put_revision_in_branch(keys, r, app.opts.branchname); } @@ -296,8 +305,9 @@ CMD(suspend, "suspend", "", CMD_REF(revi "", options::opts::branch) { + database db(app); key_store keys(app); - project_t project(app.db); + project_t project(db); if (args.size() != 1) throw usage(execid); @@ -307,7 +317,7 @@ CMD(suspend, "suspend", "", CMD_REF(revi guess_branch(app.opts, project, r); N(app.opts.branchname() != "", F("need --branch argument to suspend")); - cache_user_key(app.opts, app.lua, app.db, keys); + cache_user_key(app.opts, app.lua, db, keys); project.suspend_revision_in_branch(keys, r, app.opts.branchname); } @@ -316,8 +326,9 @@ CMD(comment, "comment", "", CMD_REF(revi "", options::opts::none) { + database db(app); key_store keys(app); - project_t project(app.db); + project_t project(db); if (args.size() != 1 && args.size() != 2) throw usage(execid); @@ -339,8 +350,8 @@ CMD(comment, "comment", "", CMD_REF(revi revision_id r; complete(app, project, idx(args, 0)(), r); - cache_user_key(app.opts, app.lua, app.db, keys); - cert_revision_comment(app.db, keys, r, comment); + cache_user_key(app.opts, app.lua, db, keys); + cert_revision_comment(db, keys, r, comment); } // Local Variables: ============================================================ --- cmd_list.cc 079dd89658dd5b56622e60256d797e0d02b02f22 +++ cmd_list.cc 27e6cda2c9abd8d4756a8604e3026fedda5bf3b3 @@ -59,10 +59,11 @@ CMD(certs, "certs", "", CMD_REF(list), " if (args.size() != 1) throw usage(execid); - project_t project(app.db); + database db(app); + project_t project(db); vector certs; - transaction_guard guard(app.db, false); + transaction_guard guard(db, false); revision_id ident; complete(app, project, idx(args, 0)(), ident); @@ -77,7 +78,7 @@ CMD(certs, "certs", "", CMD_REF(list), " for (size_t i = 0; i < certs.size(); ++i) { if (checked.find(idx(certs, i).key) == checked.end() && - !app.db.public_key_exists(idx(certs, i).key)) + !db.public_key_exists(idx(certs, i).key)) P(F("no public key '%s' found in database") % idx(certs, i).key); checked.insert(idx(certs, i).key); @@ -105,7 +106,7 @@ CMD(certs, "certs", "", CMD_REF(list), " for (size_t i = 0; i < certs.size(); ++i) { - cert_status status = check_cert(app.db, idx(certs, i)); + cert_status status = check_cert(db, idx(certs, i)); cert_value tv; decode_base64(idx(certs, i).value, tv); string washed; @@ -158,6 +159,7 @@ CMD(keys, "keys", "", CMD_REF(list), "[P "", options::opts::depth | options::opts::exclude) { + database db(app); key_store keys(app); vector pubs; @@ -168,8 +170,8 @@ CMD(keys, "keys", "", CMD_REF(list), "[P else if (args.size() > 1) throw usage(execid); - if (app.db.database_specified()) - app.db.get_key_ids(pattern, pubs); + if (db.database_specified()) + db.get_key_ids(pattern, pubs); keys.get_key_ids(pattern, privkeys); @@ -190,12 +192,12 @@ CMD(keys, "keys", "", CMD_REF(list), "[P pubkeys[*i] = false; all_in_db = false; } - else if (app.db.database_specified()) + else if (db.database_specified()) { // we've found a key that should have both a public and a private version base64 pub_key; keypair priv_key; - app.db.get_key(*i, pub_key); + db.get_key(*i, pub_key); keys.get_key_pair(*i, priv_key); if (!keys_match(*i, pub_key, *i, priv_key.pub)) bad_keys.insert(*i); @@ -214,7 +216,7 @@ CMD(keys, "keys", "", CMD_REF(list), "[P bool indb = i->second; if (indb) - app.db.get_key(keyid, pub_encoded); + db.get_key(keyid, pub_encoded); else { keypair kp; @@ -279,7 +281,8 @@ CMD(branches, "branches", "", CMD_REF(li else if (args.size() > 1) throw usage(execid); - project_t project(app.db); + database db(app); + project_t project(db); globish exc(app.opts.exclude_patterns); set names; project.get_branch_list(inc, names, !app.opts.ignore_suspend_certs); @@ -295,8 +298,9 @@ CMD(epochs, "epochs", "", CMD_REF(list), "", options::opts::depth | options::opts::exclude) { + database db(app); map epochs; - app.db.get_epochs(epochs); + db.get_epochs(epochs); if (args.size() == 0) { @@ -325,8 +329,9 @@ CMD(tags, "tags", "", CMD_REF(list), "", "", options::opts::depth | options::opts::exclude) { + database db(app); set tags; - project_t project(app.db); + project_t project(db); project.get_tags(tags); for (set::const_iterator i = tags.begin(); i != tags.end(); ++i) @@ -356,8 +361,9 @@ CMD(vars, "vars", "", CMD_REF(list), "[D else throw usage(execid); + database db(app); map vars; - app.db.get_vars(vars); + db.get_vars(vars); for (map::const_iterator i = vars.begin(); i != vars.end(); ++i) { @@ -376,11 +382,12 @@ CMD(known, "known", "", CMD_REF(list), " "", options::opts::depth | options::opts::exclude) { + database db(app); roster_t new_roster; temp_node_id_source nis; app.require_workspace(); - app.work.get_current_roster_shape(app.db, nis, new_roster); + app.work.get_current_roster_shape(db, nis, new_roster); node_restriction mask(app.work, args_to_paths(args), args_to_paths(app.opts.exclude_patterns), @@ -415,6 +422,7 @@ CMD(unknown, "unknown", "ignored", CMD_R "", options::opts::depth | options::opts::exclude) { + database db(app); app.require_workspace(); vector roots = args_to_paths(args); @@ -426,7 +434,7 @@ CMD(unknown, "unknown", "ignored", CMD_R if (roots.empty()) roots.push_back(file_path()); - app.work.find_unknown_and_ignored(app.db, mask, roots, unknown, ignored); + app.work.find_unknown_and_ignored(db, mask, roots, unknown, ignored); utf8 const & realname = execid[execid.size() - 1]; if (realname() == "ignored") @@ -445,9 +453,10 @@ CMD(missing, "missing", "", CMD_REF(list "", options::opts::depth | options::opts::exclude) { + database db(app); temp_node_id_source nis; roster_t current_roster_shape; - app.work.get_current_roster_shape(app.db, nis, current_roster_shape); + app.work.get_current_roster_shape(db, nis, current_roster_shape); node_restriction mask(app.work, args_to_paths(args), args_to_paths(app.opts.exclude_patterns), app.opts.depth, @@ -466,16 +475,17 @@ CMD(changed, "changed", "", CMD_REF(list "", options::opts::depth | options::opts::exclude) { + database db(app); parent_map parents; roster_t new_roster; temp_node_id_source nis; app.require_workspace(); - app.work.get_current_roster_shape(app.db, nis, new_roster); + app.work.get_current_roster_shape(db, nis, new_roster); app.work.update_current_roster_from_filesystem(new_roster); - app.work.get_parent_rosters(app.db, parents); + app.work.get_parent_rosters(db, parents); node_restriction mask(app.work, args_to_paths(args), args_to_paths(app.opts.exclude_patterns), @@ -573,7 +583,7 @@ CMD_AUTOMATE(keys, "", N(args.size() == 0, F("no arguments needed")); - CMD_REQUIRES_DATABASE(app); + database db(app); key_store keys(app); vector dbkeys; @@ -668,7 +678,7 @@ CMD_AUTOMATE(certs, N_("REV"), N(args.size() == 1, F("wrong argument count")); - CMD_REQUIRES_DATABASE(app); + database db(app); project_t project(db); vector certs; ============================================================ --- cmd_merging.cc d9ab554e280d2364e2faf8e5ba6db5376dbeb0e3 +++ cmd_merging.cc 4d403e14031d2efa2e447ee2a533cfe941730394 @@ -153,11 +153,12 @@ CMD(update, "update", "", CMD_REF(worksp throw usage(execid); app.require_workspace(); - project_t project(app.db); + database db(app); + project_t project(db); // Figure out where we are parent_map parents; - app.work.get_parent_rosters(app.db, parents); + app.work.get_parent_rosters(db, parents); N(parents.size() == 1, F("this command can only be used in a single-parent workspace")); @@ -221,7 +222,7 @@ CMD(update, "update", "", CMD_REF(worksp // Fiddle around with branches, in an attempt to guess what the user // wants. - bool switched_branch = pick_branch_for_update(app.opts, app.db, chosen_rid); + bool switched_branch = pick_branch_for_update(app.opts, db, chosen_rid); if (switched_branch) P(F("switching to branch %s") % app.opts.branchname()); @@ -253,7 +254,7 @@ CMD(update, "update", "", CMD_REF(worksp shared_ptr working_roster = shared_ptr(new roster_t()); MM(*working_roster); - app.work.get_current_roster_shape(app.db, nis, *working_roster); + app.work.get_current_roster_shape(db, nis, *working_roster); app.work.update_current_roster_from_filesystem(*working_roster); revision_t working_rev; @@ -263,7 +264,7 @@ CMD(update, "update", "", CMD_REF(worksp // Get the CHOSEN roster roster_t chosen_roster; MM(chosen_roster); - app.db.get_roster(chosen_rid, chosen_roster); + db.get_roster(chosen_rid, chosen_roster); // And finally do the merge @@ -279,7 +280,7 @@ CMD(update, "update", "", CMD_REF(worksp map paths; get_content_paths(*working_roster, paths); - content_merge_workspace_adaptor wca(app.db, old_rid, old_roster, + content_merge_workspace_adaptor wca(db, old_rid, old_roster, left_markings, right_markings, paths); wca.cache_roster(working_rid, working_roster); resolve_merge_conflicts(app.lua, *working_roster, chosen_roster, @@ -292,7 +293,7 @@ CMD(update, "update", "", CMD_REF(worksp // Now finally modify the workspace cset update; make_cset(*working_roster, merged_roster, update); - app.work.perform_content_update(app.db, update, wca); + app.work.perform_content_update(db, update, wca); revision_t remaining; make_revision_for_workspace(chosen_rid, chosen_roster, @@ -300,8 +301,8 @@ CMD(update, "update", "", CMD_REF(worksp // small race condition here... app.work.put_work_rev(remaining); - app.work.update_any_attrs(app.db); - app.work.maybe_update_inodeprints(app.db); + app.work.update_any_attrs(db); + app.work.maybe_update_inodeprints(db); if (!app.opts.branchname().empty()) app.make_branch_sticky(); @@ -378,8 +379,9 @@ CMD(merge, "merge", "", CMD_REF(tree), " "", options::opts::branch | options::opts::date | options::opts::author) { + database db(app); key_store keys(app); - project_t project(app.db); + project_t project(db); typedef std::pair revpair; typedef set::const_iterator rid_set_iter; @@ -405,7 +407,7 @@ CMD(merge, "merge", "", CMD_REF(tree), " % heads.size() % app.opts.branchname); // avoid failure after lots of work - cache_user_key(app.opts, app.lua, app.db, keys); + cache_user_key(app.opts, app.lua, db, keys); map heads_for_ancestor; set ancestors; @@ -439,7 +441,7 @@ CMD(merge, "merge", "", CMD_REF(tree), " continue; revision_id ancestor; - find_common_ancestor_for_merge(app.db, *i, *j, ancestor); + find_common_ancestor_for_merge(db, *i, *j, ancestor); // More than one pair might have the same ancestor (e.g. if we // have three heads all with the same parent); as this table @@ -452,7 +454,7 @@ CMD(merge, "merge", "", CMD_REF(tree), " // Erasing ancestors from ANCESTORS will now produce a set of merge // ancestors each of which is not itself an ancestor of any other // merge ancestor. - erase_ancestors(app.db, ancestors); + erase_ancestors(db, ancestors); I(ancestors.size() > 0); // Take the first ancestor from the above set and merge its @@ -531,8 +533,9 @@ CMD(merge_into_dir, "merge_into_dir", "" "", options::opts::date | options::opts::author | options::opts::message | options::opts::msgfile) { + database db(app); key_store keys(app); - project_t project(app.db); + project_t project(db); set src_heads, dst_heads; if (args.size() != 3) @@ -552,7 +555,7 @@ CMD(merge_into_dir, "merge_into_dir", "" set::const_iterator src_i = src_heads.begin(); set::const_iterator dst_i = dst_heads.begin(); - if (*src_i == *dst_i || is_ancestor(app.db, *src_i, *dst_i)) + if (*src_i == *dst_i || is_ancestor(db, *src_i, *dst_i)) { P(F("branch '%s' is up-to-date with respect to branch '%s'") % idx(args, 1)() % idx(args, 0)()); @@ -560,18 +563,18 @@ CMD(merge_into_dir, "merge_into_dir", "" return; } - cache_user_key(app.opts, app.lua, app.db, keys); + cache_user_key(app.opts, app.lua, db, keys); P(F("propagating %s -> %s") % idx(args,0) % idx(args,1)); P(F("[left] %s") % *src_i); P(F("[right] %s") % *dst_i); // check for special cases - if (is_ancestor(app.db, *dst_i, *src_i)) + if (is_ancestor(db, *dst_i, *src_i)) { P(F("no merge necessary; putting %s in branch '%s'") % (*src_i) % idx(args, 1)()); - transaction_guard guard(app.db); + transaction_guard guard(db); project.put_revision_in_branch(keys, *src_i, branch_name(idx(args, 1)())); guard.commit(); @@ -579,7 +582,7 @@ CMD(merge_into_dir, "merge_into_dir", "" else { revision_id merged; - transaction_guard guard(app.db); + transaction_guard guard(db); { revision_id const & left_rid(*src_i), & right_rid(*dst_i); @@ -591,9 +594,9 @@ CMD(merge_into_dir, "merge_into_dir", "" left_uncommon_ancestors, right_uncommon_ancestors; - app.db.get_roster(left_rid, left_roster, left_marking_map); - app.db.get_roster(right_rid, right_roster, right_marking_map); - app.db.get_uncommon_ancestors(left_rid, right_rid, + db.get_roster(left_rid, left_roster, left_marking_map); + db.get_roster(right_rid, right_roster, right_marking_map); + db.get_uncommon_ancestors(left_rid, right_rid, left_uncommon_ancestors, right_uncommon_ancestors); @@ -628,7 +631,7 @@ CMD(merge_into_dir, "merge_into_dir", "" result); content_merge_database_adaptor - dba(app.db, left_rid, right_rid, left_marking_map, right_marking_map); + dba(db, left_rid, right_rid, left_marking_map, right_marking_map); resolve_merge_conflicts(app.lua, left_roster, right_roster, result, dba); @@ -640,7 +643,7 @@ CMD(merge_into_dir, "merge_into_dir", "" } // Write new files into the db. - store_roster_merge_result(app.db, left_roster, right_roster, result, + store_roster_merge_result(db, left_roster, right_roster, result, left_rid, right_rid, merged); } @@ -681,7 +684,8 @@ CMD(merge_into_workspace, "merge_into_wo if (args.size() != 1) throw usage(execid); - project_t project(app.db); + database db(app); + project_t project(db); app.require_workspace(); // Get the current state of the workspace. @@ -692,12 +696,12 @@ CMD(merge_into_workspace, "merge_into_wo { parent_map parents; - app.work.get_parent_rosters(app.db, parents); + app.work.get_parent_rosters(db, parents); N(parents.size() == 1, F("this command can only be used in a single-parent workspace")); temp_node_id_source nis; - app.work.get_current_roster_shape(app.db, nis, *working_roster); + app.work.get_current_roster_shape(db, nis, *working_roster); app.work.update_current_roster_from_filesystem(*working_roster); N(parent_roster(parents.begin()) == *working_roster, @@ -713,14 +717,14 @@ CMD(merge_into_workspace, "merge_into_wo } complete(app, project, idx(args, 0)(), right_id); - app.db.get_roster(right_id, right); + db.get_roster(right_id, right); N(!(left_id == right_id), F("workspace is already at revision %s") % left_id); P(F("[left] %s") % left_id); P(F("[right] %s") % right_id); set left_uncommon_ancestors, right_uncommon_ancestors; - app.db.get_uncommon_ancestors(left_id, right_id, + db.get_uncommon_ancestors(left_id, right_id, left_uncommon_ancestors, right_uncommon_ancestors); @@ -732,13 +736,13 @@ CMD(merge_into_workspace, "merge_into_wo revision_id lca_id; database::cached_roster lca; - find_common_ancestor_for_merge(app.db, left_id, right_id, lca_id); - app.db.get_roster(lca_id, lca); + find_common_ancestor_for_merge(db, left_id, right_id, lca_id); + db.get_roster(lca_id, lca); map paths; get_content_paths(*working_roster, paths); - content_merge_workspace_adaptor wca(app.db, lca_id, lca.first, + content_merge_workspace_adaptor wca(db, lca_id, lca.first, *left.second, *right.second, paths); wca.cache_roster(working_rid, working_roster); resolve_merge_conflicts(app.lua, *left.first, *right.first, merge_result, wca); @@ -761,10 +765,10 @@ CMD(merge_into_workspace, "merge_into_wo make_cset(*left.first, merge_result.roster, update); // small race condition here... - app.work.perform_content_update(app.db, update, wca); + app.work.perform_content_update(db, update, wca); app.work.put_work_rev(merged_rev); - app.work.update_any_attrs(app.db); - app.work.maybe_update_inodeprints(app.db); + app.work.update_any_attrs(db); + app.work.maybe_update_inodeprints(db); P(F("updated to result of merge\n" " [left] %s\n" @@ -778,8 +782,9 @@ CMD(explicit_merge, "explicit_merge", "" "DEST-BRANCH."), options::opts::date | options::opts::author) { + database db(app); key_store keys(app); - project_t project(app.db); + project_t project(db); revision_id left, right; branch_name branch; @@ -792,13 +797,13 @@ CMD(explicit_merge, "explicit_merge", "" N(!(left == right), F("%s and %s are the same revision, aborting") % left % right); - N(!is_ancestor(app.db, left, right), + N(!is_ancestor(db, left, right), F("%s is already an ancestor of %s") % left % right); - N(!is_ancestor(app.db, right, left), + N(!is_ancestor(db, right, left), F("%s is already an ancestor of %s") % right % left); // avoid failure after lots of work - cache_user_key(app.opts, app.lua, app.db, keys); + cache_user_key(app.opts, app.lua, db, keys); merge_two(app.opts, app.lua, project, keys, left, right, branch, string("explicit merge"), std::cout, false); @@ -810,23 +815,24 @@ CMD(show_conflicts, "show_conflicts", "" "the REV parameters."), options::opts::branch | options::opts::date | options::opts::author) { - project_t project(app.db); + database db(app); + project_t project(db); 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); - N(!is_ancestor(app.db, l_id, 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(app.db, r_id, l_id), + N(!is_ancestor(db, r_id, l_id), F("%s is an ancestor of %s; no merge is needed.") % r_id % l_id); roster_t l_roster, r_roster; marking_map l_marking, r_marking; - app.db.get_roster(l_id, l_roster, l_marking); - app.db.get_roster(r_id, r_roster, r_marking); + db.get_roster(l_id, l_roster, l_marking); + db.get_roster(r_id, r_roster, r_marking); set l_uncommon_ancestors, r_uncommon_ancestors; - app.db.get_uncommon_ancestors(l_id, r_id, + db.get_uncommon_ancestors(l_id, r_id, l_uncommon_ancestors, r_uncommon_ancestors); roster_merge_result result; @@ -848,7 +854,7 @@ CMD(show_conflicts, "show_conflicts", "" } else { - content_merge_database_adaptor adaptor(app.db, l_id, r_id, + content_merge_database_adaptor adaptor(db, l_id, r_id, l_marking, r_marking); result.report_missing_root_conflicts(l_roster, r_roster, adaptor); @@ -879,13 +885,14 @@ CMD(pluck, "pluck", "", CMD_REF(workspac { // Work out our arguments revision_id from_rid, to_rid; - project_t project(app.db); + database db(app); + project_t project(db); if (app.opts.revision_selectors.size() == 1) { complete(app, project, idx(app.opts.revision_selectors, 0)(), to_rid); std::set parents; - app.db.get_revision_parents(to_rid, parents); + db.get_revision_parents(to_rid, parents); N(parents.size() == 1, F("revision %s is a merge\n" "to apply the changes relative to one of its parents, use:\n" @@ -938,12 +945,12 @@ CMD(pluck, "pluck", "", CMD_REF(workspac // Get the FROM roster shared_ptr from_roster = shared_ptr(new roster_t()); MM(*from_roster); - app.db.get_roster(from_rid, *from_roster); + db.get_roster(from_rid, *from_roster); // Get the WORKING roster shared_ptr working_roster = shared_ptr(new roster_t()); MM(*working_roster); - app.work.get_current_roster_shape(app.db, nis, *working_roster); + app.work.get_current_roster_shape(db, nis, *working_roster); app.work.update_current_roster_from_filesystem(*working_roster); @@ -952,7 +959,7 @@ CMD(pluck, "pluck", "", CMD_REF(workspac cset from_to_to_excluded; MM(from_to_to_excluded); { roster_t to_true_roster; - app.db.get_roster(to_rid, to_true_roster); + db.get_roster(to_rid, to_true_roster); node_restriction mask(app.work, args_to_paths(args), args_to_paths(app.opts.exclude_patterns), app.opts.depth, @@ -976,7 +983,7 @@ CMD(pluck, "pluck", "", CMD_REF(workspac } parent_map parents; - app.work.get_parent_rosters(app.db, parents); + app.work.get_parent_rosters(db, parents); revision_t working_rev; revision_id working_rid; @@ -996,7 +1003,7 @@ CMD(pluck, "pluck", "", CMD_REF(workspac map paths; get_content_paths(*working_roster, paths); - content_merge_workspace_adaptor wca(app.db, from_rid, from_roster, + content_merge_workspace_adaptor wca(db, from_rid, from_roster, left_markings, right_markings, paths); wca.cache_roster(working_rid, working_roster); @@ -1016,7 +1023,7 @@ CMD(pluck, "pluck", "", CMD_REF(workspac MM(update); make_cset(*working_roster, merged_roster, update); E(!update.empty(), F("no changes were applied")); - app.work.perform_content_update(app.db, update, wca); + app.work.perform_content_update(db, update, wca); P(F("applied changes to workspace")); @@ -1027,7 +1034,7 @@ CMD(pluck, "pluck", "", CMD_REF(workspac // small race condition here... app.work.put_work_rev(remaining); - app.work.update_any_attrs(app.db); + app.work.update_any_attrs(db); // add a note to the user log file about what we did { @@ -1060,7 +1067,8 @@ CMD(heads, "heads", "", CMD_REF(tree), " N(app.opts.branchname() != "", F("please specify a branch, with --branch=BRANCH")); - project_t project(app.db); + database db(app); + project_t project(db); project.get_branch_heads(app.opts.branchname, heads, app.opts.ignore_suspend_certs); @@ -1082,6 +1090,7 @@ CMD(get_roster, "get_roster", "", CMD_RE N_("If no REVID is given, the workspace is used."), options::opts::none) { + database db(app); roster_t roster; marking_map mm; @@ -1092,8 +1101,8 @@ CMD(get_roster, "get_roster", "", CMD_RE revision_id rid(fake_id()); app.require_workspace(); - app.work.get_parent_rosters(app.db, parents); - app.work.get_current_roster_shape(app.db, nis, roster); + app.work.get_parent_rosters(db, parents); + app.work.get_current_roster_shape(db, nis, roster); app.work.update_current_roster_from_filesystem(roster); if (parents.size() == 0) @@ -1121,7 +1130,7 @@ CMD(get_roster, "get_roster", "", CMD_RE i++; I(i == parents.end()); set left_uncommon_ancestors, right_uncommon_ancestors; - app.db.get_uncommon_ancestors(left_id, right_id, + db.get_uncommon_ancestors(left_id, right_id, left_uncommon_ancestors, right_uncommon_ancestors); @@ -1134,11 +1143,12 @@ CMD(get_roster, "get_roster", "", CMD_RE } else if (args.size() == 1) { - project_t project(app.db); + database db(app); + project_t project(db); revision_id rid; complete(app, project, idx(args, 0)(), rid); I(!null_id(rid)); - app.db.get_roster(rid, roster, mm); + db.get_roster(rid, roster, mm); } else throw usage(execid); ============================================================ --- cmd_netsync.cc 68b7aa1513248fa388336d5def0d12e6d515453f +++ cmd_netsync.cc 9904866a3fd2d2b4811d405c57d6c2c0e39cc35a @@ -155,14 +155,15 @@ CMD(push, "push", "", CMD_REF(network), options::opts::set_default | options::opts::exclude | options::opts::key_to_push) { + database db(app); key_store keys(app); - project_t project(app.db); + project_t project(db); utf8 addr; globish include_pattern, exclude_pattern; - extract_address(app.opts, app.db, args, addr); - extract_patterns(app.opts, app.db, args, include_pattern, exclude_pattern); - find_key_if_needed(app.opts, app.lua, app.db, keys, + extract_address(app.opts, db, args, addr); + extract_patterns(app.opts, db, args, include_pattern, exclude_pattern); + find_key_if_needed(app.opts, app.lua, db, keys, addr, include_pattern, exclude_pattern); std::list uris; @@ -180,14 +181,15 @@ CMD(pull, "pull", "", CMD_REF(network), "from the netsync server at the address ADDRESS."), options::opts::set_default | options::opts::exclude) { + database db(app); key_store keys(app); - project_t project(app.db); + project_t project(db); utf8 addr; globish include_pattern, exclude_pattern; - extract_address(app.opts, app.db, args, addr); - extract_patterns(app.opts, app.db, args, include_pattern, exclude_pattern); - find_key_if_needed(app.opts, app.lua, app.db, keys, + extract_address(app.opts, db, args, addr); + extract_patterns(app.opts, db, args, include_pattern, exclude_pattern); + find_key_if_needed(app.opts, app.lua, db, keys, addr, include_pattern, exclude_pattern, false); if (app.opts.signing_key() == "") @@ -209,14 +211,15 @@ CMD(sync, "sync", "", CMD_REF(network), options::opts::set_default | options::opts::exclude | options::opts::key_to_push) { + database db(app); key_store keys(app); - project_t project(app.db); + project_t project(db); utf8 addr; globish include_pattern, exclude_pattern; - extract_address(app.opts, app.db, args, addr); - extract_patterns(app.opts, app.db, args, include_pattern, exclude_pattern); - find_key_if_needed(app.opts, app.lua, app.db, keys, + extract_address(app.opts, db, args, addr); + extract_patterns(app.opts, db, args, include_pattern, exclude_pattern); + find_key_if_needed(app.opts, app.lua, db, keys, addr, include_pattern, exclude_pattern, false); std::list uris; @@ -286,55 +289,61 @@ CMD(clone, "clone", "", CMD_REF(network) require_path_is_nonexistent (workspace_dir, F("clone destination directory '%s' already exists") % workspace_dir); - // remember the initial working dir so that relative file:// db URIs will work + // remember the initial working dir so that relative file:// + // db URIs will work system_path start_dir(get_current_working_dir()); bool internal_db = !app.opts.dbname_given || app.opts.dbname.empty(); dir_cleanup_helper remove_on_fail(workspace_dir, internal_db); - app.create_workspace(workspace_dir); + // paths.cc's idea of the current workspace root is wrong at this point if (internal_db) - app.set_database(system_path(bookkeeping_root / ws_internal_db_file_name)); - else - app.set_database(app.opts.dbname); + app.opts.dbname = system_path(workspace_dir + / bookkeeping_root_component + / ws_internal_db_file_name); - if (get_path_status(app.db.get_filename()) == path::nonexistent) - app.db.initialize(); + // must do this after setting dbname so that _MTN/options is written + // correctly + app.create_workspace(workspace_dir); - app.db.ensure_open(); + database db(app); + if (get_path_status(db.get_filename()) == path::nonexistent) + db.initialize(); - if (!app.db.var_exists(default_server_key) || app.opts.set_default) + db.ensure_open(); + + if (!db.var_exists(default_server_key) || app.opts.set_default) { P(F("setting default server to %s") % addr); - app.db.set_var(default_server_key, var_value(addr())); + db.set_var(default_server_key, var_value(addr())); } key_store keys(app); - project_t project(app.db); + project_t project(db); globish include_pattern(app.opts.branchname()); globish exclude_pattern(app.opts.exclude_patterns); - find_key_if_needed(app.opts, app.lua, app.db, keys, + find_key_if_needed(app.opts, app.lua, db, keys, addr, include_pattern, exclude_pattern, false); if (app.opts.signing_key() == "") P(F("doing anonymous pull; use -kKEYNAME if you need authentication")); - if (!app.db.var_exists(default_include_pattern_key) + if (!db.var_exists(default_include_pattern_key) || app.opts.set_default) { P(F("setting default branch include pattern to '%s'") % include_pattern); - app.db.set_var(default_include_pattern_key, var_value(include_pattern())); + db.set_var(default_include_pattern_key, var_value(include_pattern())); } if (app.opts.exclude_given) { - if (!app.db.var_exists(default_exclude_pattern_key) + if (!db.var_exists(default_exclude_pattern_key) || app.opts.set_default) { P(F("setting default branch exclude pattern to '%s'") % exclude_pattern); - app.db.set_var(default_exclude_pattern_key, var_value(exclude_pattern())); + db.set_var(default_exclude_pattern_key, var_value(exclude_pattern())); } } @@ -350,7 +359,7 @@ CMD(clone, "clone", "", CMD_REF(network) change_current_working_dir(workspace_dir); - transaction_guard guard(app.db, false); + transaction_guard guard(db, false); if (app.opts.revision_selectors.size() == 0) { @@ -391,7 +400,7 @@ CMD(clone, "clone", "", CMD_REF(network) roster_t current_roster; L(FL("checking out revision %s to directory %s") % ident % workspace_dir); - app.db.get_roster(ident, current_roster); + db.get_roster(ident, current_roster); revision_t workrev; make_revision_for_workspace(ident, cset(), workrev); @@ -400,12 +409,12 @@ CMD(clone, "clone", "", CMD_REF(network) cset checkout; make_cset(*empty_roster, current_roster, checkout); - content_merge_checkout_adaptor wca(app.db); + content_merge_checkout_adaptor wca(db); - app.work.perform_content_update(app.db, checkout, wca, false); + app.work.perform_content_update(db, checkout, wca, false); - app.work.update_any_attrs(app.db); - app.work.maybe_update_inodeprints(app.db); + app.work.update_any_attrs(db); + app.work.maybe_update_inodeprints(db); guard.commit(); remove_on_fail.commit(); } @@ -450,11 +459,12 @@ CMD_NO_WORKSPACE(serve, "serve", "", CMD if (!args.empty()) throw usage(execid); + database db(app); key_store keys(app); - project_t project(app.db); + project_t project(db); pid_file pid(app.opts.pidfile); - app.db.ensure_open(); + db.ensure_open(); if (app.opts.use_transport_auth) { @@ -463,10 +473,10 @@ CMD_NO_WORKSPACE(serve, "serve", "", CMD "(see hook persist_phrase_ok())")); if (!app.opts.bind_uris.empty()) - find_key(app.opts, app.lua, app.db, keys, + find_key(app.opts, app.lua, db, keys, *app.opts.bind_uris.begin(), globish("*"), globish("")); else - find_key(app.opts, app.lua, app.db, keys, + find_key(app.opts, app.lua, db, keys, utf8(), globish("*"), globish("")); } else if (!app.opts.bind_stdio) ============================================================ --- cmd_othervcs.cc 9d46c385ed7557d720aa71c99da22e40b6549304 +++ cmd_othervcs.cc 86e381599532f41a2069cf8d6c6a24cfeab0d79b @@ -37,8 +37,9 @@ CMD(cvs_import, "cvs_import", "", CMD_RE "", options::opts::branch) { + database db(app); key_store keys(app); - project_t project(app.db); + project_t project(db); if (args.size() != 1) throw usage(execid); @@ -54,7 +55,7 @@ CMD(cvs_import, "cvs_import", "", CMD_RE // 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.db, keys); + cache_user_key(app.opts, app.lua, db, keys); import_cvs_repo(project, keys, cvsroot, app.opts.branchname); } ============================================================ --- cmd_packet.cc c11efd7185369ad0de570b5bf9039af982bdfebe +++ cmd_packet.cc 31f9ca76ee6a74da76f3691f64e346ac0d232550 @@ -26,6 +26,7 @@ CMD(pubkey, "pubkey", "", CMD_REF(packet "", options::opts::none) { + database db(app); key_store keys(app); if (args.size() != 1) @@ -34,9 +35,9 @@ CMD(pubkey, "pubkey", "", CMD_REF(packet rsa_keypair_id ident(idx(args, 0)()); bool exists(false); base64< rsa_pub_key > key; - if (app.db.database_specified() && app.db.public_key_exists(ident)) + if (db.database_specified() && db.public_key_exists(ident)) { - app.db.get_key(ident, key); + db.get_key(ident, key); exists = true; } if (keys.key_pair_exists(ident)) @@ -150,8 +151,9 @@ CMD(read, "read", "", CMD_REF(packet_io) N_("If no files are provided, the standard input is used."), options::opts::none) { + database db(app); key_store keys(app); - packet_db_writer dbw(app.db, keys); + packet_db_writer dbw(db, keys); size_t count = 0; if (args.empty()) { ============================================================ --- cmd_ws_commit.cc ac359c1689f1151900da5dd130319956a658b6f1 +++ cmd_ws_commit.cc bc75003a35d2e994c039c38f3bbb8d2d90bf3f7c @@ -159,17 +159,18 @@ CMD(revert, "revert", "", CMD_REF(worksp N(app.opts.missing || !args.empty() || !app.opts.exclude_patterns.empty(), F("you must pass at least one path to 'revert' (perhaps '.')")); + database db(app); app.require_workspace(); parent_map parents; - app.work.get_parent_rosters(app.db, parents); + app.work.get_parent_rosters(db, parents); N(parents.size() == 1, F("this command can only be used in a single-parent workspace")); old_roster = parent_roster(parents.begin()); { temp_node_id_source nis; - app.work.get_current_roster_shape(app.db, nis, new_roster); + app.work.get_current_roster_shape(db, nis, new_roster); } node_restriction mask(app.work, args_to_paths(args), @@ -291,14 +292,14 @@ CMD(revert, "revert", "", CMD_REF(worksp P(F("reverting %s") % new_path); L(FL("reverting %s to [%s]") % new_path % f->content); - N(app.db.file_version_exists(f->content), + N(db.file_version_exists(f->content), F("no file version %s found in database for %s") % f->content % new_path); file_data dat; L(FL("writing file %s to %s") % f->content % new_path); - app.db.get_file_version(f->content, dat); + db.get_file_version(f->content, dat); write_data(new_path, dat.inner()); } else @@ -327,8 +328,8 @@ CMD(revert, "revert", "", CMD_REF(worksp // Race. app.work.put_work_rev(remaining); - app.work.update_any_attrs(app.db); - app.work.maybe_update_inodeprints(app.db); + app.work.update_any_attrs(db); + app.work.maybe_update_inodeprints(db); } CMD(disapprove, "disapprove", "", CMD_REF(review), N_("REVISION"), @@ -337,8 +338,9 @@ CMD(disapprove, "disapprove", "", CMD_RE options::opts::branch | options::opts::messages | options::opts::date | options::opts::author) { + database db(app); key_store keys(app); - project_t project(app.db); + project_t project(db); if (args.size() != 1) throw usage(execid); @@ -349,7 +351,7 @@ CMD(disapprove, "disapprove", "", CMD_RE revision_t rev, rev_inverse; shared_ptr cs_inverse(new cset()); complete(app, project, idx(args, 0)(), r); - app.db.get_revision(r, rev); + db.get_revision(r, rev); N(rev.edges.size() == 1, F("revision %s has %d changesets, cannot invert") % r % rev.edges.size()); @@ -360,28 +362,28 @@ CMD(disapprove, "disapprove", "", CMD_RE process_commit_message_args(app.opts, log_message_given, log_message, utf8((FL("disapproval of revision '%s'") % r).str())); - cache_user_key(app.opts, app.lua, app.db, keys); + cache_user_key(app.opts, app.lua, db, keys); edge_entry const & old_edge (*rev.edges.begin()); - app.db.get_revision_manifest(edge_old_revision(old_edge), + db.get_revision_manifest(edge_old_revision(old_edge), rev_inverse.new_manifest); { roster_t old_roster, new_roster; - app.db.get_roster(edge_old_revision(old_edge), old_roster); - app.db.get_roster(r, new_roster); + db.get_roster(edge_old_revision(old_edge), old_roster); + db.get_roster(r, new_roster); make_cset(new_roster, old_roster, *cs_inverse); } rev_inverse.edges.insert(make_pair(r, cs_inverse)); { - transaction_guard guard(app.db); + transaction_guard guard(db); revision_id inv_id; revision_data rdat; write_revision(rev_inverse, rdat); calculate_ident(rdat, inv_id); - app.db.put_revision(inv_id, rdat); + db.put_revision(inv_id, rdat); project.put_standard_certs_from_options(app.opts, app.lua, keys, inv_id, app.opts.branchname, @@ -398,6 +400,7 @@ CMD(mkdir, "mkdir", "", CMD_REF(workspac if (args.size() < 1) throw usage(execid); + database db(app); app.require_workspace(); set paths; @@ -424,7 +427,7 @@ CMD(mkdir, "mkdir", "", CMD_REF(workspac for (set::const_iterator i = paths.begin(); i != paths.end(); ++i) mkdir_p(*i); - app.work.perform_additions(app.db, paths, false, !app.opts.no_ignore); + app.work.perform_additions(db, paths, false, !app.opts.no_ignore); } CMD(add, "add", "", CMD_REF(workspace), N_("[PATH]..."), @@ -436,6 +439,7 @@ CMD(add, "add", "", CMD_REF(workspace), if (!app.opts.unknown && (args.size() < 1)) throw usage(execid); + database db(app); app.require_workspace(); vector roots = args_to_paths(args); @@ -453,15 +457,15 @@ CMD(add, "add", "", CMD_REF(workspace), if (roots.empty()) roots.push_back(file_path()); - app.work.find_unknown_and_ignored(app.db, mask, roots, paths, ignored); + app.work.find_unknown_and_ignored(db, mask, roots, paths, ignored); - app.work.perform_additions(app.db, ignored, + app.work.perform_additions(db, ignored, add_recursive, !app.opts.no_ignore); } else paths = set(roots.begin(), roots.end()); - app.work.perform_additions(app.db, paths, add_recursive, !app.opts.no_ignore); + app.work.perform_additions(db, paths, add_recursive, !app.opts.no_ignore); } CMD(drop, "drop", "rm", CMD_REF(workspace), N_("[PATH]..."), @@ -472,6 +476,7 @@ CMD(drop, "drop", "rm", CMD_REF(workspac if (!app.opts.missing && (args.size() < 1)) throw usage(execid); + database db(app); app.require_workspace(); set paths; @@ -479,7 +484,7 @@ CMD(drop, "drop", "rm", CMD_REF(workspac { temp_node_id_source nis; roster_t current_roster_shape; - app.work.get_current_roster_shape(app.db, nis, current_roster_shape); + app.work.get_current_roster_shape(db, nis, current_roster_shape); node_restriction mask(app.work, args_to_paths(args), args_to_paths(app.opts.exclude_patterns), app.opts.depth, @@ -492,7 +497,7 @@ CMD(drop, "drop", "rm", CMD_REF(workspac paths = set(roots.begin(), roots.end()); } - app.work.perform_deletions(app.db, paths, + app.work.perform_deletions(db, paths, app.opts.recursive, app.opts.bookkeep_only); } @@ -507,6 +512,7 @@ CMD(rename, "rename", "mv", CMD_REF(work if (args.size() < 2) throw usage(execid); + database db(app); app.require_workspace(); utf8 dstr = args.back(); @@ -527,7 +533,7 @@ CMD(rename, "rename", "mv", CMD_REF(work N(get_path_status(dst_path) == path::directory, F(_("The specified target directory %s/ doesn't exist.")) % dst_path); - app.work.perform_rename(app.db, src_paths, dst_path, app.opts.bookkeep_only); + app.work.perform_rename(db, src_paths, dst_path, app.opts.bookkeep_only); } @@ -544,10 +550,11 @@ CMD(pivot_root, "pivot_root", "", CMD_RE if (args.size() != 2) throw usage(execid); + database db(app); app.require_workspace(); file_path new_root = file_path_external(idx(args, 0)); file_path put_old = file_path_external(idx(args, 1)); - app.work.perform_pivot_root(app.db, new_root, put_old, + app.work.perform_pivot_root(db, new_root, put_old, app.opts.bookkeep_only); } @@ -561,9 +568,10 @@ CMD(status, "status", "", CMD_REF(inform revision_t rev; temp_node_id_source nis; + database db(app); app.require_workspace(); - app.work.get_parent_rosters(app.db, old_rosters); - app.work.get_current_roster_shape(app.db, nis, new_roster); + app.work.get_parent_rosters(db, old_rosters); + app.work.get_current_roster_shape(db, nis, new_roster); node_restriction mask(app.work, args_to_paths(args), args_to_paths(app.opts.exclude_patterns), @@ -590,8 +598,9 @@ CMD(checkout, "checkout", "co", CMD_REF( revision_id revid; system_path dir; - project_t project(app.db); - transaction_guard guard(app.db, false); + database db(app); + project_t project(db); + transaction_guard guard(db, false); if (args.size() > 1 || app.opts.revision_selectors.size() > 1) throw usage(execid); @@ -667,7 +676,7 @@ CMD(checkout, "checkout", "co", CMD_REF( roster_t current_roster; L(FL("checking out revision %s to directory %s") % revid % dir); - app.db.get_roster(revid, current_roster); + db.get_roster(revid, current_roster); revision_t workrev; make_revision_for_workspace(revid, cset(), workrev); @@ -676,12 +685,12 @@ CMD(checkout, "checkout", "co", CMD_REF( cset checkout; make_cset(*empty_roster, current_roster, checkout); - content_merge_checkout_adaptor wca(app.db); + content_merge_checkout_adaptor wca(db); - app.work.perform_content_update(app.db, checkout, wca, false); + app.work.perform_content_update(db, checkout, wca, false); - app.work.update_any_attrs(app.db); - app.work.maybe_update_inodeprints(app.db); + app.work.update_any_attrs(db); + app.work.maybe_update_inodeprints(db); guard.commit(); } @@ -702,8 +711,9 @@ CMD(attr_drop, "drop", "", CMD_REF(attr) roster_t new_roster; temp_node_id_source nis; + database db(app); app.require_workspace(); - app.work.get_current_roster_shape(app.db, nis, new_roster); + app.work.get_current_roster_shape(db, nis, new_roster); file_path path = file_path_external(idx(args, 0)); @@ -728,12 +738,12 @@ CMD(attr_drop, "drop", "", CMD_REF(attr) } parent_map parents; - app.work.get_parent_rosters(app.db, parents); + app.work.get_parent_rosters(db, parents); revision_t new_work; make_revision_for_workspace(parents, new_roster, new_work); app.work.put_work_rev(new_work); - app.work.update_any_attrs(app.db); + app.work.update_any_attrs(db); } CMD(attr_get, "get", "", CMD_REF(attr), N_("PATH [ATTR]"), @@ -749,8 +759,9 @@ CMD(attr_get, "get", "", CMD_REF(attr), roster_t new_roster; temp_node_id_source nis; + database db(app); app.require_workspace(); - app.work.get_current_roster_shape(app.db, nis, new_roster); + app.work.get_current_roster_shape(db, nis, new_roster); file_path path = file_path_external(idx(args, 0)); @@ -799,8 +810,9 @@ CMD(attr_set, "set", "", CMD_REF(attr), roster_t new_roster; temp_node_id_source nis; + database db(app); app.require_workspace(); - app.work.get_current_roster_shape(app.db, nis, new_roster); + app.work.get_current_roster_shape(db, nis, new_roster); file_path path = file_path_external(idx(args, 0)); @@ -813,12 +825,12 @@ CMD(attr_set, "set", "", CMD_REF(attr), node->attrs[a_key] = make_pair(true, a_value); parent_map parents; - app.work.get_parent_rosters(app.db, parents); + app.work.get_parent_rosters(db, parents); revision_t new_work; make_revision_for_workspace(parents, new_roster, new_work); app.work.put_work_rev(new_work); - app.work.update_any_attrs(app.db); + app.work.update_any_attrs(db); } // Name: get_attributes @@ -848,6 +860,7 @@ CMD_AUTOMATE(get_attributes, N_("PATH"), N(args.size() > 0, F("wrong argument count")); + database db(app); CMD_REQUIRES_WORKSPACE(app); // retrieve the path @@ -858,8 +871,8 @@ CMD_AUTOMATE(get_attributes, N_("PATH"), temp_node_id_source nis; // get the base and the current roster of this workspace - work.get_current_roster_shape(app.db, nis, current); - work.get_parent_rosters(app.db, parents); + work.get_current_roster_shape(db, nis, current); + work.get_parent_rosters(db, parents); N(parents.size() == 1, F("this command can only be used in a single-parent workspace")); base = parent_roster(parents.begin()); @@ -965,12 +978,13 @@ CMD_AUTOMATE(set_attribute, N_("PATH KEY N(args.size() == 3, F("wrong argument count")); + database db(app); CMD_REQUIRES_WORKSPACE(app); roster_t new_roster; temp_node_id_source nis; - work.get_current_roster_shape(app.db, nis, new_roster); + work.get_current_roster_shape(db, nis, new_roster); file_path path = file_path_external(idx(args,0)); @@ -983,12 +997,12 @@ CMD_AUTOMATE(set_attribute, N_("PATH KEY node->attrs[a_key] = make_pair(true, a_value); parent_map parents; - work.get_parent_rosters(app.db, parents); + work.get_parent_rosters(db, parents); revision_t new_work; make_revision_for_workspace(parents, new_roster, new_work); work.put_work_rev(new_work); - work.update_any_attrs(app.db); + work.update_any_attrs(db); } // Name: drop_attribute @@ -1010,12 +1024,13 @@ CMD_AUTOMATE(drop_attribute, N_("PATH [K N(args.size() ==1 || args.size() == 2, F("wrong argument count")); + database db(app); CMD_REQUIRES_WORKSPACE(app); roster_t new_roster; temp_node_id_source nis; - work.get_current_roster_shape(app.db, nis, new_roster); + work.get_current_roster_shape(db, nis, new_roster); file_path path = file_path_external(idx(args,0)); @@ -1039,12 +1054,12 @@ CMD_AUTOMATE(drop_attribute, N_("PATH [K } parent_map parents; - work.get_parent_rosters(app.db, parents); + work.get_parent_rosters(db, parents); revision_t new_work; make_revision_for_workspace(parents, new_roster, new_work); work.put_work_rev(new_work); - work.update_any_attrs(app.db); + work.update_any_attrs(db); } CMD(commit, "commit", "ci", CMD_REF(workspace), N_("[PATH]..."), @@ -1054,8 +1069,9 @@ CMD(commit, "commit", "ci", CMD_REF(work | options::opts::date | options::opts::author | options::opts::depth | options::opts::exclude) { + database db(app); key_store keys(app); - project_t project(app.db); + project_t project(db); utf8 log_message(""); bool log_message_given; @@ -1067,8 +1083,8 @@ CMD(commit, "commit", "ci", CMD_REF(work app.require_workspace(); app.make_branch_sticky(); - app.work.get_parent_rosters(app.db, old_rosters); - app.work.get_current_roster_shape(app.db, nis, new_roster); + app.work.get_parent_rosters(db, old_rosters); + app.work.get_current_roster_shape(db, nis, new_roster); node_restriction mask(app.work, args_to_paths(args), args_to_paths(app.opts.exclude_patterns), @@ -1156,7 +1172,7 @@ CMD(commit, "commit", "ci", CMD_REF(work message_validated, reason); N(message_validated, F("log message rejected by hook: %s") % reason); - cache_user_key(app.opts, app.lua, app.db, keys); + cache_user_key(app.opts, app.lua, db, keys); // for the divergence check, below set heads; @@ -1165,9 +1181,9 @@ CMD(commit, "commit", "ci", CMD_REF(work unsigned int old_head_size = heads.size(); { - transaction_guard guard(app.db); + transaction_guard guard(db); - if (app.db.revision_exists(restricted_rev_id)) + if (db.revision_exists(restricted_rev_id)) W(F("revision %s already in database") % restricted_rev_id); else { @@ -1189,18 +1205,18 @@ CMD(commit, "commit", "ci", CMD_REF(work file_id old_content = i->second.first; file_id new_content = i->second.second; - if (app.db.file_version_exists(new_content)) + if (db.file_version_exists(new_content)) { L(FL("skipping file delta %s, already in database") % delta_entry_dst(i)); } - else if (app.db.file_version_exists(old_content)) + else if (db.file_version_exists(old_content)) { L(FL("inserting delta %s -> %s") % old_content % new_content); file_data old_data; data new_data; - app.db.get_file_version(old_content, old_data); + db.get_file_version(old_content, old_data); read_data(path, new_data); // sanity check hexenc tid; @@ -1210,7 +1226,7 @@ CMD(commit, "commit", "ci", CMD_REF(work % path); delta del; diff(old_data.inner(), new_data, del); - app.db.put_file_version(old_content, + db.put_file_version(old_content, new_content, file_delta(del)); } @@ -1237,13 +1253,13 @@ CMD(commit, "commit", "ci", CMD_REF(work N(tid == new_content.inner(), F("file '%s' modified during commit, aborting") % path); - app.db.put_file(new_content, file_data(new_data)); + db.put_file(new_content, file_data(new_data)); } } revision_data rdat; write_revision(restricted_rev, rdat); - app.db.put_revision(restricted_rev_id, rdat); + db.put_revision(restricted_rev_id, rdat); } project.put_standard_certs_from_options(app.opts, app.lua, keys, @@ -1272,8 +1288,8 @@ CMD(commit, "commit", "ci", CMD_REF(work % ui.prog_name); } - app.work.update_any_attrs(app.db); - app.work.maybe_update_inodeprints(app.db); + app.work.update_any_attrs(db); + app.work.maybe_update_inodeprints(db); { // Tell lua what happened. Yes, we might lose some information @@ -1292,7 +1308,7 @@ CMD(commit, "commit", "ci", CMD_REF(work certs.insert(make_pair(i->inner().name, vtmp)); } revision_data rdat; - app.db.get_revision(restricted_rev_id, rdat); + db.get_revision(restricted_rev_id, rdat); app.lua.hook_note_commit(restricted_rev_id, rdat, certs); } } @@ -1304,9 +1320,11 @@ CMD_NO_WORKSPACE(setup, "setup", "", CMD { if (args.size() > 1) throw usage(execid); + N(!app.opts.branchname().empty(), + F("need --branch argument for setup")); - N(!app.opts.branchname().empty(), F("need --branch argument for setup")); - app.db.ensure_open(); + database db(app); + db.ensure_open(); string dir; if (args.size() == 1) @@ -1332,7 +1350,8 @@ CMD_NO_WORKSPACE(import, "import", "", C { revision_id ident; system_path dir; - project_t project(app.db); + database db(app); + project_t project(db); N(args.size() == 1, F("you must specify a directory to import")); @@ -1443,9 +1462,10 @@ CMD(refresh_inodeprints, "refresh_inodep "", options::opts::none) { + database db(app); app.require_workspace(); app.work.enable_inodeprints(); - app.work.maybe_update_inodeprints(app.db); + app.work.maybe_update_inodeprints(db); } ============================================================ --- database.cc 74c819293bca360a8df5a82776edfc5f12c22bdd +++ database.cc dc4ea850465d2c7825192cd8732b70311a75cd4c @@ -24,6 +24,7 @@ #include "sqlite/sqlite3.h" +#include "app_state.hh" #include "cert.hh" #include "cleanup.hh" #include "constants.hh" @@ -187,7 +188,7 @@ public: // for scoped_ptr's sake public: - database_impl(); + explicit database_impl(system_path const &); ~database_impl(); private: @@ -195,7 +196,7 @@ private: // // --== Opening the database and schema checking ==-- // - system_path filename; + system_path const filename; struct sqlite3 * __sql; void install_functions(); @@ -388,8 +389,8 @@ private: }; -database_impl::database_impl() : - filename(), +database_impl::database_impl(system_path const & f) : + filename(f), __sql(NULL), transaction_level(0), roster_cache(constants::db_roster_cache_sz, @@ -413,20 +414,13 @@ database_impl::~database_impl() close(); } -database::database(lua_hooks & lua) - : imp(new database_impl), lua(lua) +database::database(app_state & app) + : imp(new database_impl(app.opts.dbname)), lua(app.lua) {} database::~database() {} -void -database::set_filename(system_path const & file) -{ - I(!imp->__sql); - imp->filename = file; -} - system_path database::get_filename() { ============================================================ --- database.hh eb927e49718ef1e00b7b6130b01b4abfaaae387e +++ database.hh 03747a6095f46b36c98ad383fe85b26dc2bf92c4 @@ -20,6 +20,7 @@ #include "graph.hh" #include "cert.hh" +class app_state; class lua_hooks; struct date_t; struct globish; @@ -76,10 +77,9 @@ public: // --== Opening the database and schema checking ==-- // public: - database(lua_hooks & lua); + explicit database(app_state &); ~database(); - void set_filename(system_path const & file); system_path get_filename(); bool is_dbfile(any_path const & file); bool database_specified(); ============================================================ --- key_store.hh 2e71dfcb623cb876f908cd8c3c095aba2bccd393 +++ key_store.hh 86c48762abf384ec608d0235b4173ffb72aab178 @@ -21,7 +21,7 @@ public: public: rsa_keypair_id signing_key; - key_store(app_state & a); + explicit key_store(app_state & a); ~key_store(); system_path const & get_key_dir(); ============================================================ --- monotone.cc 3602b1d8a957547153408a9a13c44d3a33803ecb +++ monotone.cc c73711529cf72e60813e162d9f80225a1ac2c400 @@ -206,12 +206,6 @@ cpp_main(int argc, char ** argv) return 0; } - if (app.opts.dbname_given) - { - if (!app.opts.dbname.empty()) - app.db.set_filename(app.opts.dbname); - } - // at this point we allow a workspace (meaning search for it // and if found read _MTN/options, but don't use the data quite // yet, and read all the monotonercs). Processing the data