# # patch "app_state.cc" # from [a7ed8e649668aca70e915e9071469219ecf9db75] # to [0d29403d596b4e71a33857321ed276b5992c80d0] # # patch "commands.cc" # from [ae7291420f4fe4e1bd44c8ad89bca05e90322c43] # to [3ff55abd9393a1f9587d8fba405ce54801e5cd11] # # patch "diff_patch.cc" # from [ef0c0571db4382835b2fa73475bd23cbe6a6ea33] # to [cbb7be193c75e6716d896a21e1e98ed2f53db348] # # patch "lcs.cc" # from [193afbcac67d99ed241454330cd58ccb449214c0] # to [21272ff8f2b22d276c671a34eb2d0ecdd94f96ca] # # patch "lcs.hh" # from [922bd65f4311335fd90485ff4bff6c962072acfa] # to [8fd9c138a9fb9baa870ebdf56723bb5ef189a081] # # patch "lua.cc" # from [324daba07afed4fccaa12d4c7bab4f02d744e705] # to [8f42af379ac825a6bbfc0ab13dfd6fc4a878befa] # # patch "transforms.cc" # from [7c75b6c118e849c06ac04466a1546ac2b152c1a4] # to [f0cb42ea02060977e94fbe5dd546055b94ca0e93] # # patch "transforms.hh" # from [19f4be0e47d83830cc4a4d7279a2a24a54ce2e3d] # to [9050965b0c215f29520dbff7fea90c0ced09da4a] # # patch "win32/inodeprint.cc" # from [d5935da66c0603bca05f8a4d4778e46fe5f21bb1] # to [d24a652d491a9cf5a98340260453d3b7279af92e] # --- app_state.cc +++ app_state.cc @@ -187,7 +187,7 @@ static file_path dot("."); if (restrictions.empty()) { - L(F("empty restricted path set; '%s' included\n") % path()); + // L(F("empty restricted path set; '%s' included\n") % path()); return true; } --- commands.cc +++ commands.cc @@ -2897,8 +2897,6 @@ else if (app.revision_selectors.size() == 1) app.require_working_copy(); - transaction_guard guard(app.db); - if (app.revision_selectors.size() == 0) { manifest_map m_old; @@ -3026,7 +3024,6 @@ cout << "# " << endl; dump_diffs(composite.deltas, app, new_is_archived, type); - } CMD(cdiff, "informative", "[--revision=REVISION [--revision=REVISION]] [PATH]...", @@ -3553,6 +3550,12 @@ } } +CMD(update_inodeprints, "tree", "", "update the inodeprint cache") +{ + enable_inodeprints(); + maybe_update_inodeprints(app); +} + CMD(explicit_merge, "tree", "LEFT-REVISION RIGHT-REVISION DEST-BRANCH\nLEFT-REVISION RIGHT-REVISION COMMON-ANCESTOR DEST-BRANCH", "merge two explicitly given revisions, placing result in given branch") { --- diff_patch.cc +++ diff_patch.cc @@ -97,11 +97,11 @@ edit_t type; }; -void calculate_extents(vector const & a_b_edits, - vector const & b, - vector & prefix, +void calculate_extents(vector const & a_b_edits, + vector const & b, + vector & prefix, vector & extents, - vector & suffix, + vector & suffix, size_t const a_len, interner & intern) { @@ -109,7 +109,7 @@ size_t a_pos = 0, b_pos = 0; - for (vector::const_iterator i = a_b_edits.begin(); + for (vector::const_iterator i = a_b_edits.begin(); i != a_b_edits.end(); ++i) { // L(F("edit: %d") % *i); @@ -173,8 +173,8 @@ } void normalize_extents(vector & a_b_map, - vector const & a, - vector const & b) + vector const & a, + vector const & b) { for (size_t i = 0; i < a_b_map.size(); ++i) { @@ -271,10 +271,10 @@ void merge_extents(vector const & a_b_map, vector const & a_c_map, - vector const & b, - vector const & c, + vector const & b, + vector const & c, interner const & in, - vector & merged) + vector & merged) { I(a_b_map.size() == a_c_map.size()); @@ -356,13 +356,13 @@ vector const & right, vector & merged) { - vector anc_interned; - vector left_interned, right_interned; - vector left_edits, right_edits; - vector left_prefix, right_prefix; - vector left_suffix, right_suffix; + vector anc_interned; + vector left_interned, right_interned; + vector left_edits, right_edits; + vector left_prefix, right_prefix; + vector left_suffix, right_suffix; vector left_extents, right_extents; - vector merged_interned; + vector merged_interned; interner in; // for (int i = 0; i < std::min(std::min(left.size(), right.size()), ancestor.size()); ++i) @@ -444,7 +444,7 @@ copy(right_suffix.begin(), right_suffix.end(), back_inserter(merged_interned)); merged.reserve(merged_interned.size()); - for (vector::const_iterator i = merged_interned.begin(); + for (vector::const_iterator i = merged_interned.begin(); i != merged_interned.end(); ++i) merged.push_back(in.lookup(*i)); } @@ -730,9 +730,9 @@ virtual ~hunk_consumer() {} }; -void walk_hunk_consumer(vector const & lcs, - vector const & lines1, - vector const & lines2, +void walk_hunk_consumer(vector const & lcs, + vector const & lines1, + vector const & lines2, hunk_consumer & cons) { @@ -750,7 +750,7 @@ else { // normal case: files have something in common - for (vector::const_iterator i = lcs.begin(); + for (vector::const_iterator i = lcs.begin(); i != lcs.end(); ++i, ++a, ++b) { if (idx(lines1, a) == *i && idx(lines2, b) == *i) @@ -1056,9 +1056,9 @@ ostream & ost, diff_type type) { - vector left_interned; - vector right_interned; - vector lcs; + vector left_interned; + vector right_interned; + vector lcs; interner in; --- lcs.cc +++ lcs.cc @@ -49,11 +49,11 @@ { long lo; long hi; - static std::vector vec; + static std::vector vec; work_vec(long lo, long hi) : lo(lo), hi(hi) { - I(hi >= lo); + // I(hi >= lo); size_t len = (hi - lo) + 1; vec.resize(len); vec.assign(len, -1); @@ -61,12 +61,12 @@ inline long & operator[](long t) { - I(t >= lo && t <= hi); + // I(t >= lo && t <= hi); return vec[t-lo]; } }; -std::vector work_vec::vec; +std::vector work_vec::vec; template cost_vec; - typedef std::vector edit_vec; + typedef std::vector cost_vec; + typedef std::vector edit_vec; template struct subarray @@ -89,7 +89,7 @@ subarray(T b, long s, long e) : base(b), start(s), end(e) {} - long size() const + inline long size() const { if (end < start) return start - end; @@ -97,12 +97,12 @@ return end - start; } - subarray subset(long s, long e) const + inline subarray subset(long s, long e) const { return subarray(base + std::min(start, end), s, e); } - vt const & operator[](size_t idx) const + inline vt const & operator[](size_t idx) const { if (end < start) return *(base + (start - (idx + 1))); @@ -321,7 +321,7 @@ // trims and calls diff_to_ez static long diff_to_et(subarray const & a, long start_a, long end_a, subarray const & b, long start_b, long end_b, - std::vector & edits, + std::vector & edits, long edx, long polarity, long p_lim) @@ -363,7 +363,7 @@ static long diff_to_ez(subarray const & a, long start_a, long end_a, subarray const & b, long start_b, long end_b, - std::vector & edits, + std::vector & edits, long edx1, long polarity, long p_lim) @@ -447,7 +447,7 @@ static void diff_to_edits(subarray const & a, long m, subarray const & b, long n, - std::vector & edits, + std::vector & edits, long p_lim) { I(m <= n); @@ -462,13 +462,13 @@ I(cost == edit_distance); } - static void edits_to_lcs (std::vector const & edits, + static void edits_to_lcs (std::vector const & edits, subarray const a, long m, long n, LCS output) { long edx = 0, sdx = 0, adx = 0; typedef typename std::iterator_traits::value_type vt; - std::vector lcs(((m + n) - edits.size()) / 2); + std::vector lcs(((m + n) - edits.size()) / 2); while (true) { long edit = (edx < static_cast(edits.size())) ? edits[edx] : 0; @@ -496,7 +496,7 @@ void _edit_script(A begin_a, A end_a, B begin_b, B end_b, long p_lim, - std::vector & edits_out, + std::vector & edits_out, LCS ignored_out) { typedef jaffer_edit_calculator calc_t; @@ -558,12 +558,12 @@ void -longest_common_subsequence(std::vector::const_iterator begin_a, - std::vector::const_iterator end_a, - std::vector::const_iterator begin_b, - std::vector::const_iterator end_b, +longest_common_subsequence(std::vector::const_iterator begin_a, + std::vector::const_iterator end_a, + std::vector::const_iterator begin_b, + std::vector::const_iterator end_b, long p_lim, - std::back_insert_iterator< std::vector > lcs) + std::back_insert_iterator< std::vector > lcs) { _longest_common_subsequence(begin_a, end_a, begin_b, end_b, @@ -571,14 +571,14 @@ } void -edit_script(std::vector::const_iterator begin_a, - std::vector::const_iterator end_a, - std::vector::const_iterator begin_b, - std::vector::const_iterator end_b, +edit_script(std::vector::const_iterator begin_a, + std::vector::const_iterator end_a, + std::vector::const_iterator begin_b, + std::vector::const_iterator end_b, long p_lim, - std::vector & edits_out) + std::vector & edits_out) { - std::vector lcs; + std::vector lcs; _edit_script(begin_a, end_a, begin_b, end_b, p_lim, edits_out, --- lcs.hh +++ lcs.hh @@ -8,21 +8,22 @@ #include #include +#include "quick_alloc.hh" void -longest_common_subsequence(std::vector::const_iterator begin_a, - std::vector::const_iterator end_a, - std::vector::const_iterator begin_b, - std::vector::const_iterator end_b, +longest_common_subsequence(std::vector::const_iterator begin_a, + std::vector::const_iterator end_a, + std::vector::const_iterator begin_b, + std::vector::const_iterator end_b, long p_lim, - std::back_insert_iterator< std::vector > lcs); + std::back_insert_iterator< std::vector > lcs); void -edit_script(std::vector::const_iterator begin_a, - std::vector::const_iterator end_a, - std::vector::const_iterator begin_b, - std::vector::const_iterator end_b, +edit_script(std::vector::const_iterator begin_a, + std::vector::const_iterator end_a, + std::vector::const_iterator begin_b, + std::vector::const_iterator end_b, long p_lim, - std::vector & edits_out); + std::vector & edits_out); #endif // __LCS_HH__ --- lua.cc +++ lua.cc @@ -201,6 +201,7 @@ { lua_State * st; bool failed; + static std::set missing_functions; Lua(lua_State * s) : st(s), failed(false) @@ -473,16 +474,35 @@ lua_pop(st, count); return *this; } + + Lua & func(string const & fname) + { + if (!failed) + { + if (missing_functions.find(fname) != missing_functions.end()) + failed = true; + else + { + push_str(fname); + get_fn(); + if (failed) + missing_functions.insert(fname); + } + } + return *this; + } + }; +std::set Lua::missing_functions; + static bool run_string(lua_State * st, string const &str) { I(st); return Lua(st) - .push_str("loadstring") - .get_fn() + .func("loadstring") .push_str(str) .call(1,1) .call(0,0) @@ -495,8 +515,7 @@ I(st); return Lua(st) - .push_str("loadfile") - .get_fn() + .func("loadfile") .push_str(filename) .call(1,1) .call(0,0) @@ -560,8 +579,7 @@ lua_hooks::hook_get_passphrase(rsa_keypair_id const & k, string & phrase) { return Lua(st) - .push_str("get_passphrase") - .get_fn() + .func("get_passphrase") .push_str(k()) .call(1,1) .extract_str(phrase) @@ -573,8 +591,7 @@ { bool persist_ok = false; bool executed_ok = Lua(st) - .push_str("persist_phrase_ok") - .get_fn() + .func("persist_phrase_ok") .call(0,1) .extract_bool(persist_ok) .ok(); @@ -586,8 +603,7 @@ std::string & exp) { return Lua(st) - .push_str("expand_selector") - .get_fn() + .func("expand_selector") .push_str(sel) .call(1,1) .extract_str(exp) @@ -600,8 +616,7 @@ { string key; bool ok = Lua(st) - .push_str("get_branch_key") - .get_fn() + .func("get_branch_key") .push_str(branchname()) .call(1,1) .extract_str(key) @@ -617,8 +632,7 @@ { string key; bool ok = Lua(st) - .push_str("get_priv_key") - .get_fn() + .func("get_priv_key") .push_str(k()) .call(1,1) .extract_str(key) @@ -633,8 +647,7 @@ string & author) { return Lua(st) - .push_str("get_author") - .get_fn() + .func("get_author") .push_str(branchname()) .call(1,1) .extract_str(author) @@ -647,8 +660,7 @@ string & result) { return Lua(st) - .push_str("edit_comment") - .get_fn() + .func("edit_comment") .push_str(commentary) .push_str(user_log_message) .call(2,1) @@ -661,8 +673,7 @@ { bool ignore_it = false; bool exec_ok = Lua(st) - .push_str("ignore_file") - .get_fn() + .func("ignore_file") .push_str(p()) .call(1,1) .extract_bool(ignore_it) @@ -675,8 +686,7 @@ { bool ignore_it = false; bool exec_ok = Lua(st) - .push_str("ignore_branch") - .get_fn() + .func("ignore_branch") .push_str(branch) .call(1,1) .extract_bool(ignore_it) @@ -689,8 +699,7 @@ { bool ok = false; bool exec_ok = Lua(st) - .push_str("non_blocking_rng_ok") - .get_fn() + .func("non_blocking_rng_ok") .call(0,1) .extract_bool(ok) .ok(); @@ -704,8 +713,7 @@ cert_name const & name, cert_value const & val) { - ll.get_fn() - .push_table(); + ll.push_table(); int k = 0; for (set::const_iterator v = signers.begin(); @@ -736,7 +744,7 @@ cert_value const & val) { Lua ll(st); - ll.push_str("get_revision_cert_trust"); + ll.func("get_revision_cert_trust"); return shared_trust_function_body(ll, signers, id, name, val); } @@ -747,7 +755,7 @@ cert_value const & val) { Lua ll(st); - ll.push_str("get_manifest_cert_trust"); + ll.func("get_manifest_cert_trust"); return shared_trust_function_body(ll, signers, id, name, val); } @@ -757,8 +765,7 @@ { Lua ll(st); ll - .push_str("accept_testresult_change") - .get_fn() + .func("accept_testresult_change") .push_table(); for (map::const_iterator i = old_results.begin(); @@ -800,8 +807,7 @@ { string res; bool ok = Lua(st) - .push_str("merge2") - .get_fn() + .func("merge2") .push_str(left_path()) .push_str(right_path()) .push_str(merged_path()) @@ -826,8 +832,7 @@ { string res; bool ok = Lua(st) - .push_str("merge3") - .get_fn() + .func("merge3") .push_str(anc_path()) .push_str(left_path()) .push_str(right_path()) @@ -850,8 +855,7 @@ { string tmp; bool ok = Lua(st) - .push_str("resolve_file_conflict") - .get_fn() + .func("resolve_file_conflict") .push_str(anc()) .push_str(a()) .push_str(b()) @@ -870,8 +874,7 @@ { string tmp; bool ok = Lua(st) - .push_str("resolve_dir_conflict") - .get_fn() + .func("resolve_dir_conflict") .push_str(anc()) .push_str(a()) .push_str(b()) @@ -889,8 +892,7 @@ bool use = false, exec_ok = false; exec_ok = Lua(st) - .push_str("use_inodeprints") - .get_fn() + .func("use_inodeprints") .call(0, 1) .extract_bool(use) .ok(); @@ -904,8 +906,7 @@ bool permitted = false, exec_ok = false; exec_ok = Lua(st) - .push_str("get_netsync_read_permitted") - .get_fn() + .func("get_netsync_read_permitted") .push_str(collection) .push_str(identity()) .call(2,1) @@ -921,8 +922,7 @@ bool permitted = false, exec_ok = false; exec_ok = Lua(st) - .push_str("get_netsync_anonymous_read_permitted") - .get_fn() + .func("get_netsync_anonymous_read_permitted") .push_str(collection) .call(1,1) .extract_bool(permitted) @@ -938,8 +938,7 @@ bool permitted = false, exec_ok = false; exec_ok = Lua(st) - .push_str("get_netsync_write_permitted") - .get_fn() + .func("get_netsync_write_permitted") .push_str(collection) .push_str(identity()) .call(2,1) @@ -1003,8 +1002,7 @@ lua_hooks::hook_get_system_linesep(string & linesep) { return Lua(st) - .push_str("get_system_linesep") - .get_fn() + .func("get_system_linesep") .call(0,1) .extract_str(linesep) .ok(); @@ -1017,8 +1015,7 @@ { Lua ll(st); ll - .push_str("get_charset_conv") - .get_fn() + .func("get_charset_conv") .push_str(p()) .call(1,1) .begin(); @@ -1038,8 +1035,7 @@ { Lua ll(st); ll - .push_str("get_linesep_conv") - .get_fn() + .func("get_linesep_conv") .push_str(p()) .call(1,1) .begin(); @@ -1058,8 +1054,7 @@ { Lua ll(st); ll - .push_str("note_commit") - .get_fn() + .func("note_commit") .push_str(new_id.inner()()); ll.push_table(); --- transforms.cc +++ transforms.cc @@ -83,6 +83,45 @@ // for use in hexenc encoding +string encode_hexenc(string const & in) +{ + char buf[in.size() * 2]; + static char const *tab = "0123456789abcdef"; + char *c = buf; + for (string::const_iterator i = in.begin(); + i != in.end(); ++i) + { + *c++ = tab[(*i >> 4) & 0xf]; + *c++ = tab[*i & 0xf]; + } + return string(buf, in.size() * 2); +} + +static inline char decode_hex_char(char c) +{ + if (c >= '0' && c <= '9') + return c - '0'; + if (c >= 'a' && c <= 'f') + return c - 'a' + 10; + I(false); +} + +string decode_hexenc(string const & in) +{ + I(in.size() % 2 == 0); + char buf[in.size() / 2]; + char *c = buf; + for (string::const_iterator i = in.begin(); + i != in.end(); ++i) + { + char t = decode_hex_char(*i++); + t <<= 4; + t |= decode_hex_char(*i); + *c++ = t; + } + return string(buf, in.size() / 2); +} + struct lowerize { --- transforms.hh +++ transforms.hh @@ -51,13 +51,16 @@ std::string uppercase(std::string const & in); std::string lowercase(std::string const & in); +std::string encode_hexenc(std::string const & in); +std::string decode_hexenc(std::string const & in); + template void decode_hexenc(hexenc const & in, T & out) -{ out = xform(uppercase(in())); } +{ out = decode_hexenc(in()); } template void encode_hexenc(T const & in, hexenc & out) -{ out = lowercase(xform(in())); } +{ out = encode_hexenc(in()); } // gzip --- win32/inodeprint.cc +++ win32/inodeprint.cc @@ -14,7 +14,7 @@ namespace { template void - add_hash(CryptoPP::SHA & hash, T obj) + inline add_hash(CryptoPP::SHA & hash, T obj) { size_t size = sizeof(obj); hash.Update(reinterpret_cast(&size),