# # # patch "automate.cc" # from [551d5976bd9f1d61673c83fc4a259c1326e91c21] # to [7aeb25a21cae32a195c07931b6660a996b209460] # # patch "cert.cc" # from [0f0995fe95590541db6379205bcf76ada7988be4] # to [0230b382c6e4ee33646e2f484b79699e6a41fc15] # # patch "cmd_diff_log.cc" # from [9104b66d0447196da48692151e68cc59f4735b52] # to [99423c43818a40c6e43e46b600fccf88dd697f30] # # patch "cmd_list.cc" # from [0a1e588d9707dcac51a0103326bcd0d763193fb1] # to [2938133222d8a2c009e3917177ea9da86d7a5612] # # patch "cmd_merging.cc" # from [fd4090137c7de4255f1f28befebcea19a1a2cf56] # to [fca7dcf4e8dc55fced64896a10bce5dfd0fb9a33] # # patch "cmd_ws_commit.cc" # from [c0bb404ea6b52a3b44b5e7c4ddb53cbdcaf5aa89] # to [3c045aeb35d2f4750f1f1761853a59ad2a3b5558] # # patch "database_check.cc" # from [e7462b630cad47cf8e0c263b293b7228d8e16392] # to [623c1ed8dab8510f0f7b4d025d38e2a25738dbea] # # patch "graph.cc" # from [be600b6812d5a9d04a79e577d25b9024c1d83286] # to [6c35d2e5d5708e429f7e4d9c2ab77809b7ad9477] # # patch "lua-testsuite.lua" # from [132d87aa7f69e7b4d5a8351e57a3a9de8055509a] # to [d2db92ea969f6b5a4a7cd2d6a0dc6c528b41bbfa] # # patch "netsync.cc" # from [19837b5f6584044bfc8d3d0321002a7667535ab3] # to [6ab908bf37623d218467c5e77fb1bcfd94cf16c8] # # patch "rcs_import.cc" # from [d2174e85f4f19510a6bd5836b49fff93dfd66c2e] # to [cbc2a655abdc7bfd9a0d166c15d0f4b04138d70a] # # patch "selectors.cc" # from [c60f8ced9db5d747054b763370746189a7e85874] # to [6fd1ac5d5fc2d8265d999af46c75fe9ff3e1358b] # # patch "vocab.cc" # from [d966715de6cefce23b41320e88cdb28ca035405f] # to [1c2ac62c2cd53e7a439c99a70d149c077652aaf3] # # patch "vocab.hh" # from [6d861210ecb11e8378ca3dfa2365f414973526ed] # to [c7641081ac95429074a7dcff7875fad65b1612c8] # # patch "vocab_hash.hh" # from [1bf71979cd58adf60349d0fb28459176c92f287b] # to [b89b926ae456c4429382e454cffb5c9d99f1abd4] # # patch "vocab_macros.hh" # from [7025028f87c647715e14fb50c13866e8df52d684] # to [3e98a31c4c78c36b9c22900be265f23123d30e45] # # patch "vocab_terms.hh" # from [8b2cc02ef4b8f211f9ca6640ad64922469530ff0] # to [f314ffbf3ac27df4aa973cd9371fd633914be492] # ============================================================ --- automate.cc 551d5976bd9f1d61673c83fc4a259c1326e91c21 +++ automate.cc 7aeb25a21cae32a195c07931b6660a996b209460 @@ -93,7 +93,7 @@ CMD_AUTOMATE(heads, N_("[BRANCH]"), project.get_branch_heads(branch, heads, app.opts.ignore_suspend_certs); for (set::const_iterator i = heads.begin(); i != heads.end(); ++i) - output << (*i).inner()() << '\n'; + output << encode_hexenc(i->inner()()) << '\n'; } // Name: ancestors @@ -119,8 +119,9 @@ CMD_AUTOMATE(ancestors, N_("REV1 [REV2 [ vector frontier; for (args_vector::const_iterator i = args.begin(); i != args.end(); ++i) { - revision_id rid((*i)()); - N(db.revision_exists(rid), F("no such revision '%s'") % rid); + revision_id rid(decode_hexenc((*i)())); + N(db.revision_exists(rid), F("no such revision '%s'") + % encode_hexenc(rid.inner()())); frontier.push_back(rid); } while (!frontier.empty()) @@ -144,7 +145,7 @@ CMD_AUTOMATE(ancestors, N_("REV1 [REV2 [ for (set::const_iterator i = ancestors.begin(); i != ancestors.end(); ++i) if (!null_id(*i)) - output << (*i).inner()() << '\n'; + output << encode_hexenc(i->inner()()) << '\n'; } @@ -171,8 +172,9 @@ CMD_AUTOMATE(descendents, N_("REV1 [REV2 vector frontier; for (args_vector::const_iterator i = args.begin(); i != args.end(); ++i) { - revision_id rid((*i)()); - N(db.revision_exists(rid), F("no such revision '%s'") % rid); + revision_id rid(decode_hexenc((*i)())); + N(db.revision_exists(rid), F("no such revision '%s'") + % encode_hexenc(rid.inner()())); frontier.push_back(rid); } while (!frontier.empty()) @@ -193,7 +195,7 @@ CMD_AUTOMATE(descendents, N_("REV1 [REV2 } for (set::const_iterator i = descendents.begin(); i != descendents.end(); ++i) - output << (*i).inner()() << '\n'; + output << encode_hexenc(i->inner()()) << '\n'; } @@ -220,13 +222,14 @@ CMD_AUTOMATE(erase_ancestors, N_("[REV1 set revs; for (args_vector::const_iterator i = args.begin(); i != args.end(); ++i) { - revision_id rid((*i)()); - N(db.revision_exists(rid), F("no such revision '%s'") % rid); + revision_id rid(decode_hexenc((*i)())); + N(db.revision_exists(rid), F("no such revision '%s'") + % encode_hexenc(rid.inner()())); revs.insert(rid); } erase_ancestors(db, revs); for (set::const_iterator i = revs.begin(); i != revs.end(); ++i) - output << (*i).inner()() << '\n'; + output << encode_hexenc(i->inner()()) << '\n'; } // Name: toposort @@ -249,15 +252,16 @@ CMD_AUTOMATE(toposort, N_("[REV1 [REV2 [ set revs; for (args_vector::const_iterator i = args.begin(); i != args.end(); ++i) { - revision_id rid((*i)()); - N(db.revision_exists(rid), F("no such revision '%s'") % rid); + revision_id rid(decode_hexenc((*i)())); + N(db.revision_exists(rid), F("no such revision '%s'") + % encode_hexenc(rid.inner()())); revs.insert(rid); } vector sorted; toposort(db, revs, sorted); for (vector::const_iterator i = sorted.begin(); i != sorted.end(); ++i) - output << (*i).inner()() << '\n'; + output << encode_hexenc(i->inner()()) << '\n'; } // Name: ancestry_difference @@ -290,12 +294,14 @@ CMD_AUTOMATE(ancestry_difference, N_("NE revision_id a; set bs; args_vector::const_iterator i = args.begin(); - a = revision_id((*i)()); - N(db.revision_exists(a), F("no such revision '%s'") % a); + a = revision_id(decode_hexenc((*i)())); + N(db.revision_exists(a), F("no such revision '%s'") + % encode_hexenc(a.inner()())); for (++i; i != args.end(); ++i) { - revision_id b((*i)()); - N(db.revision_exists(b), F("no such revision '%s'") % b); + revision_id b(decode_hexenc((*i)())); + N(db.revision_exists(b), F("no such revision '%s'") + % encode_hexenc(b.inner()())); bs.insert(b); } set ancestors; @@ -305,7 +311,7 @@ CMD_AUTOMATE(ancestry_difference, N_("NE toposort(db, ancestors, sorted); for (vector::const_iterator i = sorted.begin(); i != sorted.end(); ++i) - output << (*i).inner()() << '\n'; + output << encode_hexenc(i->inner()()) << '\n'; } // Name: leaves @@ -335,7 +341,7 @@ CMD_AUTOMATE(leaves, "", db.get_leaves(leaves); for (set::const_iterator i = leaves.begin(); i != leaves.end(); ++i) - output << (*i).inner()() << '\n'; + output << encode_hexenc(i->inner()()) << '\n'; } // Name: roots @@ -364,7 +370,7 @@ CMD_AUTOMATE(roots, "", db.get_revision_children(nullid, roots); for (set::const_iterator i = roots.begin(); i != roots.end(); ++i) - output << i->inner()() << '\n'; + output << encode_hexenc(i->inner()()) << '\n'; } // Name: parents @@ -387,14 +393,15 @@ CMD_AUTOMATE(parents, N_("REV"), database db(app); - revision_id rid(idx(args, 0)()); - N(db.revision_exists(rid), F("no such revision '%s'") % rid); + revision_id rid(decode_hexenc(idx(args, 0)())); + N(db.revision_exists(rid), F("no such revision '%s'") + % encode_hexenc(rid.inner()())); set parents; db.get_revision_parents(rid, parents); for (set::const_iterator i = parents.begin(); i != parents.end(); ++i) if (!null_id(*i)) - output << (*i).inner()() << '\n'; + output << encode_hexenc(i->inner()()) << '\n'; } // Name: children @@ -417,14 +424,15 @@ CMD_AUTOMATE(children, N_("REV"), database db(app); - revision_id rid(idx(args, 0)()); - N(db.revision_exists(rid), F("no such revision '%s'") % rid); + revision_id rid(decode_hexenc(idx(args, 0)())); + N(db.revision_exists(rid), F("no such revision '%s'") + % encode_hexenc(rid.inner()())); set children; db.get_revision_children(rid, children); for (set::const_iterator i = children.begin(); i != children.end(); ++i) if (!null_id(*i)) - output << (*i).inner()() << '\n'; + output << encode_hexenc(i->inner()()) << '\n'; } // Name: graph @@ -482,7 +490,7 @@ CMD_AUTOMATE(graph, "", output << (i->first).inner()(); for (set::const_iterator j = i->second.begin(); j != i->second.end(); ++j) - output << ' ' << (*j).inner()(); + output << ' ' << encode_hexenc(j->inner()()); output << '\n'; } } @@ -510,7 +518,7 @@ CMD_AUTOMATE(select, N_("SELECTOR"), for (set::const_iterator i = completions.begin(); i != completions.end(); ++i) - output << *i << '\n'; + output << encode_hexenc(i->inner()()) << '\n'; } struct node_info @@ -1215,13 +1223,15 @@ CMD_AUTOMATE(get_revision, N_("[REVID]") } else { - ident = revision_id(idx(args, 0)()); + ident = revision_id(decode_hexenc(idx(args, 0)())); N(db.revision_exists(ident), - F("no revision %s found in database") % ident); + F("no revision %s found in database") + % encode_hexenc(ident.inner()())); db.get_revision(ident, dat); } - L(FL("dumping revision %s") % ident); + L(FL("dumping revision %s") + % encode_hexenc(ident.inner()())); output.write(dat.inner()().data(), dat.inner()().size()); } @@ -1248,7 +1258,7 @@ CMD_AUTOMATE(get_base_revision_id, "", N(parents.size() == 1, F("this command can only be used in a single-parent workspace")); - output << parent_id(parents.begin()) << '\n'; + output << encode_hexenc(parent_id(parents.begin()).inner()()) << '\n'; } // Name: get_current_revision_id @@ -1285,7 +1295,7 @@ CMD_AUTOMATE(get_current_revision_id, "" calculate_ident(rev, new_revision_id); - output << new_revision_id << '\n'; + output << encode_hexenc(new_revision_id.inner()()) << '\n'; } // Name: get_manifest_of @@ -1354,15 +1364,17 @@ CMD_AUTOMATE(get_manifest_of, N_("[REVID } else { - revision_id rid = revision_id(idx(args, 0)()); + revision_id rid = revision_id(decode_hexenc(idx(args, 0)())); N(db.revision_exists(rid), - F("no revision %s found in database") % rid); + F("no revision %s found in database") + % encode_hexenc(rid.inner()())); db.get_roster(rid, new_roster); } calculate_ident(new_roster, mid); write_manifest_of_roster(new_roster, dat); - L(FL("dumping manifest %s") % mid); + L(FL("dumping manifest %s") + % encode_hexenc(mid.inner()())); output.write(dat.inner()().data(), dat.inner()().size()); } @@ -1390,11 +1402,12 @@ CMD_AUTOMATE(packet_for_rdata, N_("REVID packet_writer pw(output); - revision_id r_id(idx(args, 0)()); + revision_id r_id(decode_hexenc(idx(args, 0)())); revision_data r_data; N(db.revision_exists(r_id), - F("no such revision '%s'") % r_id); + F("no such revision '%s'") + % encode_hexenc(r_id.inner()())); db.get_revision(r_id, r_data); pw.consume_revision_data(r_id,r_data); } @@ -1422,11 +1435,12 @@ CMD_AUTOMATE(packets_for_certs, N_("REVI project_t project(db); packet_writer pw(output); - revision_id r_id(idx(args, 0)()); + revision_id r_id(decode_hexenc(idx(args, 0)())); vector< revision > certs; N(db.revision_exists(r_id), - F("no such revision '%s'") % r_id); + F("no such revision '%s'") + % encode_hexenc(r_id.inner()())); project.get_revision_certs(r_id, certs); for (size_t i = 0; i < certs.size(); ++i) pw.consume_revision_cert(idx(certs,i)); @@ -1454,11 +1468,12 @@ CMD_AUTOMATE(packet_for_fdata, N_("FILEI packet_writer pw(output); - file_id f_id(idx(args, 0)()); + file_id f_id(decode_hexenc(idx(args, 0)())); file_data f_data; N(db.file_version_exists(f_id), - F("no such file '%s'") % f_id); + F("no such file '%s'") + % encode_hexenc(f_id.inner()())); db.get_file_version(f_id, f_data); pw.consume_file_data(f_id,f_data); } @@ -1486,14 +1501,16 @@ CMD_AUTOMATE(packet_for_fdelta, N_("OLD_ packet_writer pw(output); - file_id f_old_id(idx(args, 0)()); - file_id f_new_id(idx(args, 1)()); + file_id f_old_id(decode_hexenc(idx(args, 0)())); + file_id f_new_id(decode_hexenc(idx(args, 1)())); file_data f_old_data, f_new_data; N(db.file_version_exists(f_old_id), - F("no such revision '%s'") % f_old_id); + F("no such revision '%s'") + % encode_hexenc(f_old_id.inner()())); N(db.file_version_exists(f_new_id), - F("no such revision '%s'") % f_new_id); + F("no such revision '%s'") + % encode_hexenc(f_new_id.inner()())); db.get_file_version(f_old_id, f_old_data); db.get_file_version(f_new_id, f_new_data); delta del; @@ -1528,8 +1545,9 @@ CMD_AUTOMATE(common_ancestors, N_("REV1 vector frontier; for (args_vector::const_iterator i = args.begin(); i != args.end(); ++i) { - revision_id rid((*i)()); - N(db.revision_exists(rid), F("no such revision '%s'") % rid); + revision_id rid(decode_hexenc((*i)())); + N(db.revision_exists(rid), F("no such revision '%s'") + % encode_hexenc(rid.inner()())); ancestors.clear(); ancestors.insert(rid); frontier.push_back(rid); @@ -1567,7 +1585,7 @@ CMD_AUTOMATE(common_ancestors, N_("REV1 for (set::const_iterator i = common_ancestors.begin(); i != common_ancestors.end(); ++i) if (!null_id(*i)) - output << (*i).inner()() << '\n'; + output << encode_hexenc((*i).inner()()) << '\n'; } // Name: branches @@ -1829,14 +1847,17 @@ CMD_AUTOMATE(get_content_changed, N_("RE revision_id ident; marking_map mm; - ident = revision_id(idx(args, 0)()); + ident = revision_id(decode_hexenc(idx(args, 0)())); N(db.revision_exists(ident), - F("no revision %s found in database") % ident); + F("no revision %s found in database") + % encode_hexenc(ident.inner()())); db.get_roster(ident, new_roster, mm); file_path path = file_path_external(idx(args,1)); N(new_roster.has_node(path), - F("file %s is unknown for revision %s") % path % ident); + F("file %s is unknown for revision %s") + % path + % encode_hexenc(ident.inner()())); node_t node = new_roster.get_node(path); marking_map::const_iterator m = mm.find(node->self); @@ -1892,19 +1913,23 @@ CMD_AUTOMATE(get_corresponding_path, N_( roster_t new_roster, old_roster; revision_id ident, old_ident; - ident = revision_id(idx(args, 0)()); + ident = revision_id(decode_hexenc(idx(args, 0)())); N(db.revision_exists(ident), - F("no revision %s found in database") % ident); + F("no revision %s found in database") + % encode_hexenc(ident.inner()())); db.get_roster(ident, new_roster); - old_ident = revision_id(idx(args, 2)()); + old_ident = revision_id(decode_hexenc(idx(args, 2)())); N(db.revision_exists(old_ident), - F("no revision %s found in database") % old_ident); + F("no revision %s found in database") + % encode_hexenc(old_ident.inner()())); db.get_roster(old_ident, old_roster); file_path path = file_path_external(idx(args,1)); N(new_roster.has_node(path), - F("file %s is unknown for revision %s") % path % ident); + F("file %s is unknown for revision %s") + % path + % encode_hexenc(ident.inner()())); node_t node = new_roster.get_node(path); basic_io::printer prt; @@ -1954,9 +1979,10 @@ CMD_AUTOMATE(put_file, N_("[FILEID] CONT { file_data dat(idx(args, 1)()); calculate_ident(dat, sha1sum); - file_id base_id(idx(args, 0)()); + file_id base_id(decode_hexenc(idx(args, 0)())); N(db.file_version_exists(base_id), - F("no file version %s found in database") % base_id); + F("no file version %s found in database") + % encode_hexenc(base_id.inner()())); // put_file_version won't do anything if the target ID already exists, // but we can save the delta calculation by checking here too @@ -1973,7 +1999,7 @@ CMD_AUTOMATE(put_file, N_("[FILEID] CONT else I(false); tr.commit(); - output << sha1sum << '\n'; + output << encode_hexenc(sha1sum.inner()()) << '\n'; } // Name: put_revision @@ -2028,9 +2054,10 @@ CMD_AUTOMATE(put_revision, N_("REVISION- // If the database refuses the revision, make sure this is because it's // already there. E(db.put_revision(id, rev) || db.revision_exists(id), - F("missing prerequisite for revision %s") % id); + F("missing prerequisite for revision %s") + % encode_hexenc(id.inner()())); - output << id << '\n'; + output << encode_hexenc(id.inner()()) << '\n'; } // Name: cert @@ -2058,7 +2085,7 @@ CMD_AUTOMATE(cert, N_("REVISION-ID NAME revision_id rid(decode_hexenc(idx(args, 0)())); N(db.revision_exists(rid), - F("no such revision '%s'") % rid); + F("no such revision '%s'") % idx(args, 0)()); cache_user_key(app.opts, app.lua, db, keys); put_simple_revision_cert(db, keys, rid, cert_name(idx(args, 1)()), ============================================================ --- cert.cc 0f0995fe95590541db6379205bcf76ada7988be4 +++ cert.cc 0230b382c6e4ee33646e2f484b79699e6a41fc15 @@ -146,14 +146,21 @@ erase_bogus_certs(database & db, get<1>(i->first), decoded_value)) { - L(FL("trust function liked %d signers of %s cert on manifest %s") - % i->second.first->size() % get<1>(i->first) % get<0>(i->first)); + if (global_sanity.debug_p()) + { + L(FL("trust function liked %d signers of %s cert on manifest %s") + % i->second.first->size() + % get<1>(i->first) + % encode_hexenc(get<0>(i->first).inner()())); + } tmp_certs.push_back(*(i->second.second)); } else { W(F("trust function disliked %d signers of %s cert on manifest %s") - % i->second.first->size() % get<1>(i->first) % get<0>(i->first)); + % i->second.first->size() + % get<1>(i->first) + % encode_hexenc(get<0>(i->first).inner()())); } } certs = tmp_certs; @@ -203,14 +210,19 @@ erase_bogus_certs(database & db, get<1>(i->first), decoded_value)) { - L(FL("trust function liked %d signers of %s cert on revision %s") - % i->second.first->size() % get<1>(i->first) % get<0>(i->first)); + if (global_sanity.debug_p()) + L(FL("trust function liked %d signers of %s cert on revision %s") + % i->second.first->size() + % get<1>(i->first) + % encode_hexenc(get<0>(i->first).inner()())); tmp_certs.push_back(*(i->second.second)); } else { W(F("trust function disliked %d signers of %s cert on revision %s") - % i->second.first->size() % get<1>(i->first) % get<0>(i->first)); + % i->second.first->size() + % get<1>(i->first) + % encode_hexenc(get<0>(i->first).inner()())); } } certs = tmp_certs; @@ -330,7 +342,10 @@ cert_signable_text(cert const & t, cert_signable_text(cert const & t, string & out) { - out = (FL("address@hidden:%s]") % t.name % t.ident % remove_ws(t.value())).str(); + out = (FL("address@hidden:%s]") + % t.name + % encode_hexenc(t.ident.inner()()) + % remove_ws(t.value())).str(); L(FL("cert: signable text %s") % out); } @@ -340,7 +355,7 @@ cert_hash_code(cert const & t, id & out) string tmp; tmp.reserve(4+t.ident.inner()().size() + t.name().size() + t.value().size() + t.key().size() + t.sig().size()); - tmp.append(t.ident.inner()()); + tmp.append(encode_hexenc(t.ident.inner()())); tmp += ':'; tmp.append(t.name()); tmp += ':'; @@ -406,11 +421,13 @@ guess_branch(options & opts, project_t & N(branches.size() != 0, F("no branch certs found for revision %s, " - "please provide a branch name") % ident); + "please provide a branch name") + % encode_hexenc(ident.inner()())); N(branches.size() == 1, F("multiple branch certs found for revision %s, " - "please provide a branch name") % ident); + "please provide a branch name") + % encode_hexenc(ident.inner()())); set::iterator i = branches.begin(); I(i != branches.end()); ============================================================ --- cmd_diff_log.cc 9104b66d0447196da48692151e68cc59f4735b52 +++ cmd_diff_log.cc 99423c43818a40c6e43e46b600fccf88dd697f30 @@ -399,7 +399,7 @@ prepare_diff(app_state & app, make_cset(restricted_roster, new_roster, excluded); new_is_archived = false; - header << "# old_revision [" << old_rid << "]\n"; + header << "# old_revision [" << encode_hexenc(old_rid.inner()()) << "]\n"; } else if (app.opts.revision_selectors.size() == 1) { @@ -425,7 +425,7 @@ prepare_diff(app_state & app, make_cset(restricted_roster, new_roster, excluded); new_is_archived = false; - header << "# old_revision [" << r_old_id << "]\n"; + header << "# old_revision [" << encode_hexenc(r_old_id.inner()()) << "]\n"; } else if (app.opts.revision_selectors.size() == 2) { ============================================================ --- cmd_list.cc 0a1e588d9707dcac51a0103326bcd0d763193fb1 +++ cmd_list.cc 2938133222d8a2c009e3917177ea9da86d7a5612 @@ -337,7 +337,7 @@ CMD(tags, "tags", "", CMD_REF(list), "", for (set::const_iterator i = tags.begin(); i != tags.end(); ++i) { cout << i->name << ' ' - << i->ident << ' ' + << encode_hexenc(i->ident.inner()()) << ' ' << i->key << '\n'; } } ============================================================ --- cmd_merging.cc fd4090137c7de4255f1f28befebcea19a1a2cf56 +++ cmd_merging.cc fca7dcf4e8dc55fced64896a10bce5dfd0fb9a33 @@ -217,7 +217,8 @@ CMD(update, "update", "", CMD_REF(worksp return; } - P(F("selected update target %s") % chosen_rid); + P(F("selected update target %s") + % encode_hexenc(chosen_rid.inner()())); // Fiddle around with branches, in an attempt to guess what the user // wants. @@ -306,7 +307,8 @@ CMD(update, "update", "", CMD_REF(worksp if (switched_branch) P(F("switched branch; next commit will use branch %s") % app.opts.branchname()); - P(F("updated to base revision %s") % chosen_rid); + P(F("updated to base revision %s") + % encode_hexenc(chosen_rid.inner()())); } // Subroutine of CMD(merge) and CMD(explicit_merge). Merge LEFT with RIGHT, @@ -336,8 +338,12 @@ merge_two(options & opts, lua_hooks & lu if (branch != opts.branchname) fieldwidth = max(fieldwidth, strlen("to branch '")); - log << setw(fieldwidth - strlen(" of '")) << caller << " of '" << left - << "'\n" << setw(fieldwidth) << "and '" << right + hexenc left_hid, right_hid; + encode_hexenc(left.inner(), left_hid); + encode_hexenc(right.inner(), right_hid); + + log << setw(fieldwidth - strlen(" of '")) << caller << " of '" << left_hid + << "'\n" << setw(fieldwidth) << "and '" << right_hid << "'\n"; if (branch != opts.branchname) @@ -346,12 +352,12 @@ merge_two(options & opts, lua_hooks & lu // Now it's time for the real work. if (automate) { - output << left << " " << right << " "; + output << left_hid << " " << right_hid << " "; } else { - P(F("[left] %s") % left); - P(F("[right] %s") % right); + P(F("[left] %s") % left_hid); + P(F("[right] %s") % right_hid); } revision_id merged; @@ -363,9 +369,9 @@ merge_two(options & opts, lua_hooks & lu guard.commit(); if (automate) - output << merged << "\n"; + output << encode_hexenc(merged.inner()()) << "\n"; else - P(F("[merged] %s") % merged); + P(F("[merged] %s") % encode_hexenc(merged.inner()())); } // should merge support --message, --message-file? It seems somewhat weird, ============================================================ --- cmd_ws_commit.cc c0bb404ea6b52a3b44b5e7c4ddb53cbdcaf5aa89 +++ cmd_ws_commit.cc 3c045aeb35d2f4750f1f1761853a59ad2a3b5558 @@ -51,7 +51,8 @@ revision_summary(revision_t const & rev, revision_id parent = edge_old_revision(*i); // A colon at the end of this string looked nicer, but it made // double-click copying from terminals annoying. - out += (F("Changes against parent %s") % parent).str() += '\n'; + out += (F("Changes against parent %s") + % encode_hexenc(parent.inner()())).str() += '\n'; cset const & cs = edge_changes(*i); ============================================================ --- database_check.cc e7462b630cad47cf8e0c263b293b7228d8e16392 +++ database_check.cc 623c1ed8dab8510f0f7b4d025d38e2a25738dbea @@ -510,7 +510,7 @@ check_heights(database & db, for (set::const_iterator i = heights.begin(); i != heights.end(); ++i) { - L(FL("checking height for %s") % *i); + L(FL("checking height for %s") % encode_hexenc(i->inner()())); rev_height h; try @@ -559,12 +559,17 @@ check_heights_relation(database & db, if (!checked_heights[p_id].found || !checked_heights[c_id].found) { - L(FL("missing height(s), skipping edge %s -> %s") % p_id % c_id); + if (global_sanity.debug_p()) + L(FL("missing height(s), skipping edge %s -> %s") + % encode_hexenc(p_id.inner()()) + % encode_hexenc(c_id.inner()())); continue; } - L(FL("checking heights for edges %s -> %s") % - p_id % c_id); + if (global_sanity.debug_p()) + L(FL("checking heights for edges %s -> %s") + % encode_hexenc(p_id.inner()()) + % encode_hexenc(c_id.inner()())); rev_height parent, child; db.get_rev_height(p_id, parent); @@ -572,8 +577,12 @@ check_heights_relation(database & db, if (!(child > parent)) { - L(FL("error: height %s of child %s not greater than height %s of parent %s") - % child % c_id % parent % p_id); + if (global_sanity.debug_p()) + L(FL("error: height %s of child %s not greater than height %s of parent %s") + % child + % encode_hexenc(c_id.inner()()) + % parent + % encode_hexenc(p_id.inner()())); checked_heights[c_id].sensible = false; // defaults to true continue; } ============================================================ --- graph.cc be600b6812d5a9d04a79e577d25b9024c1d83286 +++ graph.cc 6c35d2e5d5708e429f7e4d9c2ab77809b7ad9477 @@ -10,6 +10,7 @@ #include "numeric_vocab.hh" #include "hash_map.hh" #include "vocab_hash.hh" +#include "transforms.hh" using boost::shared_ptr; using std::string; @@ -91,7 +92,10 @@ get_reconstruction_path(id const & start for (set::const_iterator j = next.begin(); j != next.end(); ++j) { - L(FL("considering %s -> %s") % tip % *j); + if (global_sanity.debug_p()) + L(FL("considering %s -> %s") + % encode_hexenc(tip()) + % encode_hexenc((*j)())); if (seen_nodes.find(*j) == seen_nodes.end()) { shared_ptr pthN; ============================================================ --- lua-testsuite.lua 132d87aa7f69e7b4d5a8351e57a3a9de8055509a +++ lua-testsuite.lua d2db92ea969f6b5a4a7cd2d6a0dc6c528b41bbfa @@ -9,7 +9,7 @@ function safe_mtn(...) err("'mtn' environment variable not set") end end - return {monotone_path, "--debug", "--norc", "--root=" .. test.root, + return {monotone_path, "--norc", "--root=" .. test.root, "--confdir="..test.root, unpack(arg)} end ============================================================ --- netsync.cc 19837b5f6584044bfc8d3d0321002a7667535ab3 +++ netsync.cc 6ab908bf37623d218467c5e77fb1bcfd94cf16c8 @@ -1305,7 +1305,9 @@ session::process_hello_cmd(rsa_keypair_i id their_key_hash; encode_base64(their_key, their_key_encoded); key_hash_code(their_keyname, their_key_encoded, their_key_hash); - L(FL("server key has name %s, hash %s") % their_keyname % their_key_hash); + L(FL("server key has name %s, hash %s") + % their_keyname + % encode_hexenc(their_key_hash())); var_key their_key_key(known_servers_domain, var_name(peer_id)); if (project.db.var_exists(their_key_key)) { @@ -1321,7 +1323,8 @@ session::process_hello_cmd(rsa_keypair_i "remote host sent key %s\n" "I expected %s\n" "'%s unset %s %s' overrides this check") - % their_key_hash % expected_key_hash + % encode_hexenc(their_key_hash()) + % encode_hexenc(expected_key_hash()) % ui.prog_name % their_key_key.first % their_key_key.second); E(false, F("server key changed")); } @@ -1330,7 +1333,9 @@ session::process_hello_cmd(rsa_keypair_i { P(F("first time connecting to server %s\n" "I'll assume it's really them, but you might want to double-check\n" - "their key's fingerprint: %s") % peer_id % their_key_hash); + "their key's fingerprint: %s") + % peer_id + % encode_hexenc(their_key_hash())); project.db.set_var(their_key_key, var_value(their_key_hash())); } if (project.db.put_key(their_keyname, their_key_encoded)) @@ -1340,7 +1345,8 @@ session::process_hello_cmd(rsa_keypair_i hexenc hnonce; encode_hexenc(nonce, hnonce); L(FL("received 'hello' netcmd from server '%s' with nonce '%s'") - % their_key_hash % hnonce); + % encode_hexenc(their_key_hash()) + % hnonce); } I(project.db.public_key_exists(their_key_hash)); @@ -1537,7 +1543,7 @@ session::process_auth_cmd(protocol_role their_exclude_pattern); error(unknown_key, (F("remote public key hash '%s' is unknown") - % client).str()); + % encode_hexenc(client())).str()); } } ============================================================ --- rcs_import.cc d2174e85f4f19510a6bd5836b49fff93dfd66c2e +++ rcs_import.cc cbc2a655abdc7bfd9a0d166c15d0f4b04138d70a @@ -1401,7 +1401,8 @@ cluster_consumer::build_cset(cvs_cluster if (e == live_files.end()) { add_missing_parents(pth.dirname(), cs); - L(FL("adding entry state '%s' on '%s'") % fid % pth); + L(FL("adding entry state '%s' on '%s'") + % encode_hexenc(fid.inner()()) % pth); safe_insert(cs.files_added, make_pair(pth, fid)); live_files[i->first] = i->second.version; } @@ -1409,7 +1410,9 @@ cluster_consumer::build_cset(cvs_cluster { file_id old_fid(cvs.file_version_interner.lookup(e->second)); L(FL("applying state delta on '%s' : '%s' -> '%s'") - % pth % old_fid % fid); + % pth + % encode_hexenc(old_fid.inner()()) + % encode_hexenc(fid.inner()())); safe_insert(cs.deltas_applied, make_pair(pth, make_pair(old_fid, fid))); live_files[i->first] = i->second.version; @@ -1420,7 +1423,8 @@ cluster_consumer::build_cset(cvs_cluster map::const_iterator e = live_files.find(i->first); if (e != live_files.end()) { - L(FL("deleting entry state '%s' on '%s'") % fid % pth); + L(FL("deleting entry state '%s' on '%s'") + % encode_hexenc(fid.inner()()) % pth); safe_insert(cs.nodes_deleted, pth); live_files.erase(i->first); } ============================================================ --- selectors.cc c60f8ced9db5d747054b763370746189a7e85874 +++ selectors.cc 6fd1ac5d5fc2d8265d999af46c75fe9ff3e1358b @@ -16,6 +16,7 @@ #include "project.hh" #include "globish.hh" #include "cmd.hh" +#include "transforms.hh" #include #include @@ -342,9 +343,10 @@ complete(app_state & app, && sels[0].first == sel_ident && sels[0].second.size() == constants::idlen) { - completions.insert(revision_id(sels[0].second)); + completions.insert(revision_id(decode_hexenc(sels[0].second))); N(project.db.revision_exists(*completions.begin()), - F("no such revision '%s'") % *completions.begin()); + F("no such revision '%s'") + % encode_hexenc(completions.begin()->inner()())); return; } @@ -357,12 +359,12 @@ complete(app_state & app, for (set::const_iterator i = completions.begin(); i != completions.end(); ++i) { - P(F("expanded to '%s'") % *i); + P(F("expanded to '%s'") % encode_hexenc(i->inner()())); // This may be impossible, but let's make sure. // All the callers used to do it. N(project.db.revision_exists(*i), - F("no such revision '%s'") % *i); + F("no such revision '%s'") % encode_hexenc(i->inner()())); } } @@ -397,7 +399,7 @@ expand_selector(app_state & app, && sels[0].first == sel_ident && sels[0].second.size() == constants::idlen) { - completions.insert(revision_id(sels[0].second)); + completions.insert(revision_id(decode_hexenc(sels[0].second))); return; } ============================================================ --- vocab.cc d966715de6cefce23b41320e88cdb28ca035405f +++ vocab.cc 1c2ac62c2cd53e7a439c99a70d149c077652aaf3 @@ -72,6 +72,22 @@ inline void } inline void +verify(id & val) +{ + if (val.ok) + return; + + if (val().empty()) + return; + + N(val().size() == constants::sha1_digest_length, + F("binary ID '%s' size != %d") + % encode_hexenc(val()) + % constants::sha1_digest_length); + val.ok = true; +} + +inline void verify_full(symbol & val) { for (string::const_iterator i = val().begin(); i != val().end(); ++i) @@ -178,6 +194,7 @@ fake_id() #define DECORATE(dec) cc_DECORATE(dec) #define ATOMIC(ty) cc_ATOMIC(ty) #define ATOMIC_NOVERIFY(ty) cc_ATOMIC_NOVERIFY(ty) +#define ATOMIC_BINARY(ty) cc_ATOMIC_BINARY(ty) #ifdef EXTERN #undef EXTERN @@ -195,26 +212,91 @@ template void dump(base64 const&, string &); template -void dump(revision_id const & r, string &); +void dump(roster_data const & d, string &); template -void dump(manifest_id const & r, string &); +void dump(roster_delta const & d, string &); template -void dump(file_id const & r, string &); +void dump(manifest_data const & d, string &); -template -void dump(hexenc const & r, string &); +/* + * specializations for hexenc, which allows the encoded id + * to be dumped out, even if id itself must never be dumped + * because it's binary. + */ +template <> +void dump (hexenc const & obj, std::string & out) +{ + out = encode_hexenc(obj()); +} -template -void dump(roster_data const & d, string &); +template <> +std::ostream & +operator<< (std::ostream & out, hexenc const & hex_id) +{ + return (out << encode_hexenc(hex_id())); +} -template -void dump(roster_delta const & d, string &); -template -void dump(manifest_data const & d, string &); +/* + * specializations for decorated binary values, which shouldn't + * be dumped out as binaries. + * + * FIXME: these shouldn't be necessary. Heck, you shouldn't even + * use them. They are here to tell you *where* you are + * calling them. Otherwise, you'd just get a linker error + * for undefined references. + */ +template <> +void dump (revision const & obj, std::string & out) +{ + W(F("shouldn't dump out binary revision_id contents!")); + *((char*) NULL) = 0; + out = encode_hexenc(obj.inner()()); +} + +template <> std::ostream & +operator<< (std::ostream & out, revision const & id) +{ + W(F("shouldn't dump out binary revision_id contents!")); + *((char*) NULL) = 0; + return (out << encode_hexenc(id.inner()())); +} + +template <> +void dump (manifest const & obj, std::string & out) +{ + W(F("shouldn't dump out binary manifest_id contents!")); + *((char*) NULL) = 0; + out = encode_hexenc(obj.inner()()); +} + +template <> std::ostream & +operator<< (std::ostream & out, manifest const & id) +{ + W(F("shouldn't dump out binary manifest_id contents!")); + *((char*) NULL) = 0; + return (out << encode_hexenc(id.inner()())); +} + +template <> +void dump (file const & obj, std::string & out) +{ + W(F("shouldn't dump out binary file_id contents!")); + *((char*) NULL) = 0; + out = encode_hexenc(obj.inner()()); +} + +template <> std::ostream & +operator<< (std::ostream & out, file const & id) +{ + W(F("shouldn't dump out binary file_id contets!")); + *((char*) NULL) = 0; + return (out << encode_hexenc(id.inner()())); +} + #ifdef BUILD_UNIT_TESTS #include "unit_tests.hh" ============================================================ --- vocab.hh 6d861210ecb11e8378ca3dfa2365f414973526ed +++ vocab.hh c7641081ac95429074a7dcff7875fad65b1612c8 @@ -55,6 +55,7 @@ public: #define DECORATE(dec) hh_DECORATE(dec) #define ATOMIC(ty) hh_ATOMIC(ty) #define ATOMIC_NOVERIFY(ty) hh_ATOMIC_NOVERIFY(ty) +#define ATOMIC_BINARY(ty) hh_ATOMIC_BINARY(ty) inline bool is_xdigit(char x) { @@ -96,6 +97,7 @@ inline bool is_space(char x) #undef ATOMIC #undef ATOMIC_NOVERIFY +#undef ATOMIC_BINARY #undef DECORATE #undef ENCODING ============================================================ --- vocab_hash.hh 1bf71979cd58adf60349d0fb28459176c92f287b +++ vocab_hash.hh b89b926ae456c4429382e454cffb5c9d99f1abd4 @@ -49,6 +49,18 @@ }; \ } +#define ATOMIC_BINARY(ty) \ + namespace hashmap { \ + template<> \ + struct hash \ + { \ + size_t operator()(ty const & t) const \ + { \ + return hash()(t()); \ + } \ + }; \ + } + #define ATOMIC_NOVERIFY(ty) ATOMIC(ty) #include "vocab_terms.hh" ============================================================ --- vocab_macros.hh 7025028f87c647715e14fb50c13866e8df52d684 +++ vocab_macros.hh 3e98a31c4c78c36b9c22900be265f23123d30e45 @@ -106,11 +106,40 @@ inline void verify(ty &t) inline void verify(ty &t) \ { if(!t.ok) verify_full(t); }; + #define hh_ATOMIC_NOVERIFY(ty) \ ATOMIC(ty) \ inline void verify_full(ty &) {} +#define hh_ATOMIC_BINARY(ty) \ +class ty { \ + immutable_string s; \ +public: \ + bool ok; \ + ty() : ok(false) {} \ + explicit ty(std::string const & str); \ + ty(ty const & other); \ + std::string const & operator()() const \ + { return s.get(); } \ + bool operator<(ty const & other) const \ + { return s.get() < other(); } \ + ty const & operator=(ty const & other); \ + bool operator==(ty const & other) const \ + { return s.get() == other(); } \ + bool operator!=(ty const & other) const \ + { return s.get() != other(); } \ + friend void verify(ty &); \ + friend void verify_full(ty &); \ + struct symtab \ + { \ + symtab(); \ + ~symtab(); \ + }; \ +}; \ +inline void verify_full(ty &) {} + + //CC @@ -157,7 +186,39 @@ ty::symtab::~symtab() #define cc_ATOMIC_NOVERIFY(ty) cc_ATOMIC(ty) +#define cc_ATOMIC_BINARY(ty) \ + \ +static symtab_impl ty ## _tab; \ +static size_t ty ## _tab_active = 0; \ + \ +ty::ty(string const & str) : \ + s((ty ## _tab_active > 0) \ + ? (ty ## _tab.unique(str)) \ + : str), \ + ok(false) \ +{ verify(*this); } \ + \ +ty::ty(ty const & other) : \ + s(other.s), ok(other.ok) \ +{ verify(*this); } \ + \ +ty const & ty::operator=(ty const & other) \ +{ s = other.s; ok = other.ok; \ + verify(*this); return *this; } \ + \ +ty::symtab::symtab() \ +{ ty ## _tab_active++; } \ + \ +ty::symtab::~symtab() \ +{ \ + I(ty ## _tab_active > 0); \ + ty ## _tab_active--; \ + if (ty ## _tab_active == 0) \ + ty ## _tab.clear(); \ +} + + #define cc_ENCODING(enc) \ \ template \ ============================================================ --- vocab_terms.hh 8b2cc02ef4b8f211f9ca6640ad64922469530ff0 +++ vocab_terms.hh f314ffbf3ac27df4aa973cd9371fd633914be492 @@ -15,7 +15,7 @@ ATOMIC(symbol); // valid b ATOMIC_NOVERIFY(utf8); // unknown string in UTF8 charset ATOMIC(symbol); // valid basic io symbol (alphanumeric or _ chars) -ATOMIC_NOVERIFY(id); // hash of data +ATOMIC_BINARY(id); // hash of data ATOMIC_NOVERIFY(data); // meaningless blob ATOMIC_NOVERIFY(delta); // xdelta between 2 datas ATOMIC_NOVERIFY(inodeprint); // fingerprint of an inode @@ -112,12 +112,18 @@ EXTERN template class base64; // instantiate those bits of the stream operator vocab (again) actually in // use. "again" since stream operators are friends, not members. +#if 0 EXTERN template std::ostream & operator<< <>(std::ostream &, hexenc const &); +#endif -// for some reason, we need this output operator for file, which surely -// return -EXTERN template std::ostream & operator<< <>(std::ostream &, file const &); +#if 0 + +// EXTERN template std::ostream & operator<< <>(std::ostream &, revision const &); + +#endif + + EXTERN template std::ostream & operator<< <>(std::ostream &, hexenc const &); EXTERN template std::ostream & operator<< <>(std::ostream &, roster const &);