/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to object_store.py

Add trivial object store tests.

Show diffs side-by-side

added added

removed removed

Lines of Context:
113
113
 
114
114
 
115
115
def _inventory_to_objects(inv, parent_invs, parent_invshamaps,
116
 
        unusual_modes, iter_files_bytes):
 
116
        unusual_modes, iter_files_bytes, has_ghost_parents):
117
117
    """Iterate over the objects that were introduced in a revision.
118
118
 
119
119
    :param inv: Inventory to process
127
127
    new_blobs = []
128
128
    shamap = {}
129
129
    for path, ie in inv.entries():
130
 
        if ie.kind in ("file", "symlink"):
131
 
            for (pinv, pinvshamap) in zip(parent_invs, parent_invshamaps):
 
130
        if ie.kind == "file":
 
131
            if ie.revision == inv.revision_id:
 
132
                new_blobs.append((path, ie))
 
133
                new_trees[urlutils.dirname(path)] = ie.parent_id
 
134
            elif has_ghost_parents:
 
135
                for (pinv, pinvshamap) in zip(parent_invs, parent_invshamaps):
 
136
                    try:
 
137
                        pie = pinv[ie.file_id]
 
138
                    except errors.NoSuchId:
 
139
                        pass
 
140
                    else:
 
141
                        if (pie.kind == ie.kind and
 
142
                            pie.text_sha1 == ie.text_sha1):
 
143
                            shamap[ie.file_id] = pinvshamap.lookup_blob(
 
144
                                pie.file_id, pie.revision)
 
145
                            break
 
146
                else:
 
147
                    new_blobs.append((path, ie))
 
148
                    new_trees[urlutils.dirname(path)] = ie.parent_id
 
149
        elif ie.kind == "symlink":
 
150
            blob = symlink_to_blob(ie)
 
151
            for pinv in parent_invs:
132
152
                try:
133
153
                    pie = pinv[ie.file_id]
134
154
                except errors.NoSuchId:
135
155
                    pass
136
156
                else:
137
 
                    if (pie.kind == ie.kind and
138
 
                        pie.text_sha1 == ie.text_sha1):
139
 
                        shamap[ie.file_id] = pinvshamap.lookup_blob(
140
 
                            pie.file_id, pie.revision)
 
157
                    if (ie.kind == pie.kind and
 
158
                        ie.symlink_target == pie.symlink_target):
141
159
                        break
142
160
            else:
143
 
                if ie.kind == "file":
144
 
                    new_blobs.append((path, ie))
145
 
                else:
146
 
                    blob = symlink_to_blob(ie)
147
 
                    yield path, blob
148
 
                    shamap[ie.file_id] = blob.id
149
 
                new_trees[urlutils.dirname(path)] = ie.parent_id
 
161
                yield path, blob
 
162
            shamap[ie.file_id] = blob.id
 
163
            new_trees[urlutils.dirname(path)] = ie.parent_id
150
164
        elif ie.kind == "directory":
151
165
            for (pinv, pinvshamap) in zip(parent_invs, parent_invshamaps):
152
166
                try:
169
183
            raise AssertionError(ie.kind)
170
184
    
171
185
    for (path, fid), chunks in iter_files_bytes(
172
 
        [(ie.file_id, ie.revision, (path, ie.file_id)) for (path, ie) in new_blobs]):
 
186
        [(ie.file_id, ie.revision, (path, ie.file_id))
 
187
            for (path, ie) in new_blobs]):
173
188
        obj = Blob()
174
189
        obj.data = "".join(chunks)
175
190
        yield path, obj
176
191
        shamap[fid] = obj.id
177
192
 
 
193
    assert all([ie.file_id in shamap for (path, ie) in new_blobs])
 
194
 
178
195
    for fid in unusual_modes:
179
196
        new_trees[inv.id2path(fid)] = inv[fid].parent_id
180
197
    
265
282
    def _revision_to_objects(self, rev, inv):
266
283
        unusual_modes = extract_unusual_modes(rev)
267
284
        present_parents = self.repository.has_revisions(rev.parent_ids)
 
285
        has_ghost_parents = (len(rev.parent_ids) < len(present_parents))
268
286
        parent_invs = self.parent_invs_cache.get_inventories(
269
287
            [p for p in rev.parent_ids if p in present_parents])
270
288
        parent_invshamaps = [self._idmap.get_inventory_sha_map(r) for r in rev.parent_ids if r in present_parents]
271
289
        tree_sha = None
272
290
        for path, obj in _inventory_to_objects(inv, parent_invs,
273
291
                parent_invshamaps, unusual_modes,
274
 
                self.repository.iter_files_bytes):
 
292
                self.repository.iter_files_bytes, has_ghost_parents):
275
293
            yield path, obj
276
294
            if path == "":
277
295
                tree_sha = obj.id