# # # patch "automate.cc" # from [81d3a689874146b106940e9e6f359e7bb39fe5bf] # to [844ab2fa3341091460558c6a98f60ac36e5007ec] # # patch "monotone.texi" # from [0327224dae7ef01451b0786e57036915e9b20638] # to [90203c5058234c5d3041dc1e728897c7701e5b4e] # # patch "tests/automate_put_revision/__driver__.lua" # from [85248d54b8e1f0bebca9a49913ff1aa9d8e597ab] # to [6c3b35db93bbc96d3eac5263b900da1bf35187cb] # ============================================================ --- automate.cc 81d3a689874146b106940e9e6f359e7bb39fe5bf +++ automate.cc 844ab2fa3341091460558c6a98f60ac36e5007ec @@ -1648,7 +1648,7 @@ AUTOMATE(put_file, N_("[BASE-ID] CONTENT // Name: put_revision // Arguments: -// single edge specification (part of a full revision) +// revision-data // Added in: 4.1 // Purpose: // Store a revision into the database. @@ -1660,33 +1660,31 @@ AUTOMATE(put_revision, N_("SINGLE-EDGE-D { if (args.size() != 1) throw usage(name); - revision_t rev; - basic_io::input_source source(idx(args,0)(),"automate put_revision's 1st argument"); - basic_io::tokenizer tokenizer(source); - basic_io::parser parser(tokenizer); + revision_t rev; + read_revision(revision_data(idx(args,0)()),rev); + // recalculate manifest temp_node_id_source nis; - // I chose a single edge variant since this was much more simple to code - // and sufficient to my needs. - // make this a loop if you need to create merge revisions - { boost::shared_ptr cs(new cset()); - MM(*cs); - // like revision::parse_edge - parser.esym(symbol("old_revision")); - string tmp; - parser.hex(tmp); - revision_id old_rev=revision_id(tmp); - parse_cset(parser, *cs); - + rev.new_manifest=manifest_id(); + for (edge_map::const_iterator e=rev.edges.begin(); e!=rev.edges.end(); ++e) + { // calculate new manifest roster_t old_roster; - if (!null_id(old_rev)) app.db.get_roster(old_rev, old_roster); + if (!null_id(e->first)) app.db.get_roster(e->first, old_roster); roster_t new_roster=old_roster; editable_roster_base eros(new_roster,nis); - cs->apply_to(eros); - calculate_ident(new_roster, rev.new_manifest); - safe_insert(rev.edges, std::make_pair(old_rev, cs)); + e->second->apply_to(eros); + if (null_id(rev.new_manifest)) + // first edge, initialize manifest + calculate_ident(new_roster, rev.new_manifest); + else + // following edge, make sure that all csets end at the same manifest + { + manifest_id calculated; + calculate_ident(new_roster, calculated); + I(calculated==rev.new_manifest); + } } revision_id id; ============================================================ --- monotone.texi 0327224dae7ef01451b0786e57036915e9b20638 +++ monotone.texi 90203c5058234c5d3041dc1e728897c7701e5b4e @@ -7413,12 +7413,12 @@ @section Automation @end table address@hidden mtn automate put_revision @var{change-set-data} address@hidden mtn automate put_revision @var{revision-data} @table @strong @item Arguments: address@hidden is one changeset part of a revision. See example address@hidden is the new revision. See example below. @item Added in: @@ -7433,6 +7433,10 @@ @section Automation @smallexample @group +format_version "1" + +new_manifest [0000000000000000000000000000000000000004] + old_revision [] add_dir "" ============================================================ --- tests/automate_put_revision/__driver__.lua 85248d54b8e1f0bebca9a49913ff1aa9d8e597ab +++ tests/automate_put_revision/__driver__.lua 6c3b35db93bbc96d3eac5263b900da1bf35187cb @@ -1,6 +1,6 @@ mtn_setup() mtn_setup() -edge = "old_revision []\n\nadd_dir \"\"\n\nadd_file \"foo\"\n content [5bf1fd927dfb8679496a2e6cf00cbe50c1c87145]\n" +edge = "format_version \"1\"\n\nnew_manifest [0000000000000000000000000000000000000004]\n\nold_revision []\n\nadd_dir \"\"\n\nadd_file \"foo\"\n content [5bf1fd927dfb8679496a2e6cf00cbe50c1c87145]\n" check(mtn("automate", "put_file", "blah"), 0, true, false) canonicalize("stdout")