# # # add_dir "tests/automate_cert" # # add_dir "tests/automate_db_set,get" # # add_dir "tests/automate_put_file" # # add_dir "tests/automate_put_revision" # # add_file "tests/automate_cert/__driver__.lua" # content [5dc754cbcd83fffd23652e6ba521d060d7c759aa] # # add_file "tests/automate_cert/expected" # content [52a89ade4df34887ebdff7c974e989916d601056] # # add_file "tests/automate_db_set,get/__driver__.lua" # content [ac85e913e7e24cbaa39d56ba30f27e6c12149eb2] # # add_file "tests/automate_put_file/__driver__.lua" # content [9eaed7959e4597fe22fc6430a865455b6977b90c] # # add_file "tests/automate_put_revision/__driver__.lua" # content [85248d54b8e1f0bebca9a49913ff1aa9d8e597ab] # # patch "ChangeLog" # from [171769ee270942f5e1ba152b15c881d57e43c775] # to [55197c737a6842fb8dab905917079c7f108bcd8f] # # patch "automate.cc" # from [d84bcc2a3343891d6702ac80c8c00672aea6037b] # to [26adf3b2dcdc940a6d897f41bd62f94990526d3c] # # patch "cmd_automate.cc" # from [1f90ee26385b4db17ef2e12524c8ed8a410d59e4] # to [6725ca1a2fe0d9fb8f0f8b27be822e067b99fdb3] # # patch "testsuite.lua" # from [21be0891770807a4e8dce87e9d5869bd11cf259d] # to [d023c8bf33c3ff8cc07a04e53174d6510a8a3833] # ============================================================ --- tests/automate_cert/__driver__.lua 5dc754cbcd83fffd23652e6ba521d060d7c759aa +++ tests/automate_cert/__driver__.lua 5dc754cbcd83fffd23652e6ba521d060d7c759aa @@ -0,0 +1,19 @@ +mtn_setup() +revs = {} + +get("expected") + +writefile("empty", "") + +addfile("foo", "blah") +check(mtn("commit", "--date=2005-05-21T12:30:51", "--branch=testbranch", + "--message=blah-blah"), 0, false, false) +base = base_revision() + +check(mtn("automate", "cert", base, "testcert", "testvalue"), 0, true, false) +check(samefile("empty", "stdout")) + +-- check that a correct usage produces correctly formatted output +check(mtn("automate", "certs", base), 0, true, false) +canonicalize("stdout") +check(samefile("expected", "stdout")) ============================================================ --- tests/automate_cert/expected 52a89ade4df34887ebdff7c974e989916d601056 +++ tests/automate_cert/expected 52a89ade4df34887ebdff7c974e989916d601056 @@ -0,0 +1,30 @@ + key "address@hidden" +signature "ok" + name "author" + value "address@hidden" + trust "trusted" + + key "address@hidden" +signature "ok" + name "branch" + value "testbranch" + trust "trusted" + + key "address@hidden" +signature "ok" + name "changelog" + value "blah-blah +" + trust "trusted" + + key "address@hidden" +signature "ok" + name "date" + value "2005-05-21T12:30:51" + trust "trusted" + + key "address@hidden" +signature "ok" + name "testcert" + value "testvalue" + trust "trusted" ============================================================ --- tests/automate_db_set,get/__driver__.lua ac85e913e7e24cbaa39d56ba30f27e6c12149eb2 +++ tests/automate_db_set,get/__driver__.lua ac85e913e7e24cbaa39d56ba30f27e6c12149eb2 @@ -0,0 +1,13 @@ +mtn_setup() + +writefile("empty", "") +writefile("expected", "testvalue") + +check(mtn("automate", "db_set", "testdomain", "testname", "testvalue"), 0, true, false) +check(samefile("empty", "stdout")) + +check(mtn("automate", "db_get", "testdomain", "testname"), 0, true, false) +check(samefile("expected", "stdout")) + +-- ensure that missing names fail +check(mtn("automate", "db_get", "testdomain", "testname2"), 3, true, false) ============================================================ --- tests/automate_put_file/__driver__.lua 9eaed7959e4597fe22fc6430a865455b6977b90c +++ tests/automate_put_file/__driver__.lua 9eaed7959e4597fe22fc6430a865455b6977b90c @@ -0,0 +1,29 @@ +mtn_setup() + +contents = "blah\n" +contents2 = "blah\nblub\n" + +writefile("expected", contents) +writefile("expected2", contents2) + +check(mtn("automate", "put_file", contents), 0, true, false) +canonicalize("stdout") +file = "4cbd040533a2f43fc6691d773d510cda70f4126a" +result = readfile("stdout") +check(result == file) + +-- check that the file is there +check(mtn("automate", "get_file", file), 0, true, false) +canonicalize("stdout") +check(samefile("expected", "stdout")) + +check(mtn("automate", "put_file", file, contents2), 0, true, false) +canonicalize("stdout") +file2 = "ea2e27149f06a6519aa46084da815265c10b0a2a" +result = readfile("stdout") +check(result == file2) + +-- check that the file is there +check(mtn("automate", "get_file", file2), 0, true, false) +canonicalize("stdout") +check(samefile("expected2", "stdout")) ============================================================ --- tests/automate_put_revision/__driver__.lua 85248d54b8e1f0bebca9a49913ff1aa9d8e597ab +++ tests/automate_put_revision/__driver__.lua 85248d54b8e1f0bebca9a49913ff1aa9d8e597ab @@ -0,0 +1,24 @@ +mtn_setup() + +edge = "old_revision []\n\nadd_dir \"\"\n\nadd_file \"foo\"\n content [5bf1fd927dfb8679496a2e6cf00cbe50c1c87145]\n" + +check(mtn("automate", "put_file", "blah"), 0, true, false) +canonicalize("stdout") +file = "5bf1fd927dfb8679496a2e6cf00cbe50c1c87145" +result = readfile("stdout") +check(result == file) + +check(mtn("automate", "put_revision", edge), 0, true, false) +canonicalize("stdout") +rev = "4c2c1d846fa561601254200918fba1fd71e6795d" +result = readfile("stdout") +check(result == rev) + +check(mtn("automate", "cert", rev, "author", "address@hidden"), 0, true, false) +check(mtn("automate", "cert", rev, "branch", "testbranch"), 0, true, false) +check(mtn("automate", "cert", rev, "changelog", "blah-blah"), 0, true, false) +check(mtn("automate", "cert", rev, "date", "2005-05-21T12:30:51"), 0, true, false) + +check(mtn("automate", "heads", "testbranch"), 0, true, false) +canonicalize("stdout") +check(rev.."\n" == readfile("stdout")) ============================================================ --- ChangeLog 171769ee270942f5e1ba152b15c881d57e43c775 +++ ChangeLog 55197c737a6842fb8dab905917079c7f108bcd8f @@ -1,5 +1,22 @@ 2006-12-18 Christof Petig + * automate.cc: add new automate commands: + put_file: add a file to the database + put_revision: add a revision (after adding files) + cert: create certificate + db_set: set a database variable + db_get: query a database variable + + * cmd_automate.cc: raise interface version + + * tests/automate_cert/*, + tests/automate_db_set,get/__driver__.lua, + tests/automate_put_file/__driver__.lua, + tests/automate_put_revision/__driver__.lua: + tests for the new features + +2006-12-18 Christof Petig + * basic_io.hh (peek): use widen to distinguish '\xff' and EOF * basic_io.cc (binary_transparency): add an unit test for this ============================================================ --- automate.cc d84bcc2a3343891d6702ac80c8c00672aea6037b +++ automate.cc 26adf3b2dcdc940a6d897f41bd62f94990526d3c @@ -33,6 +33,7 @@ #include "vocab.hh" #include "globish.hh" #include "charset.hh" +#include "safe_map.hh" using std::allocator; using std::basic_ios; @@ -1597,6 +1598,186 @@ AUTOMATE(get_corresponding_path, N_("REV output.write(prt.buf.data(), prt.buf.size()); } +// Name: put_file +// Arguments: +// base ID (optional). +// file contents (binary, intended for automate stdio use) +// Added in: 4.1 +// Purpose: +// Store a file in the database. +// Optionally encode it as a file_delta +// Output format: +// The ID of the new file (40 digit hex string) +// Error conditions: +// a runtime exception is thrown if base revision is not available +AUTOMATE(put_file, N_("[BASE-ID] CONTENTS"), options::opts::none) +{ + hexenc sha1sum; + transaction_guard tr(app.db); + if (args.size()==1) + { + data dat(idx(args,0)()); + calculate_ident(dat,sha1sum); + if (!app.db.file_version_exists(sha1sum)) + { + app.db.put_file(sha1sum, dat); + } + else L(FL("revision %s already known") % sha1sum); + } + else if (args.size()==2) + { + data dat(idx(args,1)()); + calculate_ident(dat,sha1sum); + if (!app.db.file_version_exists(sha1sum)) + { + file_id base_id(idx(args,0)()); + N(app.db.file_version_exists(base_id), + F("no file version %s found in database") % base_id); + + file_data olddat; + app.db.get_file_version(base_id, olddat); + delta del; + diff(olddat.inner(), dat, del); + L(FL("data size %d, delta size %d") % dat().size() % del().size()); + if (dat().size()<=del().size()) + // the data is smaller or of equal size to the patch + app.db.put_file(sha1sum, dat); + else + app.db.put_file_version(base_id,sha1sum,del); + } + else L(FL("revision %s already known") % sha1sum); + } + else throw usage(name); + + tr.commit(); + output << sha1sum; +} + +// Name: put_revision +// Arguments: +// single edge specification (part of a full revision) +// Added in: 4.1 +// Purpose: +// Store a revision into the database. +// Output format: +// The ID of the new revision +// Error conditions: +// none +AUTOMATE(put_revision, N_("SINGLE-EDGE-DATA"), options::opts::none) +{ + 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); + + 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); + + // calculate new manifest + roster_t old_roster; + if (!null_id(old_rev)) app.db.get_roster(old_rev, 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)); + } + + revision_id id; + calculate_ident(rev, id); + + transaction_guard tr(app.db); + rev.made_for=made_for_database; + app.db.put_revision(id, rev); + tr.commit(); + + output << id; +} + +// Name: cert +// Arguments: +// revision ID +// certificate name +// certificate value +// Added in: 4.1 +// Purpose: +// Add a revision certificate (like mtn cert). +// Output format: +// nothing +// Error conditions: +// none +AUTOMATE(cert, N_("REVISION-ID NAME VALUE"), options::opts::none) +{ + if (args.size() != 3) + throw usage(name); + cert c; + revision_id rid(idx(args,0)()); + make_simple_cert(rid.inner(),cert_name(idx(args,1)()), + cert_value(idx(args,2)()), app, c); + revision rc(c); + packet_db_writer dbw(app); + dbw.consume_revision_cert(rc); +} + +// Name: db_set +// Arguments: +// variable domain +// variable name +// veriable value +// Added in: 4.1 +// Purpose: +// Set a database variable (like mtn database set) +// Output format: +// nothing +// Error conditions: +// none +AUTOMATE(db_set, N_("DOMAIN NAME VALUE"), options::opts::none) +{ + if (args.size() != 3) + throw usage(name); + var_domain domain = var_domain(idx(args, 0)()); + utf8 name = idx(args, 1); + string value = idx(args, 2)(); + var_key key(domain, var_name(name())); + app.db.set_var(key, var_value(value)); +} + +// Name: db_get +// Arguments: +// variable domain +// variable name +// Added in: 4.1 +// Purpose: +// Get a database variable (like mtn database ls vars | grep NAME) +// Output format: +// variable value +// Error conditions: +// a runtime exception is thrown if the variable is not set +AUTOMATE(db_get, N_("DOMAIN NAME"), options::opts::none) +{ + if (args.size() != 2) + throw usage(name); + var_domain domain = var_domain(idx(args, 0)()); + utf8 name = idx(args, 1); + var_key key(domain, var_name(name())); + var_value value; + app.db.get_var(key, value); + output << value(); +} + // Local Variables: // mode: C++ // fill-column: 76 ============================================================ --- cmd_automate.cc 1f90ee26385b4db17ef2e12524c8ed8a410d59e4 +++ cmd_automate.cc 6725ca1a2fe0d9fb8f0f8b27be822e067b99fdb3 @@ -61,7 +61,7 @@ automate_command(utf8 cmd, vector find_automation(cmd, root_cmd_name).run(args, root_cmd_name, app, output); } -static string const interface_version = "4.0"; +static string const interface_version = "4.1"; // Name: interface_version // Arguments: none ============================================================ --- testsuite.lua 21be0891770807a4e8dce87e9d5869bd11cf259d +++ testsuite.lua d023c8bf33c3ff8cc07a04e53174d6510a8a3833 @@ -696,4 +696,8 @@ table.insert(tests, "fail_cleanly_when__ table.insert(tests, "log_--to") table.insert(tests, "mkdir") table.insert(tests, "fail_cleanly_when__MTN_format_corrupt") +table.insert(tests, "automate_db_set,get") +table.insert(tests, "automate_cert") +table.insert(tests, "automate_put_file") +table.insert(tests, "automate_put_revision")