# # patch "ChangeLog" # from [5eeed1b05411fd7abeee4677fab0c7a1938330b7] # to [d44d5d3069f39e22bdb7301e9c47f12658368e06] # # patch "commands.cc" # from [16f27966ed65d063603b06d4f8e460a282025135] # to [002c7e8b171019ed9c19cb1f15dcfebdec5c1257] # # patch "database.cc" # from [c69c22cfd98aa2c979d7a93760411049578d9495] # to [6803830b8a42ac4e01669027990ebc51cffcef7a] # # patch "database.hh" # from [db62b6b964da9632dc1b04024eff7b749bce8fe0] # to [5e52b0b84dd9cdcd155ee9af48481f8476ac2d8b] # # patch "diff_patch.cc" # from [4b6a40d75971a63ab35a7cfd745d3247aa17e0d9] # to [d2246756d033c4db8683bdb0380c0c786661d1db] # ======================================================================== --- ChangeLog 5eeed1b05411fd7abeee4677fab0c7a1938330b7 +++ ChangeLog d44d5d3069f39e22bdb7301e9c47f12658368e06 @@ -1,3 +1,11 @@ +2005-11-05 Timothy Brownawell + + Make sure that all new revisions added to the db deltify as much as + possible. + * commands.cc, diff_patch.cc: deltify both sides when doing a merge + * database.{cc,hh}: new function, database::deltify_revision() + call it from put_revision, so all new revisions will be deltified + 2005-10-25 Emile Snyder Fix bug reported on mailing list by Wim Oudshoorn and Tom Koelman ======================================================================== --- commands.cc 16f27966ed65d063603b06d4f8e460a282025135 +++ commands.cc 002c7e8b171019ed9c19cb1f15dcfebdec5c1257 @@ -3121,8 +3121,6 @@ merger, app); { - // we have to record *some* route to this manifest. we pick the - // smaller of the two. manifest_map tmp; apply_change_set(anc_man, *anc_to_left, tmp); apply_change_set(tmp, *left_to_merged, merged_man); @@ -3130,14 +3128,12 @@ delta left_mdelta, right_mdelta; diff(left_man, merged_man, left_mdelta); diff(right_man, merged_man, right_mdelta); - if (left_mdelta().size() < right_mdelta().size()) - dbw.consume_manifest_delta(left_rev.new_manifest, - merged_rev.new_manifest, left_mdelta); - else - dbw.consume_manifest_delta(right_rev.new_manifest, - merged_rev.new_manifest, right_mdelta); + dbw.consume_manifest_delta(left_rev.new_manifest, + merged_rev.new_manifest, left_mdelta); + dbw.consume_manifest_delta(right_rev.new_manifest, + merged_rev.new_manifest, right_mdelta); } - + merged_rev.edges.insert(std::make_pair(left_id, std::make_pair(left_rev.new_manifest, left_to_merged))); ======================================================================== --- database.cc c69c22cfd98aa2c979d7a93760411049578d9495 +++ database.cc 6803830b8a42ac4e01669027990ebc51cffcef7a @@ -813,6 +813,8 @@ I(ident() != ""); hexenc tid; calculate_ident(dat, tid); + MM(ident); + MM(tid); I(tid == ident); base64 > dat_packed; @@ -1335,6 +1337,62 @@ dat = rdat; } +void +database::deltify_revision(revision_id const & rid) +{ + transaction_guard guard(*this); + revision_set rev; + get_revision(rid, rev); + // make sure that all parent revs have their manifests and files + // replaced with deltas from this rev's manifest and files + // assume that if the manifest is already deltafied, so are the files + { + MM(rev.new_manifest); + for (edge_map::const_iterator i = rev.edges.begin(); + i != rev.edges.end(); ++i) + { + manifest_id oldman = edge_old_manifest(i); + MM(oldman); + if (exists(oldman.inner(), "manifests") && + !(oldman == rev.new_manifest) && + manifest_version_exists(oldman)) + { + manifest_data mdat_new, mdat_old; + get_manifest_version(oldman, mdat_old); + get_manifest_version(rev.new_manifest, mdat_new); + delta delt; + diff(mdat_old.inner(), mdat_new.inner(), delt); + manifest_delta mdelt(delt); + drop(rev.new_manifest.inner(), "manifests"); + drop(rev.new_manifest.inner(), "manifest_deltas"); + put_manifest_version(oldman, rev.new_manifest, mdelt); + } + + for (change_set::delta_map::const_iterator + j = edge_changes(i).deltas.begin(); + j != edge_changes(i).deltas.end(); ++j) + { + if (! delta_entry_src(j).inner()().empty() && + exists(delta_entry_src(j).inner(), "files") && + file_version_exists(delta_entry_dst(j))) + { + file_data old_data; + file_data new_data; + get_file_version(delta_entry_src(j), old_data); + get_file_version(delta_entry_dst(j), new_data); + delta delt; + diff(old_data.inner(), new_data.inner(), delt); + file_delta del(delt); + drop(delta_entry_dst(j).inner(), "files"); + drop(delta_entry_dst(j).inner(), "file_deltas"); + put_file_version(delta_entry_src(j), delta_entry_dst(j), del); + } + } + } + } + guard.commit(); +} + void database::put_revision(revision_id const & new_id, revision_set const & rev) @@ -1368,6 +1426,8 @@ new_id.inner()().c_str()); } + deltify_revision(new_id); + check_sane_history(new_id, constants::verify_depth, *__app); guard.commit(); ======================================================================== --- database.hh db62b6b964da9632dc1b04024eff7b749bce8fe0 +++ database.hh 5e52b0b84dd9cdcd155ee9af48481f8476ac2d8b @@ -299,6 +299,8 @@ void get_revision_manifest(revision_id const & cid, manifest_id & mid); + void deltify_revision(revision_id const & rid); + void get_revision(revision_id const & id, revision_set & cs); ======================================================================== --- diff_patch.cc 4b6a40d75971a63ab35a7cfd745d3247aa17e0d9 +++ diff_patch.cc d2246756d033c4db8683bdb0380c0c786661d1db @@ -472,12 +472,14 @@ L(F("recording successful merge of %s <-> %s into %s\n") % left_ident % right_ident % merged_ident); - delta merge_delta; + delta left_delta, right_delta; transaction_guard guard(app.db); - diff(left_data.inner(), merged_data.inner(), merge_delta); + diff(left_data.inner(), merged_data.inner(), left_delta); + diff(left_data.inner(), merged_data.inner(), right_delta); packet_db_writer dbw(app); - dbw.consume_file_delta (left_ident, merged_ident, file_delta(merge_delta)); + dbw.consume_file_delta (left_ident, merged_ident, file_delta(left_delta)); + dbw.consume_file_delta (right_ident, merged_ident, file_delta(right_delta)); guard.commit(); }