# # # patch "README.encapsulation" # from [162c43414772c0d4f456c08ce578a6492aa2c313] # to [1fdd5795011a09dd0b09a49df82f57a4f4a786f4] # # patch "cmd_othervcs.cc" # from [be662f2013d7eaa93a8729606e160c2c4c7b2512] # to [61aa5daaa67e128b1e3cdf094bb2553a588e77b5] # # patch "rcs_import.cc" # from [887c3fc9c49e31801f12b0a421b0992598e0b037] # to [b292beb9bd9d2b19ec34efb7ee4b19486cd2b92e] # # patch "rcs_import.hh" # from [a8a9829141f37924a5f01de942e7153752aa1abb] # to [b864e2f752da32d66ef1f2b083b63fddb8d6bb84] # ============================================================ --- README.encapsulation 162c43414772c0d4f456c08ce578a6492aa2c313 +++ README.encapsulation 1fdd5795011a09dd0b09a49df82f57a4f4a786f4 @@ -66,23 +66,5 @@ lua_hooks.cc: app.agent lua_hooks.cc: + << evil mess involving a map from lua_*state* pointers + to app_state pointers >> - << evil mess involving a map from lua_*state* pointers to app_state pointers >> - -rcs_import.cc: - struct cluster_consumer : app_state member variable (app) - - cluster_consumer::store_revisions() - app.db - - cluster_consumer::store_auxiliary_certs() - app.db.get_project() - - import_branch() - cluster_consumer constructor - - import_cvs_repo() - app.db - app.keys (require_password) - app.opts.branchname - - ============================================================ --- cmd_othervcs.cc be662f2013d7eaa93a8729606e160c2c4c7b2512 +++ cmd_othervcs.cc 61aa5daaa67e128b1e3cdf094bb2553a588e77b5 @@ -11,6 +11,7 @@ #include "cmd.hh" #include "app_state.hh" #include "rcs_import.hh" +#include "keys.hh" using std::vector; @@ -39,7 +40,22 @@ CMD(cvs_import, "cvs_import", "", CMD_RE if (args.size() != 1) throw usage(execid); - import_cvs_repo(system_path(idx(args, 0)()), app); + N(app.opts.branchname() != "", + F("need base --branch argument for importing")); + + system_path cvsroot(idx(args, 0)()); + require_path_is_directory(cvsroot, + F("path %s does not exist") % cvsroot, + F("'%s' is not a directory") % cvsroot); + + // 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 + rsa_keypair_id key; + get_user_key(key, app.db); + require_password(key, app.keys); + + import_cvs_repo(cvsroot, app.db, app.get_project(), app.opts.branchname); } ============================================================ --- rcs_import.cc 887c3fc9c49e31801f12b0a421b0992598e0b037 +++ rcs_import.cc b292beb9bd9d2b19ec34efb7ee4b19486cd2b92e @@ -25,7 +25,6 @@ #include "lexical_cast.hh" #include -#include "app_state.hh" #include "cert.hh" #include "constants.hh" #include "cycle_detector.hh" @@ -1009,7 +1008,9 @@ cluster_consumer cluster_consumer { cvs_history & cvs; - app_state & app; + database & db; + project_t & project; + string const & branchname; cvs_branch const & branch; set created_dirs; @@ -1037,7 +1038,8 @@ cluster_consumer revision_id parent_rid, child_rid; cluster_consumer(cvs_history & cvs, - app_state & app, + database & db, + project_t & project, string const & branchname, cvs_branch const & branch, ticker & n_revs); @@ -1067,13 +1069,14 @@ import_branch(cvs_history & cvs, void import_branch(cvs_history & cvs, - app_state & app, + database & db, + project_t & project, string const & branchname, shared_ptr const & branch, ticker & n_revs) { cluster_set clusters; - cluster_consumer cons(cvs, app, branchname, *branch, n_revs); + cluster_consumer cons(cvs, db, project, branchname, *branch, n_revs); unsigned long commits_remaining = branch->lineage.size(); // step 1: sort the lineage @@ -1198,23 +1201,19 @@ import_cvs_repo(system_path const & cvsr void import_cvs_repo(system_path const & cvsroot, - app_state & app) + database & db, + project_t & project, + branch_name const & branchname) + { N(!directory_exists(cvsroot / "CVSROOT"), F("%s appears to be a CVS repository root directory\n" "try importing a module instead, with 'cvs_import %s/") % cvsroot % cvsroot); - { - // early short-circuit to avoid failure after lots of work - rsa_keypair_id key; - get_user_key(key, app.db); - require_password(key, app.keys); - } + cvs_history cvs; - cvs_history cvs; - N(app.opts.branchname() != "", F("need base --branch argument for importing")); - cvs.base_branch = app.opts.branchname(); + cvs.base_branch = branchname(); // push the trunk cvs.trunk = shared_ptr(new cvs_branch()); @@ -1222,12 +1221,9 @@ import_cvs_repo(system_path const & cvsr cvs.bstk.push(cvs.branch_interner.intern(cvs.base_branch)); { - transaction_guard guard(app.db); - cvs_tree_walker walker(cvs, app.db); - require_path_is_directory(cvsroot, - F("path %s does not exist") % cvsroot, - F("'%s' is not a directory") % cvsroot); - app.db.ensure_open(); + transaction_guard guard(db); + cvs_tree_walker walker(cvs, db); + db.ensure_open(); change_current_working_dir(cvsroot); walk_tree(file_path(), walker); guard.commit(); @@ -1239,12 +1235,12 @@ import_cvs_repo(system_path const & cvsr while (cvs.branches.size() > 0) { - transaction_guard guard(app.db); + transaction_guard guard(db); map >::const_iterator i = cvs.branches.begin(); string branchname = i->first; shared_ptr branch = i->second; L(FL("branch %s has %d entries") % branchname % branch->lineage.size()); - import_branch(cvs, app, branchname, branch, n_revs); + import_branch(cvs, db, project, branchname, branch, n_revs); // free up some memory cvs.branches.erase(branchname); @@ -1252,38 +1248,37 @@ import_cvs_repo(system_path const & cvsr } { - transaction_guard guard(app.db); + transaction_guard guard(db); L(FL("trunk has %d entries") % cvs.trunk->lineage.size()); - import_branch(cvs, app, cvs.base_branch, cvs.trunk, n_revs); + import_branch(cvs, db, project, cvs.base_branch, cvs.trunk, n_revs); guard.commit(); } // now we have a "last" rev for each tag { ticker n_tags(_("tags"), "t", 1); - transaction_guard guard(app.db); + transaction_guard guard(db); for (map >::const_iterator i = cvs.resolved_tags.begin(); i != cvs.resolved_tags.end(); ++i) { string tag = cvs.tag_interner.lookup(i->first); ui.set_tick_trailer("marking tag " + tag); - app.db.get_project().put_tag(i->second.second, tag); + project.put_tag(i->second.second, tag); ++n_tags; } guard.commit(); } - - - return; } cluster_consumer::cluster_consumer(cvs_history & cvs, - app_state & app, + database & db, + project_t & project, string const & branchname, cvs_branch const & branch, ticker & n_revs) : cvs(cvs), - app(app), + db(db), + project(project), branchname(branchname), branch(branch), n_revisions(n_revs), @@ -1341,7 +1336,7 @@ cluster_consumer::store_revisions() { for (vector::const_iterator i = preps.begin(); i != preps.end(); ++i) - if (app.db.put_revision(i->rid, *(i->rev))) + if (db.put_revision(i->rid, *(i->rev))) { store_auxiliary_certs(*i); ++n_revisions; @@ -1372,11 +1367,11 @@ cluster_consumer::store_auxiliary_certs( } } - app.db.get_project().put_standard_certs(p.rid, - branch_name(branchname), - utf8(cvs.changelog_interner.lookup(p.changelog)), - date_t::from_unix_epoch(p.time), - utf8(cvs.author_interner.lookup(p.author))); + project.put_standard_certs(p.rid, + branch_name(branchname), + utf8(cvs.changelog_interner.lookup(p.changelog)), + date_t::from_unix_epoch(p.time), + utf8(cvs.author_interner.lookup(p.author))); } void ============================================================ --- rcs_import.hh a8a9829141f37924a5f01de942e7153752aa1abb +++ rcs_import.hh b864e2f752da32d66ef1f2b083b63fddb8d6bb84 @@ -10,11 +10,14 @@ // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // PURPOSE. -#include "vocab.hh" -#include "database.hh" +class system_path; +class database; +class project_t; +class branch_name; void test_parse_rcs_file(system_path const & filename, database & db); -void import_cvs_repo(system_path const & cvsroot, app_state & app); +void import_cvs_repo(system_path const & cvsroot, database & db, + project_t & project, branch_name const & branchname); // Local Variables: // mode: C++