#
# 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();
}