# # # patch "cmd_netsync.cc" # from [321f76a5fd979cc6ad642f745d5333437c6abdd0] # to [08012b1b75787b9ee18f0f60f10140d6e74aa06f] # # patch "netsync.cc" # from [3640dd6b17a9a3e32f2766391d23a19a3e82aa3a] # to [7e2ab1d800ce5a89fff62b23cefd1fb86cae13a0] # # patch "network/connection_info.cc" # from [ca442d99d973be6e4b5d6cecdd986b419896c389] # to [d03280d9dd87adce8b7b0bebf244878661d5ae6e] # # patch "network/connection_info.hh" # from [2578ebe8394cf7611bc4db06fce0f6917a390f67] # to [181811d9adbba91506779f28461d29a46a40f2a1] # # patch "network/netsync_session.cc" # from [278f41d23b866913c926d4a6be2b84a3f9df681b] # to [e3b98a67f8eba6168d692d6a29ffa66d4db2f796] # # patch "network/netsync_session.hh" # from [b21b6f99547c74e3f02f55fa2ae144b832028fc0] # to [e5483827d8db0964dabed6565fddf1713f701a7d] # # patch "network/session.cc" # from [30e79173fce3cd35666e1f52393fa1736cc9b01e] # to [04f99fb3516968474cde97892d9b219ea0d5505e] # ============================================================ --- netsync.cc 3640dd6b17a9a3e32f2766391d23a19a3e82aa3a +++ netsync.cc 7e2ab1d800ce5a89fff62b23cefd1fb86cae13a0 @@ -129,7 +129,8 @@ call_server(app_state & app, app.opts, app.lua, project, keys, role, info->client.get_include_pattern(), - info->client.get_exclude_pattern())); + info->client.get_exclude_pattern(), + info)); break; case automate_connection: wrapped.reset(new automate_session(app, sess.get(), @@ -232,6 +233,7 @@ session_from_server_sync_item(app_state keys, request.role, info->client.get_include_pattern(), info->client.get_exclude_pattern(), + shared_conn_info(), true)); sess->set_inner(wrapped); return sess; ============================================================ --- cmd_netsync.cc 321f76a5fd979cc6ad642f745d5333437c6abdd0 +++ cmd_netsync.cc 08012b1b75787b9ee18f0f60f10140d6e74aa06f @@ -272,6 +272,54 @@ CMD_AUTOMATE_NO_STDIO(remote, F("received remote error code %d") % os.get_error()); } +void print_dryrun_info(protocol_role role, + shared_conn_info info, + project_t & project) +{ + if (role != source_role) + { + if (info->client.dryrun_incoming_keys_is_estimate) + { + P(F("would receive %d revisions, %d certs, and at least %d keys") + % info->client.dryrun_incoming_revs + % info->client.dryrun_incoming_certs + % info->client.dryrun_incoming_keys); + } + else + { + P(F("would receive %d revisions, %d certs, and %d keys") + % info->client.dryrun_incoming_revs + % info->client.dryrun_incoming_certs + % info->client.dryrun_incoming_keys); + } + } + if (role != sink_role) + { + P(F("would send %d certs and %d keys") + % info->client.dryrun_outgoing_certs + % info->client.dryrun_outgoing_keys); + P(F("would send %d revisions:") + % info->client.dryrun_outgoing_revs.size()); + map branch_counts; + for (set::const_iterator i = info->client.dryrun_outgoing_revs.begin(); + i != info->client.dryrun_outgoing_revs.end(); ++i) + { + set my_branches; + project.get_revision_branches(*i, my_branches); + for(set::iterator b = my_branches.begin(); + b != my_branches.end(); ++b) + { + ++branch_counts[*b]; + } + } + for (map::iterator i = branch_counts.begin(); + i != branch_counts.end(); ++i) + { + P(F("%9d in branch %s") % i->second % i->first); + } + } +} + CMD(push, "push", "", CMD_REF(network), N_("[URL]\n[ADDRESS[:PORTNUMBER] [PATTERN ...]]"), N_("Pushes branches to a netsync server"), @@ -291,6 +339,8 @@ CMD(push, "push", "", CMD_REF(network), run_netsync_protocol(app, app.opts, app.lua, project, keys, client_voice, source_role, info); + if (app.opts.dryrun) + print_dryrun_info(source_role, info, project); } CMD_AUTOMATE(push, N_("[URL]\n[ADDRESS[:PORTNUMBER] [PATTERN ...]]"), @@ -311,6 +361,8 @@ CMD_AUTOMATE(push, N_("[URL]\n[ADDRESS[: run_netsync_protocol(app, app.opts, app.lua, project, keys, client_voice, source_role, info); + if (app.opts.dryrun) + print_dryrun_info(source_role, info, project); } CMD(pull, "pull", "", CMD_REF(network), @@ -339,6 +391,8 @@ CMD(pull, "pull", "", CMD_REF(network), client_voice, sink_role, info); updater.maybe_do_update(); + if (app.opts.dryrun) + print_dryrun_info(sink_role, info, project); } CMD_AUTOMATE(pull, N_("[URL]\n[ADDRESS[:PORTNUMBER] [PATTERN ...]]"), @@ -359,6 +413,8 @@ CMD_AUTOMATE(pull, N_("[URL]\n[ADDRESS[: run_netsync_protocol(app, app.opts, app.lua, project, keys, client_voice, sink_role, info); + if (app.opts.dryrun) + print_dryrun_info(sink_role, info, project); } CMD(sync, "sync", "", CMD_REF(network), @@ -392,6 +448,8 @@ CMD(sync, "sync", "", CMD_REF(network), client_voice, source_and_sink_role, info); updater.maybe_do_update(); + if (app.opts.dryrun) + print_dryrun_info(source_and_sink_role, info, project); } CMD_AUTOMATE(sync, N_("[URL]\n[ADDRESS[:PORTNUMBER] [PATTERN ...]]"), @@ -418,6 +476,8 @@ CMD_AUTOMATE(sync, N_("[URL]\n[ADDRESS[: run_netsync_protocol(app, app.opts, app.lua, project, keys, client_voice, source_and_sink_role, info); + if (app.opts.dryrun) + print_dryrun_info(source_and_sink_role, info, project); } CMD_NO_WORKSPACE(clone, "clone", "", CMD_REF(network), ============================================================ --- network/netsync_session.cc 278f41d23b866913c926d4a6be2b84a3f9df681b +++ network/netsync_session.cc e3b98a67f8eba6168d692d6a29ffa66d4db2f796 @@ -75,6 +75,7 @@ netsync_session::netsync_session(session protocol_role role, globish const & our_include_pattern, globish const & our_exclude_pattern, + shared_conn_info info, bool initiated_by_server) : wrapped_session(owner), role(role), @@ -101,6 +102,7 @@ netsync_session::netsync_session(session rev_refiner(revision_item, get_voice(), *this), is_dry_run(opts.dryrun), dry_run_keys_refined(false), + conn_info(info), rev_enumerator(project, *this), initiated_by_server(initiated_by_server) { @@ -443,51 +445,21 @@ netsync_session::dry_run_finished() cons && cert_refiner.done && dry_run_keys_refined; - if (all) + if (all && conn_info) { - if (role != source_role) + conn_info->client.dryrun_incoming_revs = rev_refiner.items_to_receive; + conn_info->client.dryrun_incoming_certs = cert_refiner.items_to_receive; + conn_info->client.dryrun_incoming_keys = key_refiner.min_items_to_receive; + conn_info->client.dryrun_incoming_keys_is_estimate + = key_refiner.may_receive_more_than_min; + + for (set::const_iterator i = rev_refiner.items_to_send.begin(); + i != rev_refiner.items_to_send.end(); ++i) { - if (key_refiner.may_receive_more_than_min) - { - P(F("would receive %d revisions, %d certs, and at least %d keys") - % rev_refiner.items_to_receive - % cert_refiner.items_to_receive - % key_refiner.min_items_to_receive); - } - else - { - P(F("would receive %d revisions, %d certs, and %d keys") - % rev_refiner.items_to_receive - % cert_refiner.items_to_receive - % key_refiner.min_items_to_receive); - } + conn_info->client.dryrun_outgoing_revs.insert(revision_id(*i)); } - if (role != sink_role) - { - P(F("would send %d certs and %d keys") - % cert_refiner.items_to_send.size() - % key_refiner.items_to_send.size()); - P(F("would send %d revisions:") - % rev_refiner.items_to_send.size()); - map branch_counts; - for (set::const_iterator i = rev_refiner.items_to_send.begin(); - i != rev_refiner.items_to_send.end(); ++i) - { - revision_id const rid(*i); - set my_branches; - project.get_revision_branches(rid, my_branches); - for(set::iterator b = my_branches.begin(); - b != my_branches.end(); ++b) - { - ++branch_counts[*b]; - } - } - for (map::iterator i = branch_counts.begin(); - i != branch_counts.end(); ++i) - { - P(F("%9d in branch %s") % i->second % i->first); - } - } + conn_info->client.dryrun_outgoing_certs = cert_refiner.items_to_send.size(); + conn_info->client.dryrun_outgoing_keys = key_refiner.items_to_send.size(); } return all; ============================================================ --- network/netsync_session.hh b21b6f99547c74e3f02f55fa2ae144b832028fc0 +++ network/netsync_session.hh e5483827d8db0964dabed6565fddf1713f701a7d @@ -22,6 +22,7 @@ #include "refiner.hh" #include "ui.hh" +#include "network/connection_info.hh" #include "network/wrapped_session.hh" class cert; @@ -75,6 +76,7 @@ netsync_session: // dry-run info bool is_dry_run; bool dry_run_keys_refined; + shared_conn_info conn_info; bool dry_run_finished() const; // Interface to ancestry grovelling. @@ -99,6 +101,7 @@ public: protocol_role role, globish const & our_include_pattern, globish const & our_exclude_pattern, + shared_conn_info info, bool initiated_by_server = false); virtual ~netsync_session(); ============================================================ --- network/session.cc 30e79173fce3cd35666e1f52393fa1736cc9b01e +++ network/session.cc 04f99fb3516968474cde97892d9b219ea0d5505e @@ -660,7 +660,8 @@ bool session::handle_service_request() keys, corresponding_role(role), their_include, - their_exclude)); + their_exclude, + shared_conn_info())); break; case is_automate: wrapped.reset(new automate_session(app, this, 0, 0)); ============================================================ --- network/connection_info.cc ca442d99d973be6e4b5d6cecdd986b419896c389 +++ network/connection_info.cc d03280d9dd87adce8b7b0bebf244878661d5ae6e @@ -38,7 +38,13 @@ netsync_connection_info::Client::Client( conn_type(netsync_connection), input_stream(0), output_stream(0), - db(d), opts(o) + db(d), opts(o), + dryrun_incoming_revs(0), + dryrun_incoming_certs(0), + dryrun_incoming_keys(0), + dryrun_incoming_keys_is_estimate(false), + dryrun_outgoing_certs(0), + dryrun_outgoing_keys(0) { var_key default_server_key(var_domain("database"), var_name("default-server")); ============================================================ --- network/connection_info.hh 2578ebe8394cf7611bc4db06fce0f6917a390f67 +++ network/connection_info.hh 181811d9adbba91506779f28461d29a46a40f2a1 @@ -76,6 +76,14 @@ struct netsync_connection_info connection_type get_connection_type() const; void set_connection_successful(); + + size_t dryrun_incoming_revs; + size_t dryrun_incoming_certs; + size_t dryrun_incoming_keys; + bool dryrun_incoming_keys_is_estimate; + std::set dryrun_outgoing_revs; + size_t dryrun_outgoing_certs; + size_t dryrun_outgoing_keys; } client; static void