# # patch "CVS_prot" # from [a9b10a02331464a2fae31eb6f40a2681a22f2186] # to [a6eabc75f6bc8a54a45811938e4c3a94634aea43] # # patch "cvs_sync.cc" # from [c9e93ea6cc72e6effccfff2e09343a5a04895f89] # to [41209871db890e59bc6b5fa5ee47623688193552] # # patch "cvs_sync.hh" # from [ae192e6a0bf3de1d20afb03ea51e972ad21c3a0c] # to [1bb9b2b48cf2a04fcd08ad9ac6548197f41c2d5f] # ======================================================================== --- CVS_prot a9b10a02331464a2fae31eb6f40a2681a22f2186 +++ CVS_prot a6eabc75f6bc8a54a45811938e4c3a94634aea43 @@ -131,10 +131,15 @@ -------------------- TODO ------------------------------ correct < when calculating manifests -push: changelog on merge faster initial db-access (multimap? without timestamp access?) tests: md5sum failure merge+commit without changes enhancement: erase_ancestors will drastically reduce memory footprint + use interner for cvs_revisions, author and changelog + +tests: time jump import + takeover modified, cvs commit changed (conflict), pull (MD5 sum failure) + pull, repull, merge, commit, push + takeover modified, repull, merge+push (two contents for one revision) ======================================================================== --- cvs_sync.cc c9e93ea6cc72e6effccfff2e09343a5a04895f89 +++ cvs_sync.cc 41209871db890e59bc6b5fa5ee47623688193552 @@ -183,7 +183,7 @@ for (std::set::const_iterator j=i->second.known_states.begin(); j!=i->second.known_states.end();++j) { result+="since "+time_t2human(j->since_when); - result+="V"+j->cvs_version+" "; + result+=" V"+j->cvs_version+" "; if (j->dead) result+= "dead"; else if (j->size) result+= boost::lexical_cast(j->size); else if (j->patchsize) result+= "p" + boost::lexical_cast(j->patchsize); @@ -712,6 +712,7 @@ } } +// commit CVS revisions to monotone (pull) void cvs_repository::commit_revisions(std::set::iterator e) { cvs_manifest parent_manifest; revision_id parent_rid; @@ -722,11 +723,13 @@ unsigned cm_delta_depth=0; cvs_edges_ticker.reset(0); + L(F("commit_revisions(%s %s)\n") % time_t2human(e->time) % e->revision()); revision_ticker.reset(new ticker("revisions", "R", 3)); // const cvs_manifest *oldmanifestp=∅ if (e!=edges.begin()) { std::set::const_iterator before=e; --before; + L(F("found last committed %s %s\n") % time_t2human(before->time) % before->revision()); I(!before->revision().empty()); parent_rid=before->revision; app.db.get_revision_manifest(parent_rid,parent_mid); @@ -739,6 +742,7 @@ { boost::shared_ptr cs(new change_set()); I(e->delta_base.inner()().empty()); // no delta yet cvs_manifest child_manifest=get_files(*e); + L(F("build_change_set(%s %s)\n") % time_t2human(e->time) % e->revision()); 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; @@ -1322,11 +1326,22 @@ guard.commit(); } -cvs_file_state cvs_repository::remember(std::set &s,const file_state &fs) +cvs_file_state cvs_repository::remember(std::set &s,const file_state &fs, std::string const& filename) { for (std::set::iterator i=s.begin();i!=s.end();++i) { if (i->cvs_version==fs.cvs_version) - { if (i->since_when>fs.since_when) + { if (i->since_when>fs.since_when) // i->since_when has to be the minimum const_cast(i->since_when)=fs.since_when; + static file_id emptysha1sum; + if (emptysha1sum.inner()().empty()) + calculate_ident(data(),const_cast&>(emptysha1sum.inner())); + if (i->log_msg=="last cvs update (modified)" + && i->sha1sum==emptysha1sum.inner() + && i->author==("unknown@"+host)) + { W(F("replacing fake contents for %s V%s\n") + % filename % i->cvs_version); + const_cast&>(i->sha1sum)=fs.sha1sum; + const_cast(i->log_msg)=fs.log_msg; + } return i; } } @@ -1392,7 +1407,7 @@ fs.log_msg=e.changelog; fs.author=e.author; fs.dead=true; - cvs_file_state cfs=remember(files[path].known_states,fs); + cvs_file_state cfs=remember(files[path].known_states,fs,path); e.xfiles.insert(std::make_pair(path,cfs)); // remove_state)); } else @@ -1401,7 +1416,7 @@ fs.sha1sum=iter_file_id->second.inner(); fs.log_msg=e.changelog; fs.author=e.author; - cvs_file_state cfs=remember(files[path].known_states,fs); + cvs_file_state cfs=remember(files[path].known_states,fs,path); e.xfiles.insert(std::make_pair(path,cfs)); } } @@ -1430,7 +1445,7 @@ fs.author=i->author; fs.dead=true; L(F("file %s gets removed at %s\n") % j->first % i->revision()); - remember(files[j->first].known_states,fs); + remember(files[j->first].known_states,fs,j->first); } } } ======================================================================== --- cvs_sync.hh ae192e6a0bf3de1d20afb03ea51e972ad21c3a0c +++ cvs_sync.hh 1bb9b2b48cf2a04fcd08ad9ac6548197f41c2d5f @@ -152,7 +152,7 @@ void store_delta(const std::string &new_contents, const std::string &old_contents, const std::string &patch, const hexenc &from, hexenc &to); void cert_cvs(const cvs_edge &e, packet_consumer & pc); - cvs_file_state remember(std::set &s,const file_state &fs); + cvs_file_state remember(std::set &s,const file_state &fs, std::string const& filename); void join_edge_parts(std::set::iterator i); std::set::iterator last_known_revision(); std::set::iterator commit(