# # # patch "mtn_cvs/CVS_prot" # from [c3a66b01dd58d3b879b3736b653fc8a4ece66517] # to [86fca40527b5898c3e721a49ac384af5ad142784] # # patch "mtn_cvs/cvs_sync.cc" # from [94dabfec451c45fd97cf1f9d488ee86113ca1d74] # to [118438cfe043fc0f199b7f596a263de79c1a5a1e] # # patch "mtn_cvs/mtn_automate.cc" # from [5fd366d683a9410f48eb9479fdd6cf193f38f7b1] # to [99b86dc6eb6d43103e1ba7f710113629f057e522] # # patch "mtn_cvs/mtn_automate.hh" # from [ad3b01228692142ff7500a849144ffc4332c3eb5] # to [4b8f8ca7d730e343dc365866d3a7e19188b79bf6] # ============================================================ --- mtn_cvs/CVS_prot c3a66b01dd58d3b879b3736b653fc8a4ece66517 +++ mtn_cvs/CVS_prot 86fca40527b5898c3e721a49ac384af5ad142784 @@ -253,4 +253,5 @@ revision kann später "(1.2)" sein (= lo "README" "cvs:revision" "1.15" ["README" "cvs:keywords" "-kb" (only if different from -kk)] +"README" "cvs:sha1" "da39a3ee5e6b4b0d3255bfef95601890afd80709" + (or only first 4/6 chars) - ============================================================ --- mtn_cvs/cvs_sync.cc 94dabfec451c45fd97cf1f9d488ee86113ca1d74 +++ mtn_cvs/cvs_sync.cc 118438cfe043fc0f199b7f596a263de79c1a5a1e @@ -1107,7 +1107,7 @@ static void guess_repository(std::string // its value to repository, module, branch static void guess_repository(std::string &repository, std::string &module, - std::string & branch,std::string &last_state, revision_id &lastid, mtncvs_state &app) + std::string & branch,mtn_automate::sync_map_t &last_state, revision_id &lastid, mtncvs_state &app) { I(!app.opts.branch_name().empty()); try { lastid=app.find_newest_sync(app.opts.domain(),app.opts.branch_name()); @@ -1151,7 +1151,7 @@ cvs_sync::cvs_repository *cvs_sync::prep { app.open(); std::string repository=_repository, module=_module, branch=_branch; - std::string last_sync_info; + mtn_automate::sync_map_t last_sync_info; revision_id lastid; { std::string rep,mod,br; @@ -1224,33 +1224,29 @@ cvs_file_state cvs_repository::remember( return iter.first; } -void cvs_repository::process_sync_info(std::string const& sync_info, revision_id const& rid) +void cvs_repository::process_sync_info(mtn_automate::sync_map_t const& sync_info, revision_id const& rid) { mtn_automate::manifest_map manifest=app.get_manifest_of(rid); // populate data structure using this sync info cvs_edge e(rid.inner(),app); - piece::piece_table pieces; + //piece::piece_table pieces; // in Zeilen aufteilen - piece::index_deltatext(sync_info,pieces); - I(!pieces.empty()); - piece::piece_table::const_iterator p=pieces.begin()+1; + //piece::index_deltatext(sync_info,pieces); +// I(!pieces.empty()); +// piece::piece_table::const_iterator p=pieces.begin()+1; - while (p!=pieces.end() && (**p)!="#files\n") ++p; - if (p!=pieces.end()) ++p; // skip the #files line - for (;p!=pieces.end();++p) - { std::string line=**p; - I(!line.empty()); - I(line[line.size()-1]=='\n'); - line.erase(line.size()-1,1); // erase the newline char - // the format is "[/] \tsha1sum\n" - // e.g. "1.1 .cvsignore", "1.43/-kb test.png" - std::string::size_type space=line.find(' '); - I(space!=std::string::npos); - std::string::size_type sha1=line.find('\t',space+1); - I(sha1!=std::string::npos); - std::string monotone_path=line.substr(space+1,sha1-space-1); - std::string path=monotone_path; - std::string cvssha1sum=line.substr(sha1+1); +// while (p!=pieces.end() && (**p)!="#files\n") ++p; +// if (p!=pieces.end()) ++p; // skip the #files line + for (mtn_automate::manifest_map::const_iterator i=manifest.begin(); + i!=manifest.end();++i) + { + // populate the file info + split_path sp; + i->first.split(sp); +// std::string monotone_path=line.substr(space+1,sha1-space-1); +// std::string path=monotone_path; + std::string cvssha1sum=sync_info[std::make_pair(sp,domain+":sha1")]; + @@ // look for the optional initial slash separating the keyword mode std::string::size_type slash=line.find('/'); if (slash==std::string::npos || slash>space) ============================================================ --- mtn_cvs/mtn_automate.cc 5fd366d683a9410f48eb9479fdd6cf193f38f7b1 +++ mtn_cvs/mtn_automate.cc 99b86dc6eb6d43103e1ba7f710113629f057e522 @@ -29,11 +29,31 @@ revision_id mtn_automate::find_newest_sy return revision_id(result); } -std::string mtn_automate::get_sync_info(revision_id const& rid, std::string const& domain) +mtn_automate::sync_map_t mtn_automate::get_sync_info(revision_id const& rid, std::string const& domain) { std::vector args; args.push_back(rid.inner()()); args.push_back(domain); - return automate("get_sync_info",args); + std::string aresult=automate("get_sync_info",args); + + basic_io::input_source source(aresult,"automate get_sync_info result"); + basic_io::tokenizer tokenizer(source); + basic_io::parser parser(tokenizer); + + std::string t1; + split_path p1; + sync_map_t result; + while (parser.symp(syms::set)) + { + parser.sym(); + parse_path(parser, p1); + parser.esym(syms::attr); + parser.str(t1); + pair new_pair(p1, t1); + parser.esym(syms::value); + parser.str(t2); + safe_insert(result, make_pair(new_pair, attr_value(t2))); + } + return result; } file_id mtn_automate::put_file(data const& d, file_id const& base) @@ -430,10 +450,19 @@ dump(file_path const& fp, string & out) { out=fp.as_internal(); } -void mtn_automate::put_sync_info(revision_id const& rid, std::string const& domain, std::string const& data) +void mtn_automate::put_sync_info(revision_id const& rid, std::string const& domain, sync_map_t const& data) { std::vector args; args.push_back(rid.inner()()); args.push_back(domain); - args.push_back(data); + basic_io::printer printer; + for (sync_map_t::const_iterator i = data.begin(); i != data.end(); ++i) + { + basic_io::stanza st; + st.push_file_pair(syms::set, file_path(i->first.first)); + st.push_str_pair(syms::attr, i->first.second()); + st.push_str_pair(syms::value, i->second()); + printer.print_stanza(st); + } + args.push_back(printer.buf); automate("put_sync_info",args); } ============================================================ --- mtn_cvs/mtn_automate.hh ad3b01228692142ff7500a849144ffc4332c3eb5 +++ mtn_cvs/mtn_automate.hh 4b8f8ca7d730e343dc365866d3a7e19188b79bf6 @@ -49,8 +49,11 @@ struct mtn_automate : mtn_pipe void check_interface_revision(std::string const&minimum); revision_id find_newest_sync(std::string const& domain, std::string const& branch=""); - std::string get_sync_info(revision_id const& rid, std::string const& domain); - void put_sync_info(revision_id const& rid, std::string const& domain, std::string const& data); + + typedef std::map, attr_value> sync_map_t; + sync_map_t get_sync_info(revision_id const& rid, std::string const& domain); + void put_sync_info(revision_id const& rid, std::string const& domain, sync_map_t const& data); + file_id put_file(data const& d, file_id const& base=file_id()); manifest_map get_manifest_of(revision_id const& rid); revision_id put_revision(revision_id const& parent, cset const& changes);