# # # patch "automate.cc" # from [d2310913a872a99ebf8fa32293d8a4a33da5c5f1] # to [8a1155d54876641573ce3fecba9def947d57cffb] # # patch "cert.cc" # from [fc1da7bb4af5fdb954681c212e9279807f268478] # to [e5d00c3656f580f430998be2145fd69797658971] # # patch "charset.cc" # from [0f8956fa1358eb3714dcfb543e00a3ffb92cdb43] # to [befb5d4e7e8f0c446a125b6270de61ad74176ffd] # # patch "cmd_automate.cc" # from [4efdfc587230a39b4935009ae8111ff16c53ad4d] # to [0cba5327e7a557591e86210c6ce0ecf1306595e2] # # patch "cmd_conflicts.cc" # from [891554941767349bf175dab473f46f3da5aba372] # to [b13aa30d0d716b4e52ef8ad0d39337f3f0d41a17] # # patch "cmd_db.cc" # from [0666afbe8cab2912bcefa377a87f7b2fc0ee5b8d] # to [52369be1ac9c7f19157a3e14c3e26dc4407d23b0] # # patch "cmd_diff_log.cc" # from [837050937a8c582bc93c83c7078eabcfd1143b8d] # to [610013ebbe9f839bc9427012fef86b78ad6b48fb] # # patch "cmd_files.cc" # from [b3e3d6f26ce057141bb46a5ac40afc6d0846e478] # to [d2e6d85c9e3f7504a8eff0e54b2b694d2a13bb78] # # patch "cmd_key_cert.cc" # from [1bc36aecf4c815c3c991d09980e5ddaaaa9053ed] # to [fe9654113e9b63bb18c522de16c12426e7ee4e1d] # # patch "cmd_list.cc" # from [b1e651ecf64b1207a8e33c2e35fd4d2159c829af] # to [74e36aac8b4002f76f096b395c881f25c6388c27] # # patch "cmd_merging.cc" # from [d6574a8f09d3a68a921053516575c063ac97defd] # to [976acfa1382886784a5c442d892a1fc8167bab4d] # # patch "cmd_netsync.cc" # from [a8a7568be78fa844600d3c7ac0a8a0d9ed781063] # to [ecd5695708dce9eb261fe9fc9a7ec85ba922d4af] # # patch "cmd_packet.cc" # from [4d834fc074449b304cb7010ed596ba22b42e6441] # to [369399d79d4a6e14d9c229e8da94de50b79daac2] # # patch "cmd_ws_commit.cc" # from [dc652103959227fea14da68af9184089dcc179cf] # to [68a237875400db79f3e83844acedb021e0958ad9] # # patch "commands.cc" # from [c9349b025a29697632f8df4515c44c273320989f] # to [2d1d23d1778deeeaadbb0ad338ae7fa21ed754ab] # # patch "cset.cc" # from [0259be4135724b31aba52741aa93bc873ba5ef1d] # to [42fbd475c9413b93d2df7c8acfe7e877b47467b0] # # patch "database.cc" # from [3d9d4113d29fb9d19293f9bb9c705552fc7685d7] # to [62d70e2878b1be02b8ed2d62498f8b3cf01898cd] # # patch "diff_patch.cc" # from [7c5ca596824810b2dc3a892c79128d65f4887230] # to [b23b03a134bdb27df76d383dbb0b03a9b62f5e37] # # patch "epoch.cc" # from [5c0aae3af816fe0826b864e4e72ddb7cbdd0364c] # to [f7ced1d6a1019a2cd594a38c62f9794aaa48cb16] # # patch "file_io.cc" # from [32936506f831439ea55881b29b7f39ad3423f813] # to [f4da4a09b6bc7aafd0baa56609b0119c53b8fbac] # # patch "globish.cc" # from [3aecf8455aa7c028b29afd3d5437560dbf039bc3] # to [d4ca5ed4bc475b8f3f06a7b028265817344120d7] # # patch "globish.hh" # from [8d7ef6431c1eacbf925e91d0c2fee37e5b3d8b8f] # to [52afd9b82e2cf0a8b2e61ee60d0e6afa12ce6f13] # # patch "graph.cc" # from [cc8e1d1fb26fbb9d80096ed8d7a5f023a7b7f039] # to [368b65052543a7885b010e4f2c8b7d19c6e62ecd] # # patch "inodeprint.cc" # from [1482e819fc5fd5e4d7ac52c025b3a6b85ab6c12f] # to [942d57dffd39262762ab2951b15a94c93b7b1e34] # # patch "key_store.cc" # from [c08df090bab954291bbc6296aef75f15a9090a12] # to [e11141e0fa1143dece96d218a45417c92da2b84e] # # patch "keys.cc" # from [da37ab87e4ee6f7873d436d60f665f0da59c1787] # to [dc4b299f4dd152486ecc4c27b8a62b6994be621d] # # patch "lua_hooks.cc" # from [9bb40884a42b3741cb72c918b905357456dee3ce] # to [246a3c65f82857649c0cb86e225af19717cd60a0] # # patch "merkle_tree.cc" # from [91579fce8e09786f63da45f12b5ac9ce5f3c65e1] # to [9cc62123fed82d5413c286ca1724be3d7d901243] # # patch "netcmd.cc" # from [5fdb6c151fe6bc04b5304bf8510ddcd0a8e76ae7] # to [6252b7c1fa1a3bcead8a75d6e881ad44ea95053e] # # patch "netsync.cc" # from [ca897ef7d27e13414e4514e0a0a73485223e16f2] # to [bd455bf5537bd9b1d6dc33a255ad3fd9aec03a74] # # patch "option.cc" # from [db3fe9dfed69f51694a2a28a705f24a78ab086f9] # to [c7f033f0f2e4251e7fba65d99983d01a3cf18b53] # # patch "option.hh" # from [2d2b4949004f5ad7040601b41f78fb7c8af6beb1] # to [6b3ac60b406b88700b06236224b311daed0894d5] # # patch "origin_type.hh" # from [83986c9ae7a38a915c2ccd791f5409713e4c7587] # to [54082f23fb5a6cb64e725fe44df7b06517224222] # # patch "packet.cc" # from [b03a705bacfefcd03be113ad27cb8139cce85915] # to [e5854ef14c0f8bfd6d308cc1adcecf2d2fe4ddc9] # # patch "paths.cc" # from [3dbef065748bfed896a414be6c370a9e154f3d77] # to [c2bbab0e0a0e50607f11cf4b1833cb1467fac0e6] # # patch "paths.hh" # from [dc8439eff099b017dacdb4220da15142a8dbdf30] # to [10edc3da4ba3b6f157a5d03e100ee7dc8bb64346] # # patch "project.cc" # from [9c881d67edc2e64055101bcf65a38ba01a590ebc] # to [1ca851ed8ce7b4acb24a0b0d7c5200359aa55619] # # patch "rcs_import.cc" # from [216a7255bacccf61a61aef018bcc8c060ae77610] # to [7876d1609874f781297272a18fa35e7d28375d9e] # # patch "refiner.cc" # from [79f55898cf2c7eb7a3c2370c05368a13019f665e] # to [19066745ddc95c080b14e0b3cc2edd44d2e9d5e6] # # patch "restrictions.cc" # from [9f51a6b8ccdabffe3799d93c2e3a24b57ad74a54] # to [21599dba641ccb291d38bd170d79eae5047f924f] # # patch "revision.cc" # from [2d4f530cd3166ccee17734531f7e50ff9c449c0d] # to [926bc90127f67df896a2c32e4c3d7ae6d3c82bcc] # # patch "roster.cc" # from [385df20a4cef1226cbfec91e6cbe6c9bbd282bc1] # to [dbfdce44538d30f31386ebad938da2572da5e969] # # patch "roster_delta.cc" # from [ec099314df2d8ccbf17ef0861df895d7fc99fe5b] # to [f05705a1dbf00dbb77d4f13153a26da957a0c9a9] # # patch "roster_merge.cc" # from [f9de0d60f7a4302ee65537657502c62b95f6f26e] # to [ca479751ee42bfec579dc26bfe5d330b22607e61] # # patch "sanity.hh" # from [0f1f754d269c4ee6ed16e5e1d1865b492f0a5c71] # to [f96bc471c778d8cba8e62f71eb15c92b92791b51] # # patch "schema_migration.cc" # from [b4074090f1c1b1774852a8227123132913896ce4] # to [d1573a5d69b208dbbf1face97592b70b7e8bf79e] # # patch "sha1.cc" # from [233a3432e8469854a7840fc02bfd872379b2f40b] # to [7a6074b5fa0c77707cf3ab596e63e02980209496] # # patch "simplestring_xform.hh" # from [564a305c99ca931c93956ac3ef903683dcb15db7] # to [eb4c9acbf8671b9f7114959f1e120bbc1430b67a] # # patch "transforms.cc" # from [9c171dc101906f2eafda1d1bcb8ba5c46ac1bc80] # to [627ab523898554957d55dc2e9138bfaadf8bdec5] # # patch "ui.cc" # from [e16476608a0c83fe3ee7fbfd5a605beafffd447e] # to [646fea920cb0481004997c15fe10f4a829faf7d2] # # patch "vocab.cc" # from [e66b94af7fa13534112579568ff63c267e3dfe44] # to [bb503a780573812673e29b185737947f2a189d95] # # patch "vocab_cast.hh" # from [cdf5c8043fbdcfdd6be9e4d14191c1b977fdb798] # to [d6cdeb15c439fcb834d27482e480741c4cf608da] # # patch "vocab_macros.hh" # from [68e2ee59942578944a90e572d397fcb6c5186a26] # to [db691c053cae7fa496c004608fe39f576fd6fa7e] # # patch "work.cc" # from [6ef327477ba19f52cb2b11baa48b1c2dd3c37e7f] # to [38fcd998668d9bb8a51f9e3973086a3246c18def] # # patch "work_migration.cc" # from [5d03bd50cd3e34c2212a355cc928fea9e5fc4e20] # to [fdd7b30d20ed4ab79dfea448b7c40e4137140d7a] # # patch "xdelta.cc" # from [3e042fc714973dc387d2dbb3c3848e67b49488f0] # to [6c75c90672859828c596acd6329f5c18d0bec659] # ============================================================ --- automate.cc d2310913a872a99ebf8fa32293d8a4a33da5c5f1 +++ automate.cc 8a1155d54876641573ce3fecba9def947d57cffb @@ -44,6 +44,7 @@ #include "work.hh" #include "xdelta.hh" #include "database.hh" +#include "vocab_cast.hh" using std::allocator; using std::basic_ios; @@ -86,7 +87,7 @@ CMD_AUTOMATE(heads, N_("[BRANCH]"), branch_name branch; if (args.size() == 1) // branchname was explicitly given, use that - branch = branch_name(idx(args, 0)()); + branch = typecast_vocab(idx(args, 0)); else { workspace::require_workspace(F("with no argument, this command prints the heads of the workspace's branch")); @@ -1993,14 +1994,14 @@ CMD_AUTOMATE(put_file, N_("[FILEID] CONT transaction_guard tr(db); if (args.size() == 1) { - file_data dat(idx(args, 0)()); + file_data dat = typecast_vocab(idx(args, 0)); calculate_ident(dat, sha1sum); db.put_file(sha1sum, dat); } else if (args.size() == 2) { - file_data dat(idx(args, 1)()); + file_data dat = typecast_vocab(idx(args, 1)); calculate_ident(dat, sha1sum); file_id base_id(decode_hexenc_as(idx(args, 0)(), origin::user)); E(db.file_version_exists(base_id), origin::user, @@ -2045,7 +2046,7 @@ CMD_AUTOMATE(put_revision, N_("REVISION- database db(app); revision_t rev; - read_revision(revision_data(idx(args, 0)()), rev); + read_revision(typecast_vocab(idx(args, 0)), rev); // recalculate manifest temp_node_id_source nis; @@ -2111,8 +2112,9 @@ CMD_AUTOMATE(cert, N_("REVISION-ID NAME F("no such revision '%s'") % hrid); cache_user_key(app.opts, app.lua, db, keys); - put_simple_revision_cert(db, keys, rid, cert_name(idx(args, 1)()), - cert_value(idx(args, 2)())); + put_simple_revision_cert(db, keys, rid, + typecast_vocab(idx(args, 1)), + typecast_vocab(idx(args, 2))); } // Name: get_db_variables @@ -2141,7 +2143,7 @@ CMD_AUTOMATE(get_db_variables, N_("[DOMA if (args.size() == 1) { filter_by_domain = true; - filter = var_domain(idx(args, 0)()); + filter = typecast_vocab(idx(args, 0)); } map vars; @@ -2207,11 +2209,11 @@ CMD_AUTOMATE(set_db_variable, N_("DOMAIN database db(app); - var_domain domain = var_domain(idx(args, 0)()); + var_domain domain = typecast_vocab(idx(args, 0)); utf8 name = idx(args, 1); utf8 value = idx(args, 2); - var_key key(domain, var_name(name())); - db.set_var(key, var_value(value())); + var_key key(domain, typecast_vocab(name)); + db.set_var(key, typecast_vocab(value)); } // Name: drop_db_variables @@ -2237,11 +2239,11 @@ CMD_AUTOMATE(drop_db_variables, N_("DOMA database db(app); - var_domain domain(idx(args, 0)()); + var_domain domain = typecast_vocab(idx(args, 0)); if (args.size() == 2) { - var_name name(idx(args, 1)()); + var_name name = typecast_vocab(idx(args, 1)); var_key key(domain, name); E(db.var_exists(key), origin::user, F("no var with name %s in domain %s") % name % domain); ============================================================ --- cert.cc fc1da7bb4af5fdb954681c212e9279807f268478 +++ cert.cc e5d00c3656f580f430998be2145fd69797658971 @@ -31,6 +31,7 @@ #include "simplestring_xform.hh" #include "transforms.hh" #include "ui.hh" +#include "vocab_cast.hh" using std::make_pair; using std::map; @@ -284,10 +285,12 @@ read_cert(string const & in, cert & t) size_t pos = 0; id hash = id(extract_substring(in, pos, constants::merkle_hash_length_in_bytes, - "cert hash")); + "cert hash"), + origin::network); revision_id ident = revision_id(extract_substring(in, pos, constants::merkle_hash_length_in_bytes, - "cert ident")); + "cert ident"), + origin::network); string name, val, key, sig; extract_variable_length_string(in, name, pos, "cert name"); extract_variable_length_string(in, val, pos, "cert val"); @@ -295,8 +298,10 @@ read_cert(string const & in, cert & t) extract_variable_length_string(in, sig, pos, "cert sig"); assert_end_of_buffer(in, pos, "cert"); - cert tmp(ident, cert_name(name), cert_value(val), rsa_keypair_id(key), - rsa_sha1_signature(sig)); + cert tmp(ident, cert_name(name, origin::network), + cert_value(val, origin::network), + rsa_keypair_id(key, origin::network), + rsa_sha1_signature(sig, origin::network)); id check; cert_hash_code(tmp, check); @@ -365,7 +370,7 @@ cert_hash_code(cert const & t, id & out) tmp += ':'; append_without_ws(tmp, sig_encoded()); - data tdat(tmp); + data tdat(tmp, origin::internal); calculate_ident(tdat, out); } @@ -447,7 +452,7 @@ cert_revision_in_branch(database & db, branch_name const & branch) { put_simple_revision_cert(db, keys, rev, branch_cert_name, - cert_value(branch())); + typecast_vocab(branch)); } void @@ -457,7 +462,7 @@ cert_revision_suspended_in_branch(databa branch_name const & branch) { put_simple_revision_cert(db, keys, rev, suspend_cert_name, - cert_value(branch())); + typecast_vocab(branch)); } @@ -469,7 +474,7 @@ cert_revision_date_time(database & db, revision_id const & rev, date_t const & t) { - cert_value val = cert_value(t.as_iso_8601_extended()); + cert_value val = cert_value(t.as_iso_8601_extended(), origin::internal); put_simple_revision_cert(db, keys, rev, date_cert_name, val); } @@ -480,7 +485,7 @@ cert_revision_author(database & db, string const & author) { put_simple_revision_cert(db, keys, rev, author_cert_name, - cert_value(author)); + cert_value(author, origin::user)); } void @@ -490,7 +495,7 @@ cert_revision_tag(database & db, string const & tagname) { put_simple_revision_cert(db, keys, rev, tag_cert_name, - cert_value(tagname)); + cert_value(tagname, origin::user)); } void @@ -500,7 +505,7 @@ cert_revision_changelog(database & db, utf8 const & log) { put_simple_revision_cert(db, keys, rev, changelog_cert_name, - cert_value(log())); + typecast_vocab(log)); } void @@ -510,7 +515,7 @@ cert_revision_comment(database & db, utf8 const & comment) { put_simple_revision_cert(db, keys, rev, comment_cert_name, - cert_value(comment())); + typecast_vocab(comment)); } void @@ -537,7 +542,8 @@ cert_revision_testresult(database & db, "'pass/fail'"); put_simple_revision_cert(db, keys, rev, testresult_cert_name, - cert_value(lexical_cast(passed))); + cert_value(lexical_cast(passed), + origin::internal)); } // Local Variables: ============================================================ --- charset.cc 0f8956fa1358eb3714dcfb543e00a3ffb92cdb43 +++ charset.cc befb5d4e7e8f0c446a125b6270de61ad74176ffd @@ -19,6 +19,7 @@ #include "numeric_vocab.hh" #include "sanity.hh" #include "simplestring_xform.hh" +#include "vocab_cast.hh" using std::string; using std::vector; @@ -179,7 +180,7 @@ utf8_to_system_strict(utf8 const & utf, { string out; utf8_to_system_strict(utf, out); - ext = external(out); + ext = external(out, utf.made_from); } void @@ -187,23 +188,23 @@ utf8_to_system_best_effort(utf8 const & { string out; utf8_to_system_best_effort(utf, out); - ext = external(out); + ext = external(out, utf.made_from); } void system_to_utf8(external const & ext, utf8 & utf) { if (system_charset_is_utf8()) - utf = utf8(ext()); + utf = typecast_vocab(ext); else if (system_charset_is_ascii_extension() && is_all_ascii(ext())) - utf = utf8(ext()); + utf = typecast_vocab(ext); else { string out; charset_convert(system_charset(), "UTF-8", ext(), out, false, ext.made_from); - utf = utf8(out); + utf = utf8(out, ext.made_from); I(utf8_validate(utf)); } } @@ -321,7 +322,7 @@ ace_to_utf8(string const & a, utf8 & utf F("error converting %d UTF-8 bytes to IDNA ACE: %s") % a.size() % decode_idna_error(res)); - utf = utf8(string(out)); + utf = utf8(string(out), whence); free(out); } @@ -344,7 +345,7 @@ internalize_cert_name(utf8 const & utf, { string a; utf8_to_ace(utf, a); - c = cert_name(a); + c = cert_name(a, utf.made_from); } void @@ -377,7 +378,7 @@ internalize_rsa_keypair_id(utf8 const & if (*i == "@") in_domain = true; } - key = rsa_keypair_id(tmp); + key = rsa_keypair_id(tmp, utf.made_from); } void @@ -410,7 +411,7 @@ externalize_rsa_keypair_id(rsa_keypair_i if (*i == "@") in_domain = true; } - utf = utf8(tmp); + utf = utf8(tmp, key.made_from); } void @@ -426,7 +427,7 @@ internalize_var_domain(utf8 const & utf, { string a; utf8_to_ace(utf, a); - d = var_domain(a); + d = var_domain(a, utf.made_from); } void @@ -594,7 +595,7 @@ UNIT_TEST(charset, idna_encoding) string u = lowercase(idna_vec[i].utf); string a = lowercase(idna_vec[i].ace); string tace; - utf8_to_ace(utf8(u), tace); + utf8_to_ace(utf8(u, origin::internal), tace); L(FL("ACE-encoded %s: '%s'") % idna_vec[i].name % tace); UNIT_TEST_CHECK(a == lowercase(tace)); ============================================================ --- cmd_automate.cc 4efdfc587230a39b4935009ae8111ff16c53ad4d +++ cmd_automate.cc 0cba5327e7a557591e86210c6ce0ecf1306595e2 @@ -381,8 +381,8 @@ CMD_AUTOMATE(stdio, "", vector::iterator i = cmdline.begin(); for (; i != cmdline.end(); ++i) { - args.push_back(arg_type(*i)); - id.push_back(utf8(*i)); + args.push_back(arg_type(*i, origin::user)); + id.push_back(utf8(*i, origin::user)); } set< command_id > matches = @@ -487,7 +487,7 @@ LUAEXT(mtn_automate, ) for (int i=1; i<=n; i++) { - arg_type next_arg(luaL_checkstring(LS, i)); + arg_type next_arg(luaL_checkstring(LS, i), origin::user); L(FL("arg: %s")%next_arg()); args.push_back(next_arg); } @@ -506,7 +506,7 @@ LUAEXT(mtn_automate, ) commands::command_id id; for (args_vector::const_iterator iter = args.begin(); iter != args.end(); iter++) - id.push_back(utf8((*iter)())); + id.push_back(*iter); E(!id.empty(), origin::user, F("no command found")); ============================================================ --- cmd_conflicts.cc 891554941767349bf175dab473f46f3da5aba372 +++ cmd_conflicts.cc b13aa30d0d716b4e52ef8ad0d39337f3f0d41a17 @@ -293,7 +293,7 @@ set_first_conflict(database & db, { E(args.size() == 2, origin::user, F("wrong number of arguments")); - E(bookkeeping_path::external_string_is_bookkeeping_path(utf8(idx(args,1)())), + E(bookkeeping_path::external_string_is_bookkeeping_path(idx(args,1)), origin::user, F("result path must be under _MTN")); bookkeeping_path const result_path(idx(args,1)(), origin::user); ============================================================ --- cmd_db.cc 0666afbe8cab2912bcefa377a87f7b2fc0ee5b8d +++ cmd_db.cc 52369be1ac9c7f19157a3e14c3e26dc4407d23b0 @@ -23,6 +23,7 @@ #include "work.hh" #include "rev_height.hh" #include "transforms.hh" +#include "vocab_cast.hh" using std::cin; using std::cout; @@ -209,7 +210,7 @@ CMD(db_kill_branch_certs_locally, "kill_ throw usage(execid); database db(app); - db.delete_branch_named(cert_value(idx(args, 0)())); + db.delete_branch_named(typecast_vocab(idx(args, 0))); } CMD(db_kill_tag_locally, "kill_tag_locally", "", CMD_REF(db), "TAG", @@ -221,7 +222,7 @@ CMD(db_kill_tag_locally, "kill_tag_local throw usage(execid); database db(app); - db.delete_tag_named(cert_value(idx(args, 0)())); + db.delete_tag_named(typecast_vocab(idx(args, 0))); } CMD(db_check, "check", "", CMD_REF(db), "", @@ -299,7 +300,7 @@ CMD_HIDDEN(clear_epoch, "clear_epoch", " throw usage(execid); database db(app); - db.clear_epoch(branch_name(idx(args, 0)())); + db.clear_epoch(typecast_vocab(idx(args, 0))); } CMD(db_set_epoch, "set_epoch", "", CMD_REF(db), "BRANCH EPOCH", @@ -332,8 +333,8 @@ CMD(set, "set", "", CMD_REF(variables), var_name n; var_value v; internalize_var_domain(idx(args, 0), d); - n = var_name(idx(args, 1)()); - v = var_value(idx(args, 2)()); + n = typecast_vocab(idx(args, 1)); + v = typecast_vocab(idx(args, 2)); database db(app); db.set_var(make_pair(d, n), v); @@ -351,7 +352,7 @@ CMD(unset, "unset", "", CMD_REF(variable var_domain d; var_name n; internalize_var_domain(idx(args, 0), d); - n = var_name(idx(args, 1)()); + n = typecast_vocab(idx(args, 1)); var_key k(d, n); database db(app); @@ -436,7 +437,7 @@ CMD_HIDDEN(rev_height, "rev_height", "", { if (args.size() != 1) throw usage(execid); - revision_id rid(idx(args, 0)()); + revision_id rid = typecast_vocab(idx(args, 0)); database db(app); E(db.revision_exists(rid), origin::user, F("no such revision '%s'") % rid); ============================================================ --- cmd_diff_log.cc 837050937a8c582bc93c83c7078eabcfd1143b8d +++ cmd_diff_log.cc 610013ebbe9f839bc9427012fef86b78ad6b48fb @@ -958,7 +958,7 @@ CMD(log, "log", "", CMD_REF(informative) last--; string out_system; - utf8_to_system_best_effort(utf8(out.str()), out_system); + utf8_to_system_best_effort(utf8(out.str(), origin::internal), out_system); if (app.opts.no_graph) cout << out_system; else ============================================================ --- cmd_files.cc b3e3d6f26ce057141bb46a5ac40afc6d0846e478 +++ cmd_files.cc d2e6d85c9e3f7504a8eff0e54b2b694d2a13bb78 @@ -121,7 +121,9 @@ CMD(fdiff, "fdiff", "", CMD_REF(debug), string pattern(""); if (!app.opts.no_show_encloser) - app.lua.hook_get_encloser_pattern(file_path_external(utf8(src_name)), pattern); + app.lua.hook_get_encloser_pattern(file_path_external(utf8(src_name, + origin::user)), + pattern); make_diff(src_name, dst_name, src_id, dst_id, ============================================================ --- cmd_key_cert.cc 1bc36aecf4c815c3c991d09980e5ddaaaa9053ed +++ cmd_key_cert.cc fe9654113e9b63bb18c522de16c12426e7ee4e1d @@ -21,6 +21,7 @@ #include "keys.hh" #include "key_store.hh" #include "transforms.hh" +#include "vocab_cast.hh" using std::cout; using std::ostream_iterator; @@ -59,7 +60,7 @@ CMD(dropkey, "dropkey", "", CMD_REF(key_ if (args.size() != 1) throw usage(execid); - rsa_keypair_id ident(idx(args, 0)()); + rsa_keypair_id ident = typecast_vocab(idx(args, 0)); if (db.database_specified()) { transaction_guard guard(db); @@ -173,12 +174,12 @@ CMD(cert, "cert", "", CMD_REF(key_and_ce cert_value val; if (args.size() == 3) - val = cert_value(idx(args, 2)()); + val = typecast_vocab(idx(args, 2)); else { data dat; read_data_stdin(dat); - val = cert_value(dat()); + val = typecast_vocab(dat); } project.put_cert(keys, rid, cname, val); @@ -208,7 +209,7 @@ CMD(trusted, "trusted", "", CMD_REF(key_ cert_name cname; internalize_cert_name(idx(args, 1), cname); - cert_value value(idx(args, 2)()); + cert_value value = typecast_vocab(idx(args, 2)); set signers; for (unsigned int i = 3; i != args.size(); ++i) ============================================================ --- cmd_list.cc b1e651ecf64b1207a8e33c2e35fd4d2159c829af +++ cmd_list.cc 74e36aac8b4002f76f096b395c881f25c6388c27 @@ -33,6 +33,7 @@ #include "vocab_cast.hh" #include "app_state.hh" #include "project.hh" +#include "vocab_cast.hh" #include "work.hh" using std::cout; @@ -102,7 +103,7 @@ CMD(certs, "certs", "", CMD_REF(list), " if (colon_pos != string::npos) { string substr(str, 0, colon_pos); - colon_pos = display_width(utf8(substr)); + colon_pos = display_width(utf8(substr, origin::internal)); extra_str = string(colon_pos, ' ') + ": %s\n"; } @@ -416,7 +417,8 @@ CMD(epochs, "epochs", "", CMD_REF(list), i != args.end(); ++i) { - map::const_iterator j = epochs.find(branch_name((*i)())); + map::const_iterator j = + epochs.find(typecast_vocab((*i))); E(j != epochs.end(), origin::user, F("no epoch for branch %s") % *i); cout << encode_hexenc(j->second.inner()(), j->second.inner().made_from) ============================================================ --- cmd_merging.cc d6574a8f09d3a68a921053516575c063ac97defd +++ cmd_merging.cc 976acfa1382886784a5c442d892a1fc8167bab4d @@ -31,6 +31,7 @@ #include "keys.hh" #include "key_store.hh" #include "database.hh" +#include "vocab_cast.hh" using std::cout; using std::make_pair; @@ -101,7 +102,7 @@ pick_branch_for_update(options & opts, d set< branch_name > branches; for (vector< revision >::const_iterator i = certs.begin(); i != certs.end(); i++) - branches.insert(branch_name(i->inner().value())); + branches.insert(typecast_vocab(i->inner().value)); if (branches.find(opts.branchname) != branches.end()) { @@ -346,7 +347,8 @@ merge_two(options & opts, lua_hooks & lu if (branch != opts.branchname) log << setw(fieldwidth) << "to branch '" << branch << "'\n"; - process_commit_message_args(opts, log_message_given, log_message, utf8(log.str())); + process_commit_message_args(opts, log_message_given, log_message, + utf8(log.str(), origin::internal)); // Now it's time for the real work. if (automate) @@ -559,9 +561,9 @@ CMD(merge_into_dir, "merge_into_dir", "" if (args.size() != 3) throw usage(execid); - project.get_branch_heads(branch_name(idx(args, 0)()), src_heads, + project.get_branch_heads(typecast_vocab(idx(args, 0)), src_heads, app.opts.ignore_suspend_certs); - project.get_branch_heads(branch_name(idx(args, 1)()), dst_heads, + project.get_branch_heads(typecast_vocab(idx(args, 1)), dst_heads, app.opts.ignore_suspend_certs); E(src_heads.size() != 0, origin::user, @@ -598,7 +600,7 @@ CMD(merge_into_dir, "merge_into_dir", "" % *src_i % idx(args, 1)()); transaction_guard guard(db); project.put_revision_in_branch(keys, *src_i, - branch_name(idx(args, 1)())); + typecast_vocab(idx(args, 1))); guard.commit(); } else @@ -678,17 +680,18 @@ CMD(merge_into_dir, "merge_into_dir", "" utf8 log_message; utf8 log_prefix = utf8((FL("propagate from branch '%s' (head %s)\n" " to branch '%s' (head %s)\n") - % idx(args, 0) - % *src_i - % idx(args, 1) - % *dst_i).str()); + % idx(args, 0) + % *src_i + % idx(args, 1) + % *dst_i).str(), + origin::internal); process_commit_message_args(app.opts, log_message_given, log_message, log_prefix); project.put_standard_certs_from_options(app.opts, app.lua, keys, merged, - branch_name(idx(args, 1)()), + typecast_vocab(idx(args, 1)), log_message); guard.commit(); @@ -826,7 +829,7 @@ CMD(explicit_merge, "explicit_merge", "" complete(app.opts, app.lua, project, idx(args, 0)(), left); complete(app.opts, app.lua, project, idx(args, 1)(), right); - branch = branch_name(idx(args, 2)()); + branch = typecast_vocab(idx(args, 2)); E(!(left == right), origin::user, F("%s and %s are the same revision, aborting") @@ -1074,7 +1077,7 @@ CMD(store, "store", "", CMD_REF(conflict std::ostringstream output; show_conflicts_core(db, app.lua, left_id, right_id, true, true, output); - data dat(output.str()); + data dat(output.str(), origin::internal); write_data(app.opts.conflicts_file, dat); } @@ -1319,7 +1322,7 @@ CMD(pluck, "pluck", "", CMD_REF(workspac " through %s\n") % from_rid % to_rid).str(); - work.write_user_log(utf8(log_str)); + work.write_user_log(utf8(log_str, origin::internal)); } } ============================================================ --- cmd_netsync.cc a8a7568be78fa844600d3c7ac0a8a0d9ed781063 +++ cmd_netsync.cc ecd5695708dce9eb261fe9fc9a7ec85ba922d4af @@ -17,6 +17,7 @@ #include "work.hh" #include "database.hh" #include "roster.hh" +#include "vocab_cast.hh" #include @@ -53,7 +54,7 @@ find_key(options & opts, utf8 host(info.client.unparsed); if (!info.client.u.host.empty()) - host = utf8(info.client.u.host); + host = utf8(info.client.u.host, origin::user); if (!lua.hook_get_netsync_key(host, info.client.include_pattern, @@ -81,7 +82,7 @@ build_client_connection_info(options & o F("no server given and no default server set")); var_value addr_value; db.get_var(default_server_key, addr_value); - info.client.unparsed = utf8(addr_value()); + info.client.unparsed = typecast_vocab(addr_value); L(FL("using default server address: %s") % info.client.unparsed); } parse_uri(info.client.unparsed(), info.client.u, origin::user); @@ -145,9 +146,11 @@ build_client_connection_info(options & o } if (is_exclude) - excludes.push_back(arg_type(urldecode(item, origin::user))); + excludes.push_back(arg_type(urldecode(item, origin::user), + origin::user)); else - includes.push_back(arg_type(urldecode(item, origin::user))); + includes.push_back(arg_type(urldecode(item, origin::user), + origin::user)); } info.client.include_pattern = globish(includes); info.client.exclude_pattern = globish(excludes); @@ -157,7 +160,8 @@ build_client_connection_info(options & o if (!db.var_exists(default_server_key) || opts.set_default) { P(F("setting default server to %s") % info.client.unparsed()); - db.set_var(default_server_key, var_value(info.client.unparsed())); + db.set_var(default_server_key, + typecast_vocab(info.client.unparsed)); } if (!db.var_exists(default_include_pattern_key) || opts.set_default) @@ -165,7 +169,7 @@ build_client_connection_info(options & o P(F("setting default branch include pattern to '%s'") % info.client.include_pattern); db.set_var(default_include_pattern_key, - var_value(info.client.include_pattern())); + typecast_vocab(info.client.include_pattern)); } if (!db.var_exists(default_exclude_pattern_key) || opts.set_default) @@ -173,7 +177,7 @@ build_client_connection_info(options & o P(F("setting default branch exclude pattern to '%s'") % info.client.exclude_pattern); db.set_var(default_exclude_pattern_key, - var_value(info.client.exclude_pattern())); + typecast_vocab(info.client.exclude_pattern)); } info.client.use_argv = @@ -328,7 +332,7 @@ CMD(clone, "clone", "", CMD_REF(network) netsync_connection_info info; info.client.unparsed = idx(args, 0); - branch_name branchname(idx(args, 1)()); + branch_name branchname = typecast_vocab(idx(args, 1)); E(!branchname().empty(), origin::user, F("you must specify a branch to clone")); ============================================================ --- cmd_packet.cc 4d834fc074449b304cb7010ed596ba22b42e6441 +++ cmd_packet.cc 369399d79d4a6e14d9c229e8da94de50b79daac2 @@ -16,6 +16,7 @@ #include "database.hh" #include "key_store.hh" #include "packet.hh" +#include "vocab_cast.hh" using std::cin; using std::cout; @@ -33,7 +34,7 @@ CMD(pubkey, "pubkey", "", CMD_REF(packet if (args.size() != 1) throw usage(execid); - rsa_keypair_id ident(idx(args, 0)()); + rsa_keypair_id ident = typecast_vocab(idx(args, 0)); bool exists(false); rsa_pub_key key; if (db.database_specified() && db.public_key_exists(ident)) @@ -65,7 +66,7 @@ CMD(privkey, "privkey", "", CMD_REF(pack if (args.size() != 1) throw usage(execid); - rsa_keypair_id ident(idx(args, 0)()); + rsa_keypair_id ident = typecast_vocab(idx(args, 0)); E(keys.key_pair_exists(ident), origin::user, F("public and private key '%s' do not exist in keystore") % idx(args, 0)()); ============================================================ --- cmd_ws_commit.cc dc652103959227fea14da68af9184089dcc179cf +++ cmd_ws_commit.cc 68a237875400db79f3e83844acedb021e0958ad9 @@ -29,6 +29,7 @@ #include "simplestring_xform.hh" #include "database.hh" #include "roster.hh" +#include "vocab_cast.hh" using std::cout; using std::make_pair; @@ -97,7 +98,7 @@ revision_summary(revision_t const & rev, " attr %s") % (i->first) % (i->second)).str() += "\n"; } - summary = utf8(out); + summary = utf8(out, origin::internal); } static void @@ -111,7 +112,8 @@ get_log_message_interactively(lua_hooks external summary_external; utf8_to_system_best_effort(summary, summary_external); - utf8 branch_comment = utf8((F("branch \"%s\"\n\n") % branchname).str()); + utf8 branch_comment = utf8((F("branch \"%s\"\n\n") % branchname).str(), + branchname.made_from); external branch_external; utf8_to_system_best_effort(branch_comment, branch_external); @@ -125,7 +127,7 @@ get_log_message_interactively(lua_hooks commentary_str += summary_external(); commentary_str += string(70, '-') + "\n"; - external commentary(commentary_str); + external commentary(commentary_str, origin::internal); utf8 user_log_message; work.read_user_log(user_log_message); @@ -133,7 +135,7 @@ get_log_message_interactively(lua_hooks //if the _MTN/log file was non-empty, we'll append the 'magic' line utf8 user_log; if (user_log_message().length() > 0) - user_log = utf8( magic_line + "\n" + user_log_message()); + user_log = utf8( magic_line + "\n" + user_log_message(), origin::internal); else user_log = user_log_message; @@ -371,7 +373,8 @@ CMD(disapprove, "disapprove", "", CMD_RE process_commit_message_args(app.opts, log_message_given, log_message, utf8((FL("disapproval of revision '%s'") - % r).str())); + % r).str(), + origin::internal)); cache_user_key(app.opts, app.lua, db, keys); @@ -746,7 +749,7 @@ CMD(attr_drop, "drop", "", CMD_REF(attr) else { I(args.size() == 2); - attr_key a_key = attr_key(idx(args, 1)()); + attr_key a_key = typecast_vocab(idx(args, 1)); E(node->attrs.find(a_key) != node->attrs.end(), origin::user, F("Path '%s' does not have attribute '%s'") % path % a_key); @@ -802,7 +805,7 @@ CMD(attr_get, "get", "", CMD_REF(attr), else { I(args.size() == 2); - attr_key a_key = attr_key(idx(args, 1)()); + attr_key a_key = typecast_vocab(idx(args, 1)); full_attr_map_t::const_iterator i = node->attrs.find(a_key); if (i != node->attrs.end() && i->second.first) cout << path << " : " @@ -836,8 +839,8 @@ CMD(attr_set, "set", "", CMD_REF(attr), F("Unknown path '%s'") % path); node_t node = new_roster.get_node(path); - attr_key a_key = attr_key(idx(args, 1)()); - attr_value a_value = attr_value(idx(args, 2)()); + attr_key a_key = typecast_vocab(idx(args, 1)); + attr_value a_value = typecast_vocab(idx(args, 2)); node->attrs[a_key] = make_pair(true, a_value); @@ -1010,8 +1013,8 @@ CMD_AUTOMATE(set_attribute, N_("PATH KEY F("Unknown path '%s'") % path); node_t node = new_roster.get_node(path); - attr_key a_key = attr_key(idx(args,1)()); - attr_value a_value = attr_value(idx(args,2)()); + attr_key a_key = typecast_vocab(idx(args,1)); + attr_value a_value = typecast_vocab(idx(args,2)); node->attrs[a_key] = make_pair(true, a_value); @@ -1065,7 +1068,7 @@ CMD_AUTOMATE(drop_attribute, N_("PATH [K } else { - attr_key a_key = attr_key(idx(args,1)()); + attr_key a_key = typecast_vocab(idx(args,1)); E(node->attrs.find(a_key) != node->attrs.end(), origin::user, F("Path '%s' does not have attribute '%s'") % path % a_key); ============================================================ --- commands.cc c9349b025a29697632f8df4515c44c273320989f +++ commands.cc 2d1d23d1778deeeaadbb0ad338ae7fa21ed754ab @@ -26,6 +26,7 @@ #include "app_state.hh" #include "project.hh" #include "work.hh" +#include "vocab_cast.hh" #ifndef _WIN32 #include "lexical_cast.hh" @@ -157,13 +158,13 @@ namespace commands { bool use_workspace_options, options::options_type const & opts, bool _allow_completion) - : m_primary_name(utf8(primary_name)), + : m_primary_name(utf8(primary_name, origin::internal)), m_parent(parent), m_is_group(is_group), m_hidden(hidden), - m_params(utf8(params)), - m_abstract(utf8(abstract)), - m_desc(utf8(desc)), + m_params(utf8(params, origin::internal)), + m_abstract(utf8(abstract, origin::internal)), + m_desc(utf8(desc, origin::internal)), m_use_workspace_options(use_workspace_options), m_opts(opts), m_allow_completion(_allow_completion) @@ -183,7 +184,7 @@ namespace commands { m_names.insert(m_primary_name); - vector< utf8 > onv = split_into_words(utf8(other_names)); + vector< utf8 > onv = split_into_words(utf8(other_names, origin::internal)); m_names.insert(onv.begin(), onv.end()); } @@ -421,7 +422,7 @@ namespace commands { allow_completion() && completion_ok) { string temp((*iter2)(), 0, prefix().length()); - utf8 p(temp); + utf8 p(temp, origin::internal); if (prefix == p) matches[caux] = child; } @@ -516,7 +517,7 @@ namespace commands command_id id; for (args_vector::const_iterator iter = args.begin(); iter != args.end(); iter++) - id.push_back(utf8((*iter)())); + id.push_back(*iter); set< command_id > matches; @@ -556,7 +557,7 @@ namespace commands if (matches.empty()) { E(false, origin::user, - F("unknown command '%s'") % join_words(id)()); + F("unknown command '%s'") % join_words(id)); } else if (matches.size() == 1) { @@ -602,7 +603,7 @@ namespace commands size_t col = 0; out << " " << tag << " "; - col += display_width(utf8(tag + " ")); + col += display_width(utf8(tag + " ", origin::internal)); out << string(colabstract - col, ' '); col = colabstract; @@ -721,7 +722,7 @@ namespace commands command_id make_command_id(std::string const & path) { - return split_into_words(utf8(path)); + return split_into_words(utf8(path, origin::user)); } void explain_usage(command_id const & ident, ostream & out) @@ -922,19 +923,21 @@ process_commit_message_args(options cons { string msg; join_lines(opts.message, msg); - log_message = utf8(msg); + log_message = utf8(msg, origin::user); if (!opts.no_prefix && message_prefix().length() != 0) - log_message = utf8(message_prefix() + "\n\n" + log_message()); + log_message = utf8(message_prefix() + "\n\n" + log_message(), + origin::user); given = true; } else if (opts.msgfile_given) { data dat; read_data_for_command_line(opts.msgfile, dat); - external dat2 = external(dat()); + external dat2 = typecast_vocab(dat); system_to_utf8(dat2, log_message); if (!opts.no_prefix && message_prefix().length() != 0) - log_message = utf8(message_prefix() + "\n\n" + log_message()); + log_message = utf8(message_prefix() + "\n\n" + log_message(), + origin::user); given = true; } else if (message_prefix().length() != 0) @@ -972,7 +975,7 @@ mkargs(const char *words) static args_vector mkargs(const char *words) { - return split_into_words(arg_type(words)); + return split_into_words(arg_type(words, origin::user)); } UNIT_TEST(commands, make_command_id) ============================================================ --- cset.cc 0259be4135724b31aba52741aa93bc873ba5ef1d +++ cset.cc 42fbd475c9413b93d2df7c8acfe7e877b47467b0 @@ -421,7 +421,7 @@ parse_cset(basic_io::parser & parser, parse_path(parser, p1); parser.esym(syms::attr); parser.str(t1); - pair new_pair(p1, attr_key(t1)); + pair new_pair(p1, attr_key(t1, parser.tok.in.made_from)); I(prev_pair.first.empty() || new_pair > prev_pair); prev_pair = new_pair; safe_insert(cs.attrs_cleared, new_pair); @@ -434,12 +434,12 @@ parse_cset(basic_io::parser & parser, parse_path(parser, p1); parser.esym(syms::attr); parser.str(t1); - pair new_pair(p1, attr_key(t1)); + pair new_pair(p1, attr_key(t1, parser.tok.in.made_from)); I(prev_pair.first.empty() || new_pair > prev_pair); prev_pair = new_pair; parser.esym(syms::value); parser.str(t2); - safe_insert(cs.attrs_set, make_pair(new_pair, attr_value(t2))); + safe_insert(cs.attrs_set, make_pair(new_pair, attr_value(t2, parser.tok.in.made_from))); } } @@ -448,7 +448,7 @@ write_cset(cset const & cs, data & dat) { basic_io::printer pr; print_cset(pr, cs); - dat = data(pr.buf); + dat = data(pr.buf, origin::internal); } void @@ -517,7 +517,7 @@ UNIT_TEST(cset, cset_written) " content [0000000000000000000000000000000000000000]\n" "\n" "add_dir \"pling\"\n"); - data d1(s); + data d1(s, origin::internal); cset cs; UNIT_TEST_CHECK_THROW(read_cset(d1, cs), logic_error); // check that it still fails if there's extra stanzas past the @@ -525,7 +525,8 @@ UNIT_TEST(cset, cset_written) data d2(s + "\n" " set \"bar\"\n" " attr \"flavoursome\"\n" - "value \"mostly\"\n"); + "value \"mostly\"\n", + origin::internal); UNIT_TEST_CHECK_THROW(read_cset(d2, cs), logic_error); } ============================================================ --- database.cc 3d9d4113d29fb9d19293f9bb9c705552fc7685d7 +++ database.cc 62d70e2878b1be02b8ed2d62498f8b3cf01898cd @@ -529,7 +529,7 @@ sqlite3_gunzip_fn(sqlite3_context *f, in data unpacked; const char *val = (const char*) sqlite3_value_blob(args[0]); int bytes = sqlite3_value_bytes(args[0]); - decode_gzip(gzip(string(val,val+bytes)), unpacked); + decode_gzip(gzip(string(val,val+bytes), origin::database), unpacked); sqlite3_result_blob(f, unpacked().c_str(), unpacked().size(), SQLITE_TRANSIENT); } @@ -1554,7 +1554,7 @@ database_impl::get_ids(string const & ta for (size_t i = 0; i < res.size(); ++i) { - ids.insert(id(res[i][0])); + ids.insert(id(res[i][0], origin::database)); } } @@ -1576,7 +1576,7 @@ database_impl::get_file_or_manifest_base query q("SELECT data FROM " + table + " WHERE id = ?"); fetch(res, one_col, one_row, q % blob(ident())); - gzip rdata(res[0][0]); + gzip rdata(res[0][0], origin::database); data rdata_unpacked; decode_gzip(rdata,rdata_unpacked); @@ -1597,7 +1597,7 @@ database_impl::get_file_or_manifest_delt fetch(res, one_col, one_row, q % blob(ident()) % blob(base())); - gzip del_packed(res[0][0]); + gzip del_packed(res[0][0], origin::database); decode_gzip(del_packed, del); } @@ -1619,12 +1619,12 @@ database_impl::get_roster_base(revision_ query q("SELECT checksum, data FROM rosters WHERE id = ?"); fetch(res, 2, one_row, q % blob(ident.inner()())); - id checksum(res[0][0]); + id checksum(res[0][0], origin::database); id calculated; - calculate_ident(data(res[0][1]), calculated); + calculate_ident(data(res[0][1], origin::database), calculated); I(calculated == checksum); - gzip dat_packed(res[0][1]); + gzip dat_packed(res[0][1], origin::database); data dat; decode_gzip(dat_packed, dat); read_roster_and_marking(roster_data(dat), roster, marking); @@ -1639,12 +1639,12 @@ database_impl::get_roster_delta(id const query q("SELECT checksum, delta FROM roster_deltas WHERE id = ? AND base = ?"); fetch(res, 2, one_row, q % blob(ident()) % blob(base())); - id checksum(res[0][0]); + id checksum(res[0][0], origin::database); id calculated; - calculate_ident(data(res[0][1]), calculated); + calculate_ident(data(res[0][1], origin::database), calculated); I(calculated == checksum); - gzip del_packed(res[0][1]); + gzip del_packed(res[0][1], origin::database); delta tmp; decode_gzip(del_packed, tmp); del = roster(tmp); @@ -1682,7 +1682,7 @@ database_impl::write_delayed_roster(revi // ident is a number, and we should calculate a checksum on what // we write id checksum; - calculate_ident(data(dat_packed()), checksum); + calculate_ident(typecast_vocab(dat_packed), checksum); // and then write it execute(query("INSERT INTO rosters (id, checksum, data) VALUES (?, ?, ?)") @@ -1719,7 +1719,7 @@ database_impl::put_roster_delta(revision encode_gzip(del.inner(), del_packed); id checksum; - calculate_ident(data(del_packed()), checksum); + calculate_ident(typecast_vocab(del_packed), checksum); query q("INSERT INTO roster_deltas (id, base, checksum, delta) VALUES (?, ?, ?, ?)"); execute(q @@ -1752,7 +1752,7 @@ struct file_and_manifest_reconstruction_ query q("SELECT base FROM " + delta_table + " WHERE id = ?"); imp.fetch(res, one_col, any_rows, q % blob(from())); for (results::const_iterator i = res.begin(); i != res.end(); ++i) - next.insert(id((*i)[0])); + next.insert(id((*i)[0], origin::database)); } }; @@ -1794,7 +1794,7 @@ database_impl::get_version(id const & id { string tmp; appl->finish(tmp); - vcache.insert_clean(curr, data(tmp)); + vcache.insert_clean(curr, data(tmp, origin::database)); } if (global_sanity.debug_p()) @@ -1809,7 +1809,7 @@ database_impl::get_version(id const & id string tmp; appl->finish(tmp); - dat = data(tmp); + dat = data(tmp, origin::database); id final; calculate_ident(dat, final); @@ -1834,7 +1834,7 @@ struct roster_reconstruction_graph : pub query q("SELECT base FROM roster_deltas WHERE id = ?"); imp.fetch(res, one_col, any_rows, q % blob(from())); for (results::const_iterator i = res.begin(); i != res.end(); ++i) - next.insert(id((*i)[0])); + next.insert(id((*i)[0], origin::database)); } }; @@ -2161,7 +2161,7 @@ database::put_file_version(file_id const { string tmp; invert_xdelta(old_data.inner()(), del.inner()(), tmp); - reverse_delta = file_delta(tmp); + reverse_delta = file_delta(tmp, origin::database); data old_tmp; patch(new_data.inner(), reverse_delta.inner(), old_tmp); // We already have the real old data, so compare the @@ -2206,7 +2206,7 @@ database::get_arbitrary_file_delta(file_ if (!res.empty()) { // Exact hit: a plain delta from src -> dst. - gzip del_packed(res[0][0]); + gzip del_packed(res[0][0], origin::database); decode_gzip(del_packed, dtmp); del = file_delta(dtmp); return; @@ -2221,13 +2221,13 @@ database::get_arbitrary_file_delta(file_ { // We have a delta from dst -> src; we need to // invert this to a delta from src -> dst. - gzip del_packed(res[0][0]); + gzip del_packed(res[0][0], origin::database); decode_gzip(del_packed, dtmp); string fwd_delta; file_data dst; get_file_version(dst_id, dst); invert_xdelta(dst.inner()(), dtmp(), fwd_delta); - del = file_delta(fwd_delta); + del = file_delta(fwd_delta, origin::database); return; } @@ -2251,8 +2251,8 @@ database::get_revision_ancestry(rev_ance imp->fetch(res, 2, any_rows, query("SELECT parent,child FROM revision_ancestry")); for (size_t i = 0; i < res.size(); ++i) - graph.insert(make_pair(revision_id(res[i][0]), - revision_id(res[i][1]))); + graph.insert(make_pair(revision_id(res[i][0], origin::database), + revision_id(res[i][1], origin::database))); } void @@ -2269,7 +2269,7 @@ database::get_revision_parents(revision_ query("SELECT parent FROM revision_ancestry WHERE child = ?") % blob(id.inner()())); for (size_t i = 0; i < res.size(); ++i) - parents.insert(revision_id(res[i][0])); + parents.insert(revision_id(res[i][0], origin::database)); imp->parent_cache.insert(make_pair(id, parents)); } @@ -2289,7 +2289,7 @@ database::get_revision_children(revision query("SELECT child FROM revision_ancestry WHERE parent = ?") % blob(id.inner()())); for (size_t i = 0; i < res.size(); ++i) - children.insert(revision_id(res[i][0])); + children.insert(revision_id(res[i][0], origin::database)); } void @@ -2303,7 +2303,7 @@ database::get_leaves(set & "ON revisions.id = revision_ancestry.parent " "WHERE revision_ancestry.child IS null")); for (size_t i = 0; i < res.size(); ++i) - leaves.insert(revision_id(res[i][0])); + leaves.insert(revision_id(res[i][0], origin::database)); } @@ -2388,7 +2388,7 @@ database::get_revision(revision_id const query("SELECT data FROM revisions WHERE id = ?") % blob(id.inner()())); - gzip gzdata(res[0][0]); + gzip gzdata(res[0][0], origin::database); data rdat; decode_gzip(gzdata,rdat); @@ -2780,7 +2780,7 @@ database::get_key_ids(vectorfetch(res, one_col, any_rows, query("SELECT id FROM public_keys")); for (size_t i = 0; i < res.size(); ++i) - pubkeys.push_back(rsa_keypair_id(res[i][0])); + pubkeys.push_back(rsa_keypair_id(res[i][0], origin::database)); } void @@ -2794,7 +2794,7 @@ database::get_key_ids(globish const & pa for (size_t i = 0; i < res.size(); ++i) if (pattern.matches(res[i][0])) - pubkeys.push_back(rsa_keypair_id(res[i][0])); + pubkeys.push_back(rsa_keypair_id(res[i][0], origin::database)); } void @@ -2804,7 +2804,7 @@ database_impl::get_keys(string const & t results res; fetch(res, one_col, any_rows, query("SELECT id FROM " + table)); for (size_t i = 0; i < res.size(); ++i) - keys.push_back(rsa_keypair_id(res[i][0])); + keys.push_back(rsa_keypair_id(res[i][0], origin::database)); } void @@ -2848,8 +2848,8 @@ database::get_pubkey(id const & hash, imp->fetch(res, 2, one_row, query("SELECT id, keydata FROM public_keys WHERE hash = ?") % blob(hash())); - id = rsa_keypair_id(res[0][0]); - pub = rsa_pub_key(res[0][1]); + id = rsa_keypair_id(res[0][0], origin::database); + pub = rsa_pub_key(res[0][1], origin::database); } void @@ -2860,7 +2860,7 @@ database::get_key(rsa_keypair_id const & imp->fetch(res, one_col, one_row, query("SELECT keydata FROM public_keys WHERE id = ?") % text(pub_id())); - pub = rsa_pub_key(res[0][0]); + pub = rsa_pub_key(res[0][0], origin::database); } bool @@ -2925,7 +2925,8 @@ database::encrypt_rsa(rsa_keypair_id con reinterpret_cast(plaintext.data()), plaintext.size(), *rng); ciphertext = rsa_oaep_sha_data(string(reinterpret_cast(ct.begin()), - ct.size())); + ct.size()), + origin::database); } cert_status @@ -3032,11 +3033,11 @@ database_impl::results_to_certs(results for (size_t i = 0; i < res.size(); ++i) { cert t; - t = cert(revision_id(res[i][0]), - cert_name(res[i][1]), - cert_value(res[i][2]), - rsa_keypair_id(res[i][3]), - rsa_sha1_signature(res[i][4])); + t = cert(revision_id(res[i][0], origin::database), + cert_name(res[i][1], origin::database), + cert_value(res[i][2], origin::database), + rsa_keypair_id(res[i][3], origin::database), + rsa_sha1_signature(res[i][4], origin::database)); certs.push_back(t); } } @@ -3187,9 +3188,9 @@ database::get_revision_cert_nobranch_ind idx.reserve(res.size()); for (results::const_iterator i = res.begin(); i != res.end(); ++i) { - idx.push_back(make_pair(revision_id((*i)[0]), - make_pair(revision_id((*i)[1]), - rsa_keypair_id((*i)[2])))); + idx.push_back(make_pair(revision_id((*i)[0], origin::database), + make_pair(revision_id((*i)[1], origin::database), + rsa_keypair_id((*i)[2], origin::database)))); } return imp->cert_stamper.get_indicator(); } @@ -3250,7 +3251,7 @@ database::get_revisions_with_cert(cert_n query q("SELECT id FROM revision_certs WHERE name = ? AND value = ?"); imp->fetch(res, one_col, any_rows, q % text(name()) % blob(val())); for (results::const_iterator i = res.begin(); i != res.end(); ++i) - revisions.insert(revision_id((*i)[0])); + revisions.insert(revision_id((*i)[0], origin::database)); return imp->cert_stamper.get_indicator(); } @@ -3290,7 +3291,7 @@ database::get_revision_certs(revision_id % blob(ident.inner()())); ts.clear(); for (size_t i = 0; i < res.size(); ++i) - ts.push_back(id(res[i][0])); + ts.push_back(id(res[i][0], origin::database)); return imp->cert_stamper.get_indicator(); } @@ -3419,7 +3420,7 @@ database::complete(string const & partia imp->fetch(res, 1, any_rows, q); for (size_t i = 0; i < res.size(); ++i) - completions.insert(revision_id(res[i][0])); + completions.insert(revision_id(res[i][0], origin::database)); } @@ -3435,7 +3436,7 @@ database::complete(string const & partia imp->fetch(res, 1, any_rows, q); for (size_t i = 0; i < res.size(); ++i) - completions.insert(file_id(res[i][0])); + completions.insert(file_id(res[i][0], origin::database)); res.clear(); @@ -3444,7 +3445,7 @@ database::complete(string const & partia imp->fetch(res, 1, any_rows, q); for (size_t i = 0; i < res.size(); ++i) - completions.insert(file_id(res[i][0])); + completions.insert(file_id(res[i][0], origin::database)); } void @@ -3459,8 +3460,8 @@ database::complete(string const & partia imp->fetch(res, 2, any_rows, q); for (size_t i = 0; i < res.size(); ++i) - completions.insert(make_pair(key_id(res[i][0]), - utf8(res[i][1]))); + completions.insert(make_pair(key_id(res[i][0], origin::database), + utf8(res[i][1], origin::database))); } // revision selectors @@ -3478,7 +3479,7 @@ database::select_parent(string const & p imp->fetch(res, 1, any_rows, q); for (size_t i = 0; i < res.size(); ++i) - completions.insert(revision_id(res[i][0])); + completions.insert(revision_id(res[i][0], origin::database)); } void @@ -3493,7 +3494,7 @@ database::select_cert(string const & cer % text(certname)); for (size_t i = 0; i < res.size(); ++i) - completions.insert(revision_id(res[i][0])); + completions.insert(revision_id(res[i][0], origin::database)); } void @@ -3509,7 +3510,7 @@ database::select_cert(string const & cer % text(certname) % text(certvalue)); for (size_t i = 0; i < res.size(); ++i) - completions.insert(revision_id(res[i][0])); + completions.insert(revision_id(res[i][0], origin::database)); } void @@ -3529,7 +3530,7 @@ database::select_author_tag_or_branch(st % text(branch_cert_name()) % text(pattern)); for (size_t i = 0; i < res.size(); ++i) - completions.insert(revision_id(res[i][0])); + completions.insert(revision_id(res[i][0], origin::database)); } void @@ -3548,7 +3549,7 @@ database::select_date(string const & dat imp->fetch(res, 1, any_rows, q % text(date_cert_name()) % text(date)); for (size_t i = 0; i < res.size(); ++i) - completions.insert(revision_id(res[i][0])); + completions.insert(revision_id(res[i][0], origin::database)); } // epochs @@ -3561,10 +3562,11 @@ database::get_epochs(mapfetch(res, 2, any_rows, query("SELECT branch, epoch FROM branch_epochs")); for (results::const_iterator i = res.begin(); i != res.end(); ++i) { - branch_name decoded(idx(*i, 0)); + branch_name decoded(idx(*i, 0), origin::database); I(epochs.find(decoded) == epochs.end()); epochs.insert(make_pair(decoded, - epoch_data(idx(*i, 1)))); + epoch_data(idx(*i, 1), + origin::database))); } } @@ -3579,8 +3581,8 @@ database::get_epoch(epoch_id const & eid " WHERE hash = ?") % blob(eid.inner()())); I(res.size() == 1); - branch = branch_name(idx(idx(res, 0), 0)); - epo = epoch_data(idx(idx(res, 0), 1)); + branch = branch_name(idx(idx(res, 0), 0), origin::database); + epo = epoch_data(idx(idx(res, 0), 1), origin::database); } bool @@ -3634,9 +3636,9 @@ database::get_vars(mapfetch(res, 3, any_rows, query("SELECT domain, name, value FROM db_vars")); for (results::const_iterator i = res.begin(); i != res.end(); ++i) { - var_domain domain(idx(*i, 0)); - var_name name(idx(*i, 1)); - var_value value(idx(*i, 2)); + var_domain domain(idx(*i, 0), origin::database); + var_name name(idx(*i, 1), origin::database); + var_value value(idx(*i, 2), origin::database); I(vars.find(make_pair(domain, name)) == vars.end()); vars.insert(make_pair(make_pair(domain, name), value)); } ============================================================ --- diff_patch.cc 7c5ca596824810b2dc3a892c79128d65f4887230 +++ diff_patch.cc b23b03a134bdb27df76d383dbb0b03a9b62f5e37 @@ -860,7 +860,7 @@ content_merger::attempt_auto_merge(file_ string tmp; join_lines(merged_lines, tmp); - merge_data = file_data(tmp); + merge_data = file_data(tmp, origin::internal); return true; } ============================================================ --- epoch.cc 5c0aae3af816fe0826b864e4e72ddb7cbdd0364c +++ epoch.cc f7ced1d6a1019a2cd594a38c62f9794aaa48cb16 @@ -25,8 +25,9 @@ read_epoch(string const & in, data raw_epoch; extract_variable_length_string(in, raw_branch, pos, "epoch, branch name"); raw_epoch = data(extract_substring(in, pos, constants::epochlen_bytes, - "epoch, epoch data")); - branch = branch_name(raw_branch); + "epoch, epoch data"), + origin::network); + branch = branch_name(raw_branch, origin::network); epoch = epoch_data(raw_epoch); } @@ -44,7 +45,7 @@ epoch_hash_code(branch_name const & bran { string tmp(branch() + ":" + encode_hexenc(epoch.inner()(), epoch.inner().made_from)); - data tdat(tmp); + data tdat(tmp, origin::internal); id out; calculate_ident(tdat, out); eid = epoch_id(out); ============================================================ --- file_io.cc 32936506f831439ea55881b29b7f39ad3423f813 +++ file_io.cc f4da4a09b6bc7aafd0baa56609b0119c53b8fbac @@ -20,6 +20,7 @@ #include "charset.hh" #include "platform-wrapped.hh" #include "numeric_vocab.hh" +#include "vocab_cast.hh" // this file deals with talking to the filesystem, loading and // saving files. @@ -340,7 +341,11 @@ read_data(any_path const & p, data & dat unfiltered_pipe->start_msg(); file >> *unfiltered_pipe; unfiltered_pipe->end_msg(); - dat = data(unfiltered_pipe->read_all_as_string(Botan::Pipe::LAST_MESSAGE)); + origin::type data_from = p.made_from; + if (data_from != origin::internal || data_from == origin::database) + data_from = origin::system; + dat = data(unfiltered_pipe->read_all_as_string(Botan::Pipe::LAST_MESSAGE), + data_from); } void read_directory(any_path const & path, @@ -365,7 +370,8 @@ read_data_stdin(data & dat) unfiltered_pipe->start_msg(); cin >> *unfiltered_pipe; unfiltered_pipe->end_msg(); - dat = data(unfiltered_pipe->read_all_as_string(Botan::Pipe::LAST_MESSAGE)); + dat = data(unfiltered_pipe->read_all_as_string(Botan::Pipe::LAST_MESSAGE), + origin::user); } void @@ -459,9 +465,9 @@ safe_compose(file_path const & path, pat // sort of diagnostic to issue. utf8 badpth; if (path.empty()) - badpth = utf8(pc()); + badpth = typecast_vocab(pc); else - badpth = utf8(path.as_internal() + "/" + pc()); + badpth = utf8(path.as_internal() + "/" + pc(), pc.made_from); if (!isdir) W(F("skipping file '%s' with unsupported name") % badpth); @@ -570,7 +576,8 @@ calculate_ident(file_path const & file, Botan::DataSource_Stream infile(file.as_external(), true); p->process_msg(infile); - ident = file_id(p->read_all_as_string(Botan::Pipe::LAST_MESSAGE)); + ident = file_id(p->read_all_as_string(Botan::Pipe::LAST_MESSAGE), + origin::internal); } // Local Variables: ============================================================ --- globish.cc 3aecf8455aa7c028b29afd3d5437560dbf039bc3 +++ globish.cc d4ca5ed4bc475b8f3f06a7b028265817344120d7 @@ -273,15 +273,19 @@ globish::globish(string const & p, origi } globish::globish(string const & p, origin::type made_from) - : compiled_pattern(compile(p, made_from)) {} + : origin_aware(made_from), + compiled_pattern(compile(p, made_from)) {} globish::globish(char const * p, origin::type made_from) - : compiled_pattern(compile(p, made_from)) {} + : origin_aware(made_from), + compiled_pattern(compile(p, made_from)) {} globish::globish(vector const & p) - : compiled_pattern(compile(p.begin(), p.end())) {} + : origin_aware(origin::user), + compiled_pattern(compile(p.begin(), p.end())) {} globish::globish(vector::const_iterator const & beg, vector::const_iterator const & end) - : compiled_pattern(compile(beg, end)) {} + : origin_aware(origin::user), + compiled_pattern(compile(beg, end)) {} // Debugging. @@ -622,9 +626,9 @@ UNIT_TEST(globish, from_vector) UNIT_TEST(globish, from_vector) { vector v; - v.push_back(arg_type("a")); - v.push_back(arg_type("b")); - v.push_back(arg_type("c")); + v.push_back(arg_type("a", origin::internal)); + v.push_back(arg_type("b", origin::internal)); + v.push_back(arg_type("c", origin::internal)); globish combined(v); string s; dump(combined, s); ============================================================ --- globish.hh 8d7ef6431c1eacbf925e91d0c2fee37e5b3d8b8f +++ globish.hh 52afd9b82e2cf0a8b2e61ee60d0e6afa12ce6f13 @@ -44,11 +44,12 @@ // empty string. this hardly ever matters, but it's nice to have some way // to say "don't exclude anything", for instance. +#include "origin_type.hh" #include "vector.hh" class arg_type; -struct globish +struct globish : origin_aware { globish() : compiled_pattern() {} globish(char const * pat, origin::type made_from); ============================================================ --- graph.cc cc8e1d1fb26fbb9d80096ed8d7a5f023a7b7f039 +++ graph.cc 368b65052543a7885b010e4f2c8b7d19c6e62ecd @@ -179,7 +179,7 @@ make_random_reconstruction_graph(size_t { id hash; string s(lexical_cast(i)); - calculate_ident(data(s), hash); + calculate_ident(data(s, origin::internal), hash); all_nodes.push_back(hash); } // We put a single long chain of edges in, to make sure that everything is ============================================================ --- inodeprint.cc 1482e819fc5fd5e4d7ac52c025b3a6b85ab6c12f +++ inodeprint.cc 942d57dffd39262762ab2951b15a94c93b7b1e34 @@ -19,6 +19,7 @@ #include "transforms.hh" #include "constants.hh" #include "basic_io.hh" +#include "vocab_cast.hh" #include "botan/botan.h" #include "botan/sha160.h" @@ -78,7 +79,8 @@ read_inodeprint_map(data const & dat, pa.hex(print); ipm.insert(inodeprint_entry(file_path_internal(path), - hexenc(print))); + hexenc(print, + origin::workspace))); } I(src.lookahead == EOF); } @@ -98,10 +100,10 @@ write_inodeprint_map(inodeprint_map cons { basic_io::stanza st; st.push_file_pair(syms::file, i->first); - st.push_hex_pair(syms::print, hexenc(i->second())); + st.push_hex_pair(syms::print, typecast_vocab >(i->second)); pr.print_stanza(st); } - dat = data(pr.buf); + dat = data(pr.buf, origin::internal); } class my_iprint_calc : public inodeprint_calculator @@ -143,7 +145,7 @@ bool inodeprint_file(file_path const & f { my_iprint_calc calc; bool ret = inodeprint_file(file.as_external(), calc); - inodeprint ip_raw(calc.str()); + inodeprint ip_raw(calc.str(), origin::internal); if (!ret) ip_raw = inodeprint(""); encode_hexenc(ip_raw, ip); ============================================================ --- key_store.cc c08df090bab954291bbc6296aef75f15a9090a12 +++ key_store.cc e11141e0fa1143dece96d218a45417c92da2b84e @@ -286,7 +286,7 @@ key_store_state::get_key_file(rsa_keypai if (leaf.at(i) == '+') leaf.at(i) = '_'; - file = key_dir / path_component(leaf); + file = key_dir / path_component(leaf, origin::internal); } void @@ -296,7 +296,7 @@ key_store_state::write_key(rsa_keypair_i ostringstream oss; packet_writer pw(oss); pw.consume_key_pair(ident, kp); - data dat(oss.str()); + data dat(oss.str(), ident.made_from); system_path file; get_key_file(ident, file); @@ -404,7 +404,7 @@ key_store_state::decrypt_private_key(rsa string lua_phrase; // See whether a lua hook will tell us the passphrase. if (!force_from_user && lua.hook_get_passphrase(id, lua_phrase)) - phrase = utf8(lua_phrase); + phrase = utf8(lua_phrase, origin::user); else get_passphrase(phrase, id, false, false); @@ -501,13 +501,15 @@ key_store::create_key_pair(database & db else Botan::PKCS8::encode(priv, *unfiltered_pipe); unfiltered_pipe->end_msg(); - kp.priv = rsa_priv_key(unfiltered_pipe->read_all_as_string(Pipe::LAST_MESSAGE)); + kp.priv = rsa_priv_key(unfiltered_pipe->read_all_as_string(Pipe::LAST_MESSAGE), + origin::internal); // serialize the public key unfiltered_pipe->start_msg(); Botan::X509::encode(priv, *unfiltered_pipe, Botan::RAW_BER); unfiltered_pipe->end_msg(); - kp.pub = rsa_pub_key(unfiltered_pipe->read_all_as_string(Pipe::LAST_MESSAGE)); + kp.pub = rsa_pub_key(unfiltered_pipe->read_all_as_string(Pipe::LAST_MESSAGE), + origin::internal); // convert to storage format L(FL("generated %d-byte public key\n" @@ -547,7 +549,8 @@ key_store::change_key_passphrase(rsa_key "PBE-PKCS5v20(SHA-1,TripleDES/CBC)", Botan::RAW_BER); unfiltered_pipe->end_msg(); - kp.priv = rsa_priv_key(unfiltered_pipe->read_all_as_string(Pipe::LAST_MESSAGE)); + kp.priv = rsa_priv_key(unfiltered_pipe->read_all_as_string(Pipe::LAST_MESSAGE), + origin::internal); delete_key(id); put_key_pair(id, kp); @@ -680,7 +683,7 @@ key_store::make_signature(database & db, } L(FL("make_signature: produced %d-byte signature") % sig_string.size()); - signature = rsa_sha1_signature(sig_string); + signature = rsa_sha1_signature(sig_string, origin::internal); cert_status s = db.check_signature(id, tosign, signature); I(s != cert_unknown); @@ -743,7 +746,7 @@ key_store_state::migrate_old_key_pair // See whether a lua hook will tell us the passphrase. string lua_phrase; if (lua.hook_get_passphrase(id, lua_phrase)) - phrase = utf8(lua_phrase); + phrase = utf8(lua_phrase, origin::user); else get_passphrase(phrase, id, false, false); @@ -789,7 +792,8 @@ key_store_state::migrate_old_key_pair "PBE-PKCS5v20(SHA-1,TripleDES/CBC)", Botan::RAW_BER); unfiltered_pipe->end_msg(); - kp.priv = rsa_priv_key(unfiltered_pipe->read_all_as_string(Pipe::LAST_MESSAGE)); + kp.priv = rsa_priv_key(unfiltered_pipe->read_all_as_string(Pipe::LAST_MESSAGE), + origin::internal); // also the public key (which is derivable from the private key; asking // Botan for the X.509 encoding of the private key implies that we want @@ -797,7 +801,8 @@ key_store_state::migrate_old_key_pair unfiltered_pipe->start_msg(); Botan::X509::encode(*priv_key, *unfiltered_pipe, Botan::RAW_BER); unfiltered_pipe->end_msg(); - kp.pub = rsa_pub_key(unfiltered_pipe->read_all_as_string(Pipe::LAST_MESSAGE)); + kp.pub = rsa_pub_key(unfiltered_pipe->read_all_as_string(Pipe::LAST_MESSAGE), + origin::internal); // if the database had a public key entry for this key, make sure it // matches what we derived from the private key entry, but don't abort the ============================================================ --- keys.cc da37ab87e4ee6f7873d436d60f665f0da59c1787 +++ keys.cc dc4b299f4dd152486ecc4c27b8a62b6994be621d @@ -179,7 +179,8 @@ key_hash_code(rsa_keypair_id const & ide rsa_pub_key const & pub, id & out) { - data tdat(ident() + ":" + remove_ws(encode_base64(pub)())); + data tdat(ident() + ":" + remove_ws(encode_base64(pub)()), + origin::internal); calculate_ident(tdat, out); } @@ -188,7 +189,8 @@ key_hash_code(rsa_keypair_id const & ide rsa_priv_key const & priv, id & out) { - data tdat(ident() + ":" + remove_ws(encode_base64(priv)())); + data tdat(ident() + ":" + remove_ws(encode_base64(priv)()), + origin::internal); calculate_ident(tdat, out); } ============================================================ --- lua_hooks.cc 9bb40884a42b3741cb72c918b905357456dee3ce +++ lua_hooks.cc 246a3c65f82857649c0cb86e225af19717cd60a0 @@ -292,7 +292,7 @@ lua_hooks::hook_get_branch_key(branch_na .extract_str(key) .ok(); - k = rsa_keypair_id(key); + k = rsa_keypair_id(key, origin::user); return ok; } @@ -323,7 +323,7 @@ lua_hooks::hook_edit_comment(external co .call(2,1) .extract_str(result_str) .ok(); - result = external(result_str); + result = external(result_str, origin::user); return is_ok; } @@ -500,7 +500,7 @@ lua_hooks::hook_merge3(file_path const & .call(7,1) .extract_str(res) .ok(); - result = data(res); + result = data(res, origin::user); return ok; } @@ -589,7 +589,7 @@ lua_hooks::hook_get_default_command_opti { std::string arg; ll.extract_str(arg).pop(); - args.push_back(arg_type(arg)); + args.push_back(arg_type(arg, origin::user)); } return ll.ok() && !args.empty(); } @@ -645,7 +645,7 @@ lua_hooks::hook_get_netsync_key(utf8 con if (!exec_ok) key_id = ""; - k = rsa_keypair_id(key_id); + k = rsa_keypair_id(key_id, origin::user); return exec_ok; } @@ -1196,7 +1196,7 @@ LUAEXT(alias_command, ) F("%s called with an invalid parameter") % "alias_command"); args_vector args; - args.push_back(arg_type(old_cmd)); + args.push_back(arg_type(old_cmd, origin::user)); commands::command_id id = commands::complete_command(args); commands::command *old_cmd_p = CMD_REF(__root__)->find_command(id); ============================================================ --- merkle_tree.cc 91579fce8e09786f63da45f12b5ac9ce5f3c65e1 +++ merkle_tree.cc 9cc62123fed82d5413c286ca1724be3d7d901243 @@ -37,7 +37,7 @@ bitset_to_prefix(dynamic_bitset= constants::merkle_hash_length_in_bytes); - return id(out.substr(0, constants::merkle_hash_length_in_bytes)); + return id(out.substr(0, constants::merkle_hash_length_in_bytes), + origin::internal); } void ============================================================ --- netcmd.cc 5fdb6c151fe6bc04b5304bf8510ddcd0a8e76ae7 +++ netcmd.cc 6252b7c1fa1a3bcead8a75d6e881ad44ea95053e @@ -463,7 +463,7 @@ netcmd::write_data_cmd(netcmd_item_type if (dat.size() > constants::netcmd_minimum_bytes_to_bother_with_gzip) { gzip zdat; - encode_gzip(data(dat), zdat); + encode_gzip(data(dat, origin::internal), zdat); payload += static_cast(1); // compressed flag insert_variable_length_string(zdat(), payload); } @@ -648,7 +648,7 @@ UNIT_TEST(netcmd, functions) string buf; rsa_keypair_id out_server_keyname("address@hidden"), in_server_keyname; rsa_pub_key out_server_key("9387938749238792874"), in_server_key; - id out_nonce(raw_sha1("nonce it up")), in_nonce; + id out_nonce(raw_sha1("nonce it up"), origin::internal), in_nonce; out_cmd.write_hello_cmd(out_server_keyname, out_server_key, out_nonce); do_netcmd_roundtrip(out_cmd, in_cmd, buf); in_cmd.read_hello_cmd(in_server_keyname, in_server_key, in_nonce); @@ -702,12 +702,14 @@ UNIT_TEST(netcmd, functions) netcmd out_cmd, in_cmd; protocol_role out_role = source_and_sink_role, in_role; string buf; - id out_client(raw_sha1("happy client day")), out_nonce1(raw_sha1("nonce me amadeus")), - in_client, in_nonce1; + id out_client(raw_sha1("happy client day"), origin::internal); + id out_nonce1(raw_sha1("nonce me amadeus"), origin::internal); + id in_client, in_nonce1; // total cheat, since we don't actually verify that rsa_oaep_sha_data // is sensible anywhere here... rsa_oaep_sha_data out_key("nonce start my heart"), in_key; - rsa_sha1_signature out_signature(raw_sha1("burble") + raw_sha1("gorby")), in_signature; + rsa_sha1_signature out_signature(raw_sha1("burble") + raw_sha1("gorby"), + origin::internal), in_signature; globish out_include_pattern("radishes galore!", origin::user), in_include_pattern; globish out_exclude_pattern("turnips galore!", origin::user), @@ -747,10 +749,10 @@ UNIT_TEST(netcmd, functions) refinement_type out_ty (refinement_query), in_ty(refinement_response); merkle_node out_node, in_node; - out_node.set_raw_slot(0, id(raw_sha1("The police pulled Kris Kringle over"))); - out_node.set_raw_slot(3, id(raw_sha1("Kris Kringle tried to escape from the police"))); - out_node.set_raw_slot(8, id(raw_sha1("He was arrested for auto theft"))); - out_node.set_raw_slot(15, id(raw_sha1("He was whisked away to jail"))); + out_node.set_raw_slot(0, id(raw_sha1("The police pulled Kris Kringle over"), origin::internal)); + out_node.set_raw_slot(3, id(raw_sha1("Kris Kringle tried to escape from the police"), origin::internal)); + out_node.set_raw_slot(8, id(raw_sha1("He was arrested for auto theft"), origin::internal)); + out_node.set_raw_slot(15, id(raw_sha1("He was whisked away to jail"), origin::internal)); out_node.set_slot_state(0, subtree_state); out_node.set_slot_state(3, leaf_state); out_node.set_slot_state(8, leaf_state); @@ -785,7 +787,7 @@ UNIT_TEST(netcmd, functions) L(FL("checking i/o round trip on data_cmd")); netcmd out_cmd, in_cmd; netcmd_item_type out_type(file_item), in_type(key_item); - id out_id(raw_sha1("tuna is not yummy")), in_id; + id out_id(raw_sha1("tuna is not yummy"), origin::internal), in_id; string out_dat("thank you for flying northwest"), in_dat; string buf; out_cmd.write_data_cmd(out_type, out_id, out_dat); @@ -801,8 +803,8 @@ UNIT_TEST(netcmd, functions) L(FL("checking i/o round trip on delta_cmd")); netcmd out_cmd, in_cmd; netcmd_item_type out_type(file_item), in_type(key_item); - id out_head(raw_sha1("your seat cusion can be reused")), in_head; - id out_base(raw_sha1("as a floatation device")), in_base; + id out_head(raw_sha1("your seat cusion can be reused"), origin::internal), in_head; + id out_base(raw_sha1("as a floatation device"), origin::internal), in_base; delta out_delta("goodness, this is not an xdelta"), in_delta; string buf; ============================================================ --- netsync.cc ca897ef7d27e13414e4514e0a0a73485223e16f2 +++ netsync.cc bd455bf5537bd9b1d6dc33a255ad3fd9aec03a74 @@ -48,6 +48,7 @@ #include "globish.hh" #include "uri.hh" #include "options.hh" +#include "vocab_cast.hh" #include "botan/botan.h" @@ -293,8 +294,8 @@ read_pubkey(string const & in, size_t pos = 0; extract_variable_length_string(in, tmp_id, pos, "pubkey id"); extract_variable_length_string(in, tmp_key, pos, "pubkey value"); - id = rsa_keypair_id(tmp_id); - pub = rsa_pub_key(tmp_key); + id = rsa_keypair_id(tmp_id, origin::network); + pub = rsa_pub_key(tmp_key, origin::network); } static void @@ -1081,7 +1082,8 @@ session::mk_nonce() char buf[constants::merkle_hash_length_in_bytes]; keys.get_rng().randomize(reinterpret_cast(buf), constants::merkle_hash_length_in_bytes); - this->saved_nonce = id(string(buf, buf + constants::merkle_hash_length_in_bytes)); + this->saved_nonce = id(string(buf, buf + constants::merkle_hash_length_in_bytes), + origin::internal); I(this->saved_nonce().size() == constants::merkle_hash_length_in_bytes); return this->saved_nonce; } @@ -1089,7 +1091,7 @@ session::set_session_key(string const & void session::set_session_key(string const & key) { - session_key = netsync_session_key(key); + session_key = netsync_session_key(key, origin::internal); read_hmac.set_key(session_key); write_hmac.set_key(session_key); } @@ -1584,11 +1586,12 @@ session::process_hello_cmd(rsa_keypair_i { hexenc encoded_key_hash; encode_hexenc(their_key_hash, encoded_key_hash); - printable_key_hash = var_value(encoded_key_hash()); + printable_key_hash = typecast_vocab(encoded_key_hash); } L(FL("server key has name %s, hash %s") % their_keyname % printable_key_hash); - var_key their_key_key(known_servers_domain, var_name(peer_id)); + var_key their_key_key(known_servers_domain, + var_name(peer_id, origin::internal)); if (project.db.var_exists(their_key_key)) { var_value expected_key_hash; @@ -2365,7 +2368,8 @@ session::process_usher_cmd(utf8 const & L(FL("Received greeting from usher: %s") % msg().substr(1)); } netcmd cmdout; - cmdout.write_usher_reply_cmd(utf8(peer_id), our_include_pattern); + cmdout.write_usher_reply_cmd(utf8(peer_id, origin::internal), + our_include_pattern); write_netcmd_and_try_flush(cmdout); L(FL("Sent reply.")); return true; @@ -3150,7 +3154,7 @@ session_from_server_sync_item(options & server_initiated_sync_request const & request) { netsync_connection_info info; - info.client.unparsed = utf8(request.address); + info.client.unparsed = utf8(request.address, origin::user); info.client.include_pattern = globish(request.include, origin::user); info.client.exclude_pattern = globish(request.exclude, origin::user); info.client.use_argv = false; @@ -3354,7 +3358,8 @@ session::rebuild_merkle_trees(set epochs; project.db.get_epochs(epochs); - epoch_data epoch_zero(string(constants::epochlen_bytes, '\x00')); + epoch_data epoch_zero(string(constants::epochlen_bytes, '\x00'), + origin::internal); for (set::const_iterator i = branchnames.begin(); i != branchnames.end(); ++i) { ============================================================ --- option.cc db3fe9dfed69f51694a2a28a705f24a78ab086f9 +++ option.cc c7f033f0f2e4251e7fba65d99983d01a3cf18b53 @@ -217,7 +217,7 @@ tokenize_for_command_line(string const & if (type == none) { if (have_tok) - to.push_back(arg_type(cur)); + to.push_back(arg_type(cur, origin::user)); cur.clear(); have_tok = false; } @@ -234,14 +234,14 @@ tokenize_for_command_line(string const & } } if (have_tok) - to.push_back(arg_type(cur)); + to.push_back(arg_type(cur, origin::user)); } void concrete_option_set::from_command_line(int argc, char const * const * argv) { args_vector arguments; for (int i = 1; i < argc; ++i) - arguments.push_back(arg_type(argv[i])); + arguments.push_back(arg_type(argv[i], origin::user)); from_command_line(arguments, true); } @@ -316,7 +316,7 @@ void concrete_option_set::from_command_l arg = idx(args,i+1); } else - arg = arg_type(idx(args,i)().substr(equals+1)); + arg = arg_type(idx(args,i)().substr(equals+1), origin::user); } } else if (idx(args,i)().substr(0,1) == "-") @@ -337,7 +337,7 @@ void concrete_option_set::from_command_l arg = idx(args,i+1); } else - arg = arg_type(idx(args,i)().substr(2)); + arg = arg_type(idx(args,i)().substr(2), origin::user); } } else @@ -393,7 +393,7 @@ void concrete_option_set::from_key_value i != keyvals.end(); ++i) { string const & key(i->first); - arg_type const & value(arg_type(i->second)); + arg_type const & value(arg_type(i->second, origin::user)); concrete_option o = getopt(by_name, key); @@ -513,10 +513,10 @@ UNIT_TEST(option, concrete_options) { args_vector cmdline; - cmdline.push_back(arg_type("--bool")); - cmdline.push_back(arg_type("-s")); - cmdline.push_back(arg_type("-s")); - cmdline.push_back(arg_type("foo")); + cmdline.push_back(arg_type("--bool", origin::internal)); + cmdline.push_back(arg_type("-s", origin::internal)); + cmdline.push_back(arg_type("-s", origin::internal)); + cmdline.push_back(arg_type("foo", origin::internal)); os.from_command_line(cmdline); } UNIT_TEST_CHECK(b); ============================================================ --- option.hh 2d2b4949004f5ad7040601b41f78fb7c8af6beb1 +++ option.hh 6b3ac60b406b88700b06236224b311daed0894d5 @@ -28,7 +28,7 @@ public: class arg_type : public utf8 { public: explicit arg_type(void) : utf8() {} - explicit arg_type(std::string const & s) : utf8(s) {} + //explicit arg_type(std::string const & s) : utf8(s) {} arg_type(std::string const & s, origin::type f) : utf8(s, f) {} explicit arg_type(utf8 const & u) : utf8(u) {} }; ============================================================ --- origin_type.hh 83986c9ae7a38a915c2ccd791f5409713e4c7587 +++ origin_type.hh 54082f23fb5a6cb64e725fe44df7b06517224222 @@ -14,6 +14,15 @@ namespace origin { }; } +// Something that knows where it came from. +class origin_aware +{ +public: + origin::type made_from; + origin_aware() : made_from(origin::internal) {} + origin_aware(origin::type m) : made_from(m) {} +}; + // Local Variables: // mode: C++ // c-file-style: "gnu" ============================================================ --- packet.cc b03a705bacfefcd03be113ad27cb8139cce85915 +++ packet.cc e5854ef14c0f8bfd6d308cc1adcecf2d2fe4ddc9 @@ -195,7 +195,7 @@ namespace id src_hash(decode_hexenc_as(src_id, made_from)), dst_hash(decode_hexenc_as(dst_id, made_from)); delta contents; - unpack(base64 >(body), contents); + unpack(base64 >(body, made_from), contents); cons.consume_file_delta(file_id(src_hash), file_id(dst_hash), file_delta(contents)); @@ -239,7 +239,7 @@ namespace validate_key(args); validate_base64(body); - cons.consume_public_key(rsa_keypair_id(args), + cons.consume_public_key(rsa_keypair_id(args, made_from), decode_base64_as(body, made_from)); } @@ -401,6 +401,7 @@ read_packets(istream & in, packet_consum #ifdef BUILD_UNIT_TESTS #include "unit_tests.hh" #include "xdelta.hh" +#include "vocab_cast.hh" using std::ostringstream; @@ -514,7 +515,7 @@ UNIT_TEST(packet, roundabout) // cert now accepts revision_id exclusively, so we need to cast the // file_id to create a cert to test the packet writer with. - cert c(revision_id(fid.inner()()), cert_name("smell"), val, + cert c(typecast_vocab(fid.inner()), cert_name("smell"), val, rsa_keypair_id("address@hidden"), sig); pw.consume_revision_cert(revision(c)); ============================================================ --- paths.cc 3dbef065748bfed896a414be6c370a9e154f3d77 +++ paths.cc c2bbab0e0a0e50607f11cf4b1833cb1467fac0e6 @@ -404,17 +404,17 @@ path_component::path_component(utf8 cons // but is not acceptable to bad_component (above) and therefore we have // to open-code most of those checks. path_component::path_component(utf8 const & d) - : data(d()) + : origin_aware(d.made_from), data(d()) { MM(data); I(!has_bad_component_chars(data) && data != "." && data != ".."); } -path_component::path_component(string const & d) - : data(d) +path_component::path_component(string const & d, origin::type whence) + : origin_aware(whence), data(d) { MM(data); - I(utf8_validate(utf8(data)) + I(utf8_validate(utf8(data, origin::internal)) && !has_bad_component_chars(data) && data != "." && data != ".."); } @@ -423,7 +423,7 @@ path_component::path_component(char cons : data(d) { MM(data); - I(utf8_validate(utf8(data)) + I(utf8_validate(utf8(data, origin::internal)) && !has_bad_component_chars(data) && data != "." && data != ".."); } @@ -445,7 +445,7 @@ file_path::file_path(file_path::source_t file_path::file_path(file_path::source_type type, string const & path, bool to_workspace_root) { MM(path); - I(utf8_validate(utf8(path))); + I(utf8_validate(utf8(path, origin::internal))); if (type == external) { string normalized; @@ -460,10 +460,12 @@ file_path::file_path(file_path::source_t I(is_valid_internal(data)); } -file_path::file_path(file_path::source_type type, utf8 const & path, bool to_workspace_root) +file_path::file_path(file_path::source_type type, utf8 const & path, + bool to_workspace_root) + : any_path(path.made_from) { MM(path); - I(utf8_validate(path)); + E(utf8_validate(path), made_from, F("Invalid utf8")); if (type == external) { string normalized; @@ -506,7 +508,7 @@ bookkeeping_path::external_string_is_boo { return false; } - return internal_string_is_bookkeeping_path(utf8(normalized)); + return internal_string_is_bookkeeping_path(utf8(normalized, path.made_from)); } bool bookkeeping_path::internal_string_is_bookkeeping_path(utf8 const & path) { @@ -659,7 +661,7 @@ any_path::as_external() const // not much, though, because utf8_to_system_string does all the hard work. // it is carefully optimized. do not screw it up. external out; - utf8_to_system_strict(utf8(data), out); + utf8_to_system_strict(utf8(data, made_from), out); return out(); #endif } @@ -832,7 +834,7 @@ new_optimal_path(std::string path, bool boost::shared_ptr new_optimal_path(std::string path, bool to_workspace_root) { - utf8 const utf8_path = utf8(path); + utf8 const utf8_path = utf8(path, origin::user); string normalized; try { @@ -1911,10 +1913,12 @@ UNIT_TEST(paths, test_internal_string_is 0 }; for (char const * const * c = yes; *c; ++c) UNIT_TEST_CHECK(bookkeeping_path - ::internal_string_is_bookkeeping_path(utf8(std::string(*c)))); + ::internal_string_is_bookkeeping_path(utf8(std::string(*c), + origin::internal))); for (char const * const * c = no; *c; ++c) UNIT_TEST_CHECK(!bookkeeping_path - ::internal_string_is_bookkeeping_path(utf8(std::string(*c)))); + ::internal_string_is_bookkeeping_path(utf8(std::string(*c), + origin::internal))); } UNIT_TEST(paths, test_external_string_is_bookkeeping_path_prefix_none) @@ -1933,10 +1937,12 @@ UNIT_TEST(paths, test_external_string_is 0 }; for (char const * const * c = yes; *c; ++c) UNIT_TEST_CHECK(bookkeeping_path - ::external_string_is_bookkeeping_path(utf8(std::string(*c)))); + ::external_string_is_bookkeeping_path(utf8(std::string(*c), + origin::internal))); for (char const * const * c = no; *c; ++c) UNIT_TEST_CHECK(!bookkeeping_path - ::external_string_is_bookkeeping_path(utf8(std::string(*c)))); + ::external_string_is_bookkeeping_path(utf8(std::string(*c), + origin::internal))); } UNIT_TEST(paths, test_external_string_is_bookkeeping_path_prefix_a_b) @@ -1957,10 +1963,12 @@ UNIT_TEST(paths, test_external_string_is 0 }; for (char const * const * c = yes; *c; ++c) UNIT_TEST_CHECK(bookkeeping_path - ::external_string_is_bookkeeping_path(utf8(std::string(*c)))); + ::external_string_is_bookkeeping_path(utf8(std::string(*c), + origin::internal))); for (char const * const * c = no; *c; ++c) UNIT_TEST_CHECK(!bookkeeping_path - ::external_string_is_bookkeeping_path(utf8(std::string(*c)))); + ::external_string_is_bookkeeping_path(utf8(std::string(*c), + origin::internal))); } UNIT_TEST(paths, test_external_string_is_bookkeeping_path_prefix__MTN) @@ -1985,10 +1993,12 @@ UNIT_TEST(paths, test_external_string_is 0 }; for (char const * const * c = yes; *c; ++c) UNIT_TEST_CHECK(bookkeeping_path - ::external_string_is_bookkeeping_path(utf8(std::string(*c)))); + ::external_string_is_bookkeeping_path(utf8(std::string(*c), + origin::internal))); for (char const * const * c = no; *c; ++c) UNIT_TEST_CHECK(!bookkeeping_path - ::external_string_is_bookkeeping_path(utf8(std::string(*c)))); + ::external_string_is_bookkeeping_path(utf8(std::string(*c), + origin::internal))); } #endif // BUILD_UNIT_TESTS ============================================================ --- paths.hh dc8439eff099b017dacdb4220da15142a8dbdf30 +++ paths.hh 10edc3da4ba3b6f157a5d03e100ee7dc8bb64346 @@ -115,12 +115,12 @@ class utf8; // for the basename of the root directory. It resembles, but is not, a // vocab type. -class path_component +class path_component : public origin_aware { public: path_component() : data() {} explicit path_component(utf8 const &); - explicit path_component(std::string const &); + path_component(std::string const &, origin::type); explicit path_component(char const *); std::string const & operator()() const { return data; } @@ -154,7 +154,7 @@ template <> void dump(path_component con // It's possible this will become a proper virtual interface in the future, // but since the implementation is exactly the same in all cases, there isn't // much point ATM... -class any_path +class any_path : public origin_aware { public: // converts to native charset and path syntax @@ -174,13 +174,14 @@ public: any_path dirname() const; any_path(any_path const & other) - : data(other.data) {} + : origin_aware(other.made_from), data(other.data) {} any_path & operator=(any_path const & other) - { data = other.data; return *this; } + { made_from = other.made_from; data = other.data; return *this; } protected: std::string data; any_path() {} + any_path(origin::type whence) : origin_aware(whence) {} private: any_path(std::string const & path, ============================================================ --- project.cc 9c881d67edc2e64055101bcf65a38ba01a590ebc +++ project.cc 1ca851ed8ce7b4acb24a0b0d7c5200359aa55619 @@ -12,6 +12,7 @@ #include "lua_hooks.hh" #include "keys.hh" #include "options.hh" +#include "vocab_cast.hh" using std::string; using std::set; @@ -38,7 +39,7 @@ project_t::get_branch_list(std::set heads; if (check_heads) @@ -66,7 +67,7 @@ project_t::get_branch_list(globish const i != got.end(); ++i) { // check that the branch has at least one non-suspended head - const branch_name branch(*i); + const branch_name branch(*i, origin::database); std::set heads; if (check_heads) @@ -92,7 +93,7 @@ namespace vector< revision > certs; db.get_revision_certs(rid, cert_name(branch_cert_name), - cert_value(branch()), + typecast_vocab(branch), certs); erase_bogus_certs(db, certs); return certs.empty(); @@ -112,7 +113,7 @@ namespace vector< revision > certs; db.get_revision_certs(rid, cert_name(suspend_cert_name), - cert_value(branch()), + typecast_vocab(branch), certs); erase_bogus_certs(db, certs); return !certs.empty(); @@ -135,7 +136,7 @@ project_t::get_branch_heads(branch_name L(FL("getting heads of branch %s") % name); branch.first = db.get_revisions_with_cert(cert_name(branch_cert_name), - cert_value(name()), + typecast_vocab(name), branch.second); not_in_branch p(db, name); @@ -164,7 +165,8 @@ project_t::revision_is_in_branch(revisio branch_name const & branch) { vector > certs; - db.get_revision_certs(id, branch_cert_name, cert_value(branch()), certs); + db.get_revision_certs(id, branch_cert_name, + typecast_vocab(branch), certs); int num = certs.size(); @@ -192,7 +194,8 @@ project_t::revision_is_suspended_in_bran branch_name const & branch) { vector > certs; - db.get_revision_certs(id, suspend_cert_name, cert_value(branch()), certs); + db.get_revision_certs(id, suspend_cert_name, + typecast_vocab(branch), certs); int num = certs.size(); @@ -249,7 +252,7 @@ project_t::get_revision_branches(revisio branches.clear(); for (std::vector >::const_iterator i = certs.begin(); i != certs.end(); ++i) - branches.insert(branch_name(i->inner().value())); + branches.insert(typecast_vocab(i->inner().value)); return i; } @@ -258,7 +261,8 @@ project_t::get_branch_certs(branch_name project_t::get_branch_certs(branch_name const & branch, std::vector > & certs) { - return db.get_revision_certs(branch_cert_name, cert_value(branch()), certs); + return db.get_revision_certs(branch_cert_name, + typecast_vocab(branch), certs); } tag_t::tag_t(revision_id const & ident, @@ -295,7 +299,8 @@ project_t::get_tags(set & tags) for (std::vector >::const_iterator i = certs.begin(); i != certs.end(); ++i) tags.insert(tag_t(revision_id(i->inner().ident), - utf8(i->inner().value()), i->inner().key)); + typecast_vocab(i->inner().value), + i->inner().key)); return i; } ============================================================ --- rcs_import.cc 216a7255bacccf61a61aef018bcc8c060ae77610 +++ rcs_import.cc 7876d1609874f781297272a18fa35e7d28375d9e @@ -490,7 +490,7 @@ insert_into_db(database & db, data const { string tmp; global_pieces.build_string(next_lines, tmp); - next_data = data(tmp); + next_data = data(tmp, origin::internal); } delta del; diff(curr_data, next_data, del); @@ -677,7 +677,8 @@ import_rcs_file_with_cvs(database & db, I(r.deltas.find(r.admin.head) != r.deltas.end()); file_id fid; - file_data dat(r.deltatexts.find(r.admin.head)->second->text); + file_data dat(r.deltatexts.find(r.admin.head)->second->text, + origin::user); calculate_ident(dat, fid); cvs.set_filename(filename, fid); @@ -1366,8 +1367,9 @@ cluster_consumer::store_auxiliary_certs( } project.put_standard_certs(keys, p.rid, - branch_name(branchname), - utf8(cvs.changelog_interner.lookup(p.changelog)), + branch_name(branchname, origin::user), + utf8(cvs.changelog_interner.lookup(p.changelog), + origin::internal), date_t(p.time), cvs.author_interner.lookup(p.author)); } @@ -1394,7 +1396,8 @@ cluster_consumer::build_cset(cvs_cluster { file_path pth = file_path_internal(cvs.path_interner.lookup(i->first)); - file_id fid(cvs.file_version_interner.lookup(i->second.version)); + file_id fid(cvs.file_version_interner.lookup(i->second.version), + origin::internal); if (i->second.live) { map::const_iterator e = live_files.find(i->first); @@ -1408,7 +1411,8 @@ cluster_consumer::build_cset(cvs_cluster } else if (e->second != i->second.version) { - file_id old_fid(cvs.file_version_interner.lookup(e->second)); + file_id old_fid(cvs.file_version_interner.lookup(e->second), + origin::internal); L(FL("applying state delta on '%s' : '%s' -> '%s'") % pth % old_fid ============================================================ --- refiner.cc 79f55898cf2c7eb7a3c2370c05368a13019f665e +++ refiner.cc 19066745ddc95c080b14e0b3cc2edd44d2e9d5e6 @@ -622,7 +622,7 @@ build_random_set(set & s, size_t sz, string str(constants::merkle_hash_length_in_bytes, ' '); for (size_t i = 0; i < constants::merkle_hash_length_in_bytes; ++i) str[i] = static_cast(rng.uniform(0xff)); - s.insert(id(str)); + s.insert(id(str, origin::internal)); if (clumpy && rng.flip()) { size_t clumpsz = rng.uniform(7) + 1; @@ -634,7 +634,7 @@ build_random_set(set & s, size_t sz, break; ++c; str[pos] = c; - s.insert(id(str)); + s.insert(id(str, origin::internal)); } } } ============================================================ --- restrictions.cc 9f51a6b8ccdabffe3799d93c2e3a24b57ad74a54 +++ restrictions.cc 21599dba641ccb291d38bd170d79eae5047f924f @@ -512,22 +512,22 @@ namespace node_id nid_yyf; node_id nid_yyg; - file_id fid_f (string(constants::idlen_bytes, '\x11')); - file_id fid_g (string(constants::idlen_bytes, '\x22')); + file_id fid_f (string(constants::idlen_bytes, '\x11'), origin::internal); + file_id fid_g (string(constants::idlen_bytes, '\x22'), origin::internal); - file_id fid_xf (string(constants::idlen_bytes, '\x33')); - file_id fid_xg (string(constants::idlen_bytes, '\x44')); - file_id fid_xxf(string(constants::idlen_bytes, '\x55')); - file_id fid_xxg(string(constants::idlen_bytes, '\x66')); - file_id fid_xyf(string(constants::idlen_bytes, '\x77')); - file_id fid_xyg(string(constants::idlen_bytes, '\x88')); + file_id fid_xf (string(constants::idlen_bytes, '\x33'), origin::internal); + file_id fid_xg (string(constants::idlen_bytes, '\x44'), origin::internal); + file_id fid_xxf(string(constants::idlen_bytes, '\x55'), origin::internal); + file_id fid_xxg(string(constants::idlen_bytes, '\x66'), origin::internal); + file_id fid_xyf(string(constants::idlen_bytes, '\x77'), origin::internal); + file_id fid_xyg(string(constants::idlen_bytes, '\x88'), origin::internal); - file_id fid_yf (string(constants::idlen_bytes, '\x99')); - file_id fid_yg (string(constants::idlen_bytes, '\xaa')); - file_id fid_yxf(string(constants::idlen_bytes, '\xbb')); - file_id fid_yxg(string(constants::idlen_bytes, '\xcc')); - file_id fid_yyf(string(constants::idlen_bytes, '\xdd')); - file_id fid_yyg(string(constants::idlen_bytes, '\xee')); + file_id fid_yf (string(constants::idlen_bytes, '\x99'), origin::internal); + file_id fid_yg (string(constants::idlen_bytes, '\xaa'), origin::internal); + file_id fid_yxf(string(constants::idlen_bytes, '\xbb'), origin::internal); + file_id fid_yxg(string(constants::idlen_bytes, '\xcc'), origin::internal); + file_id fid_yyf(string(constants::idlen_bytes, '\xdd'), origin::internal); + file_id fid_yyg(string(constants::idlen_bytes, '\xee'), origin::internal); } static void setup(roster_t & roster) ============================================================ --- revision.cc 2d4f530cd3166ccee17734531f7e50ff9c449c0d +++ revision.cc 926bc90127f67df896a2c32e4c3d7ae6d3c82bcc @@ -43,6 +43,7 @@ #include "roster.hh" #include "graph.hh" #include "key_store.hh" +#include "vocab_cast.hh" using std::back_inserter; using std::copy; @@ -208,7 +209,8 @@ find_common_ancestor_for_merge(database else { curr_leaf_ancestors = shared_bitmap(new bitmap()); - calculate_ancestors_from_graph(intern, revision_id(intern.lookup(curr_leaf)), + calculate_ancestors_from_graph(intern, revision_id(intern.lookup(curr_leaf), + origin::internal), inverse_graph, ancestors, curr_leaf_ancestors); } @@ -232,7 +234,8 @@ find_common_ancestor_for_merge(database { if (isect->test(i)) { - calculate_ancestors_from_graph(intern, revision_id(intern.lookup(i)), + calculate_ancestors_from_graph(intern, revision_id(intern.lookup(i), + origin::internal), inverse_graph, ancestors, isect_ancs); } } @@ -251,7 +254,7 @@ find_common_ancestor_for_merge(database } I(leaves.size() == 1); - anc = revision_id(intern.lookup(*leaves.begin())); + anc = revision_id(intern.lookup(*leaves.begin()), origin::internal); } // FIXME: this algorithm is incredibly inefficient; it's O(n) where n is the @@ -333,7 +336,7 @@ calculate_ancestors_from_graph(interner< while (! stk.empty()) { ctx us = stk.top(); - revision_id rev(intern.lookup(us)); + revision_id rev(intern.lookup(us), origin::internal); pair parents = graph.equal_range(rev); bool pushed = false; @@ -586,7 +589,7 @@ ancestry_difference(database & db, revis { if (au->test(i)) { - revision_id rid(intern.lookup(i)); + revision_id rid(intern.lookup(i), origin::internal); if (!null_id(rid)) new_stuff.insert(rid); } @@ -925,10 +928,11 @@ void anc_graph::write_certs() { char buf[constants::epochlen_bytes]; keys.get_rng().randomize(reinterpret_cast(buf), constants::epochlen_bytes); - epoch_data new_epoch(string(buf, buf + constants::epochlen_bytes)); + epoch_data new_epoch(string(buf, buf + constants::epochlen_bytes), + origin::internal); L(FL("setting epoch for %s to %s") % *i % new_epoch); - db.set_epoch(branch_name(*i), new_epoch); + db.set_epoch(branch_name(*i, origin::internal), new_epoch); } } @@ -1542,8 +1546,10 @@ anc_graph::construct_revisions_from_ance } else if (key == "execute" || key == "manual_merge") child_roster.set_attr(j->first, - attr_key("mtn:" + key), - attr_value(k->second)); + attr_key("mtn:" + key, + origin::internal), + attr_value(k->second, + origin::internal)); else E(false, origin::no_fault, F("unknown attribute '%s' on path '%s'\n" @@ -1705,7 +1711,7 @@ build_changesets_from_manifest_ancestry( { manifest_id child, parent; child = manifest_id(i->inner().ident.inner()); - parent = manifest_id(i->inner().value()); + parent = typecast_vocab(i->inner().value); u64 parent_node = graph.add_node_for_old_manifest(parent); u64 child_node = graph.add_node_for_old_manifest(child); @@ -1884,7 +1890,7 @@ static void write_insane_revision(revisi { basic_io::printer pr; print_insane_revision(pr, rev); - dat = data(pr.buf); + dat = data(pr.buf, origin::internal); } template <> void ============================================================ --- roster.cc 385df20a4cef1226cbfec91e6cbe6c9bbd282bc1 +++ roster.cc dbfdce44538d30f31386ebad938da2572da5e969 @@ -30,6 +30,7 @@ #include "restrictions.hh" #include "safe_map.hh" #include "ui.hh" +#include "vocab_cast.hh" using std::inserter; using std::make_pair; @@ -717,7 +718,7 @@ roster_t::get_name(node_id nid, file_pat return; } - I(!bookkeeping_path::internal_string_is_bookkeeping_path(utf8(sp.top()->name()))); + I(!bookkeeping_path::internal_string_is_bookkeeping_path(typecast_vocab(sp.top()->name))); string tmp; tmp.reserve(size); @@ -2556,7 +2557,7 @@ parse_marking(basic_io::parser & pa, pa.sym(); pa.str(k); pa.hex(rev); - attr_key key = attr_key(k); + attr_key key = attr_key(k, pa.tok.in.made_from); safe_insert(marking.attrs[key], decode_hexenc_as(rev, pa.tok.in.made_from)); } @@ -2728,8 +2729,9 @@ roster_t::parse_from(basic_io::parser & string k, v; pa.str(k); pa.str(v); - safe_insert(n->attrs, make_pair(attr_key(k), - make_pair(true, attr_value(v)))); + safe_insert(n->attrs, make_pair(attr_key(k, pa.tok.in.made_from), + make_pair(true, + attr_value(v, pa.tok.in.made_from)))); } // Dormant attrs @@ -2738,7 +2740,7 @@ roster_t::parse_from(basic_io::parser & pa.sym(); string k; pa.str(k); - safe_insert(n->attrs, make_pair(attr_key(k), + safe_insert(n->attrs, make_pair(attr_key(k, pa.tok.in.made_from), make_pair(false, attr_value()))); } @@ -2776,7 +2778,7 @@ write_roster_and_marking(roster_t const ros.check_sane(true); basic_io::printer pr; ros.print_to(pr, mm, print_local_parts); - dat = data(pr.buf); + dat = data(pr.buf, origin::internal); } @@ -3059,7 +3061,7 @@ path_component new_component(randomizer path_component new_component(randomizer & rng) { - return path_component(new_word(rng)); + return path_component(new_word(rng), origin::internal); } @@ -3210,22 +3212,24 @@ void perform_random_action(roster_t & r, { // L(FL("changing attr on '%s'\n") % pth); safe_insert(c.attrs_set, - make_pair(make_pair(pth, k), new_word(rng))); + make_pair(make_pair(pth, k), + attr_value(new_word(rng), origin::internal))); } } else { // L(FL("setting previously set attr on '%s'") % pth); safe_insert(c.attrs_set, - make_pair(make_pair(pth, k), new_word(rng))); + make_pair(make_pair(pth, k), + attr_value(new_word(rng), origin::internal))); } } else { // L(FL("setting attr on '%s'") % pth); safe_insert(c.attrs_set, - make_pair(make_pair(pth, new_word(rng)), - new_word(rng))); + make_pair(make_pair(pth, attr_key(new_word(rng), origin::internal)), + attr_value(new_word(rng), origin::internal))); } break; } @@ -3530,10 +3534,10 @@ namespace return s; } - revision_id old_rid(string(constants::idlen_bytes, '\x00')); - revision_id left_rid(string(constants::idlen_bytes, '\x11')); - revision_id right_rid(string(constants::idlen_bytes, '\x22')); - revision_id new_rid(string(constants::idlen_bytes, '\x44')); + revision_id old_rid(string(constants::idlen_bytes, '\x00'), origin::internal); + revision_id left_rid(string(constants::idlen_bytes, '\x11'), origin::internal); + revision_id right_rid(string(constants::idlen_bytes, '\x22'), origin::internal); + revision_id new_rid(string(constants::idlen_bytes, '\x44'), origin::internal); //////////////// // These classes encapsulate information about all the different scalars @@ -3607,7 +3611,7 @@ namespace roster_t & roster, marking_map & markings) { make_file(scalar_origin_rid, nid, - file_id(string(constants::idlen_bytes, '\xaa')), + file_id(string(constants::idlen_bytes, '\xaa'), origin::internal), roster, markings); } static void make_file(revision_id const & scalar_origin_rid, node_id nid, @@ -3645,13 +3649,16 @@ namespace { safe_insert(values, make_pair(scalar_a, - file_id(string(constants::idlen_bytes, '\xaa')))); + file_id(string(constants::idlen_bytes, '\xaa'), + origin::internal))); safe_insert(values, make_pair(scalar_b, - file_id(string(constants::idlen_bytes, '\xbb')))); + file_id(string(constants::idlen_bytes, '\xbb'), + origin::internal))); safe_insert(values, make_pair(scalar_c, - file_id(string(constants::idlen_bytes, '\xcc')))); + file_id(string(constants::idlen_bytes, '\xcc'), + origin::internal))); } virtual void set(revision_id const & scalar_origin_rid, scalar_val val, @@ -4525,8 +4532,8 @@ UNIT_TEST(roster, write_roster) file_path fo = file_path_internal("fo"); file_path xx = file_path_internal("xx"); - file_id f1(string(constants::idlen_bytes, '\x11')); - revision_id rid(string(constants::idlen_bytes, '\x44')); + file_id f1(string(constants::idlen_bytes, '\x11'), origin::internal); + revision_id rid(string(constants::idlen_bytes, '\x44'), origin::internal); node_id nid; // if adding new nodes, add them at the end to keep the node_id order @@ -4595,7 +4602,7 @@ UNIT_TEST(roster, write_roster) "\n" " dir \"xx\"\n" "attr \"say\" \"hello\"\n" - )); + ), origin::internal); MM(expected); UNIT_TEST_CHECK_NOT_THROW( I(expected == mdat), logic_error); @@ -4653,7 +4660,7 @@ UNIT_TEST(roster, write_roster) " birth [4444444444444444444444444444444444444444]\n" "path_mark [4444444444444444444444444444444444444444]\n" "attr_mark \"say\" [4444444444444444444444444444444444444444]\n" - )); + ), origin::internal); MM(expected); UNIT_TEST_CHECK_NOT_THROW( I(expected == rdat), logic_error); ============================================================ --- roster_delta.cc ec099314df2d8ccbf17ef0861df895d7fc99fe5b +++ roster_delta.cc f05705a1dbf00dbb77d4f13153a26da957a0c9a9 @@ -376,7 +376,7 @@ namespace loc.first = parse_nid(parser); std::string name; parser.str(name); - loc.second = path_component(name); + loc.second = path_component(name, parser.tok.in.made_from); } void @@ -446,10 +446,12 @@ namespace parser.str(value_bool); parser.str(value_value); pair full_value(lexical_cast(value_bool), - attr_value(value_value)); + attr_value(value_value, + parser.tok.in.made_from)); safe_insert(d.attrs_changed, make_pair(nid, - make_pair(attr_key(key), full_value))); + make_pair(attr_key(key, parser.tok.in.made_from), + full_value))); } while (parser.symp(syms::marking)) { @@ -476,7 +478,7 @@ delta_rosters(roster_t const & from, mar make_roster_delta_t(from, from_markings, to, to_markings, d); basic_io::printer printer; print_roster_delta_t(printer, d); - del = roster_delta(printer.buf); + del = roster_delta(printer.buf, origin::internal); } static ============================================================ --- roster_merge.cc f9de0d60f7a4302ee65537657502c62b95f6f26e +++ roster_merge.cc ca479751ee42bfec579dc26bfe5d330b22607e61 @@ -34,7 +34,7 @@ namespace resolve_conflicts boost::shared_ptr new_file_path(std::string path) { - return boost::shared_ptr(new file_path(file_path_external(utf8(path)))); + return boost::shared_ptr(new file_path(file_path_external(utf8(path, origin::user)))); }; static char const * @@ -380,7 +380,7 @@ get_nid_name_pair(roster_t const & roste node_id & nid, std::pair & name) { - node_t const node = roster.get_node(file_path_external(utf8(path))); + node_t const node = roster.get_node(file_path_external(utf8(path, origin::internal))); nid = node->self; name = make_pair (node->parent, node->name); } @@ -2000,7 +2000,7 @@ read_attr_state_left(basic_io::parser & pars.sym(); value.first = true; pars.str(tmp); - value.second = attr_value(tmp); + value.second = attr_value(tmp, pars.tok.in.made_from); } else { @@ -2022,7 +2022,7 @@ read_attr_state_right(basic_io::parser & pars.sym(); value.first = true; pars.str(tmp); - value.second = attr_value(tmp); + value.second = attr_value(tmp, pars.tok.in.made_from); } else { @@ -2048,11 +2048,11 @@ read_attribute_conflict(basic_io::parser if (tmp == "file") { pars.esym(syms::attr_name); pars.str(tmp); - conflict.key = attr_key(tmp); + conflict.key = attr_key(tmp, pars.tok.in.made_from); pars.esym(syms::ancestor_name); pars.str(); pars.esym(syms::ancestor_file_id); pars.hex(); pars.esym(syms::left_name); pars.str(tmp); - conflict.nid = left_roster.get_node(file_path_external(utf8(tmp)))->self; + conflict.nid = left_roster.get_node(file_path_external(utf8(tmp, pars.tok.in.made_from)))->self; pars.esym(syms::left_file_id); pars.hex(); read_attr_state_left(pars, conflict.left); pars.esym(syms::right_name); pars.str(); @@ -2062,10 +2062,10 @@ read_attribute_conflict(basic_io::parser else if (tmp == "directory") { pars.esym(syms::attr_name); pars.str(tmp); - conflict.key = attr_key(tmp); + conflict.key = attr_key(tmp, pars.tok.in.made_from); pars.esym(syms::ancestor_name); pars.str(); pars.esym(syms::left_name); pars.str(tmp); - conflict.nid = left_roster.get_node(file_path_external(utf8(tmp)))->self; + conflict.nid = left_roster.get_node(file_path_external(utf8(tmp, pars.tok.in.made_from)))->self; read_attr_state_left(pars, conflict.left); pars.esym(syms::right_name); pars.str(); read_attr_state_right(pars, conflict.right); @@ -2332,7 +2332,7 @@ roster_merge_result::write_conflict_file report_attribute_conflicts(*left_roster, *right_roster, adaptor, true, output); report_file_content_conflicts(lua, *left_roster, *right_roster, adaptor, true, output); - data dat(output.str()); + data dat(output.str(), origin::internal); write_data(file_name, dat); } // roster_merge_result::write_conflict_file @@ -3212,7 +3212,7 @@ void string_to_set(string const & from, for (string::const_iterator i = from.begin(); i != from.end(); ++i) { char label = ((*i - '0') << 4) + (*i - '0'); - to.insert(revision_id(string(constants::idlen_bytes, label))); + to.insert(revision_id(string(constants::idlen_bytes, label), origin::internal)); } } @@ -3268,8 +3268,8 @@ test_a_scalar_merge_impl(scalar_val left scalar.check_result(left_val, right_val, result, expected_outcome); } -static const revision_id root_rid(string(constants::idlen_bytes, '\0')); -static const file_id arbitrary_file(string(constants::idlen_bytes, '\0')); +static const revision_id root_rid(string(constants::idlen_bytes, '\0'), origin::internal); +static const file_id arbitrary_file(string(constants::idlen_bytes, '\0'), origin::internal); struct base_scalar { @@ -3498,7 +3498,8 @@ struct file_content_scalar : public virt { I(val != scalar_conflict); return file_id(string(constants::idlen_bytes, - (val == scalar_a) ? '\xaa' : '\xbb')); + (val == scalar_a) ? '\xaa' : '\xbb'), + origin::internal); } void @@ -3530,7 +3531,7 @@ struct file_content_scalar : public virt I(null_id(content)); // resolve the conflict, thus making sure that resolution works and // that this was the only conflict signaled - content = file_id(string(constants::idlen_bytes, '\xff')); + content = file_id(string(constants::idlen_bytes, '\xff'), origin::internal); result.file_content_conflicts.pop_back(); break; } @@ -3681,15 +3682,15 @@ namespace namespace { - const revision_id a_uncommon1(string(constants::idlen_bytes, '\xaa')); - const revision_id a_uncommon2(string(constants::idlen_bytes, '\xbb')); - const revision_id b_uncommon1(string(constants::idlen_bytes, '\xcc')); - const revision_id b_uncommon2(string(constants::idlen_bytes, '\xdd')); - const revision_id common1(string(constants::idlen_bytes, '\xee')); - const revision_id common2(string(constants::idlen_bytes, '\xff')); + const revision_id a_uncommon1(string(constants::idlen_bytes, '\xaa'), origin::internal); + const revision_id a_uncommon2(string(constants::idlen_bytes, '\xbb'), origin::internal); + const revision_id b_uncommon1(string(constants::idlen_bytes, '\xcc'), origin::internal); + const revision_id b_uncommon2(string(constants::idlen_bytes, '\xdd'), origin::internal); + const revision_id common1(string(constants::idlen_bytes, '\xee'), origin::internal); + const revision_id common2(string(constants::idlen_bytes, '\xff'), origin::internal); - const file_id fid1(string(constants::idlen_bytes, '\x11')); - const file_id fid2(string(constants::idlen_bytes, '\x22')); + const file_id fid1(string(constants::idlen_bytes, '\x11'), origin::internal); + const file_id fid2(string(constants::idlen_bytes, '\x22'), origin::internal); } static void ============================================================ --- sanity.hh 0f1f754d269c4ee6ed16e5e1d1865b492f0a5c71 +++ sanity.hh f96bc471c778d8cba8e62f71eb15c92b92791b51 @@ -31,15 +31,6 @@ namespace origin { std::string type_to_string(type t); } -// Something that knows where it came from. -class origin_aware -{ -public: - origin::type made_from; - origin_aware() : made_from(origin::internal) {} - origin_aware(origin::type m) : made_from(m) {} -}; - // An error that may have had an external source. class recoverable_failure : public std::runtime_error { origin::type _caused_by; ============================================================ --- schema_migration.cc b4074090f1c1b1774852a8227123132913896ce4 +++ schema_migration.cc d1573a5d69b208dbbf1face97592b70b7e8bf79e @@ -275,7 +275,7 @@ sqlite_sha1_fn(sqlite3_context *f, int n } id hash; - calculate_ident(data(tmp), hash); + calculate_ident(data(tmp, origin::database), hash); sqlite3_result_blob(f, hash().c_str(), hash().size(), SQLITE_TRANSIENT); } @@ -534,12 +534,14 @@ migrate_to_external_privkeys(sqlite3 * d while (stmt.step()) { - rsa_keypair_id ident(stmt.column_string(0)); - base64 old_priv(stmt.column_string(1)); + rsa_keypair_id ident(stmt.column_string(0), origin::database); + base64 old_priv(stmt.column_string(1), + origin::database); base64 pub; if (stmt.column_nonnull(2)) - pub = base64(stmt.column_string(2)); + pub = base64(stmt.column_string(2), + origin::database); P(F("moving key '%s' from database to %s") % ident % keys.get_key_dir()); @@ -859,7 +861,7 @@ calculate_schema_id(sqlite3 * db, string } id tid; - calculate_ident(data(schema), tid); + calculate_ident(data(schema, origin::database), tid); ident = encode_hexenc(tid(), tid.made_from); } ============================================================ --- sha1.cc 233a3432e8469854a7840fc02bfd872379b2f40b +++ sha1.cc 7a6074b5fa0c77707cf3ab596e63e02980209496 @@ -100,7 +100,7 @@ CMD_HIDDEN(benchmark_sha1, "benchmark_sh P(F("Benchmarking %s SHA-1 cores") % registry().size()); int mebibytes = 100; string test_str(mebibytes << 20, 'a'); - data test_data(test_str); + data test_data(test_str, origin::internal); for (map >::const_iterator i = registry().begin(); i != registry().end(); ++i) { ============================================================ --- simplestring_xform.hh 564a305c99ca931c93956ac3ef903683dcb15db7 +++ simplestring_xform.hh eb4c9acbf8671b9f7114959f1e120bbc1430b67a @@ -29,6 +29,28 @@ void join_lines(std::vector void join_lines(std::vector const & in, std::string & out); + +template inline +origin::type get_made_from(Thing const & thing) +{ + return thing.made_from; +} +template<> inline +origin::type get_made_from(std::string const & thing) +{ + return origin::internal; +} +template inline +Thing from_string(std::string const & str, origin::type made_from) +{ + return Thing(str, made_from); +} +template<> inline +std::string from_string(std::string const & str, origin::type made_from) +{ + return str; +} + template< class T > std::vector< T > split_into_words(T const & in) { @@ -40,32 +62,37 @@ std::vector< T > split_into_words(T cons while (end != std::string::npos && end >= begin) { - out.push_back(T(instr.substr(begin, end-begin))); + out.push_back(from_string(instr.substr(begin, end-begin), + get_made_from(in))); begin = end + 1; if (begin >= instr.size()) break; end = instr.find_first_of(" ", begin); } if (begin < instr.size()) - out.push_back(T(instr.substr(begin, instr.size() - begin))); + out.push_back(from_string(instr.substr(begin, instr.size() - begin), + get_made_from(in))); return out; } template< class Container > -typename Container::value_type join_words(Container const & in, std::string const & sep = " ") +typename Container::value_type join_words(Container const & in, + std::string const & sep = " ") { + origin::type made_from = origin::internal; std::string str; typename Container::const_iterator iter = in.begin(); while (iter != in.end()) { + made_from = get_made_from(*iter); str += (*iter)(); iter++; if (iter != in.end()) str += sep; } typedef typename Container::value_type result_type; - return result_type(str); + return from_string(str, made_from); } void prefix_lines_with(std::string const & prefix, ============================================================ --- transforms.cc 9c171dc101906f2eafda1d1bcb8ba5c46ac1bc80 +++ transforms.cc 627ab523898554957d55dc2e9138bfaadf8bdec5 @@ -311,8 +311,10 @@ UNIT_TEST(transform, rdiff) UNIT_TEST(transform, rdiff) { - data dat1(string("the first day of spring\nmakes me want to sing\n")); - data dat2(string("the first day of summer\nis a major bummer\n")); + data dat1(string("the first day of spring\nmakes me want to sing\n"), + origin::internal); + data dat2(string("the first day of summer\nis a major bummer\n"), + origin::internal); delta del; diff(dat1, dat2, del); @@ -323,7 +325,8 @@ UNIT_TEST(transform, calculate_ident) UNIT_TEST(transform, calculate_ident) { - data input(string("the only blender which can be turned into the most powerful vaccum cleaner")); + data input(string("the only blender which can be turned into the most powerful vaccum cleaner"), + origin::internal); id output; string ident("86e03bdb3870e2a207dfd0dcbfd4c4f2e3bc97bd"); calculate_ident(input, output); @@ -332,7 +335,7 @@ UNIT_TEST(transform, corruption_check) UNIT_TEST(transform, corruption_check) { - data input(string("i'm so fragile, fragile when you're here")); + data input(string("i'm so fragile, fragile when you're here"), origin::internal); gzip gzd; encode_gzip(input, gzd); ============================================================ --- ui.cc e16476608a0c83fe3ee7fbfd5a605beafffd447e +++ ui.cc 646fea920cb0481004997c15fe10f4a829faf7d2 @@ -247,7 +247,8 @@ void tick_write_count::write_ticks() // spurious re-issuing of the tick titles as we expand to // the goal. tick->set_count_size(display_width(utf8(compose_count(tick, - tick->total)))); + tick->total), + origin::internal))); tick->previous_total = tick->total; } else @@ -258,14 +259,15 @@ void tick_write_count::write_ticks() // size of the returned count string as an initial size for // this tick. tick->set_count_size(display_width(utf8(compose_count(tick, - 1048575)))); + 1048575), + origin::internal))); } } string count(compose_count(tick)); - size_t title_width = display_width(utf8(tick->name)); - size_t count_width = display_width(utf8(count)); + size_t title_width = display_width(utf8(tick->name, origin::internal)); + size_t count_width = display_width(utf8(count, origin::internal)); if (count_width > tick->count_size) { @@ -319,7 +321,7 @@ void tick_write_count::write_ticks() tickline2 += ui.imp->tick_trailer; } - size_t curr_sz = display_width(utf8(tickline2)); + size_t curr_sz = display_width(utf8(tickline2, origin::internal)); if (curr_sz < last_tick_len) tickline2.append(last_tick_len - curr_sz, ' '); last_tick_len = curr_sz; @@ -330,7 +332,7 @@ void tick_write_count::write_ticks() if (ui.imp->last_write_was_a_tick) clog << '\n'; - if (tw && display_width(utf8(tickline1)) > tw) + if (tw && display_width(utf8(tickline1, origin::internal)) > tw) { // FIXME: may chop off more than necessary (because we chop by // bytes, not by characters) @@ -338,7 +340,7 @@ void tick_write_count::write_ticks() } clog << tickline1 << '\n'; } - if (tw && display_width(utf8(tickline2)) > tw) + if (tw && display_width(utf8(tickline2, origin::internal)) > tw) { // FIXME: may chop off more than necessary (because we chop by // bytes, not by characters) @@ -683,7 +685,9 @@ public: { public: string_adaptor(string const & str) : string(str) {} + string_adaptor(string const & str, origin::type) : string(str) {} string const & operator()(void) const { return *this; } + origin::type made_from; }; // See description for format_text below for more details. @@ -708,7 +712,7 @@ format_paragraph(string const & text, si string const & word = (*iter)(); if (iter != words.begin() && - curcol + display_width(utf8(word)) + 1 > maxcol) + curcol + display_width(utf8(word, origin::no_fault)) + 1 > maxcol) { formatted += '\n' + string(col, ' '); curcol = col; @@ -720,7 +724,7 @@ format_paragraph(string const & text, si } formatted += word; - curcol += display_width(utf8(word)); + curcol += display_width(utf8(word, origin::no_fault)); } return formatted; ============================================================ --- vocab.cc e66b94af7fa13534112579568ff63c267e3dfe44 +++ vocab.cc bb503a780573812673e29b185737947f2a189d95 @@ -154,7 +154,7 @@ fake_id() ++counter; I(counter >= 1); // detect overflow string s((FL("00000000000000000000000000000000%08x") % counter).str()); - return id(decode_hexenc(s, origin::internal)); + return id(decode_hexenc(s, origin::internal), origin::internal); } // instantiation of various vocab functions ============================================================ --- vocab_cast.hh cdf5c8043fbdcfdd6be9e4d14191c1b977fdb798 +++ vocab_cast.hh d6cdeb15c439fcb834d27482e480741c4cf608da @@ -4,9 +4,9 @@ #include // You probably won't use this yourself, but it's needed by... -template +template To typecast_vocab(From const & from) -{ return To(from()); } +{ return To(from(), from.made_from); } // There are a few places where we want to typecast an entire // container full of vocab types. @@ -14,12 +14,12 @@ void typecast_vocab_container(From const void typecast_vocab_container(From const & from, To & to) { std::transform(from.begin(), from.end(), std::inserter(to, to.end()), - &typecast_vocab); + &typecast_vocab); } // You won't use this directly either. -template +template To add_decoration(From const & from) { return To(from); @@ -31,8 +31,8 @@ void add_decoration_to_container(From co void add_decoration_to_container(From const & from, To & to) { std::transform(from.begin(), from.end(), std::inserter(to, to.end()), - &add_decoration); + &add_decoration); } template ============================================================ --- vocab_macros.hh 68e2ee59942578944a90e572d397fcb6c5186a26 +++ vocab_macros.hh db691c053cae7fa496c004608fe39f576fd6fa7e @@ -18,7 +18,7 @@ public: immutable_string s; \ public: \ enc() {} \ - explicit enc(std::string const & s); \ + explicit enc(char const * const s); \ enc(std::string const & s, origin::type m); \ enc(enc const & other); \ enc const & \ @@ -55,7 +55,7 @@ public: INNER i; \ public: \ dec() {} \ - explicit dec(std::string const & s); \ + explicit dec(char const * const s); \ dec(std::string const & s, origin::type m); \ explicit dec(INNER const & inner); \ dec(dec const & other); \ @@ -86,7 +86,7 @@ public: immutable_string s; \ public: \ ty() {} \ - explicit ty(std::string const & str); \ + explicit ty(char const * const str); \ ty(std::string const & str, origin::type m); \ ty(ty const & other); \ ty const & operator=(ty const & other); \ @@ -120,7 +120,7 @@ static size_t ty ## _tab_active = 0; static symtab_impl ty ## _tab; \ static size_t ty ## _tab_active = 0; \ \ -ty::ty(string const & str) : \ +ty::ty(char const * const str) : \ origin_aware(), \ s((ty ## _tab_active > 0) \ ? (ty ## _tab.unique(str)) \ @@ -171,7 +171,7 @@ static size_t ty ## _tab_active = 0; static symtab_impl ty ## _tab; \ static size_t ty ## _tab_active = 0; \ \ -ty::ty(string const & str) : \ +ty::ty(char const * const str) : \ origin_aware(), \ s((ty ## _tab_active > 0) \ ? (ty ## _tab.unique(str)) \ @@ -212,7 +212,7 @@ template #define cc_ENCODING(enc) \ \ template \ -enc::enc(string const & s) : \ +enc::enc(char const * const s) : \ origin_aware(), s(s) \ { verify(*this); } \ \ @@ -253,7 +253,7 @@ template : i(other.i) {} \ \ template \ -dec::dec(std::string const & s) \ +dec::dec(char const * const s) \ : i(s) { verify(i); } \ \ template \ ============================================================ --- work.cc 6ef327477ba19f52cb2b11baa48b1c2dd3c37e7f +++ work.cc 38fcd998668d9bb8a51f9e3973086a3246c18def @@ -34,6 +34,7 @@ #include "database.hh" #include "roster.hh" #include "transforms.hh" +#include "vocab_cast.hh" using std::deque; using std::exception; @@ -327,7 +328,7 @@ workspace::read_user_log(utf8 & dat) { data tmp; read_data(ul_path, tmp); - system_to_utf8(external(tmp()), dat); + system_to_utf8(typecast_vocab(tmp), dat); } } @@ -339,7 +340,7 @@ workspace::write_user_log(utf8 const & d external tmp; utf8_to_system_best_effort(dat, tmp); - write_data(ul_path, data(tmp())); + write_data(ul_path, typecast_vocab(tmp)); } void @@ -430,7 +431,7 @@ write_options_file(bookkeeping_path cons pr.print_stanza(st); try { - write_data(optspath, data(pr.buf)); + write_data(optspath, data(pr.buf, origin::internal)); } catch(exception & e) { @@ -678,7 +679,8 @@ workspace::init_attributes(file_path con if (!attrs.empty()) for (map::const_iterator i = attrs.begin(); i != attrs.end(); ++i) - er.set_attr(path, attr_key(i->first), attr_value(i->second)); + er.set_attr(path, attr_key(i->first, origin::user), + attr_value(i->second, origin::user)); } // objects and routines for manipulating the workspace itself @@ -990,7 +992,8 @@ path_for_detached_nid(node_id nid) static inline bookkeeping_path path_for_detached_nid(node_id nid) { - return path_for_detached_nids() / path_component(lexical_cast(nid)); + return path_for_detached_nids() / path_component(lexical_cast(nid), + origin::internal); } // Attaching/detaching the root directory: @@ -1029,8 +1032,11 @@ editable_working_tree::detach_node(file_ move_file(src_pth / *i, dst_pth / *i); for (vector::const_iterator i = dirs.begin(); i != dirs.end(); ++i) - if (!bookkeeping_path::internal_string_is_bookkeeping_path(utf8((*i)()))) - move_dir(src_pth / *i, dst_pth / *i); + { + utf8 item = typecast_vocab(*i); + if (!bookkeeping_path::internal_string_is_bookkeeping_path(item)) + move_dir(src_pth / *i, dst_pth / *i); + } root_dir_attached = false; } else @@ -1099,13 +1105,15 @@ editable_working_tree::attach_node(node_ for (vector::const_iterator i = files.begin(); i != files.end(); ++i) { - I(!bookkeeping_path::internal_string_is_bookkeeping_path(utf8((*i)()))); + utf8 item = typecast_vocab(*i); + I(!bookkeeping_path::internal_string_is_bookkeeping_path(item)); move_file(src_pth / *i, dst_pth / *i); } for (vector::const_iterator i = dirs.begin(); i != dirs.end(); ++i) { - I(!bookkeeping_path::internal_string_is_bookkeeping_path(utf8((*i)()))); + utf8 item = typecast_vocab(*i); + I(!bookkeeping_path::internal_string_is_bookkeeping_path(item)); move_dir(src_pth / *i, dst_pth / *i); } delete_dir_shallow(src_pth); ============================================================ --- work_migration.cc 5d03bd50cd3e34c2212a355cc928fea9e5fc4e20 +++ work_migration.cc fdd7b30d20ed4ab79dfea448b7c40e4137140d7a @@ -103,7 +103,8 @@ workspace::write_ws_format() } else { - data f_dat(lexical_cast(current_workspace_format) + "\n"); + data f_dat(lexical_cast(current_workspace_format) + "\n", + origin::workspace); write_data(f_path, f_dat); } } ============================================================ --- xdelta.cc 3e042fc714973dc387d2dbb3c3848e67b49488f0 +++ xdelta.cc 6c75c90672859828c596acd6329f5c18d0bec659 @@ -461,7 +461,7 @@ diff(data const & olddata, { string unpacked; compute_delta(olddata(), newdata(), unpacked); - del = delta(unpacked); + del = delta(unpacked, newdata.made_from); } void @@ -471,7 +471,7 @@ patch(data const & olddata, { string result; apply_delta(olddata(), del(), result); - newdata = data(result); + newdata = data(result, del.made_from); }