# # # patch "automate.cc" # from [c6e067dec1263e430f22e39fc63e30932d1c02d1] # to [b23eced8b6c237fd768369cf7d32ba6119f19fe4] # # patch "database.cc" # from [7d05335695a344d562e1c81daed3f0bf525259d8] # to [9e10e5d55233691379b3c4855ff77de8aced5ada] # # patch "database.hh" # from [cdb13d34c338f3d6fb2e48840fd9c3a5b698cbcb] # to [dd6db1d50f94c66c8b9a4090bd93c92d8885dcc3] # ============================================================ --- automate.cc c6e067dec1263e430f22e39fc63e30932d1c02d1 +++ automate.cc b23eced8b6c237fd768369cf7d32ba6119f19fe4 @@ -1555,50 +1555,19 @@ CMD_AUTOMATE(common_ancestors, N_("REV1 database db(app); - set ancestors, common_ancestors; - vector frontier; + set revs, common_ancestors; for (args_vector::const_iterator i = args.begin(); i != args.end(); ++i) { revision_id rid(decode_hexenc((*i)())); - N(db.revision_exists(rid), F("no such revision '%s'") % rid); - ancestors.clear(); - ancestors.insert(rid); - frontier.push_back(rid); - while (!frontier.empty()) - { - revision_id rid = frontier.back(); - frontier.pop_back(); - if(!null_id(rid)) - { - set parents; - db.get_revision_parents(rid, parents); - for (set::const_iterator i = parents.begin(); - i != parents.end(); ++i) - { - if (ancestors.find(*i) == ancestors.end()) - { - frontier.push_back(*i); - ancestors.insert(*i); - } - } - } - } - if (common_ancestors.empty()) - common_ancestors = ancestors; - else - { - set common; - set_intersection(ancestors.begin(), ancestors.end(), - common_ancestors.begin(), common_ancestors.end(), - inserter(common, common.begin())); - common_ancestors = common; - } + N(db.revision_exists(rid), F("No such revision %s") % rid); + revs.insert(rid); } + db.get_common_ancestors(revs, common_ancestors); + for (set::const_iterator i = common_ancestors.begin(); i != common_ancestors.end(); ++i) - if (!null_id(*i)) - output << *i << '\n'; + output << *i << "\n"; } // Name: branches ============================================================ --- database.cc 7d05335695a344d562e1c81daed3f0bf525259d8 +++ database.cc 9e10e5d55233691379b3c4855ff77de8aced5ada @@ -2157,6 +2157,59 @@ void } void +database::get_common_ancestors(std::set const & revs, + std::set & common_ancestors) +{ + set ancestors, all_common_ancestors; + vector frontier; + for (set::const_iterator i = revs.begin(); + i != revs.end(); ++i) + { + I(revision_exists(*i)); + ancestors.clear(); + ancestors.insert(*i); + frontier.push_back(*i); + while (!frontier.empty()) + { + revision_id rid = frontier.back(); + frontier.pop_back(); + if(!null_id(rid)) + { + set parents; + get_revision_parents(rid, parents); + for (set::const_iterator i = parents.begin(); + i != parents.end(); ++i) + { + if (ancestors.find(*i) == ancestors.end()) + { + frontier.push_back(*i); + ancestors.insert(*i); + } + } + } + } + if (all_common_ancestors.empty()) + all_common_ancestors = ancestors; + else + { + set common; + set_intersection(ancestors.begin(), ancestors.end(), + all_common_ancestors.begin(), all_common_ancestors.end(), + inserter(common, common.begin())); + all_common_ancestors = common; + } + } + + for (set::const_iterator i = all_common_ancestors.begin(); + i != all_common_ancestors.end(); ++i) + { + // FIXME: where do these null'ed IDs come from? + if (null_id(*i)) continue; + common_ancestors.insert(*i); + } +} + +void database::get_revision(revision_id const & id, revision_t & rev) { ============================================================ --- database.hh cdb13d34c338f3d6fb2e48840fd9c3a5b698cbcb +++ database.hh dd6db1d50f94c66c8b9a4090bd93c92d8885dcc3 @@ -156,6 +156,10 @@ public: void get_revision_manifest(revision_id const & cid, manifest_id & mid); + + void get_common_ancestors(std::set const & revs, + std::set & common_ancestors); + void get_revision_ids(std::set & ids); // this is exposed for 'db check': void get_file_ids(std::set & ids);