The unified diff between revisions [2589afb3..] and [3ba209c9..] is displayed below. It can also be downloaded as a raw diff.

#
#
# patch "database.cc"
#  from [52e97dea7a509a3c6440aaa25f97e5b02696abb1]
#    to [ea24fbf420fac86ec9f3339b8c813c91bbcc5816]
#
# patch "netsync.cc"
#  from [3e3475f5f52358ceefb11124cd298d6d09b8c3ce]
#    to [15e1753b95d0fb44da92370668aff85e0d8fed02]
#
============================================================
--- database.cc	52e97dea7a509a3c6440aaa25f97e5b02696abb1
+++ database.cc	ea24fbf420fac86ec9f3339b8c813c91bbcc5816
@@ -1380,7 +1380,7 @@ database::get_file_delta(file_id const &
     }
   else
     {
-      L(FL("get_file_delta failed for '%s'->'%s'") % id % base);
+      L(FL("get_file_delta failed for '%s'->'%s'") % base % id);
       file_data dat, base_dat;
       get_file_version(base, base_dat);
       get_file_version(id, dat);
@@ -2753,7 +2753,6 @@ database::put_roster(revision_id const &
 {
   MM(rev_id);
   data old_data, new_data;
-  delta reverse_delta;
   hexenc<id> old_id, new_id;

   write_roster_and_marking(roster, marks, new_data);
@@ -2782,13 +2781,13 @@ database::put_roster(revision_id const &
   // Else we have a new roster the database hasn't seen yet; our task is to
   // add it, and deltify all the incoming edges (if they aren't already).

-  put(new_id, new_data, data_table);

   std::set<revision_id> parents;
   get_revision_parents(rev_id, parents);

   // Now do what deltify would do if we bothered (we have the
   // roster written now, so might as well do it here).
+  bool delta_written = false;
   for (std::set<revision_id>::const_iterator i = parents.begin();
        i != parents.end(); ++i)
     {
@@ -2796,14 +2795,18 @@ database::put_roster(revision_id const &
         continue;
       revision_id old_rev = *i;
       get_roster_id_for_revision(old_rev, old_id);
-      if (exists(new_id, data_table))
-        {
-          get_version(old_id, old_data, data_table, delta_table);
-          diff(new_data, old_data, reverse_delta);
-          drop(old_id, data_table);
-          put_delta(old_id, new_id, reverse_delta, delta_table);
-        }
+      get_version(old_id, old_data, data_table, delta_table);
+      delta del;
+      diff(old_data, new_data, del);
+      put_delta(new_id, old_id, del, delta_table);
+      delta_written = true;
+      break;
     }
+
+  // in case the parents were all null/didn't exist
+  if (!delta_written)
+    put(new_id, new_data, data_table);
+
   guard.commit();
 }

============================================================
--- netsync.cc	3e3475f5f52358ceefb11124cd298d6d09b8c3ce
+++ netsync.cc	15e1753b95d0fb44da92370668aff85e0d8fed02
@@ -591,7 +591,7 @@ session::note_file_delta(file_id const &
   if (role == sink_role)
     return;
   file_delta del;
-  app.db.get_file_delta(src, dst, del);
+  app.db.get_file_delta(dst, src, del);
   id src_id, dst_id;
   decode_hexenc(src.inner(), src_id);
   decode_hexenc(dst.inner(), dst_id);