# # # patch "cmd_othervcs.cc" # from [2fa02fafeafe1d70b357572a4cd77ce9f8aef7a0] # to [001f139a078dd171823a09b81f22d65d8ef6159b] # # patch "options_list.hh" # from [dfe718d29ed66e5bf4ead45b2c962d8791bb3dd5] # to [47897e10b9dfc727dacb6bc2562e61884c3c7dee] # ============================================================ --- cmd_othervcs.cc 2fa02fafeafe1d70b357572a4cd77ce9f8aef7a0 +++ cmd_othervcs.cc 001f139a078dd171823a09b81f22d65d8ef6159b @@ -20,6 +20,7 @@ #include "revision.hh" #include "roster.hh" #include "simplestring_xform.hh" +#include "transforms.hh" #include "keys.hh" #include "key_store.hh" #include "ui.hh" @@ -29,6 +30,7 @@ using std::map; using std::cout; using std::map; +using std::istringstream; using std::ostringstream; using std::set; using std::string; @@ -247,6 +249,7 @@ CMD(git_export, "git_export", "", CMD_RE N_(""), options::opts::authors_file | options::opts::branches_file | options::opts::log_revids | options::opts::log_certs | + options::opts::import_marks | options::opts::export_marks | options::opts::refs) { database db(app); @@ -269,9 +272,50 @@ CMD(git_export, "git_export", "", CMD_RE read_mappings(app.opts.branches_file, branch_map); } + map marked_revs; + map marked_files; + + size_t mark_id = 1; + + if (!app.opts.import_marks.empty()) + { + P(F("importing revision marks from '%s'") % app.opts.import_marks); + data mark_data; + read_data(app.opts.import_marks, mark_data); + istringstream marks(mark_data()); + while (!marks.eof()) + { + char c; + size_t mark; + string tmp; + + marks.get(c); + N(c == ':', F("missing leading ':' in marks file")); + marks >> mark; + + marks.get(c); + N(c == ' ', F("missing space after mark")); + marks >> tmp; + N(tmp.size() == 40, F("bad revision id in marks file")); + revision_id revid(decode_hexenc(tmp)); + + marks.get(c); + N(c == '\n', F("incomplete line in marks file")); + + marked_revs[revid] = mark; + if (mark_id <= mark) mark_id = mark+1; + marks.peek(); + } + } + set revision_set; db.get_revision_ids(revision_set); + // remove marked revs from the set to be exported + for (map::const_iterator + i = marked_revs.begin(); i != marked_revs.end(); ++i) + revision_set.erase(i->first); + vector revisions; toposort(db, revision_set, revisions); @@ -281,11 +325,6 @@ CMD(git_export, "git_export", "", CMD_RE size_t revnum = 0; size_t revmax = revisions.size(); - map marked_revs; - map marked_files; - - size_t mark_id = 1; - for (vector::const_iterator r = revisions.begin(); r != revisions.end(); ++r) { @@ -552,6 +591,19 @@ CMD(git_export, "git_export", "", CMD_RE cout << "reset refs/mtn/leaves/" << *i << "\n" << "from :" << marked_revs[*i] << "\n"; } + + if (!app.opts.export_marks.empty()) + { + P(F("exporting revision marks to '%s'") % app.opts.export_marks); + ostringstream marks; + for (map::const_iterator + i = marked_revs.begin(); i != marked_revs.end(); ++i) + marks << ":" << i->second << " " << i->first << "\n"; + + data mark_data(marks.str()); + system_path tmp("."); // use the current directory for tmp + write_data(app.opts.export_marks, mark_data, tmp); + } } // Local Variables: ============================================================ --- options_list.hh dfe718d29ed66e5bf4ead45b2c962d8791bb3dd5 +++ options_list.hh 47897e10b9dfc727dacb6bc2562e61884c3c7dee @@ -756,6 +756,22 @@ OPT(log_certs, "log-certs", bool, false, } #endif +OPT(import_marks, "import-marks", system_path, , + gettext_noop("load the internal marks table before exporting revisions")) +#ifdef option_bodies +{ + import_marks = system_path(arg); +} +#endif + +OPT(export_marks, "export-marks", system_path, , + gettext_noop("save the internal marks table after exporting revisions")) +#ifdef option_bodies +{ + export_marks = system_path(arg); +} +#endif + // Local Variables: // mode: C++ // fill-column: 76