# # patch "cvs_repository.cc" # from [1d3087b49057b11f054f15c375d9bfa2e682cd1c] # to [3fc332d06970ce92b71c1bec17e2e6ec68915341] # # patch "cvs_sync.hh" # from [7db8f1011a1f55d1bf90b5764ef595cb9200e268] # to [1f26c005c18f6c6494ddd8177987196f1c836d99] # --- cvs_repository.cc +++ cvs_repository.cc @@ -493,7 +493,7 @@ static bool build_change_set(const cvs_client &c, const cvs_manifest &oldm, cvs_manifest &newm, - change_set & cs, cvs_file_state remove_state) + change_set & cs, cvs_file_state remove_state, unsigned cm_delta_depth) { cs = change_set(); cvs_manifest cvs_delta; @@ -536,7 +536,8 @@ cvs_delta[f->first]=f->second; } } - if (!oldm.empty() && cvs_delta.size()cm_delta_depth; } for (; e!=edges.end(); ++e) { boost::shared_ptr cs(new change_set()); I(e->delta_base.inner()().empty()); // no delta yet cvs_manifest child_manifest=get_files(*e); - if (build_change_set(*this,parent_manifest,e->xfiles,*cs,remove_state)) - e->delta_base=parent_rid; + if (build_change_set(*this,parent_manifest,e->xfiles,*cs,remove_state,cm_delta_depth)) + { e->delta_base=parent_rid; + e->cm_delta_depth=cm_delta_depth+1; + } if (cs->empty()) { W(F("null edge (empty cs) @%ld skipped\n") % e->time); continue; @@ -828,6 +833,7 @@ parent_mid = child_mid; parent_rid = child_rid; parent_manifest=child_manifest; + cm_delta_depth=e->cm_delta_depth; } } @@ -963,7 +969,7 @@ } cvs_edge::cvs_edge(const revision_id &rid, app_state &app) - : changelog_valid(), time(), time2() + : changelog_valid(), time(), time2(), cm_delta_depth() { revision=hexenc(rid.inner()); // get author + date std::vector< ::revision > edge_certs; @@ -1010,6 +1016,7 @@ revision_set rs; app.db.get_revision(rid, rs); std::vector commits; + unsigned cm_delta_depth=parent->cm_delta_depth; for (edge_map::const_iterator j = rs.edges.begin(); j != rs.edges.end(); @@ -1108,6 +1115,12 @@ } } packet_db_writer dbw(app); + if (cm_delta_depth+1>=cvs_edge::cm_max_delta_depth) + { get_files(e); + cm_delta_depth=0; + } + else + e.cm_delta_depth=++cm_delta_depth; cert_cvs(e, dbw); revision_lookup[e.revision]=edges.insert(e).first; if (global_sanity.debug) L(F("%s") % debug()); @@ -1505,6 +1518,7 @@ std::vector deltas; while (!current->delta_base.inner()().empty()) { L(F("get_files: looking for base rev %s\n") % current->delta_base); + ++e.cm_delta_depth; deltas.push_back(current); std::map::iterator>::const_iterator cache_item=revision_lookup.find(current->delta_base); --- cvs_sync.hh +++ cvs_sync.hh @@ -65,16 +65,19 @@ mutable revision_id delta_base; // delta encoded if !delta_base().empty() mutable cvs_manifest xfiles; // manifest (or use cvs_manifest) + mutable unsigned cm_delta_depth; // we store a full manifest every N revisions + static const unsigned cm_max_delta_depth=50; mutable hexenc revision; // monotone revision // make this a revision_id // I do not want this to be 3 hours (how comes?) static size_t const cvs_window = 5; - cvs_edge() : changelog_valid(), time(), time2() {} - cvs_edge(time_t when) : changelog_valid(), time(when), time2(when) {} + cvs_edge() : changelog_valid(), time(), time2(), cm_delta_depth() {} + cvs_edge(time_t when) : changelog_valid(), time(when), time2(when), cm_delta_depth() {} cvs_edge(const std::string &log, time_t when, const std::string &auth) - : changelog(log), changelog_valid(true), author(auth), time(when), time2(when) + : changelog(log), changelog_valid(true), author(auth), time(when), time2(when), + cm_delta_depth() {} cvs_edge(const revision_id &rid,app_state &app);