# # # patch "app_state.cc" # from [c51dd3ba75b38b6f0c624470f5b88f976c3b1deb] # to [4c1ac983529b930a7ec449de19fd6cd04b3f8ea1] # # patch "app_state.hh" # from [542ae07fd61ea2002549a185189c0db1235613bc] # to [f80f87e780b717e5a27e70d716364193f3e33d02] # # patch "automate.cc" # from [7d5b68647c134c094323e2ac3793d887211547a0] # to [e60ee7f88520b2a22f5ff1fb01af375b74381ca4] # # patch "branch.cc" # from [feebd0dcee184b06da556c39804f799df62004d1] # to [8fcf3617d3c24fc6f53b515c203cd0693baea311] # # patch "branch.hh" # from [f913da1a88fee4f7943411cb8d03a11655ca5d2e] # to [4f64260d0b85965f7bac3854db20b609c075b35b] # # patch "cmd_merging.cc" # from [6cf691238da422820cb4e59a05e0174a54548c93] # to [da91fb262ffa57750a82b15e68ad885a1e22b8f3] # # patch "cmd_ws_commit.cc" # from [b7434c5291a0c867f38fdbff6a1a7bae50a90cbb] # to [306acc01a0bd314725219d4e352c74cfb21e6538] # # patch "database.cc" # from [a878bffc1708b353c1c804eecc2f07dfce1d0abb] # to [4b2f6a180ecf2de37eca6e6d5388625665fc9c5e] # # patch "database.hh" # from [90b06ee358aefaec065b5e7a7ac645f112dade68] # to [a3a95224391592f5f83b4da6864c8d330e563bc5] # # patch "netsync.cc" # from [c5f71ed07ffa8631bc997dc02e872e4d7f14a416] # to [c309066e1f171b13eda8869c2955d1e1b427cf8a] # # patch "outdated_indicator.cc" # from [5aec489052b464a928cadf8915478177f7ee8196] # to [17a644bc4ec2dff927f2a232c4460cc511fc642a] # # patch "outdated_indicator.hh" # from [1e93604846e99249f6f6e31544b39d6fb576a3ab] # to [d531a816252525b9620af673768faae1a73ba208] # ============================================================ --- app_state.cc c51dd3ba75b38b6f0c624470f5b88f976c3b1deb +++ app_state.cc 4c1ac983529b930a7ec449de19fd6cd04b3f8ea1 @@ -40,7 +40,8 @@ app_state::app_state() keys(this), work(db, lua), // search_root(current_root_path()), // diff_format(unified_diff), - branch_is_sticky(false) + branch_is_sticky(false), + branches(*this) { db.set_app(this); lua.set_app(this); @@ -193,14 +194,6 @@ app_state::make_branch_sticky() } } -branch & -app_state::get_branch(utf8 const & name) -{ - std::pair::iterator, bool> res; - res = branch_map.insert(std::make_pair(name, branch(*this, name))); - return res.first->second; -} - void app_state::set_root(system_path const & path) { ============================================================ --- app_state.hh 542ae07fd61ea2002549a185189c0db1235613bc +++ app_state.hh f80f87e780b717e5a27e70d716364193f3e33d02 @@ -81,11 +81,9 @@ public: void make_branch_sticky(); -private: - std::map branch_map; -public: - branch & get_branch(utf8 const & name); + branch_list branches; + void set_database(system_path const & filename); void set_key_dir(system_path const & filename); void set_root(system_path const & root); ============================================================ --- automate.cc 7d5b68647c134c094323e2ac3793d887211547a0 +++ automate.cc e60ee7f88520b2a22f5ff1fb01af375b74381ca4 @@ -71,7 +71,7 @@ AUTOMATE(heads, N_("[BRANCH]"), options: app.opts.branch_name = idx(args, 0); } set heads; - app.get_branch(app.opts.branch_name()).heads(heads); + app.branches.get(app.opts.branch_name()).heads(heads); for (set::const_iterator i = heads.begin(); i != heads.end(); ++i) output << (*i).inner()() << "\n"; } ============================================================ --- branch.cc feebd0dcee184b06da556c39804f799df62004d1 +++ branch.cc 8fcf3617d3c24fc6f53b515c203cd0693baea311 @@ -1,6 +1,7 @@ // 2007 Timothy Brownawell // GNU GPL V2 or later +#include "app_state.hh" #include "branch.hh" #include "cert.hh" @@ -17,3 +18,34 @@ branch::heads(std::set & h) } h = _heads; } + + +branch_list::branch_list(app_state & app) + : app(app) +{} + +void +branch_list::list_all(std::set & names) +{ + if (indicator.outdated()) + { + std::vector got; + indicator = app.db.get_branches(got); + actual.clear(); + for (std::vector::iterator i = got.begin(); + i != got.end(); ++i) + { + actual.insert(*i); + } + } + + names = actual; +} + +branch & +branch_list::get(utf8 const & name) +{ + std::pair::iterator, bool> res; + res = known.insert(std::make_pair(name, branch(app, name))); + return res.first->second; +} ============================================================ --- branch.hh f913da1a88fee4f7943411cb8d03a11655ca5d2e +++ branch.hh 4f64260d0b85965f7bac3854db20b609c075b35b @@ -1,9 +1,10 @@ // 2007 Timothy Brownawell // GNU GPL V2 or later #ifndef __BRANCH_HH__ #define __BRANCH_HH__ +#include #include #include "outdated_indicator.hh" @@ -23,4 +24,18 @@ public: void heads(std::set & h); }; +class branch_list +{ + app_state & app; + std::map known; + std::set actual; + outdated_indicator indicator; + +public: + branch_list(app_state & app); + + void list_all(std::set & names); + branch & get(utf8 const & name); +}; + #endif ============================================================ --- cmd_merging.cc 6cf691238da422820cb4e59a05e0174a54548c93 +++ cmd_merging.cc da91fb262ffa57750a82b15e68ad885a1e22b8f3 @@ -330,7 +330,7 @@ CMD(merge, N_("tree"), "", N_("merge unm F("please specify a branch, with --branch=BRANCH")); set heads; - app.get_branch(app.opts.branch_name()).heads(heads); + app.branches.get(app.opts.branch_name()).heads(heads); N(heads.size() != 0, F("branch '%s' is empty") % app.opts.branch_name); if (heads.size() == 1) @@ -398,7 +398,7 @@ CMD(merge, N_("tree"), "", N_("merge unm ancestors.clear(); heads_for_ancestor.clear(); - app.get_branch(app.opts.branch_name()).heads(heads); + app.branches.get(app.opts.branch_name()).heads(heads); pass++; } @@ -463,8 +463,8 @@ CMD(merge_into_dir, N_("tree"), N_("SOUR if (args.size() != 3) throw usage(name); - app.get_branch(idx(args, 0)()).heads(src_heads); - app.get_branch(idx(args, 1)()).heads(dst_heads); + app.branches.get(idx(args, 0)()).heads(src_heads); + app.branches.get(idx(args, 1)()).heads(dst_heads); N(src_heads.size() != 0, F("branch '%s' is empty") % idx(args, 0)()); N(src_heads.size() == 1, F("branch '%s' is not merged") % idx(args, 0)()); @@ -828,7 +828,7 @@ CMD(heads, N_("tree"), "", N_("show unme N(app.opts.branch_name() != "", F("please specify a branch, with --branch=BRANCH")); - app.get_branch(app.opts.branch_name()).heads(heads); + app.branches.get(app.opts.branch_name()).heads(heads); if (heads.size() == 0) P(F("branch '%s' is empty") % app.opts.branch_name); ============================================================ --- cmd_ws_commit.cc b7434c5291a0c867f38fdbff6a1a7bae50a90cbb +++ cmd_ws_commit.cc 306acc01a0bd314725219d4e352c74cfb21e6538 @@ -502,7 +502,7 @@ CMD(checkout, N_("tree"), N_("[DIRECTORY F("use --revision or --branch to specify what to checkout")); set heads; - app.get_branch(app.opts.branch_name).heads(heads); + app.branches.get(app.opts.branch_name).heads(heads); N(heads.size() > 0, F("branch '%s' is empty") % app.opts.branch_name); if (heads.size() > 1) @@ -758,7 +758,7 @@ CMD(commit, N_("workspace"), N_("[PATH]. I(restricted_rev.edges.size() == 1); set heads; - app.get_branch(app.opts.branch_name).heads(heads); + app.branches.get(app.opts.branch_name).heads(heads); unsigned int old_head_size = heads.size(); if (app.opts.branch_name() != "") @@ -931,7 +931,7 @@ CMD(commit, N_("workspace"), N_("[PATH]. app.work.blank_user_log(); - app.get_branch(app.opts.branch_name).heads(heads); + app.branches.get(app.opts.branch_name).heads(heads); if (heads.size() > old_head_size && old_head_size > 0) { P(F("note: this revision creates divergence\n" "note: you may (or may not) wish to run '%s merge'") @@ -1036,7 +1036,7 @@ CMD_NO_WORKSPACE(import, N_("tree"), N_( F("use --revision or --branch to specify what to checkout")); set heads; - app.get_branch(app.opts.branch_name).heads(heads); + app.branches.get(app.opts.branch_name).heads(heads); if (heads.size() > 1) { P(F("branch %s has multiple heads:") % app.opts.branch_name); ============================================================ --- database.cc a878bffc1708b353c1c804eecc2f07dfce1d0abb +++ database.cc 4b2f6a180ecf2de37eca6e6d5388625665fc9c5e @@ -2264,7 +2264,7 @@ database::get_revision_cert_nobranch_ind make_pair(revision_id((*i)[1]), rsa_keypair_id((*i)[2])))); } - return cert_stamper.get_notifier(); + return cert_stamper.get_indicator(); } outdated_indicator @@ -2274,7 +2274,7 @@ database::get_revision_certs(vector< rev get_certs(certs, "revision_certs"); ts.clear(); copy(certs.begin(), certs.end(), back_inserter(ts)); - return cert_stamper.get_notifier(); + return cert_stamper.get_indicator(); } outdated_indicator @@ -2285,7 +2285,7 @@ database::get_revision_certs(cert_name c get_certs(name, certs, "revision_certs"); ts.clear(); copy(certs.begin(), certs.end(), back_inserter(ts)); - return cert_stamper.get_notifier(); + return cert_stamper.get_indicator(); } outdated_indicator @@ -2297,7 +2297,7 @@ database::get_revision_certs(revision_id get_certs(id.inner(), name, certs, "revision_certs"); ts.clear(); copy(certs.begin(), certs.end(), back_inserter(ts)); - return cert_stamper.get_notifier(); + return cert_stamper.get_indicator(); } outdated_indicator @@ -2310,7 +2310,7 @@ database::get_revision_certs(revision_id get_certs(id.inner(), name, val, certs, "revision_certs"); ts.clear(); copy(certs.begin(), certs.end(), back_inserter(ts)); - return cert_stamper.get_notifier(); + return cert_stamper.get_indicator(); } outdated_indicator @@ -2326,7 +2326,7 @@ database::get_revisions_with_cert(cert_n fetch(res, one_col, any_rows, q % text(name()) % blob(binvalue())); for (results::const_iterator i = res.begin(); i != res.end(); ++i) revisions.insert(revision_id((*i)[0])); - return cert_stamper.get_notifier(); + return cert_stamper.get_indicator(); } outdated_indicator @@ -2338,7 +2338,7 @@ database::get_revision_certs(cert_name c get_certs(name, val, certs, "revision_certs"); ts.clear(); copy(certs.begin(), certs.end(), back_inserter(ts)); - return cert_stamper.get_notifier(); + return cert_stamper.get_indicator(); } outdated_indicator @@ -2349,7 +2349,7 @@ database::get_revision_certs(revision_id get_certs(id.inner(), certs, "revision_certs"); ts.clear(); copy(certs.begin(), certs.end(), back_inserter(ts)); - return cert_stamper.get_notifier(); + return cert_stamper.get_indicator(); } outdated_indicator @@ -2366,7 +2366,7 @@ database::get_revision_certs(revision_id ts.clear(); for (size_t i = 0; i < res.size(); ++i) ts.push_back(hexenc(res[i][0])); - return cert_stamper.get_notifier(); + return cert_stamper.get_indicator(); } void @@ -2851,7 +2851,7 @@ database::clear_var(var_key const & key) // branches -void +outdated_indicator database::get_branches(vector & names) { results res; @@ -2862,6 +2862,7 @@ database::get_branches(vector & { names.push_back(res[i][0]); } + return cert_stamper.get_indicator(); } void ============================================================ --- database.hh 90b06ee358aefaec065b5e7a7ac645f112dade68 +++ database.hh a3a95224391592f5f83b4da6864c8d330e563bc5 @@ -530,7 +530,7 @@ public: database & db); public: // branches - void get_branches(std::vector & names); + outdated_indicator get_branches(std::vector & names); bool check_integrity(); ============================================================ --- netsync.cc c5f71ed07ffa8631bc997dc02e872e4d7f14a416 +++ netsync.cc c309066e1f171b13eda8869c2955d1e1b427cf8a @@ -1342,14 +1342,13 @@ session::process_hello_cmd(rsa_keypair_i // clients always include in the synchronization set, every branch that the // user requested - vector branchnames; - set ok_branches; - get_branches(app, branchnames); - for (vector::const_iterator i = branchnames.begin(); - i != branchnames.end(); i++) + set all_branches, ok_branches; + app.branches.list_all(all_branches); + for (set::const_iterator i = all_branches.begin(); + i != all_branches.end(); i++) { - if (our_matcher(*i)) - ok_branches.insert(utf8(*i)); + if (our_matcher((*i)())) + ok_branches.insert(*i); } rebuild_merkle_trees(app, ok_branches); @@ -1436,22 +1435,21 @@ session::process_anonymous_cmd(protocol_ } } - vector branchnames; - set ok_branches; - get_branches(app, branchnames); + set all_branches, ok_branches; + app.branches.list_all(all_branches); globish_matcher their_matcher(their_include_pattern, their_exclude_pattern); - for (vector::const_iterator i = branchnames.begin(); - i != branchnames.end(); i++) + for (set::const_iterator i = all_branches.begin(); + i != all_branches.end(); i++) { - if (their_matcher(*i)) + if (their_matcher((*i)())) if (app.opts.use_transport_auth && - !app.lua.hook_get_netsync_read_permitted(*i)) + !app.lua.hook_get_netsync_read_permitted((*i)())) { error(not_permitted, (F("anonymous access to branch '%s' denied by server") % *i).str()); } else - ok_branches.insert(utf8(*i)); + ok_branches.insert(*i); } if (app.opts.use_transport_auth) @@ -1509,9 +1507,7 @@ session::process_auth_cmd(protocol_role hexenc their_key_hash; encode_hexenc(client, their_key_hash); - set ok_branches; - vector branchnames; - get_branches(app, branchnames); + globish_matcher their_matcher(their_include_pattern, their_exclude_pattern); if (!app.db.public_key_exists(their_key_hash)) @@ -1572,19 +1568,21 @@ session::process_auth_cmd(protocol_role } } - for (vector::const_iterator i = branchnames.begin(); - i != branchnames.end(); i++) + set all_branches, ok_branches; + app.branches.list_all(all_branches); + for (set::const_iterator i = all_branches.begin(); + i != all_branches.end(); i++) { - if (their_matcher(*i)) + if (their_matcher((*i)())) { - if (!app.lua.hook_get_netsync_read_permitted(*i, their_id)) + if (!app.lua.hook_get_netsync_read_permitted((*i)(), their_id)) { error(not_permitted, (F("denied '%s' read permission for '%s' excluding '%s' because of branch '%s'") % their_id % their_include_pattern % their_exclude_pattern % *i).str()); } else - ok_branches.insert(utf8(*i)); + ok_branches.insert(*i); } } @@ -3069,34 +3067,29 @@ session::rebuild_merkle_trees(app_state set inserted_keys; { - // Get our branches - vector names; - get_branches(app, names); - for (size_t i = 0; i < names.size(); ++i) + for (set::const_iterator i = branchnames.begin(); + i != branchnames.end(); ++i) { - if(branchnames.find(names[i]) != branchnames.end()) + // Get branch certs. + vector< revision > certs; + base64 encoded_name; + encode_base64(cert_value((*i)()),encoded_name); + app.db.get_revision_certs(branch_cert_name, encoded_name, certs); + for (vector< revision >::const_iterator j = certs.begin(); + j != certs.end(); j++) { - // Branch matches, get its certs. - vector< revision > certs; - base64 encoded_name; - encode_base64(cert_value(names[i]),encoded_name); - app.db.get_revision_certs(branch_cert_name, encoded_name, certs); - for (vector< revision >::const_iterator j = certs.begin(); - j != certs.end(); j++) - { - revision_id rid(j->inner().ident); - insert_with_parents(rid, rev_refiner, rev_enumerator, - revision_ids, app, revisions_ticker); - // Granch certs go in here, others later on. - hexenc tmp; - id item; - cert_hash_code(j->inner(), tmp); - decode_hexenc(tmp, item); - cert_refiner.note_local_item(item); - rev_enumerator.note_cert(rid, tmp); - if (inserted_keys.find(j->inner().key) == inserted_keys.end()) - inserted_keys.insert(j->inner().key); - } + revision_id rid(j->inner().ident); + insert_with_parents(rid, rev_refiner, rev_enumerator, + revision_ids, app, revisions_ticker); + // Branch certs go in here, others later on. + hexenc tmp; + id item; + cert_hash_code(j->inner(), tmp); + decode_hexenc(tmp, item); + cert_refiner.note_local_item(item); + rev_enumerator.note_cert(rid, tmp); + if (inserted_keys.find(j->inner().key) == inserted_keys.end()) + inserted_keys.insert(j->inner().key); } } } ============================================================ --- outdated_indicator.cc 5aec489052b464a928cadf8915478177f7ee8196 +++ outdated_indicator.cc 17a644bc4ec2dff927f2a232c4460cc511fc642a @@ -73,7 +73,7 @@ outdated_indicator } outdated_indicator -outdated_indicator_factory::get_notifier() +outdated_indicator_factory::get_indicator() { return outdated_indicator(impl); } @@ -93,13 +93,13 @@ UNIT_TEST(outdated_indicator, ) { outdated_indicator_factory factory; BOOST_CHECK(indicator.outdated()); - indicator = factory.get_notifier(); + indicator = factory.get_indicator(); BOOST_CHECK(!indicator.outdated()); factory.note_change(); BOOST_CHECK(indicator.outdated()); factory.note_change(); factory.note_change(); - indicator = factory.get_notifier(); + indicator = factory.get_indicator(); BOOST_CHECK(!indicator.outdated()); } BOOST_CHECK(indicator.outdated()); ============================================================ --- outdated_indicator.hh 1e93604846e99249f6f6e31544b39d6fb576a3ab +++ outdated_indicator.hh d531a816252525b9620af673768faae1a73ba208 @@ -37,7 +37,7 @@ public: public: outdated_indicator_factory(); ~outdated_indicator_factory(); - outdated_indicator get_notifier(); + outdated_indicator get_indicator(); void note_change(); };