# # # patch "legacy.cc" # from [dce9c303bbed541f73e8f8d82e6ac4c018d051bb] # to [f0e7de059d21606fe99593a481adc9ad5a021858] # # patch "legacy.hh" # from [39ea5733f2dda2777ef15178f0ce4b3ab53ffec1] # to [4171983436b8f7b753d542a41c8d79567aaa12fe] # # patch "revision.cc" # from [786afc0e1531ddfd7a4a563a0d8ab06cdea77633] # to [fb281177ee3eea533fb50d414eb16270bc0b96eb] # ============================================================ --- legacy.cc dce9c303bbed541f73e8f8d82e6ac4c018d051bb +++ legacy.cc f0e7de059d21606fe99593a481adc9ad5a021858 @@ -10,6 +10,7 @@ namespace legacy { + // cf. work.cc:read_attr_map in the pre-roster code. void read_dot_mt_attrs(data const & dat, dot_mt_attrs_map & attr) { @@ -41,38 +42,92 @@ { namespace syms { + std::string const new_manifest("new_manifest"); std::string const old_revision("old_revision"); - std::string const new_manifest("new_manifest"); + std::string const old_manifest("old_manifest"); + std::string const patch("patch"); + std::string const from("from"); + std::string const to("to"); + std::string const add_file("add_file"); + std::string const delete_file("delete_file"); + std::string const delete_dir("delete_dir"); + std::string const rename_file("rename_file"); + std::string const rename_dir("rename_dir"); } } - void - get_manifest_for_rev(app_state & app, - revision_id const & ident, - manifest_id & mid) + // cf. revision.cc:parse_edge and change_set.cc:parse_change_set and + // change_set.cc:parse_path_rearrangement in the pre-roster code. + static void + extract_renames(basic_io::parser & parser, renames_map & renames) { - revision_data dat; - app.db.get_revision(ident,dat); - basic_io::input_source src(dat.inner()(), "revision"); - basic_io::tokenizer tok(src); - basic_io::parser pars(tok); - while (pars.symp()) + revision_id old_rev; + std::string tmp; + parser.esym(syms::old_revision); + parser.hex(tmp); + old_rev = revision_id(tmp); + parser.esym(syms::old_manifest); + parser.hex(); + + while (parser.symp()) { - if (pars.symp(syms::new_manifest)) + // things that take a single string argument + if (parser.symp(syms::add_file) + || parser.symp(syms::delete_file) + || parser.symp(syms::delete_dir)) { - std::string tmp; - pars.sym(); - pars.hex(tmp); - mid = manifest_id(tmp); - return; + parser.sym(); + parser.str(); } + else if (parser.symp(syms::rename_file) + || parser.symp(syms::rename_dir)) + { + std::string from_str, to_str; + parser.sym(); + parser.str(from_str); + parser.esym(syms::to); + parser.str(to_str); + split_path from, to; + file_path_internal(from_str).split(from); + file_path_internal(to_str).split(to); + renames[old_rev][to] = from; + } + else if (parser.symp(syms::patch)) + { + parser.sym(); + parser.str(); + parser.esym(syms::from); + parser.hex(); + parser.esym(syms::to); + parser.hex(); + } else - pars.sym(); + break; } - I(false); } + // cf. revision.cc:parse_revision in the pre-roster code. + void + get_manifest_and_renames_for_rev(app_state & app, + revision_id const & ident, + manifest_id & mid, + renames_map & renames) + { + revision_data dat; + app.db.get_revision(ident, dat); + basic_io::input_source src(dat.inner()(), "revision"); + basic_io::tokenizer tok(src); + basic_io::parser pars(tok); + pars.esym(syms::new_manifest); + std::string tmp; + pars.hex(tmp); + mid = manifest_id(tmp); + while (pars.symp(syms::old_revision)) + extract_renames(pars, renames); + } + + // cf. manifest.cc:read_manifest_map in the pre-roster code. void read_manifest_map(manifest_data const & mdat, manifest_map & man) ============================================================ --- legacy.hh 39ea5733f2dda2777ef15178f0ce4b3ab53ffec1 +++ legacy.hh 4171983436b8f7b753d542a41c8d79567aaa12fe @@ -32,10 +32,13 @@ // *partially* read them, however, in order to get the manifest IDs out of // the old revisions (before we delete the revs and rebuild them) + typedef std::map > renames_map; + void get_manifest_for_rev(app_state & app, revision_id const & ident, - manifest_id & mid); + manifest_id & mid, + renames_map & renames); /////// // parsing old-style manifests, for 'rosterify' and 'changesetify' commands ============================================================ --- revision.cc 786afc0e1531ddfd7a4a563a0d8ab06cdea77633 +++ revision.cc fb281177ee3eea533fb50d414eb16270bc0b96eb @@ -818,7 +818,8 @@ ++n_nodes; manifest_id man; - legacy::get_manifest_for_rev(app, rev, man); + legacy::renames_map renames; + legacy::get_manifest_for_rev(app, rev, man, renames); L(F("node %d = revision %s = manifest %s\n") % node % rev % man); old_rev_to_node.insert(std::make_pair(rev, node));