# # # patch "cmd_merging.cc" # from [602d5834212b47cdb5cc9151fe8eaa77d325f571] # to [3f665ae0b10a9800925df54af0eb393c956d43a0] # # patch "tests/merge_into_workspace_attr_corpse/__driver__.lua" # from [b2e5f8748e7a645d97fc17ec4a071be0b1bf7df2] # to [7f01da1af5eedec9debf4f2d8f1dd7ec14561dcf] # ============================================================ --- cmd_merging.cc 602d5834212b47cdb5cc9151fe8eaa77d325f571 +++ cmd_merging.cc 3f665ae0b10a9800925df54af0eb393c956d43a0 @@ -1462,6 +1462,80 @@ CMD(heads, "heads", "", CMD_REF(tree), " cout << describe_revision(app.opts, app.lua, project, *i) << '\n'; } +CMD(get_roster, "get_roster", "", CMD_REF(debug), N_("[REVID]"), + N_("Dumps the roster associated with a given identifier"), + N_("If no REVID is given, the workspace is used."), + options::opts::none) +{ + database db(app); + roster_t roster; + marking_map mm; + + if (args.empty()) + { + parent_map parents; + temp_node_id_source nis; + revision_id rid(fake_id()); + + workspace work(app); + work.get_parent_rosters(db, parents); + work.get_current_roster_shape(db, nis, roster); + work.update_current_roster_from_filesystem(roster); + + if (parents.empty()) + { + mark_roster_with_no_parents(rid, roster, mm); + } + else if (parents.size() == 1) + { + roster_t parent = parent_roster(parents.begin()); + marking_map parent_mm = parent_marking(parents.begin()); + mark_roster_with_one_parent(parent, parent_mm, rid, roster, mm); + } + else + { + parent_map::const_iterator i = parents.begin(); + revision_id left_id = parent_id(i); + roster_t const & left_roster = parent_roster(i); + marking_map const & left_markings = parent_marking(i); + + i++; + revision_id right_id = parent_id(i); + roster_t const & right_roster = parent_roster(i); + marking_map const & right_markings = parent_marking(i); + + i++; I(i == parents.end()); + + set left_uncommon_ancestors, right_uncommon_ancestors; + db.get_uncommon_ancestors(left_id, right_id, + left_uncommon_ancestors, + right_uncommon_ancestors); + + mark_merge_roster(left_roster, left_markings, + left_uncommon_ancestors, + right_roster, right_markings, + right_uncommon_ancestors, + rid, roster, mm); + } + } + else if (args.size() == 1) + { + database db(app); + project_t project(db); + revision_id rid; + complete(app.opts, app.lua, project, idx(args, 0)(), rid); + I(!null_id(rid)); + db.get_roster(rid, roster, mm); + } + else + throw usage(execid); + + roster_data dat; + write_roster_and_marking(roster, mm, dat); + cout << dat; +} + + // Local Variables: // mode: C++ // fill-column: 76 ============================================================ --- tests/merge_into_workspace_attr_corpse/__driver__.lua b2e5f8748e7a645d97fc17ec4a071be0b1bf7df2 +++ tests/merge_into_workspace_attr_corpse/__driver__.lua 7f01da1af5eedec9debf4f2d8f1dd7ec14561dcf @@ -42,7 +42,7 @@ check(get("expected-roster")) -- in-database merge would generate; in particular, both "left-attr" -- and "right-attr" should show up as "dormant_attr"s. check(get("expected-roster")) -check(mtn("au", "get_roster"), 0, true, nil) +check(mtn("get_roster"), 0, true, nil) canonicalize("stdout") check(samefile("expected-roster", "stdout"))