# # # patch "automate.cc" # from [b857485541867650081368e781728c471b71863c] # to [8fa450b0e98f21120ab9d205c99e6f34247b7f88] # # patch "cmd_ws_commit.cc" # from [e030ccdaabb64d79f7d420f55d326163cee9e08c] # to [df6621e7ffc64c6b9d71834703108cf31f5f4dab] # ============================================================ --- automate.cc b857485541867650081368e781728c471b71863c +++ automate.cc 8fa450b0e98f21120ab9d205c99e6f34247b7f88 @@ -1544,6 +1544,58 @@ } +static void +automate_common_ancestors(std::vector args, std::string const & help_name, + app_state & app, std::ostream & output) +{ + if (args.size() == 0) + throw usage(help_name); + + std::set ancestors, common_ancestors; + std::vector frontier; + for (std::vector::const_iterator i = args.begin(); i != args.end(); ++i) + { + revision_id rid((*i)()); + N(app.db.revision_exists(rid), F("No such revision %s") % rid); + ancestors.clear(); + frontier.push_back(rid); + while (!frontier.empty()) + { + revision_id rid = frontier.back(); + frontier.pop_back(); + if(!null_id(rid)) + { + std::set parents; + app.db.get_revision_parents(rid, parents); + for (std::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 + { + std::set common; + std::set_intersection(ancestors.begin(), ancestors.end(), + common_ancestors.begin(), common_ancestors.end(), + std::inserter(common, common.begin())); + common_ancestors = common; + } + } + + for (std::set::const_iterator i = common_ancestors.begin(); + i != common_ancestors.end(); ++i) + if (!null_id(*i)) + output << (*i).inner()() << std::endl; +} + void automate_command(utf8 cmd, std::vector args, std::string const & root_cmd_name, @@ -1598,6 +1650,8 @@ automate_packet_for_fdata(args, root_cmd_name, app, output); else if (cmd() == "packet_for_fdelta") automate_packet_for_fdelta(args, root_cmd_name, app, output); + else if (cmd() == "common_ancestors") + automate_common_ancestors(args, root_cmd_name, app, output); else throw usage(root_cmd_name); } ============================================================ --- cmd_ws_commit.cc e030ccdaabb64d79f7d420f55d326163cee9e08c +++ cmd_ws_commit.cc df6621e7ffc64c6b9d71834703108cf31f5f4dab @@ -465,12 +465,11 @@ if (args.size() < 2 || args.size() > 4) throw usage(name); - revision_set rs; roster_t old_roster, new_roster; app.require_workspace(); temp_node_id_source nis; - get_unrestricted_working_revision_and_rosters(app, rs, old_roster, new_roster, nis); + get_base_and_current_roster_shape(old_roster, new_roster, nis, app); file_path path = file_path_external(idx(args,1)); split_path sp;