# # # patch "rcs_import.cc" # from [e5c32b2eda3675f883d7b322528311d9fdb2a1ca] # to [90a034a15d353b6a93720e0e75607b87993e4301] # ============================================================ --- rcs_import.cc e5c32b2eda3675f883d7b322528311d9fdb2a1ca +++ rcs_import.cc 90a034a15d353b6a93720e0e75607b87993e4301 @@ -347,7 +347,7 @@ cvs_branch return range.first; } - void append_event(cvs_event_ptr c) + cvs_blob_index append_event(cvs_event_ptr c) { if (c->get_digest().is_commit()) { @@ -357,6 +357,7 @@ cvs_branch blob_index_iterator b = get_blob(c->get_digest(), true); blobs[b->second].push_back(c); + return b->second; } }; @@ -385,6 +386,9 @@ cvs_history map > branches; shared_ptr trunk; + // store a list of possible parents for every symbol + map< cvs_event_digest, set< shared_ptr< cvs_branch > > > symbol_parents; + // stack of branches we're injecting states into stack< shared_ptr > stk; stack< cvs_branchname > bstk; @@ -403,6 +407,7 @@ cvs_history void index_branchpoint_symbols(rcs_file const & r); + void add_symbol_parent(const cvs_event_digest d); void push_branch(string const & branch_name, bool private_branch); void pop_branch(); }; @@ -753,8 +758,10 @@ process_branch(string const & begin_vers boost::static_pointer_cast( shared_ptr( new cvs_event_tag(curr_commit, tag))); - cvs.stk.top()->append_event(event); + cvs_blob_index bi = cvs.stk.top()->append_event(event); + cvs.add_symbol_parent(event->get_digest()); + // append to the last_commit deps if (last_commit != NULL) last_commit->dependencies.push_back(event); @@ -823,7 +830,9 @@ process_branch(string const & begin_vers cvs.stk.top()->get_blob(curr_commit->get_digest(), false); // then append it to the parent branch - cvs.stk.top()->append_event(branch_event); + cvs_blob_index bi = cvs.stk.top()->append_event(branch_event); + cvs.add_symbol_parent(branch_event->get_digest()); + L(FL("added branch event for file %s from branch %s into branch %s") % cvs.path_interner.lookup(curr_commit->path) % cvs.bstk.top() @@ -1018,8 +1027,25 @@ void cvs_history::index_branchpoint_symb } } +void +cvs_history::add_symbol_parent(const cvs_event_digest d) +{ + if (symbol_parents.find(d) == symbol_parents.end()) + symbol_parents.insert(make_pair(d, set< shared_ptr < cvs_branch > > ())); + map< cvs_event_digest, + set< shared_ptr< cvs_branch > > >::iterator parent_list_iter = + symbol_parents.find(d); + I(parent_list_iter != symbol_parents.end()); + + set< shared_ptr< cvs_branch > > & parent_list = parent_list_iter->second; + + if (parent_list.find(stk.top()) == parent_list.end()) + parent_list.insert(stk.top()); +} + + void cvs_history::push_branch(string const & branch_name, bool private_branch) { @@ -1472,6 +1498,68 @@ import_cvs_repo(system_path const & cvsr guard.commit(); } + // make sure all symbol blobs are only present in one branch + map< cvs_event_digest, set< shared_ptr< cvs_branch > > >::const_iterator i; + for (i = cvs.symbol_parents.begin(); i != cvs.symbol_parents.end(); ++i) + { + I(i->second.size() > 0); + cvs_event_digest d = i->first; + + if (i->second.size() == 1) + { + shared_ptr< cvs_branch > branch = *i->second.begin(); + blob_index_iterator bi = branch->get_blob(d, false); + cvs_blob & blob = branch->blobs[bi->second]; + + shared_ptr< cvs_event > ev = *(blob.get_events().begin()); + + if (d.is_branch()) + { + shared_ptr be = + boost::static_pointer_cast(ev); + + L(FL("Branch %s is a child of branch %s") + % cvs.branchname_interner.lookup(be->branch->branchname) + % cvs.branchname_interner.lookup(branch->branchname)); + } + } + else if (i->second.size() > 1) + { + I(!d.is_commit()); + + for (set< shared_ptr< cvs_branch > >::const_iterator j = + i->second.begin(); j != i->second.end(); ++j) + { + blob_index_iterator bi = (*j)->get_blob(d, false); + cvs_blob & blob = (*j)->blobs[bi->second]; + + shared_ptr< cvs_event > ev = *(blob.get_events().begin()); + + if (d.is_branch()) + { + shared_ptr be = + boost::static_pointer_cast(ev); + + L(FL("XXXXX: Symbol (branch %s) is in branch %s") + % cvs.branchname_interner.lookup(be->branch->branchname) + % cvs.branchname_interner.lookup((*j)->branchname)); + } + else if (d.is_tag()) + { + shared_ptr te = + boost::static_pointer_cast(ev); + + L(FL("XXXXX: symbol tag %s is in branch %s") + % cvs.tag_interner.lookup(te->tag) + % cvs.branchname_interner.lookup((*j)->branchname)); + } + else + I(false); + } + } + } + I(cvs.stk.size() == 1); ticker n_revs(_("revisions"), "r", 1);