# # # patch "ancestry.cc" # from [e13c59e3ab4f4aae398a06e0eeffe2c39d7c0e81] # to [3c777fd295ee1ff41231877691411041819fe875] # # patch "cmd_diff_log.cc" # from [aac2aabe76bf2ba7b53a07325861479f56f8ff9d] # to [62ae1deaa76976e239288c9a72819e26b9c86c3e] # # patch "cmd_ws_commit.cc" # from [522d9a9e138d06c46a4a462411d1dadd53874d21] # to [b9f4f47dc0fb69f7cd4a12df1d6ad998519988bb] # # patch "revision.hh" # from [75bac531320de250cc7d0660762c3b01e04147dd] # to [740c4dd4ee350fcf06af3ba707cef3dadecb46f8] # ============================================================ --- ancestry.cc e13c59e3ab4f4aae398a06e0eeffe2c39d7c0e81 +++ ancestry.cc 3c777fd295ee1ff41231877691411041819fe875 @@ -563,9 +563,69 @@ make_roster_for_revision(database & db, make_roster_for_revision(db, nis, rev, new_rid, new_roster, new_markings); } +// ancestry graph loader +void +graph_loader::load_parents(revision_id const rid, + set & parents) +{ + db.get_revision_parents(rid, parents); +} +void +graph_loader::load_children(revision_id const rid, + set & children) +{ + db.get_revision_children(rid, children); +} +void +graph_loader::load_ancestors(set & revs) +{ + load_revs(ancestors, revs); +} + +void +graph_loader::load_descendants(set & revs) +{ + load_revs(descendants, revs); +} + +void +graph_loader::load_revs(load_direction const direction, + set & revs) +{ + std::deque next(revs.begin(), revs.end()); + + while (!next.empty()) + { + revision_id const & rid(next.front()); + MM(rid); + + set relatives; + MM(relatives); + + if (direction == ancestors) + load_parents(rid, relatives); + else if (direction == descendants) + load_children(rid, relatives); + else + I(false); + + for (set::const_iterator i = relatives.begin(); + i != relatives.end(); ++i) + { + if (null_id(*i)) + continue; + pair::iterator, bool> res = revs.insert(*i); + if (res.second) + next.push_back(*i); + } + + next.pop_front(); + } +} + // Local Variables: // mode: C++ // fill-column: 76 ============================================================ --- cmd_diff_log.cc aac2aabe76bf2ba7b53a07325861479f56f8ff9d +++ cmd_diff_log.cc 62ae1deaa76976e239288c9a72819e26b9c86c3e @@ -9,7 +9,6 @@ // PURPOSE. #include "base.hh" -#include #include #include #include @@ -32,7 +31,6 @@ using std::cout; #include "roster.hh" using std::cout; -using std::deque; using std::make_pair; using std::map; using std::ostream; @@ -726,57 +724,6 @@ struct rev_cmp } }; -struct revision_loader -{ - database & db; - log_direction direction; - - revision_loader(database & db, log_direction const direction) : - db(db), direction(direction) {} - - void - load_related_revs(revision_id const & rid, set & relatives) - { - switch (direction) - { - case log_forward: // optional with --next N - db.get_revision_children(rid, relatives); - break; - case log_reverse: // default and with --last N - db.get_revision_parents(rid, relatives); - break; - } - } - - void - load_implied_revs(set & revs) - { - std::deque next(revs.begin(), revs.end()); - - while (!next.empty()) - { - revision_id const & rid(next.front()); - MM(rid); - - set relatives; - MM(relatives); - load_related_revs(rid, relatives); - - for (set::const_iterator i = relatives.begin(); - i != relatives.end(); ++i) - { - if (null_id(*i)) - continue; - pair::iterator, bool> res = revs.insert(*i); - if (res.second) - next.push_back(*i); - } - - next.pop_front(); - } - } -}; - typedef priority_queue, vector >, rev_cmp> frontier_t; @@ -816,7 +763,7 @@ CMD(log, "log", "", CMD_REF(informative) if (next >= 0) direction = log_forward; - revision_loader loader(db, direction); + graph_loader loader(db); rev_cmp cmp(direction); frontier_t frontier(cmp); @@ -872,7 +819,16 @@ CMD(log, "log", "", CMD_REF(informative) ending_revs.insert(rids.begin(), rids.end()); } - loader.load_implied_revs(ending_revs); + if (direction == log_forward) + { + loader.load_descendants(ending_revs); + } + else if (direction == log_reverse) + { + loader.load_ancestors(ending_revs); + } + else + I(false); } L(FL("%d ending revisions") % ending_revs.size()); @@ -1059,10 +1015,16 @@ CMD(log, "log", "", CMD_REF(informative) { interesting.insert(marked_revs.begin(), marked_revs.end()); } - else + else if (direction == log_forward) { - loader.load_related_revs(rid, interesting); + loader.load_children(rid, interesting); } + else if (direction == log_reverse) + { + loader.load_parents(rid, interesting); + } + else + I(false); if (print_this) { ============================================================ --- cmd_ws_commit.cc 522d9a9e138d06c46a4a462411d1dadd53874d21 +++ cmd_ws_commit.cc b9f4f47dc0fb69f7cd4a12df1d6ad998519988bb @@ -1540,70 +1540,12 @@ CMD(reset, "reset", "", CMD_REF(bisect), work.remove_bisect_info(); } -// FIXME: this is copied from cmd_diff_log.cc -class revision_loader -{ - private: - database & db; - enum load_direction { ancestors, descendants }; - - void - load_revs(load_direction const direction, set & revs) - { - std::deque next(revs.begin(), revs.end()); - - while (!next.empty()) - { - revision_id const & rid(next.front()); - MM(rid); - - set relatives; - MM(relatives); - - if (direction == ancestors) - db.get_revision_parents(rid, relatives); - else if (direction == descendants) - db.get_revision_children(rid, relatives); - else - I(false); - - for (set::const_iterator i = relatives.begin(); - i != relatives.end(); ++i) - { - if (null_id(*i)) - continue; - pair::iterator, bool> res = revs.insert(*i); - if (res.second) - next.push_back(*i); - } - - next.pop_front(); - } - } - - public: - revision_loader(database & db) : db(db) {} - - void - load_ancestors(set & revs) - { - load_revs(ancestors, revs); - } - - void - load_descendants(set & revs) - { - load_revs(descendants, revs); - } - -}; - static bool bisect_setup(database & db, vector const & info, set & remaining) { - revision_loader loader(db); + graph_loader loader(db); set good, bad, skipped; E(!info.empty(), origin::user, ============================================================ --- revision.hh 75bac531320de250cc7d0660762c3b01e04147dd +++ revision.hh 740c4dd4ee350fcf06af3ba707cef3dadecb46f8 @@ -66,6 +66,24 @@ revision_t : public origin_aware enum made_for made_for; }; +class graph_loader +{ + public: + graph_loader(database & db) : db(db) {} + + void load_parents(revision_id const rid, std::set & parents); + void load_children(revision_id const rid, std::set & children); + void load_ancestors(std::set & revs); + void load_descendants(std::set & revs); + + private: + database & db; + enum load_direction { ancestors, descendants }; + + void load_revs(load_direction const direction, + std::set & revs); +}; + inline revision_id const & edge_old_revision(edge_entry const & e) {