# # # patch "automate.cc" # from [69331e82d1dcefcd00f0f6e9675f80da97e4aee8] # to [a36f5623c1c25c9261022318c069e1ba7521fa99] # # patch "commands.cc" # from [1c668059bf5730a63a23324e625207bc0ad76959] # to [8f913fd56223d99d1788a09005e6e9882ea24f18] # # patch "work.cc" # from [b27a7c55997c12adc5ad268c6c799afb05e65b41] # to [91344ff1c00cef1c3ab300b2956bccb27b0d323f] # # patch "work.hh" # from [410b69b097ae15b89d9b80b3973d4f57b2a5d43e] # to [487a9bda1fdf89f4eab461d5c71a10e7bf7fce0f] # ============================================================ --- automate.cc 69331e82d1dcefcd00f0f6e9675f80da97e4aee8 +++ automate.cc a36f5623c1c25c9261022318c069e1ba7521fa99 @@ -226,8 +226,7 @@ throw usage(help_name); roster_t base, current; - temp_node_id_source nis; - get_base_and_current_roster_shape(base, current, nis, app); + get_base_and_current_roster_shape(base, current, app); if (args.size() == 1) { @@ -679,13 +678,12 @@ app.require_working_copy(); - temp_node_id_source nis; roster_t base, curr; inventory_map inventory; cset cs; path_set unchanged, changed, missing, known, unknown, ignored; - get_base_and_current_roster_shape(base, curr, nis, app); + get_base_and_current_roster_shape(base, curr, app); make_cset(base, curr, cs); I(cs.deltas_applied.empty()); @@ -940,12 +938,11 @@ if (args.size() == 0) { roster_t old_roster, new_roster; - temp_node_id_source nis; revision_id old_revision_id; revision_set rev; app.require_working_copy(); - get_base_and_current_roster_shape(old_roster, new_roster, nis, app); + get_base_and_current_roster_shape(old_roster, new_roster, app); update_current_roster_from_filesystem(new_roster, app); get_revision_id(old_revision_id); @@ -991,11 +988,10 @@ if (args.size() == 0) { - temp_node_id_source nis; revision_id old_revision_id; app.require_working_copy(); - get_base_and_current_roster_shape(old_roster, new_roster, nis, app); + get_base_and_current_roster_shape(old_roster, new_roster, app); update_current_roster_from_filesystem(new_roster, app); } else ============================================================ --- commands.cc 1c668059bf5730a63a23324e625207bc0ad76959 +++ commands.cc 8f913fd56223d99d1788a09005e6e9882ea24f18 @@ -341,9 +341,8 @@ return; inodeprint_map ipm_new; roster_t old_roster, new_roster; - temp_node_id_source nis; - get_base_and_current_roster_shape(old_roster, new_roster, nis, app); + get_base_and_current_roster_shape(old_roster, new_roster, app); update_current_roster_from_filesystem(new_roster, app); node_map const & new_nodes = new_roster.all_nodes(); @@ -1290,7 +1289,6 @@ { path_set paths; roster_t old_roster, new_roster, restricted_roster; - temp_node_id_source nis; cset included, excluded; revision_id old_rev_id; revision_set rev; @@ -1298,7 +1296,7 @@ app.require_working_copy(); - get_base_and_current_roster_shape(old_roster, new_roster, nis, app); + get_base_and_current_roster_shape(old_roster, new_roster, app); for (vector::const_iterator i = args.begin(); i != args.end(); ++i) { @@ -1315,6 +1313,7 @@ make_restricted_csets(old_roster, new_roster, included, excluded, mask); restricted_roster = old_roster; + temp_node_id_source nis; editable_roster_base er(restricted_roster, nis); included.apply_to(er); @@ -1665,12 +1664,11 @@ { path_set paths; roster_t old_roster, new_roster; - temp_node_id_source nis; restriction mask; app.require_working_copy(); - get_base_and_current_roster_shape(old_roster, new_roster, nis, app); + get_base_and_current_roster_shape(old_roster, new_roster, app); for (vector::const_iterator i = args.begin(); i != args.end(); ++i) { @@ -1706,10 +1704,23 @@ revision_set rev; roster_t old_roster, new_roster; path_set known; + path_set paths; + restriction mask; - get_working_revision_and_rosters(app, args, rev, old_roster, new_roster); + get_base_and_current_roster_shape(old_roster, new_roster, app); + + for (vector::const_iterator i = args.begin(); i != args.end(); ++i) + { + split_path sp; + file_path_external(*i).split(sp); + paths.insert(sp); + } + + mask.add_nodes(new_roster, paths); + new_roster.extract_path_set(known); + // FIXME_RESTRICTIONS: use mask to restrict paths instead of nids file_itemizer u(app, known, unknown, ignored); walk_tree(file_path(), u); } @@ -1737,10 +1748,9 @@ { path_set paths; roster_t old_roster, new_roster; - temp_node_id_source nis; restriction mask; - get_base_and_current_roster_shape(old_roster, new_roster, nis, app); + get_base_and_current_roster_shape(old_roster, new_roster, app); for (vector::const_iterator i = args.begin(); i != args.end(); ++i) { @@ -2225,10 +2235,9 @@ throw usage(name); roster_t old_roster, new_roster; - temp_node_id_source nis; app.require_working_copy(); - get_base_and_current_roster_shape(old_roster, new_roster, nis, app); + get_base_and_current_roster_shape(old_roster, new_roster, app); // FIXME_RESTRICTIONS: is there any reason to update content hashes here? update_current_roster_from_filesystem(new_roster, app); @@ -2346,23 +2355,45 @@ { string log_message(""); bool log_message_given; - revision_set rs; - revision_id rid; - roster_t old_roster, new_roster; + revision_set restricted_rev; + revision_id old_rev_id, restricted_rev_id; + roster_t old_roster, new_roster, restricted_roster; + path_set paths; + cset included, excluded; app.make_branch_sticky(); app.require_working_copy(); - // preserve excluded work for future commmits - cset excluded_work; - get_working_revision_and_rosters(app, args, rs, old_roster, new_roster, excluded_work); + get_base_and_current_roster_shape(old_roster, new_roster, app); - calculate_ident(rs, rid); + for (vector::const_iterator i = args.begin(); i != args.end(); ++i) + { + split_path sp; + file_path_external(*i).split(sp); + paths.insert(sp); + } - N(rs.is_nontrivial(), F("no changes to commit\n")); + restriction mask; + mask.add_nodes(old_roster, paths); + mask.add_nodes(new_roster, paths); + + update_current_roster_from_filesystem(new_roster, mask, app); + make_restricted_csets(old_roster, new_roster, included, excluded, mask); + + restricted_roster = old_roster; + temp_node_id_source nis; + editable_roster_base er(restricted_roster, nis); + included.apply_to(er); + + get_revision_id(old_rev_id); + make_revision_set(old_rev_id, old_roster, restricted_roster, restricted_rev); + + calculate_ident(restricted_rev, restricted_rev_id); + + N(restricted_rev.is_nontrivial(), F("no changes to commit\n")); cert_value branchname; - I(rs.edges.size() == 1); + I(restricted_rev.edges.size() == 1); set heads; get_branch_heads(app.branch_name(), app, heads); @@ -2371,13 +2402,13 @@ if (app.branch_name() != "") branchname = app.branch_name(); else - guess_branch(edge_old_revision(rs.edges.begin()), app, branchname); + guess_branch(edge_old_revision(restricted_rev.edges.begin()), app, branchname); P(F("beginning commit on branch '%s'\n") % branchname); L(F("new manifest '%s'\n" "new revision '%s'\n") - % rs.new_manifest - % rid); + % restricted_rev.new_manifest + % restricted_rev_id); process_commit_message_args(log_message_given, log_message, app); @@ -2389,7 +2420,7 @@ if (!log_message_given) { // this call handles MT/log - get_log_message_interactively(rs, app, log_message); + get_log_message_interactively(restricted_rev, app, log_message); // we only check for empty log messages when the user entered them // interactively. Consensus was that if someone wanted to explicitly // type --message="", then there wasn't any reason to stop them. @@ -2409,18 +2440,18 @@ transaction_guard guard(app.db); packet_db_writer dbw(app); - if (app.db.revision_exists(rid)) + if (app.db.revision_exists(restricted_rev_id)) { - W(F("revision %s already in database\n") % rid); + W(F("revision %s already in database\n") % restricted_rev_id); } else { // new revision - L(F("inserting new revision %s\n") % rid); + L(F("inserting new revision %s\n") % restricted_rev_id); - I(rs.edges.size() == 1); - edge_map::const_iterator edge = rs.edges.begin(); - I(edge != rs.edges.end()); + I(restricted_rev.edges.size() == 1); + edge_map::const_iterator edge = restricted_rev.edges.begin(); + I(edge != restricted_rev.edges.end()); // process file deltas or new files cset const & cs = edge_changes(edge); @@ -2492,26 +2523,26 @@ } revision_data rdat; - write_revision_set(rs, rdat); - dbw.consume_revision_data(rid, rdat); + write_revision_set(restricted_rev, rdat); + dbw.consume_revision_data(restricted_rev_id, rdat); - cert_revision_in_branch(rid, branchname, app, dbw); + cert_revision_in_branch(restricted_rev_id, branchname, app, dbw); if (app.date_set) - cert_revision_date_time(rid, app.date, app, dbw); + cert_revision_date_time(restricted_rev_id, app.date, app, dbw); else - cert_revision_date_now(rid, app, dbw); + cert_revision_date_now(restricted_rev_id, app, dbw); if (app.author().length() > 0) - cert_revision_author(rid, app.author(), app, dbw); + cert_revision_author(restricted_rev_id, app.author(), app, dbw); else - cert_revision_author_default(rid, app, dbw); - cert_revision_changelog(rid, log_message, app, dbw); + cert_revision_author_default(restricted_rev_id, app, dbw); + cert_revision_changelog(restricted_rev_id, log_message, app, dbw); guard.commit(); } // small race condition here... - put_work_cset(excluded_work); - put_revision_id(rid); - P(F("committed revision %s\n") % rid); + put_work_cset(excluded); + put_revision_id(restricted_rev_id); + P(F("committed revision %s\n") % restricted_rev_id); blank_user_log(); @@ -2531,7 +2562,7 @@ // with same name, etc. they can inquire further, later. map certs; vector< revision > ctmp; - app.db.get_revision_certs(rid, ctmp); + app.db.get_revision_certs(restricted_rev_id, ctmp); for (vector< revision >::const_iterator i = ctmp.begin(); i != ctmp.end(); ++i) { @@ -2540,8 +2571,8 @@ certs.insert(make_pair(i->inner().name, vtmp)); } revision_data rdat; - app.db.get_revision(rid, rdat); - app.lua.hook_note_commit(rid, rdat, certs); + app.db.get_revision(restricted_rev_id, rdat); + app.lua.hook_note_commit(restricted_rev_id, rdat, certs); } } @@ -2720,8 +2751,7 @@ F("--diff-args requires --external\n" "try adding --external or removing --diff-args?")); - cset included; - cset excluded; + cset included, excluded; // initialize before transaction so we have a database to work with @@ -2740,10 +2770,9 @@ if (app.revision_selectors.size() == 0) { roster_t new_roster, old_roster; - temp_node_id_source nis; revision_id old_rid; - get_base_and_current_roster_shape(old_roster, new_roster, nis, app); + get_base_and_current_roster_shape(old_roster, new_roster, app); get_revision_id(old_rid); @@ -2761,14 +2790,13 @@ else if (app.revision_selectors.size() == 1) { roster_t new_roster, old_roster; - temp_node_id_source nis; revision_id r_old_id; complete(app, idx(app.revision_selectors, 0)(), r_old_id); N(app.db.revision_exists(r_old_id), F("no such revision '%s'") % r_old_id); - get_base_and_current_roster_shape(old_roster, new_roster, nis, app); + get_base_and_current_roster_shape(old_roster, new_roster, app); // Clobber old_roster with the one specified app.db.get_roster(r_old_id, old_roster); @@ -2789,7 +2817,6 @@ else if (app.revision_selectors.size() == 2) { roster_t new_roster, old_roster; - temp_node_id_source nis; revision_id r_old_id, r_new_id; complete(app, idx(app.revision_selectors, 0)(), r_old_id); @@ -2895,7 +2922,6 @@ boost::shared_ptr old_roster = boost::shared_ptr(new roster_t()); marking_map working_mm, chosen_mm, merged_mm; revision_id r_old_id, r_working_id, r_chosen_id; - temp_node_id_source nis; if (args.size() > 0) throw usage(name); @@ -2910,7 +2936,7 @@ // such. But it should work for now; revisit if performance is // intolerable. - get_base_and_current_roster_shape(*old_roster, working_roster, nis, app); + get_base_and_current_roster_shape(*old_roster, working_roster, app); update_current_roster_from_filesystem(working_roster, app); get_revision_id(r_old_id); @@ -3339,7 +3365,6 @@ { path_set paths; roster_t old_roster, new_roster; - temp_node_id_source nis; restriction mask; cset included, excluded; @@ -3353,8 +3378,6 @@ path_set missing; find_missing(app, args_copy, missing); - // chose as_external because app_state::set_restriction turns utf8s into file_paths - // using file_path_external()... for (path_set::const_iterator i = missing.begin(); i != missing.end(); i++) args_copy.push_back(file_path(*i).as_external()); @@ -3367,7 +3390,7 @@ return; } - get_base_and_current_roster_shape(old_roster, new_roster, nis, app); + get_base_and_current_roster_shape(old_roster, new_roster, app); for (vector::const_iterator i = args_copy.begin(); i != args_copy.end(); ++i) { @@ -3593,10 +3616,9 @@ { // User wants to trace only specific files roster_t old_roster, new_roster; - temp_node_id_source nis; if (app.revision_selectors.size() == 0) - get_base_and_current_roster_shape(old_roster, new_roster, nis, app); + get_base_and_current_roster_shape(old_roster, new_roster, app); else app.db.get_roster(first_rid, new_roster); ============================================================ --- work.cc b27a7c55997c12adc5ad268c6c799afb05e65b41 +++ work.cc 91344ff1c00cef1c3ab300b2956bccb27b0d323f @@ -189,9 +189,8 @@ if (paths.empty()) return; - temp_node_id_source nis; roster_t base_roster, new_roster; - get_base_and_current_roster_shape(base_roster, new_roster, nis, app); + get_base_and_current_roster_shape(base_roster, new_roster, app); // we traverse the the paths backwards, so that we always hit deep paths // before shallow paths (because path_set is lexicographically sorted). @@ -425,16 +424,7 @@ cs.apply_to(er); } -/** void -get_current_restricted_roster(roster_t & ros, node_id_source & nis, app_state & app) -{ - get_current_roster_shape(ros, nis, app); - update_restricted_roster_from_filesystem(ros, app); -} -**/ - -void get_base_and_current_roster_shape(roster_t & base_roster, roster_t & current_roster, node_id_source & nis, @@ -448,17 +438,14 @@ cs.apply_to(er); } -/** void -get_base_and_current_restricted_roster(roster_t & base_roster, - roster_t & current_roster, - node_id_source & nis, - app_state & app) +get_base_and_current_roster_shape(roster_t & base_roster, + roster_t & current_roster, + app_state & app) { + temp_node_id_source nis; get_base_and_current_roster_shape(base_roster, current_roster, nis, app); - update_restricted_roster_from_filesystem(current_roster, app); } -**/ // user log file ============================================================ --- work.hh 410b69b097ae15b89d9b80b3973d4f57b2a5d43e +++ work.hh 487a9bda1fdf89f4eab461d5c71a10e7bf7fce0f @@ -97,12 +97,7 @@ // and under the correct names -- but do not trust file content hashes. void get_current_roster_shape(roster_t & ros, node_id_source & nis, app_state & app); -/** -// This does update hashes, but only those that match the current restriction -void get_current_restricted_roster(roster_t & ros, node_id_source & nis, app_state & app); -**/ - -// This returns the current roster, except it does not bother updating the +// These returns the current roster, except they do not bother updating the // hashes in that roster -- the "shape" is correct, all files and dirs exist // and under the correct names -- but do not trust file content hashes. void get_base_and_current_roster_shape(roster_t & base_roster, @@ -110,13 +105,9 @@ node_id_source & nis, app_state & app); -/** -// This does update hashes, but only those that match the current restriction -void get_base_and_current_restricted_roster(roster_t & base_roster, - roster_t & current_roster, - node_id_source & nis, - app_state & app); -**/ +void get_base_and_current_roster_shape(roster_t & base_roster, + roster_t & current_roster, + app_state & app); // the "user log" is a file the user can edit as they program to record // changes they make to their source code. Upon commit the file is read