~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/inventory_delta.py

  • Committer: Andrew Bennetts
  • Date: 2009-07-31 08:31:41 UTC
  • mto: This revision was merged to the branch mainline in revision 4608.
  • Revision ID: andrew.bennetts@canonical.com-20090731083141-cx32g3lqid0tzld7
Make actual non-rich-root inventories (which have implicit root entries with non-None revisions) roundtrip through inventory-deltas correctly.

Show diffs side-by-side

added added

removed removed

Lines of Context:
115
115
    return result
116
116
 
117
117
 
118
 
 
119
118
class InventoryDeltaSerializer(object):
120
119
    """Serialize and deserialize inventory deltas."""
121
120
 
175
174
        lines = ['', '', '', '', '']
176
175
        to_line = self._delta_item_to_line
177
176
        for delta_item in delta_to_new:
178
 
            lines.append(to_line(delta_item))
179
 
            if lines[-1].__class__ != str:
 
177
            line = to_line(delta_item, new_name)
 
178
            if line.__class__ != str:
180
179
                raise errors.BzrError(
181
180
                    'to_line generated non-str output %r' % lines[-1])
 
181
            lines.append(line)
182
182
        lines.sort()
183
183
        lines[0] = "format: %s\n" % InventoryDeltaSerializer.FORMAT_1
184
184
        lines[1] = "parent: %s\n" % old_name
195
195
        else:
196
196
            return "false"
197
197
 
198
 
    def _delta_item_to_line(self, delta_item):
 
198
    def _delta_item_to_line(self, delta_item, new_version):
199
199
        """Convert delta_item to a line."""
200
200
        oldpath, newpath, file_id, entry = delta_item
201
201
        if newpath is None:
222
222
            last_modified = entry.revision
223
223
            # special cases for /
224
224
            if newpath_utf8 == '/' and not self._versioned_root:
 
225
                # This is an entry for the root, this inventory does not
 
226
                # support versioned roots.  So this must be an unversioned
 
227
                # root, i.e. id == TREE_ROOT and last_modified == new revision.
 
228
                # Otherwise, this delta is nonsensical.
225
229
                if file_id != 'TREE_ROOT':
 
230
                    from bzrlib.trace import mutter
 
231
                    mutter('delta_item: %r', delta_item)
 
232
                    mutter('self._versioned_root: %r', self._versioned_root)
226
233
                    raise errors.BzrError(
227
234
                        'file_id %s is not TREE_ROOT for /' % file_id)
228
 
                if last_modified is not None:
 
235
                if last_modified != new_version:
229
236
                    raise errors.BzrError(
230
 
                        'Version present for / in %s' % file_id)
231
 
                last_modified = NULL_REVISION
 
237
                        'Version present for / in %s (%s != %s)'
 
238
                        % (file_id, last_modified, new_version))
232
239
            if last_modified is None:
233
240
                raise errors.BzrError("no version for fileid %s" % file_id)
234
241
            content = self._entry_to_content[entry.kind](entry)
298
305
                    "duplicate file id in inventory delta %r" % lines)
299
306
            seen_ids.add(file_id)
300
307
            if newpath_utf8 == '/' and not delta_versioned_root and (
301
 
                last_modified != 'null:' or file_id != 'TREE_ROOT'):
 
308
                last_modified != delta_version_id or file_id != 'TREE_ROOT'):
 
309
                    # Delta claims to be not rich root, yet here's a root entry
 
310
                    # with either a non-default ID or a non-default version,
 
311
                    # i.e.  it's rich...
302
312
                    raise errors.BzrError("Versioned root found: %r" % line)
303
313
            elif last_modified[-1] == ':':
304
314
                    raise errors.BzrError('special revisionid found: %r' % line)